Commit 629ebf4f authored by Liu Bo's avatar Liu Bo Committed by David Sterba

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: 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>
parent 17347cec
...@@ -8078,6 +8078,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode, ...@@ -8078,6 +8078,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
u32 sectorsize; u32 sectorsize;
int nr_sectors; int nr_sectors;
int ret; int ret;
int err = 0;
fs_info = BTRFS_I(inode)->root->fs_info; fs_info = BTRFS_I(inode)->root->fs_info;
sectorsize = fs_info->sectorsize; sectorsize = fs_info->sectorsize;
...@@ -8099,8 +8100,10 @@ static int __btrfs_correct_data_nocsum(struct inode *inode, ...@@ -8099,8 +8100,10 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
pgoff, start, start + sectorsize - 1, pgoff, start, start + sectorsize - 1,
io_bio->mirror_num, io_bio->mirror_num,
btrfs_retry_endio_nocsum, &done); btrfs_retry_endio_nocsum, &done);
if (ret) if (ret) {
return ret; err = ret;
goto next;
}
wait_for_completion(&done.done); wait_for_completion(&done.done);
...@@ -8109,6 +8112,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode, ...@@ -8109,6 +8112,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
goto next_block_or_try_again; goto next_block_or_try_again;
} }
next:
start += sectorsize; start += sectorsize;
nr_sectors--; nr_sectors--;
...@@ -8119,7 +8123,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode, ...@@ -8119,7 +8123,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
} }
} }
return 0; return err;
} }
static void btrfs_retry_endio(struct bio *bio) static void btrfs_retry_endio(struct bio *bio)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment