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)) {
        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);
        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)
 }
 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;
 
 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);
 
        struct r0conf *conf = priv;
 
        free_conf(mddev, conf);
-       acct_bioset_exit(mddev);
 }
 
 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;
 
        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;
 }
 
 /*
 
        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",
            (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) {
                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
                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 */
                        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 <=
                        /* 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; */
        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) {
        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)
        struct r5conf *conf = priv;
 
        free_conf(conf);
-       acct_bioset_exit(mddev);
        mddev->to_remove = &raid5_attrs_group;
 }