- int i;
-
- for (i = 0; i < BIOVEC_NR_POOLS; i++) {
- struct biovec_slab *bp = bvec_slabs + i;
- mempool_t **bvp = bs->bvec_pools + i;
-
- if (i >= scale)
- pool_entries >>= 1;
-
- *bvp = mempool_create(pool_entries, mempool_alloc_slab,
- mempool_free_slab, bp->slab);
- if (!*bvp)
- return -ENOMEM;
- }
- return 0;
-}
-
-static void biovec_free_pools(struct bio_set *bs)
-{
- int i;
-
- for (i = 0; i < BIOVEC_NR_POOLS; i++) {
- mempool_t *bvp = bs->bvec_pools[i];
-
- if (bvp)
- mempool_destroy(bvp);
- }
-
-}
-
-void bioset_free(struct bio_set *bs)
-{
- if (bs->bio_pool)
- mempool_destroy(bs->bio_pool);
-
- biovec_free_pools(bs);
-
- kfree(bs);
-}
-
-struct bio_set *bioset_create(int bio_pool_size, int bvec_pool_size, int scale)
-{
- struct bio_set *bs = kmalloc(sizeof(*bs), GFP_KERNEL);
-
- if (!bs)
- return NULL;
-
- memset(bs, 0, sizeof(*bs));
- bs->bio_pool = mempool_create(bio_pool_size, mempool_alloc_slab,
- mempool_free_slab, bio_slab);
-
- if (!bs->bio_pool)
- goto bad;
-
- if (!biovec_create_pools(bs, bvec_pool_size, scale))
- return bs;
-
-bad:
- bioset_free(bs);
- return NULL;
-}
-
-static void __init biovec_init_slabs(void)
-{
- int i;
-
- for (i = 0; i < BIOVEC_NR_POOLS; i++) {
- int size;
- struct biovec_slab *bvs = bvec_slabs + i;
-
- size = bvs->nr_vecs * sizeof(struct bio_vec);
- bvs->slab = kmem_cache_create(bvs->name, size, 0,
- SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
- }
-}
-
-static int __init init_bio(void)
-{
- int megabytes, bvec_pool_entries;