md: move initialization and destruction of 'io_acct_set' to md.c
authorYu Kuai <yukuai3@huawei.com>
Wed, 21 Jun 2023 16:51:03 +0000 (00:51 +0800)
committerSalvatore Bonaccorso <carnil@debian.org>
Wed, 7 May 2025 15:10:56 +0000 (17:10 +0200)
Origin: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/commit?id=5bec482db5aa81d4ea8b94391f74aafbe8eceb3c
Bug-Debian: https://bugs.debian.org/1104460

commit c567c86b90d4715081adfe5eb812141a5b6b4883 upstream.

'io_acct_set' is only used for raid0 and raid456, prepare to use it for
raid1 and raid10, so that io accounting from different levels can be
consistent.

By the way, follow up patches will also use this io clone mechanism to
make sure 'active_io' represents in flight io, not io that is dispatching,
so that mddev_suspend will wait for io to be done as designed.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20230621165110.1498313-2-yukuai1@huaweicloud.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Gbp-Pq: Topic bugfix/all
Gbp-Pq: Name md-move-initialization-and-destruction-of-io_acct_se.patch

drivers/md/md.c
drivers/md/md.h
drivers/md/raid0.c
drivers/md/raid5.c

index d5fbccc7281011165dd073896cff12d844c07d92..a9fcfcbc2d1102edd57a741d8ada92cf358a55e8 100644 (file)
@@ -5965,6 +5965,13 @@ int md_run(struct mddev *mddev)
                        goto exit_bio_set;
        }
 
+       if (!bioset_initialized(&mddev->io_acct_set)) {
+               err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE,
+                                 offsetof(struct md_io_acct, bio_clone), 0);
+               if (err)
+                       goto exit_sync_set;
+       }
+
        spin_lock(&pers_lock);
        pers = find_pers(mddev->level, mddev->clevel);
        if (!pers || !try_module_get(pers->owner)) {
@@ -6142,6 +6149,8 @@ bitmap_abort:
        module_put(pers->owner);
        md_bitmap_destroy(mddev);
 abort:
+       bioset_exit(&mddev->io_acct_set);
+exit_sync_set:
        bioset_exit(&mddev->sync_set);
 exit_bio_set:
        bioset_exit(&mddev->bio_set);
@@ -6374,6 +6383,7 @@ static void __md_stop(struct mddev *mddev)
        percpu_ref_exit(&mddev->active_io);
        bioset_exit(&mddev->bio_set);
        bioset_exit(&mddev->sync_set);
+       bioset_exit(&mddev->io_acct_set);
 }
 
 void md_stop(struct mddev *mddev)
@@ -8744,23 +8754,6 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
 }
 EXPORT_SYMBOL_GPL(md_submit_discard_bio);
 
-int acct_bioset_init(struct mddev *mddev)
-{
-       int err = 0;
-
-       if (!bioset_initialized(&mddev->io_acct_set))
-               err = bioset_init(&mddev->io_acct_set, BIO_POOL_SIZE,
-                       offsetof(struct md_io_acct, bio_clone), 0);
-       return err;
-}
-EXPORT_SYMBOL_GPL(acct_bioset_init);
-
-void acct_bioset_exit(struct mddev *mddev)
-{
-       bioset_exit(&mddev->io_acct_set);
-}
-EXPORT_SYMBOL_GPL(acct_bioset_exit);
-
 static void md_end_io_acct(struct bio *bio)
 {
        struct md_io_acct *md_io_acct = bio->bi_private;
index 4f0b480974552be83372b3b67f05b1f76baf1b07..1fda5e139beb006e74c996dcad7450d616268925 100644 (file)
@@ -746,8 +746,6 @@ extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
 extern void md_finish_reshape(struct mddev *mddev);
 void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev,
                        struct bio *bio, sector_t start, sector_t size);
-int acct_bioset_init(struct mddev *mddev);
-void acct_bioset_exit(struct mddev *mddev);
 void md_account_bio(struct mddev *mddev, struct bio **bio);
 
 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
index 7c6a0b4437d8fcfc44d217bee4bd3b186d0122ee..c50a7abda744ad13262378a83fec2dbde0e00b9a 100644 (file)
@@ -377,7 +377,6 @@ static void raid0_free(struct mddev *mddev, void *priv)
        struct r0conf *conf = priv;
 
        free_conf(mddev, conf);
-       acct_bioset_exit(mddev);
 }
 
 static int raid0_run(struct mddev *mddev)
@@ -392,16 +391,11 @@ static int raid0_run(struct mddev *mddev)
        if (md_check_no_bitmap(mddev))
                return -EINVAL;
 
-       if (acct_bioset_init(mddev)) {
-               pr_err("md/raid0:%s: alloc acct bioset failed.\n", mdname(mddev));
-               return -ENOMEM;
-       }
-
        /* if private is not null, we are here after takeover */
        if (mddev->private == NULL) {
                ret = create_strip_zones(mddev, &conf);
                if (ret < 0)
-                       goto exit_acct_set;
+                       return ret;
                mddev->private = conf;
        }
        conf = mddev->private;
