On Wed, May 17, 2017 at 03:42:00PM -0600, Liu Bo wrote: > 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: Liu Bo <bo.li.liu@xxxxxxxxxx> > --- > > v2: Add more details to changelog. Thanks. Reviewed-by: David Sterba <dsterba@xxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
