btrfs: do not return errors from raid56_parity_write
authorChristoph Hellwig <hch@lst.de>
Fri, 17 Jun 2022 10:04:08 +0000 (12:04 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:39 +0000 (17:45 +0200)
Always consume the bio and call the end_io handler on error instead of
returning an error and letting the caller handle it.  This matches what
the block layer submission does and avoids any confusion on who
needs to handle errors.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Tested-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/raid56.c
fs/btrfs/raid56.h
fs/btrfs/volumes.c

index f4d3200a14dc5704ef274d13b44bfdbbe3ce70d7..0408ef29bd02cde6f2dacc34a4bd8389038a76ac 100644 (file)
@@ -1803,18 +1803,19 @@ static void rbio_add_bio(struct btrfs_raid_bio *rbio, struct bio *orig_bio)
 /*
  * our main entry point for writes from the rest of the FS.
  */
-int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
+void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
 {
        struct btrfs_fs_info *fs_info = bioc->fs_info;
        struct btrfs_raid_bio *rbio;
        struct btrfs_plug_cb *plug = NULL;
        struct blk_plug_cb *cb;
-       int ret;
+       int ret = 0;
 
        rbio = alloc_rbio(fs_info, bioc);
        if (IS_ERR(rbio)) {
                btrfs_put_bioc(bioc);
-               return PTR_ERR(rbio);
+               ret = PTR_ERR(rbio);
+               goto out;
        }
        rbio->operation = BTRFS_RBIO_WRITE;
        rbio_add_bio(rbio, bio);
@@ -1829,8 +1830,8 @@ int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
        if (rbio_is_full(rbio)) {
                ret = full_stripe_write(rbio);
                if (ret)
-                       btrfs_bio_counter_dec(fs_info);
-               return ret;
+                       goto out_dec_counter;
+               return;
        }
 
        cb = blk_check_plugged(btrfs_raid_unplug, fs_info, sizeof(*plug));
@@ -1841,13 +1842,19 @@ int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
                        INIT_LIST_HEAD(&plug->rbio_list);
                }
                list_add_tail(&rbio->plug_list, &plug->rbio_list);
-               ret = 0;
        } else {
                ret = __raid56_parity_write(rbio);
                if (ret)
-                       btrfs_bio_counter_dec(fs_info);
+                       goto out_dec_counter;
        }
-       return ret;
+
+       return;
+
+out_dec_counter:
+       btrfs_bio_counter_dec(fs_info);
+out:
+       bio->bi_status = errno_to_blk_status(ret);
+       bio_endio(bio);
 }
 
 /*
index 1dce205b79bf966a0f77325ff59d50b797f5e877..3f223ae39462a6a13b62e7e32a1083a5b3469216 100644 (file)
@@ -167,7 +167,7 @@ struct btrfs_device;
 
 int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
                          int mirror_num, int generic_io);
-int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc);
+void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc);
 
 void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
                            unsigned int pgoff, u64 logical);
index 6b2ad30e0221619391346ff8cf9b4e5e6e99b7ab..ed440b5a300ca068d34bcc938d78f3a9f59e605e 100644 (file)
@@ -6762,7 +6762,7 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
        if ((bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) &&
            ((btrfs_op(bio) == BTRFS_MAP_WRITE) || (mirror_num > 1))) {
                if (btrfs_op(bio) == BTRFS_MAP_WRITE)
-                       ret = raid56_parity_write(bio, bioc);
+                       raid56_parity_write(bio, bioc);
                else
                        ret = raid56_parity_recover(bio, bioc, mirror_num, 1);
                goto out_dec;