• Ira Weiny's avatar
    btrfs: fix raid6 qstripe kmap · d70cef0d
    Ira Weiny authored
    When a qstripe is required an extra page is allocated and mapped.  There
    were 3 problems:
    
    1) There is no corresponding call of kunmap() for the qstripe page.
    2) There is no reason to map the qstripe page more than once if the
       number of bits set in rbio->dbitmap is greater than one.
    3) There is no reason to map the parity page and unmap it each time
       through the loop.
    
    The page memory can continue to be reused with a single mapping on each
    iteration by raid6_call.gen_syndrome() without remapping.  So map the
    page for the duration of the loop.
    
    Similarly, improve the algorithm by mapping the parity page just 1 time.
    
    Fixes: 5a6ac9ea ("Btrfs, raid56: support parity scrub on raid56")
    CC: stable@vger.kernel.org # 4.4.x: c17af965: btrfs: raid56: simplify tracking of Q stripe presence
    CC: stable@vger.kernel.org # 4.4.x
    Signed-off-by: default avatarIra Weiny <ira.weiny@intel.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    d70cef0d
raid56.c 66.9 KB