Convert md to embedded bio sets.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
                }
        }
        if (failit) {
-               struct bio *b = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set);
+               struct bio *b = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
 
                bio_set_dev(b, conf->rdev->bdev);
                b->bi_private = bio;
 
        if (unlikely(bio_end_sector(bio) > end_sector)) {
                /* This bio crosses a device boundary, so we have to split it */
                struct bio *split = bio_split(bio, end_sector - bio_sector,
-                                             GFP_NOIO, mddev->bio_set);
+                                             GFP_NOIO, &mddev->bio_set);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
 
 
        bio->bi_status = status;
        bio_endio(bio);
-       mempool_free(mp_bh, conf->pool);
+       mempool_free(mp_bh, &conf->pool);
 }
 
 static void multipath_end_request(struct bio *bio)
                return true;
        }
 
-       mp_bh = mempool_alloc(conf->pool, GFP_NOIO);
+       mp_bh = mempool_alloc(&conf->pool, GFP_NOIO);
 
        mp_bh->master_bio = bio;
        mp_bh->mddev = mddev;
        mp_bh->path = multipath_map(conf);
        if (mp_bh->path < 0) {
                bio_io_error(bio);
-               mempool_free(mp_bh, conf->pool);
+               mempool_free(mp_bh, &conf->pool);
                return true;
        }
        multipath = conf->multipaths + mp_bh->path;
        struct multipath_info *disk;
        struct md_rdev *rdev;
        int working_disks;
+       int ret;
 
        if (md_check_no_bitmap(mddev))
                return -EINVAL;
        }
        mddev->degraded = conf->raid_disks - working_disks;
 
-       conf->pool = mempool_create_kmalloc_pool(NR_RESERVED_BUFS,
-                                                sizeof(struct multipath_bh));
-       if (conf->pool == NULL)
+       ret = mempool_init_kmalloc_pool(&conf->pool, NR_RESERVED_BUFS,
+                                       sizeof(struct multipath_bh));
+       if (ret)
                goto out_free_conf;
 
        mddev->thread = md_register_thread(multipathd, mddev,
        return 0;
 
 out_free_conf:
-       mempool_destroy(conf->pool);
+       mempool_exit(&conf->pool);
        kfree(conf->multipaths);
        kfree(conf);
        mddev->private = NULL;
 {
        struct mpconf *conf = priv;
 
-       mempool_destroy(conf->pool);
+       mempool_exit(&conf->pool);
        kfree(conf->multipaths);
        kfree(conf);
 }
 
        spinlock_t              device_lock;
        struct list_head        retry_list;
 
-       mempool_t               *pool;
+       mempool_t               pool;
 };
 
 /*
 
 {
        struct bio *b;
 
-       if (!mddev || !mddev->bio_set)
+       if (!mddev || !bioset_initialized(&mddev->bio_set))
                return bio_alloc(gfp_mask, nr_iovecs);
 
-       b = bio_alloc_bioset(gfp_mask, nr_iovecs, mddev->bio_set);
+       b = bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set);
        if (!b)
                return NULL;
        return b;
 
 static struct bio *md_bio_alloc_sync(struct mddev *mddev)
 {
-       if (!mddev || !mddev->sync_set)
+       if (!mddev || !bioset_initialized(&mddev->sync_set))
                return bio_alloc(GFP_NOIO, 1);
 
-       return bio_alloc_bioset(GFP_NOIO, 1, mddev->sync_set);
+       return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set);
 }
 
 /*
 
 static void mddev_put(struct mddev *mddev)
 {
-       struct bio_set *bs = NULL, *sync_bs = NULL;
+       struct bio_set bs, sync_bs;
+
+       memset(&bs, 0, sizeof(bs));
+       memset(&sync_bs, 0, sizeof(sync_bs));
 
        if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
                return;
                list_del_init(&mddev->all_mddevs);
                bs = mddev->bio_set;
                sync_bs = mddev->sync_set;
-               mddev->bio_set = NULL;
-               mddev->sync_set = NULL;
+               memset(&mddev->bio_set, 0, sizeof(mddev->bio_set));
+               memset(&mddev->sync_set, 0, sizeof(mddev->sync_set));
                if (mddev->gendisk) {
                        /* We did a probe so need to clean up.  Call
                         * queue_work inside the spinlock so that
                        kfree(mddev);
        }
        spin_unlock(&all_mddevs_lock);
-       if (bs)
-               bioset_free(bs);
-       if (sync_bs)
-               bioset_free(sync_bs);
+       bioset_exit(&bs);
+       bioset_exit(&sync_bs);
 }
 
 static void md_safemode_timeout(struct timer_list *t);
                               bdev_get_integrity(reference->bdev));
 
        pr_debug("md: data integrity enabled on %s\n", mdname(mddev));
-       if (bioset_integrity_create(mddev->bio_set, BIO_POOL_SIZE)) {
+       if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE)) {
                pr_err("md: failed to create integrity pool for %s\n",
                       mdname(mddev));
                return -EINVAL;
                sysfs_notify_dirent_safe(rdev->sysfs_state);
        }
 
-       if (mddev->bio_set == NULL) {
-               mddev->bio_set = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
-               if (!mddev->bio_set)
-                       return -ENOMEM;
+       if (!bioset_initialized(&mddev->bio_set)) {
+               err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
+               if (err)
+                       return err;
        }
-       if (mddev->sync_set == NULL) {
-               mddev->sync_set = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
-               if (!mddev->sync_set) {
-                       err = -ENOMEM;
+       if (!bioset_initialized(&mddev->sync_set)) {
+               err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
+               if (err)
                        goto abort;
-               }
        }
 
        spin_lock(&pers_lock);
        return 0;
 
 abort:
-       if (mddev->bio_set) {
-               bioset_free(mddev->bio_set);
-               mddev->bio_set = NULL;
-       }
-       if (mddev->sync_set) {
-               bioset_free(mddev->sync_set);
-               mddev->sync_set = NULL;
-       }
+       bioset_exit(&mddev->bio_set);
+       bioset_exit(&mddev->sync_set);
 
        return err;
 }
         * This is called from dm-raid
         */
        __md_stop(mddev);