@@ -432,15 +426,9 @@ static int raid0_run(struct mddev *mddev)
 
        ret = md_integrity_register(mddev);
        if (ret)
-               goto free;
+               free_conf(mddev, conf);
 
        return ret;
-
-free:
-       free_conf(mddev, conf);
-exit_acct_set:
-       acct_bioset_exit(mddev);
-       return ret;
 }
 
 /*
index 4315dabd3202301eea3d9033a404fca22f8d899b..6e80a439ec45662a7c4e16ddec1168e2f0ca87b2 100644 (file)
@@ -7770,19 +7770,12 @@ static int raid5_run(struct mddev *mddev)
        struct md_rdev *rdev;
        struct md_rdev *journal_dev = NULL;
        sector_t reshape_offset = 0;
-       int i, ret = 0;
+       int i;
        long long min_offset_diff = 0;
        int first = 1;
 
-       if (acct_bioset_init(mddev)) {
-               pr_err("md/raid456:%s: alloc acct bioset failed.\n", mdname(mddev));
+       if (mddev_init_writes_pending(mddev) < 0)
                return -ENOMEM;
-       }
-
-       if (mddev_init_writes_pending(mddev) < 0) {
-               ret = -ENOMEM;
-               goto exit_acct_set;
-       }
 
        if (mddev->recovery_cp != MaxSector)
                pr_notice("md/raid:%s: not clean -- starting background reconstruction\n",
@@ -7813,8 +7806,7 @@ static int raid5_run(struct mddev *mddev)
            (mddev->bitmap_info.offset || mddev->bitmap_info.file)) {
                pr_notice("md/raid:%s: array cannot have both journal and bitmap\n",
                          mdname(mddev));
-               ret = -EINVAL;
-               goto exit_acct_set;
+               return -EINVAL;
        }
 
        if (mddev->reshape_position != MaxSector) {
@@ -7839,15 +7831,13 @@ static int raid5_run(struct mddev *mddev)
                if (journal_dev) {
                        pr_warn("md/raid:%s: don't support reshape with journal - aborting.\n",
                                mdname(mddev));
-                       ret = -EINVAL;
-                       goto exit_acct_set;
+                       return -EINVAL;
                }
 
                if (mddev->new_level != mddev->level) {
                        pr_warn("md/raid:%s: unsupported reshape required - aborting.\n",
                                mdname(mddev));
-                       ret = -EINVAL;
-                       goto exit_acct_set;
+                       return -EINVAL;
                }
                old_disks = mddev->raid_disks - mddev->delta_disks;
                /* reshape_position must be on a new-stripe boundary, and one
@@ -7863,8 +7853,7 @@ static int raid5_run(struct mddev *mddev)
                if (sector_div(here_new, chunk_sectors * new_data_disks)) {
                        pr_warn("md/raid:%s: reshape_position not on a stripe boundary\n",
                                mdname(mddev));
-                       ret = -EINVAL;
-                       goto exit_acct_set;
+                       return -EINVAL;
                }
                reshape_offset = here_new * chunk_sectors;
                /* here_new is the stripe we will write to */
@@ -7886,8 +7875,7 @@ static int raid5_run(struct mddev *mddev)
                        else if (mddev->ro == 0) {
                                pr_warn("md/raid:%s: in-place reshape must be started in read-only mode - aborting\n",
                                        mdname(mddev));
-                               ret = -EINVAL;
-                               goto exit_acct_set;
+                               return -EINVAL;
                        }
                } else if (mddev->reshape_backwards
                    ? (here_new * chunk_sectors + min_offset_diff <=
@@ -7897,8 +7885,7 @@ static int raid5_run(struct mddev *mddev)
                        /* Reading from the same stripe as writing to - bad */
                        pr_warn("md/raid:%s: reshape_position too early for auto-recovery - aborting.\n",
                                mdname(mddev));
-                       ret = -EINVAL;
-                       goto exit_acct_set;
+                       return -EINVAL;
                }
                pr_debug("md/raid:%s: reshape will continue\n", mdname(mddev));
                /* OK, we should be able to continue; */
@@ -7922,10 +7909,8 @@ static int raid5_run(struct mddev *mddev)
        else
                conf = mddev->private;
 
-       if (IS_ERR(conf)) {
-               ret = PTR_ERR(conf);
-               goto exit_acct_set;
-       }
+       if (IS_ERR(conf))
+               return PTR_ERR(conf);
 
        if (test_bit(MD_HAS_JOURNAL, &mddev->flags)) {
                if (!journal_dev) {
@@ -8125,10 +8110,7 @@ abort:
        free_conf(conf);
        mddev->private = NULL;
        pr_warn("md/raid:%s: failed to run raid set.\n", mdname(mddev));
-       ret = -EIO;
-exit_acct_set:
-       acct_bioset_exit(mddev);
-       return ret;
+       return -EIO;
 }
 
 static void raid5_free(struct mddev *mddev, void *priv)
@@ -8136,7 +8118,6 @@ static void raid5_free(struct mddev *mddev, void *priv)
        struct r5conf *conf = priv;
 
        free_conf(conf);
-       acct_bioset_exit(mddev);
        mddev->to_remove = &raid5_attrs_group;
 }