• Omar Sandoval's avatar
    btrfs: look at full bi_io_vec for repair decision · c7333972
    Omar Sandoval authored
    Read repair does two things: it finds a good copy of data to return to
    the reader, and it corrects the bad copy on disk. If a read of multiple
    sectors has an I/O error, repair does an extra "validation" step that
    issues a separate read for each sector. This allows us to find the exact
    failing sectors and only rewrite those.
    
    This heuristic is implemented in
    bio_readpage_error()/btrfs_check_repairable() as:
    
    	failed_bio_pages = failed_bio->bi_iter.bi_size >> PAGE_SHIFT;
    	if (failed_bio_pages > 1)
    		do validation
    
    However, at this point, bi_iter may have already been advanced. This
    means that we'll skip the validation step and rewrite the entire failed
    read.
    
    Fix it by getting the actual size from the biovec (which we can do
    because this is only called for non-cloned bios, although that will
    change in a later commit).
    
    Fixes: 8a2ee44a ("btrfs: look at bi_size for repair decisions")
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    c7333972
extent_io.c 158 KB