-       if (mddev->bio_set) {
-               bioset_free(mddev->bio_set);
-               mddev->bio_set = NULL;
-       }
-       if (mddev->sync_set) {
-               bioset_free(mddev->sync_set);
-               mddev->sync_set = NULL;
-       }
+       bioset_exit(&mddev->bio_set);
+       bioset_exit(&mddev->sync_set);
 }
 
 EXPORT_SYMBOL_GPL(md_stop);
 
 
        struct attribute_group          *to_remove;
 
-       struct bio_set                  *bio_set;
-       struct bio_set                  *sync_set; /* for sync operations like
+       struct bio_set                  bio_set;
+       struct bio_set                  sync_set; /* for sync operations like
                                                   * metadata and bitmap writes
                                                   */
 
 
        if (bio_end_sector(bio) > zone->zone_end) {
                struct bio *split = bio_split(bio,
                        zone->zone_end - bio->bi_iter.bi_sector, GFP_NOIO,
-                       mddev->bio_set);
+                       &mddev->bio_set);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
        sector = bio_sector;
 
        if (sectors < bio_sectors(bio)) {
-               struct bio *split = bio_split(bio, sectors, GFP_NOIO, mddev->bio_set);
+               struct bio *split = bio_split(bio, sectors, GFP_NOIO,
+                                             &mddev->bio_set);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
 
        struct r1conf *conf = r1_bio->mddev->private;
 
        put_all_bios(conf, r1_bio);
-       mempool_free(r1_bio, conf->r1bio_pool);
+       mempool_free(r1_bio, &conf->r1bio_pool);
 }
 
 static void put_buf(struct r1bio *r1_bio)
                        rdev_dec_pending(conf->mirrors[i].rdev, r1_bio->mddev);
        }
 
-       mempool_free(r1_bio, conf->r1buf_pool);
+       mempool_free(r1_bio, &conf->r1buf_pool);
 
        lower_barrier(conf, sect);
 }
        struct r1conf *conf = mddev->private;
        struct r1bio *r1_bio;
 
