From 629ebf4fadbc647e2118ef9c94b038eeef178e9c Mon Sep 17 00:00:00 2001 From: Liu Bo Date: Mon, 15 May 2017 17:20:07 -0700 Subject: [PATCH] Btrfs: record error if one block has failed to retry In the nocsum case of dio read endio, it returns immediately if an error gets returned when repairing, which leaves the rest blocks unrepaired. The behavior is different from how buffered read endio works in the same case. This changes it to record error only and go on repairing the rest blocks. Signed-off-by: Liu Bo Reviewed-by: David Sterba Signed-off-by: David Sterba --- fs/btrfs/inode.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ce6a9b2cce51..d8d1fe5096b7 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8078,6 +8078,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode, u32 sectorsize; int nr_sectors; int ret; + int err = 0; fs_info = BTRFS_I(inode)->root->fs_info; sectorsize = fs_info->sectorsize; @@ -8099,8 +8100,10 @@ next_block_or_try_again: pgoff, start, start + sectorsize - 1, io_bio->mirror_num, btrfs_retry_endio_nocsum, &done); - if (ret) - return ret; + if (ret) { + err = ret; + goto next; + } wait_for_completion(&done.done); @@ -8109,6 +8112,7 @@ next_block_or_try_again: goto next_block_or_try_again; } +next: start += sectorsize; nr_sectors--; @@ -8119,7 +8123,7 @@ next_block_or_try_again: } } - return 0; + return err; } static void btrfs_retry_endio(struct bio *bio) -- 2.20.1