/* to allocate from that set */
 extern struct bio *bio_alloc_drbd(gfp_t gfp_mask);
 
+/* And a bio_set for cloning */
+extern struct bio_set *drbd_io_bio_set;
+
 extern struct mutex resources_mutex;
 
 extern int conn_lowest_minor(struct drbd_connection *connection);
 
 mempool_t *drbd_ee_mempool;
 mempool_t *drbd_md_io_page_pool;
 struct bio_set *drbd_md_io_bio_set;
+struct bio_set *drbd_io_bio_set;
 
 /* I do not use a standard mempool, because:
    1) I want to hand out the pre-allocated objects first.
 
        /* D_ASSERT(device, atomic_read(&drbd_pp_vacant)==0); */
 
+       if (drbd_io_bio_set)
+               bioset_free(drbd_io_bio_set);
        if (drbd_md_io_bio_set)
                bioset_free(drbd_md_io_bio_set);
        if (drbd_md_io_page_pool)
        if (drbd_al_ext_cache)
                kmem_cache_destroy(drbd_al_ext_cache);
 
+       drbd_io_bio_set      = NULL;
        drbd_md_io_bio_set   = NULL;
        drbd_md_io_page_pool = NULL;
        drbd_ee_mempool      = NULL;
        drbd_pp_pool         = NULL;
        drbd_md_io_page_pool = NULL;
        drbd_md_io_bio_set   = NULL;
+       drbd_io_bio_set      = NULL;
 
        /* caches */
        drbd_request_cache = kmem_cache_create(
                goto Enomem;
 
        /* mempools */
+       drbd_io_bio_set = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_RESCUER);
+       if (drbd_io_bio_set == NULL)
+               goto Enomem;
+
        drbd_md_io_bio_set = bioset_create(DRBD_MIN_POOL_PAGES, 0,
                                           BIOSET_NEED_BVECS |
                                           BIOSET_NEED_RESCUER);
 
 static inline void drbd_req_make_private_bio(struct drbd_request *req, struct bio *bio_src)
 {
        struct bio *bio;
-       bio = bio_clone(bio_src, GFP_NOIO); /* XXX cannot fail?? */
+       bio = bio_clone_fast(bio_src, GFP_NOIO, drbd_io_bio_set);
 
        req->private_bio = bio;