-       r1_bio = mempool_alloc(conf->r1bio_pool, GFP_NOIO);
+       r1_bio = mempool_alloc(&conf->r1bio_pool, GFP_NOIO);
        /* Ensure no bio records IO_BLOCKED */
        memset(r1_bio->bios, 0, conf->raid_disks * sizeof(r1_bio->bios[0]));
        init_r1bio(r1_bio, mddev, bio);
 
        if (max_sectors < bio_sectors(bio)) {
                struct bio *split = bio_split(bio, max_sectors,
-                                             gfp, conf->bio_split);
+                                             gfp, &conf->bio_split);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
 
        r1_bio->read_disk = rdisk;
 
-       read_bio = bio_clone_fast(bio, gfp, mddev->bio_set);
+       read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
 
        r1_bio->bios[rdisk] = read_bio;
 
 
        if (max_sectors < bio_sectors(bio)) {
                struct bio *split = bio_split(bio, max_sectors,
-                                             GFP_NOIO, conf->bio_split);
+                                             GFP_NOIO, &conf->bio_split);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
 
                if (r1_bio->behind_master_bio)
                        mbio = bio_clone_fast(r1_bio->behind_master_bio,
-                                             GFP_NOIO, mddev->bio_set);
+                                             GFP_NOIO, &mddev->bio_set);
                else
-                       mbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set);
+                       mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
 
                if (r1_bio->behind_master_bio) {
                        if (test_bit(WriteMostly, &conf->mirrors[i].rdev->flags))
                _allow_barrier(conf, idx);
        }
 
-       mempool_destroy(conf->r1buf_pool);
-       conf->r1buf_pool = NULL;
+       mempool_exit(&conf->r1buf_pool);
 }
 
 static int raid1_spare_active(struct mddev *mddev)
                if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
                        wbio = bio_clone_fast(r1_bio->behind_master_bio,
                                              GFP_NOIO,
-                                             mddev->bio_set);
+                                             &mddev->bio_set);
                } else {
                        wbio = bio_clone_fast(r1_bio->master_bio, GFP_NOIO,
-                                             mddev->bio_set);
+                                             &mddev->bio_set);
                }
 
                bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);
        int buffs;
 
        buffs = RESYNC_WINDOW / RESYNC_BLOCK_SIZE;
-       BUG_ON(conf->r1buf_pool);
-       conf->r1buf_pool = mempool_create(buffs, r1buf_pool_alloc, r1buf_pool_free,
-                                         conf->poolinfo);
-       if (!conf->r1buf_pool)
-               return -ENOMEM;
-       return 0;
+       BUG_ON(mempool_initialized(&conf->r1buf_pool));
+
+       return mempool_init(&conf->r1buf_pool, buffs, r1buf_pool_alloc,
+                           r1buf_pool_free, conf->poolinfo);
 }
 
 static struct r1bio *raid1_alloc_init_r1buf(struct r1conf *conf)
 {
-       struct r1bio *r1bio = mempool_alloc(conf->r1buf_pool, GFP_NOIO);
+       struct r1bio *r1bio = mempool_alloc(&conf->r1buf_pool, GFP_NOIO);
        struct resync_pages *rps;
        struct bio *bio;
        int i;
        int idx = sector_to_idx(sector_nr);
        int page_idx = 0;
 
-       if (!conf->r1buf_pool)
+       if (!mempool_initialized(&conf->r1buf_pool))
                if (init_resync(conf))
                        return 0;
 
        if (!conf->poolinfo)
                goto abort;
        conf->poolinfo->raid_disks = mddev->raid_disks * 2;
-       conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc,
-                                         r1bio_pool_free,
-                                         conf->poolinfo);
-       if (!conf->r1bio_pool)
+       err = mempool_init(&conf->r1bio_pool, NR_RAID1_BIOS, r1bio_pool_alloc,
+                          r1bio_pool_free, conf->poolinfo);
+       if (err)
                goto abort;
 
