• Liu Bo's avatar
    Btrfs: scrub: batch rebuild for raid56 · 6ca1765b
    Liu Bo authored
    In case of raid56, writes and rebuilds always take BTRFS_STRIPE_LEN(64K)
    as unit, however, scrub_extent() sets blocksize as unit, so rebuild
    process may be triggered on every block on a same stripe.
    
    A typical example would be that when we're replacing a disappeared disk,
    all reads on the disks get -EIO, every block (size is 4K if blocksize is
    4K) would go thru these,
    
    scrub_handle_errored_block
      scrub_recheck_block # re-read pages one by one
      scrub_recheck_block # rebuild by calling raid56_parity_recover()
                            page by page
    
    Although with raid56 stripe cache most of reads during rebuild can be
    avoided, the parity recover calculation(xor or raid6 algorithms) needs to
    be done $(BTRFS_STRIPE_LEN / blocksize) times.
    
    This makes it smarter by doing raid56 scrub/replace on stripe length.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    6ca1765b
scrub.c 123 KB