[4/6] Btrfs: record error if one block has failed to retry
diff mbox

Message ID 1492478187-24875-5-git-send-email-bo.li.liu@oracle.com
State New
Headers show

Commit Message

Liu Bo April 18, 2017, 1:16 a.m. UTC
In the nocsum case of dio read endio, it will return immediately if an
error got returned when repairing, which left 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 <bo.li.liu@oracle.com>
---
 fs/btrfs/inode.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

David Sterba May 17, 2017, 6:32 p.m. UTC | #1
On Mon, Apr 17, 2017 at 06:16:25PM -0700, Liu Bo wrote:
> In the nocsum case of dio read endio, it will return immediately if an
> error got returned when repairing, which left 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 <bo.li.liu@oracle.com>

Reviewed-by: David Sterba <dsterba@suse.com>

> ---
>  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 fca2f1f..cc46d21 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -7942,6 +7942,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
>  	u32 sectorsize;
>  	int nr_sectors;
>  	int ret;
> +	int err;
>  
>  	fs_info = BTRFS_I(inode)->root->fs_info;
>  	sectorsize = fs_info->sectorsize;
> @@ -7962,8 +7963,10 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
>  				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);
>  
> @@ -7972,6 +7975,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
>  			goto next_block_or_try_again;
>  		}
>  
> +next:
>  		start += sectorsize;
>  
>  		if (nr_sectors--) {
> @@ -7980,7 +7984,7 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
>  		}
>  	}
>  
> -	return 0;
> +	return err;
>  }
>  
>  static void btrfs_retry_endio(struct bio *bio)
> -- 
> 2.5.5
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index fca2f1f..cc46d21 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -7942,6 +7942,7 @@  static int __btrfs_correct_data_nocsum(struct inode *inode,
 	u32 sectorsize;
 	int nr_sectors;
 	int ret;
+	int err;
 
 	fs_info = BTRFS_I(inode)->root->fs_info;
 	sectorsize = fs_info->sectorsize;
@@ -7962,8 +7963,10 @@  static int __btrfs_correct_data_nocsum(struct inode *inode,
 				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);
 
@@ -7972,6 +7975,7 @@  static int __btrfs_correct_data_nocsum(struct inode *inode,
 			goto next_block_or_try_again;
 		}
 
+next:
 		start += sectorsize;
 
 		if (nr_sectors--) {
@@ -7980,7 +7984,7 @@  static int __btrfs_correct_data_nocsum(struct inode *inode,
 		}
 	}
 
-	return 0;
+	return err;
 }
 
 static void btrfs_retry_endio(struct bio *bio)