-       conf->bio_split = bioset_create(BIO_POOL_SIZE, 0, 0);
-       if (!conf->bio_split)
+       err = bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0);
+       if (err)
                goto abort;
 
        conf->poolinfo->mddev = mddev;
 
  abort:
        if (conf) {
-               mempool_destroy(conf->r1bio_pool);
+               mempool_exit(&conf->r1bio_pool);
                kfree(conf->mirrors);
                safe_put_page(conf->tmppage);
                kfree(conf->poolinfo);
                kfree(conf->nr_waiting);
                kfree(conf->nr_queued);
                kfree(conf->barrier);
-               if (conf->bio_split)
-                       bioset_free(conf->bio_split);
+               bioset_exit(&conf->bio_split);
                kfree(conf);
        }
        return ERR_PTR(err);
 {
        struct r1conf *conf = priv;
 
-       mempool_destroy(conf->r1bio_pool);
+       mempool_exit(&conf->r1bio_pool);
        kfree(conf->mirrors);
        safe_put_page(conf->tmppage);
        kfree(conf->poolinfo);
        kfree(conf->nr_waiting);
        kfree(conf->nr_queued);
        kfree(conf->barrier);
-       if (conf->bio_split)
-               bioset_free(conf->bio_split);
+       bioset_exit(&conf->bio_split);
        kfree(conf);
 }
 
         * At the same time, we "pack" the devices so that all the missing
         * devices have the higher raid_disk numbers.
         */
-       mempool_t *newpool, *oldpool;
+       mempool_t newpool, oldpool;
        struct pool_info *newpoolinfo;
        struct raid1_info *newmirrors;
        struct r1conf *conf = mddev->private;
        int cnt, raid_disks;
        unsigned long flags;
        int d, d2;
+       int ret;
+
+       memset(&newpool, 0, sizeof(newpool));
+       memset(&oldpool, 0, sizeof(oldpool));
 
        /* Cannot change chunk_size, layout, or level */
        if (mddev->chunk_sectors != mddev->new_chunk_sectors ||
        newpoolinfo->mddev = mddev;
        newpoolinfo->raid_disks = raid_disks * 2;
 
-       newpool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc,
-                                r1bio_pool_free, newpoolinfo);
-       if (!newpool) {
+       ret = mempool_init(&newpool, NR_RAID1_BIOS, r1bio_pool_alloc,
+                          r1bio_pool_free, newpoolinfo);
+       if (ret) {
                kfree(newpoolinfo);
-               return -ENOMEM;
+               return ret;
        }
        newmirrors = kzalloc(sizeof(struct raid1_info) * raid_disks * 2,
                             GFP_KERNEL);
        if (!newmirrors) {
                kfree(newpoolinfo);
-               mempool_destroy(newpool);
+               mempool_exit(&newpool);
                return -ENOMEM;
        }
 
        set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        md_wakeup_thread(mddev->thread);
 
-       mempool_destroy(oldpool);
+       mempool_exit(&oldpool);
        return 0;
 }
 
 
         * mempools - it changes when the array grows or shrinks
         */
        struct pool_info        *poolinfo;
-       mempool_t               *r1bio_pool;
-       mempool_t               *r1buf_pool;
+       mempool_t               r1bio_pool;
+       mempool_t               r1buf_pool;
 
