btrfs: scrub: fix a return value overwrite in scrub_stripe()
authorQu Wenruo <wqu@suse.com>
Wed, 14 Jun 2023 06:49:35 +0000 (14:49 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 14 Jun 2023 16:30:30 +0000 (18:30 +0200)
[RETURN VALUE OVERWRITE]
Inside scrub_stripe(), we would submit all the remaining stripes after
iterating all extents.

But since flush_scrub_stripes() can return error, we need to avoid
overwriting the existing @ret if there is any error.

However the existing check is doing the wrong check:

ret2 = flush_scrub_stripes();
if (!ret2)
ret = ret2;

This would overwrite the existing @ret to 0 as long as the final flush
detects no critical errors.

[FIX]
We should check @ret other than @ret2 in that case.

Fixes: 8eb3dd17eadd ("btrfs: dev-replace: error out if we have unrepaired metadata error during")
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/scrub.c

index 50c241aba1a13cab6f2d6d15c1b5c8f0ded88471..bceaa8c2007e67ec2dbf322e6cdeef2df260197f 100644 (file)
@@ -2266,7 +2266,7 @@ next:
        }
 out:
        ret2 = flush_scrub_stripes(sctx);
-       if (!ret2)
+       if (!ret)
                ret = ret2;
        if (sctx->raid56_data_stripes) {
                for (int i = 0; i < nr_data_stripes(map); i++)