btrfs: raid56: transfer the bio counter reference to the raid submission helpers
authorChristoph Hellwig <hch@lst.de>
Fri, 17 Jun 2022 10:04:10 +0000 (12:04 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:40 +0000 (17:45 +0200)
Transfer the bio counter reference acquired by btrfs_submit_bio to
raid56_parity_write and raid56_parity_recovery together with the bio
that the reference was acquired for instead of acquiring another
reference in those helpers and dropping the original one in
btrfs_submit_bio.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Tested-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/raid56.c
fs/btrfs/volumes.c

index 84d0e073b409ee3ef5c85f43a9adb65075997c97..1afe32d5ab017a174538206b05722a9f1113e488 100644 (file)
@@ -1815,12 +1815,11 @@ void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
        if (IS_ERR(rbio)) {
                btrfs_put_bioc(bioc);
                ret = PTR_ERR(rbio);
-               goto out;
+               goto out_dec_counter;
        }
        rbio->operation = BTRFS_RBIO_WRITE;
        rbio_add_bio(rbio, bio);
 
-       btrfs_bio_counter_inc_noblocked(fs_info);
        rbio->generic_bio_cnt = 1;
 
        /*
@@ -1852,7 +1851,6 @@ void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
 
 out_dec_counter:
        btrfs_bio_counter_dec(fs_info);
-out:
        bio->bi_status = errno_to_blk_status(ret);
        bio_endio(bio);
 }
@@ -2208,6 +2206,8 @@ void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
        if (generic_io) {
                ASSERT(bioc->mirror_num == mirror_num);
                btrfs_bio(bio)->mirror_num = mirror_num;
+       } else {
+               btrfs_get_bioc(bioc);
        }
 
        rbio = alloc_rbio(fs_info, bioc);
@@ -2230,12 +2230,8 @@ void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
                goto out_end_bio;
        }
 
-       if (generic_io) {
-               btrfs_bio_counter_inc_noblocked(fs_info);
+       if (generic_io)
                rbio->generic_bio_cnt = 1;
-       } else {
-               btrfs_get_bioc(bioc);
-       }
 
        /*
         * Loop retry:
@@ -2265,8 +2261,8 @@ void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
        return;
 
 out_end_bio:
-       if (generic_io)
-               btrfs_put_bioc(bioc);
+       btrfs_bio_counter_dec(fs_info);
+       btrfs_put_bioc(bioc);
        bio_endio(bio);
 }
 
index c9328cbd7fe91c49e4a839de7a777ebf5d809151..bf4e140f6bfc7eb7a6a92c37e14e545ad1cc1480 100644 (file)
@@ -6750,8 +6750,12 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
        btrfs_bio_counter_inc_blocked(fs_info);
        ret = __btrfs_map_block(fs_info, btrfs_op(bio), logical,
                                &map_length, &bioc, mirror_num, 1);
-       if (ret)
-               goto out_dec;
+       if (ret) {
+               btrfs_bio_counter_dec(fs_info);
+               bio->bi_status = errno_to_blk_status(ret);
+               bio_endio(bio);
+               return;
+       }
 
        total_devs = bioc->num_stripes;
        bioc->orig_bio = bio;
@@ -6765,7 +6769,7 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
                        raid56_parity_write(bio, bioc);
                else
                        raid56_parity_recover(bio, bioc, mirror_num, true);
-               goto out_dec;
+               return;
        }
 
        if (map_length < length) {
@@ -6780,12 +6784,7 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
 
                submit_stripe_bio(bioc, bio, dev_nr, should_clone);
        }
-out_dec:
        btrfs_bio_counter_dec(fs_info);
-       if (ret) {
-               bio->bi_status = errno_to_blk_status(ret);
-               bio_endio(bio);
-       }
 }
 
 static bool dev_args_match_fs_devices(const struct btrfs_dev_lookup_args *args,