-       struct bio_set          *bio_split;
+       struct bio_set          bio_split;
 
        /* temporary buffer to synchronous IO when attempting to repair
         * a read error.
 
        struct r10conf *conf = r10_bio->mddev->private;
 
        put_all_bios(conf, r10_bio);
-       mempool_free(r10_bio, conf->r10bio_pool);
+       mempool_free(r10_bio, &conf->r10bio_pool);
 }
 
 static void put_buf(struct r10bio *r10_bio)
 {
        struct r10conf *conf = r10_bio->mddev->private;
 
-       mempool_free(r10_bio, conf->r10buf_pool);
+       mempool_free(r10_bio, &conf->r10buf_pool);
 
        lower_barrier(conf);
 }
                                   (unsigned long long)r10_bio->sector);
        if (max_sectors < bio_sectors(bio)) {
                struct bio *split = bio_split(bio, max_sectors,
-                                             gfp, conf->bio_split);
+                                             gfp, &conf->bio_split);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
        }
        slot = r10_bio->read_slot;
 
-       read_bio = bio_clone_fast(bio, gfp, mddev->bio_set);
+       read_bio = bio_clone_fast(bio, gfp, &mddev->bio_set);
 
        r10_bio->devs[slot].bio = read_bio;
        r10_bio->devs[slot].rdev = rdev;
        } else
                rdev = conf->mirrors[devnum].rdev;
 
-       mbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set);
+       mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
        if (replacement)
                r10_bio->devs[n_copy].repl_bio = mbio;
        else
 
        if (r10_bio->sectors < bio_sectors(bio)) {
                struct bio *split = bio_split(bio, r10_bio->sectors,
-                                             GFP_NOIO, conf->bio_split);
+                                             GFP_NOIO, &conf->bio_split);
                bio_chain(split, bio);
                generic_make_request(bio);
                bio = split;
        struct r10conf *conf = mddev->private;
        struct r10bio *r10_bio;
 
-       r10_bio = mempool_alloc(conf->r10bio_pool, GFP_NOIO);
+       r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO);
 
        r10_bio->master_bio = bio;
        r10_bio->sectors = sectors;
        wait_barrier(conf);
        allow_barrier(conf);
 
-       mempool_destroy(conf->r10buf_pool);
-       conf->r10buf_pool = NULL;
+       mempool_exit(&conf->r10buf_pool);
 }
 
 static int raid10_spare_active(struct mddev *mddev)
                if (sectors > sect_to_write)
                        sectors = sect_to_write;
                /* Write at 'sector' for 'sectors' */
-               wbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set);
+               wbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set);
                bio_trim(wbio, sector - bio->bi_iter.bi_sector, sectors);
                wsector = r10_bio->devs[i].addr + (sector - r10_bio->sector);
                wbio->bi_iter.bi_sector = wsector +
 
 static int init_resync(struct r10conf *conf)
 {
-       int buffs;
-       int i;
+       int ret, buffs, i;
 
        buffs = RESYNC_WINDOW / RESYNC_BLOCK_SIZE;
-       BUG_ON(conf->r10buf_pool);
+       BUG_ON(mempool_initialized(&conf->r10buf_pool));
        conf->have_replacement = 0;
        for (i = 0; i < conf->geo.raid_disks; i++)
                if (conf->mirrors[i].replacement)
                        conf->have_replacement = 1;
-       conf->r10buf_pool = mempool_create(buffs, r10buf_pool_alloc, r10buf_pool_free, conf);
-       if (!conf->r10buf_pool)
-               return -ENOMEM;
+       ret = mempool_init(&conf->r10buf_pool, buffs,
+                          r10buf_pool_alloc, r10buf_pool_free, conf);
+       if (ret)
+               return ret;
        conf->next_resync = 0;
        return 0;
 }
 
 static struct r10bio *raid10_alloc_init_r10buf(struct r10conf *conf)
 {
-       struct r10bio *r10bio = mempool_alloc(conf->r10buf_pool, GFP_NOIO);
+       struct r10bio *r10bio = mempool_alloc(&conf->r10buf_pool, GFP_NOIO);
        struct rsync_pages *rp;
        struct bio *bio;
        int nalloc;
        sector_t chunk_mask = conf->geo.chunk_mask;
        int page_idx = 0;
 
-       if (!conf->r10buf_pool)
+       if (!mempool_initialized(&conf->r10buf_pool))
                if (init_resync(conf))
                        return 0;
 
 
        conf->geo = geo;
        conf->copies = copies;
-       conf->r10bio_pool = mempool_create(NR_RAID10_BIOS, r10bio_pool_alloc,
-                                          r10bio_pool_free, conf);
-       if (!conf->r10bio_pool)
+       err = mempool_init(&conf->r10bio_pool, NR_RAID10_BIOS, r10bio_pool_alloc,
+                          r10bio_pool_free, conf);
+       if (err)
                goto out;
 
-       conf->bio_split = bioset_create(BIO_POOL_SIZE, 0, 0);
-       if (!conf->bio_split)
+       err = bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0);
+       if (err)
                goto out;
 
        calc_sectors(conf, mddev->dev_sectors);
        init_waitqueue_head(&conf->wait_barrier);
        atomic_set(&conf->nr_pending, 0);
 
