|
@@ -428,6 +428,9 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
|
|
|
front_pad = 0;
|
|
|
inline_vecs = nr_iovecs;
|
|
|
} else {
|
|
|
+ /* should not use nobvec bioset for nr_iovecs > 0 */
|
|
|
+ if (WARN_ON_ONCE(!bs->bvec_pool && nr_iovecs > 0))
|
|
|
+ return NULL;
|
|
|
/*
|
|
|
* generic_make_request() converts recursion to iteration; this
|
|
|
* means if we're running beneath it, any bios we allocate and
|
|
@@ -1900,20 +1903,9 @@ void bioset_free(struct bio_set *bs)
|
|
|
}
|
|
|
EXPORT_SYMBOL(bioset_free);
|
|
|
|
|
|
-/**
|
|
|
- * bioset_create - Create a bio_set
|
|
|
- * @pool_size: Number of bio and bio_vecs to cache in the mempool
|
|
|
- * @front_pad: Number of bytes to allocate in front of the returned bio
|
|
|
- *
|
|
|
- * Description:
|
|
|
- * Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
|
|
|
- * to ask for a number of bytes to be allocated in front of the bio.
|
|
|
- * Front pad allocation is useful for embedding the bio inside
|
|
|
- * another structure, to avoid allocating extra data to go with the bio.
|
|
|
- * Note that the bio must be embedded at the END of that structure always,
|
|
|
- * or things will break badly.
|
|
|
- */
|
|
|
-struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
|
|
+static struct bio_set *__bioset_create(unsigned int pool_size,
|
|
|
+ unsigned int front_pad,
|
|
|
+ bool create_bvec_pool)
|
|
|
{
|
|
|
unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
|
|
|
struct bio_set *bs;
|
|
@@ -1938,9 +1930,11 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
|
|
if (!bs->bio_pool)
|
|
|
goto bad;
|
|
|
|
|
|
- bs->bvec_pool = biovec_create_pool(pool_size);
|
|
|
- if (!bs->bvec_pool)
|
|
|
- goto bad;
|
|
|
+ if (create_bvec_pool) {
|
|
|
+ bs->bvec_pool = biovec_create_pool(pool_size);
|
|
|
+ if (!bs->bvec_pool)
|
|
|
+ goto bad;
|
|
|
+ }
|
|
|
|
|
|
bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
|
|
|
if (!bs->rescue_workqueue)
|
|
@@ -1951,8 +1945,41 @@ bad:
|
|
|
bioset_free(bs);
|
|
|
return NULL;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * bioset_create - Create a bio_set
|
|
|
+ * @pool_size: Number of bio and bio_vecs to cache in the mempool
|
|
|
+ * @front_pad: Number of bytes to allocate in front of the returned bio
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
|
|
|
+ * to ask for a number of bytes to be allocated in front of the bio.
|
|
|
+ * Front pad allocation is useful for embedding the bio inside
|
|
|
+ * another structure, to avoid allocating extra data to go with the bio.
|
|
|
+ * Note that the bio must be embedded at the END of that structure always,
|
|
|
+ * or things will break badly.
|
|
|
+ */
|
|
|
+struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
|
|
+{
|
|
|
+ return __bioset_create(pool_size, front_pad, true);
|
|
|
+}
|
|
|
EXPORT_SYMBOL(bioset_create);
|
|
|
|
|
|
+/**
|
|
|
+ * bioset_create_nobvec - Create a bio_set without bio_vec mempool
|
|
|
+ * @pool_size: Number of bio to cache in the mempool
|
|
|
+ * @front_pad: Number of bytes to allocate in front of the returned bio
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Same functionality as bioset_create() except that mempool is not
|
|
|
+ * created for bio_vecs. Saving some memory for bio_clone_fast() users.
|
|
|
+ */
|
|
|
+struct bio_set *bioset_create_nobvec(unsigned int pool_size, unsigned int front_pad)
|
|
|
+{
|
|
|
+ return __bioset_create(pool_size, front_pad, false);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(bioset_create_nobvec);
|
|
|
+
|
|
|
#ifdef CONFIG_BLK_CGROUP
|
|
|
/**
|
|
|
* bio_associate_current - associate a bio with %current
|