• Liu Bo's avatar
    Btrfs: tolerate errors if we have retried successfully · e3d37fab
    Liu Bo authored
    With raid1 profile, dio read isn't tolerating IO errors if read length is
    less than the stripe length (64K).
    
    Our bio didn't get split in btrfs_submit_direct_hook() if (dip->flags &
    BTRFS_DIO_ORIG_BIO_SUBMITTED) is true and that happens when the read
    length is less than 64k.  In this case, if the underlying device returns
    error somehow, bio->bi_error has recorded that error.
    
    If we could recover the correct data from another copy in profile raid1/10/5/6,
    with btrfs_subio_endio_read() returning 0, bio would have the correct data in
    its vector, but bio->bi_error is not updated accordingly so that the following
    dio_end_io(dio_bio, bio->bi_error) makes directIO think this read has failed.
    
    This fixes the problem by setting bio's error to 0 if a good copy has been
    found.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    e3d37fab
inode.c 289 KB