+       err = -ENOMEM;
        conf->thread = md_register_thread(raid10d, mddev, "raid10");
        if (!conf->thread)
                goto out;
 
  out:
        if (conf) {
-               mempool_destroy(conf->r10bio_pool);
+               mempool_exit(&conf->r10bio_pool);
                kfree(conf->mirrors);
                safe_put_page(conf->tmppage);
-               if (conf->bio_split)
-                       bioset_free(conf->bio_split);
+               bioset_exit(&conf->bio_split);
                kfree(conf);
        }
        return ERR_PTR(err);
 
 out_free_conf:
        md_unregister_thread(&mddev->thread);
-       mempool_destroy(conf->r10bio_pool);
+       mempool_exit(&conf->r10bio_pool);
        safe_put_page(conf->tmppage);
        kfree(conf->mirrors);
        kfree(conf);
 {
        struct r10conf *conf = priv;
 
-       mempool_destroy(conf->r10bio_pool);
+       mempool_exit(&conf->r10bio_pool);
        safe_put_page(conf->tmppage);
        kfree(conf->mirrors);
        kfree(conf->mirrors_old);
        kfree(conf->mirrors_new);
-       if (conf->bio_split)
-               bioset_free(conf->bio_split);
+       bioset_exit(&conf->bio_split);
        kfree(conf);
 }
 
                 * on all the target devices.
                 */
                // FIXME
-               mempool_free(r10_bio, conf->r10buf_pool);
+               mempool_free(r10_bio, &conf->r10buf_pool);
                set_bit(MD_RECOVERY_INTR, &mddev->recovery);
                return sectors_done;
        }
 
                                                   */
        wait_queue_head_t       wait_barrier;
 
-       mempool_t               *r10bio_pool;
-       mempool_t               *r10buf_pool;
+       mempool_t               r10bio_pool;
+       mempool_t               r10buf_pool;
        struct page             *tmppage;
-       struct bio_set          *bio_split;
+       struct bio_set          bio_split;
 
        /* When taking over an array from a different personality, we store
         * the new thread here until we fully activate the array.
 
        struct list_head no_mem_stripes;   /* pending stripes, -ENOMEM */
 
        struct kmem_cache *io_kc;
-       mempool_t *io_pool;
-       struct bio_set *bs;
-       mempool_t *meta_pool;
+       mempool_t io_pool;
+       struct bio_set bs;
+       mempool_t meta_pool;
 
        struct md_thread *reclaim_thread;
        unsigned long reclaim_target;   /* number of space that need to be
                md_error(log->rdev->mddev, log->rdev);
 
        bio_put(bio);
-       mempool_free(io->meta_page, log->meta_pool);
+       mempool_free(io->meta_page, &log->meta_pool);
 
        spin_lock_irqsave(&log->io_list_lock, flags);
        __r5l_set_io_unit_state(io, IO_UNIT_IO_END);
 
 static struct bio *r5l_bio_alloc(struct r5l_log *log)
 {
-       struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, log->bs);
+       struct bio *bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES, &log->bs);
 
        bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
        bio_set_dev(bio, log->rdev->bdev);
        struct r5l_io_unit *io;
        struct r5l_meta_block *block;
 
-       io = mempool_alloc(log->io_pool, GFP_ATOMIC);
+       io = mempool_alloc(&log->io_pool, GFP_ATOMIC);
        if (!io)
                return NULL;
        memset(io, 0, sizeof(*io));
        bio_list_init(&io->flush_barriers);
        io->state = IO_UNIT_RUNNING;
 
-       io->meta_page = mempool_alloc(log->meta_pool, GFP_NOIO);
+       io->meta_page = mempool_alloc(&log->meta_pool, GFP_NOIO);
        block = page_address(io->meta_page);
        clear_page(block);
        block->magic = cpu_to_le32(R5LOG_MAGIC);
                log->next_checkpoint = io->log_start;
 
                list_del(&io->log_sibling);
-               mempool_free(io, log->io_pool);
+               mempool_free(io, &log->io_pool);
                r5l_run_no_mem_stripe(log);
 
                found = true;
 {
        struct page *page;
 
-       ctx->ra_bio = bio_alloc_bioset(GFP_KERNEL, BIO_MAX_PAGES, log->bs);
+       ctx->ra_bio = bio_alloc_bioset(GFP_KERNEL, BIO_MAX_PAGES, &log->bs);
        if (!ctx->ra_bio)
                return -ENOMEM;
 
        struct request_queue *q = bdev_get_queue(rdev->bdev);
        struct r5l_log *log;
        char b[BDEVNAME_SIZE];
+       int ret;
 
        pr_debug("md/raid:%s: using device %s as journal\n",
                 mdname(conf->mddev), bdevname(rdev->bdev, b));
        if (!log->io_kc)
                goto io_kc;
 
-       log->io_pool = mempool_create_slab_pool(R5L_POOL_SIZE, log->io_kc);
-       if (!log->io_pool)
+       ret = mempool_init_slab_pool(&log->io_pool, R5L_POOL_SIZE, log->io_kc);
+       if (ret)
                goto io_pool;
 
-       log->bs = bioset_create(R5L_POOL_SIZE, 0, BIOSET_NEED_BVECS);
-       if (!log->bs)
+       ret = bioset_init(&log->bs, R5L_POOL_SIZE, 0, BIOSET_NEED_BVECS);
+       if (ret)
                goto io_bs;
 
-       log->meta_pool = mempool_create_page_pool(R5L_POOL_SIZE, 0);
-       if (!log->meta_pool)
+       ret = mempool_init_page_pool(&log->meta_pool, R5L_POOL_SIZE, 0);
+       if (ret)
                goto out_mempool;
 
        spin_lock_init(&log->tree_lock);
        rcu_assign_pointer(conf->log, NULL);
        md_unregister_thread(&log->reclaim_thread);
 reclaim_thread:
-       mempool_destroy(log->meta_pool);
+       mempool_exit(&log->meta_pool);
 out_mempool:
-       bioset_free(log->bs);
+       bioset_exit(&log->bs);
 io_bs:
-       mempool_destroy(log->io_pool);
+       mempool_exit(&log->io_pool);
 io_pool:
        kmem_cache_destroy(log->io_kc);
 io_kc:
        wake_up(&conf->mddev->sb_wait);
        flush_work(&log->disable_writeback_work);
        md_unregister_thread(&log->reclaim_thread);
-       mempool_destroy(log->meta_pool);
-       bioset_free(log->bs);
-       mempool_destroy(log->io_pool);
+       mempool_exit(&log->meta_pool);
+       bioset_exit(&log->bs);
+       mempool_exit(&log->io_pool);
        kmem_cache_destroy(log->io_kc);
        kfree(log);
 }
 
        atomic64_t seq;         /* current log write sequence number */
 
        struct kmem_cache *io_kc;
-       mempool_t *io_pool;
-       struct bio_set *bs;
-       struct bio_set *flush_bs;
+       mempool_t io_pool;
+       struct bio_set bs;
+       struct bio_set flush_bs;
 
        /* used only for recovery */
        int recovered_entries;
        struct ppl_header *pplhdr;
        struct page *header_page;
 
-       io = mempool_alloc(ppl_conf->io_pool, GFP_NOWAIT);
+       io = mempool_alloc(&ppl_conf->io_pool, GFP_NOWAIT);
        if (!io)
                return NULL;
 
                        struct bio *prev = bio;
 
                        bio = bio_alloc_bioset(GFP_NOIO, BIO_MAX_PAGES,
-                                              ppl_conf->bs);
+                                              &ppl_conf->bs);
                        bio->bi_opf = prev->bi_opf;
                        bio_copy_dev(bio, prev);
                        bio->bi_iter.bi_sector = bio_end_sector(prev);
        list_del(&io->log_sibling);
        spin_unlock(&log->io_list_lock);
 
-       mempool_free(io, ppl_conf->io_pool);
+       mempool_free(io, &ppl_conf->io_pool);
 
        spin_lock(&ppl_conf->no_mem_stripes_lock);
        if (!list_empty(&ppl_conf->no_mem_stripes)) {
                        struct bio *bio;
                        char b[BDEVNAME_SIZE];
 
-                       bio = bio_alloc_bioset(GFP_NOIO, 0, ppl_conf->flush_bs);
+                       bio = bio_alloc_bioset(GFP_NOIO, 0, &ppl_conf->flush_bs);
                        bio_set_dev(bio, bdev);
                        bio->bi_private = io;
                        bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
 
        kfree(ppl_conf->child_logs);
 
-       if (ppl_conf->bs)
-               bioset_free(ppl_conf->bs);
-       if (ppl_conf->flush_bs)
-               bioset_free(ppl_conf->flush_bs);
-       mempool_destroy(ppl_conf->io_pool);
+       bioset_exit(&ppl_conf->bs);
+       bioset_exit(&ppl_conf->flush_bs);
+       mempool_exit(&ppl_conf->io_pool);
        kmem_cache_destroy(ppl_conf->io_kc);
 
        kfree(ppl_conf);
                goto err;
        }
 
-       ppl_conf->io_pool = mempool_create(conf->raid_disks, ppl_io_pool_alloc,
-                                          ppl_io_pool_free, ppl_conf->io_kc);
-       if (!ppl_conf->io_pool) {
-               ret = -ENOMEM;
+       ret = mempool_init(&ppl_conf->io_pool, conf->raid_disks, ppl_io_pool_alloc,
+                          ppl_io_pool_free, ppl_conf->io_kc);
+       if (ret)
                goto err;
-       }
 
-       ppl_conf->bs = bioset_create(conf->raid_disks, 0, BIOSET_NEED_BVECS);
-       if (!ppl_conf->bs) {
-               ret = -ENOMEM;
+       ret = bioset_init(&ppl_conf->bs, conf->raid_disks, 0, BIOSET_NEED_BVECS);
+       if (ret)
                goto err;
-       }
 
-       ppl_conf->flush_bs = bioset_create(conf->raid_disks, 0, 0);
-       if (!ppl_conf->flush_bs) {
-               ret = -ENOMEM;
+       ret = bioset_init(&ppl_conf->flush_bs, conf->raid_disks, 0, 0);
+       if (ret)
                goto err;
-       }
 
        ppl_conf->count = conf->raid_disks;
        ppl_conf->child_logs = kcalloc(ppl_conf->count, sizeof(struct ppl_log),
 
        /*
         * use bio_clone_fast to make a copy of the bio
         */
-       align_bi = bio_clone_fast(raid_bio, GFP_NOIO, mddev->bio_set);
+       align_bi = bio_clone_fast(raid_bio, GFP_NOIO, &mddev->bio_set);
        if (!align_bi)
                return 0;
        /*
 
        if (sectors < bio_sectors(raid_bio)) {
                struct r5conf *conf = mddev->private;
-               split = bio_split(raid_bio, sectors, GFP_NOIO, conf->bio_split);
+               split = bio_split(raid_bio, sectors, GFP_NOIO, &conf->bio_split);
                bio_chain(split, raid_bio);
                generic_make_request(raid_bio);
                raid_bio = split;
                if (conf->disks[i].extra_page)
                        put_page(conf->disks[i].extra_page);
        kfree(conf->disks);
-       if (conf->bio_split)
-               bioset_free(conf->bio_split);
+       bioset_exit(&conf->bio_split);
        kfree(conf->stripe_hashtbl);
        kfree(conf->pending_data);
        kfree(conf);
        int i;
        int group_cnt, worker_cnt_per_group;
        struct r5worker_group *new_group;
+       int ret;
 
        if (mddev->new_level != 5
            && mddev->new_level != 4
                        goto abort;
        }
 
-       conf->bio_split = bioset_create(BIO_POOL_SIZE, 0, 0);
-       if (!conf->bio_split)
+       ret = bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0);
+       if (ret)
                goto abort;
        conf->mddev = mddev;
 
 
        int                     pool_size; /* number of disks in stripeheads in pool */
        spinlock_t              device_lock;
        struct disk_info        *disks;
-       struct bio_set          *bio_split;
+       struct bio_set          bio_split;
 
        /* When taking over an array from a different personality, we store
         * the new thread here until we fully activate the array.