]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/bio.c
block: Ues bi_pool for bio_integrity_alloc()
[mirror_ubuntu-zesty-kernel.git] / fs / bio.c
index 71072ab99128aadf1090e2ceab32bae67827dc9c..b14f71adff4ad4fcf396e72547f48a304fde02a4 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -241,7 +241,7 @@ void bio_free(struct bio *bio, struct bio_set *bs)
                bvec_free_bs(bs, bio->bi_io_vec, BIO_POOL_IDX(bio));
 
        if (bio_integrity(bio))
-               bio_integrity_free(bio, bs);
+               bio_integrity_free(bio);
 
        /*
         * If we have front padding, adjust the bio pointer before freeing
@@ -272,10 +272,6 @@ EXPORT_SYMBOL(bio_init);
  *   bio_alloc_bioset will try its own mempool to satisfy the allocation.
  *   If %__GFP_WAIT is set then we will block on the internal pool waiting
  *   for a &struct bio to become free.
- *
- *   Note that the caller must set ->bi_destructor on successful return
- *   of a bio, to do the appropriate freeing of the bio once the reference
- *   count drops to zero.
  **/
 struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
 {
@@ -290,6 +286,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
        bio = p + bs->front_pad;
 
        bio_init(bio);
+       bio->bi_pool = bs;
 
        if (unlikely(!nr_iovecs))
                goto out_set;
@@ -316,11 +313,6 @@ err_free:
 }
 EXPORT_SYMBOL(bio_alloc_bioset);
 
-static void bio_fs_destructor(struct bio *bio)
-{
-       bio_free(bio, fs_bio_set);
-}
-
 /**
  *     bio_alloc - allocate a new bio, memory pool backed
  *     @gfp_mask: allocation mask to use
@@ -342,19 +334,14 @@ static void bio_fs_destructor(struct bio *bio)
  */
 struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
 {
-       struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
-
-       if (bio)
-               bio->bi_destructor = bio_fs_destructor;
-
-       return bio;
+       return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
 }
 EXPORT_SYMBOL(bio_alloc);
 
 static void bio_kmalloc_destructor(struct bio *bio)
 {
        if (bio_integrity(bio))
-               bio_integrity_free(bio, fs_bio_set);
+               bio_integrity_free(bio);
        kfree(bio);
 }
 
@@ -423,7 +410,16 @@ void bio_put(struct bio *bio)
        if (atomic_dec_and_test(&bio->bi_cnt)) {
                bio_disassociate_task(bio);
                bio->bi_next = NULL;
-               bio->bi_destructor(bio);
+
+               /*
+                * This if statement is temporary - bi_pool is replacing
+                * bi_destructor, but bi_destructor will be taken out in another
+                * patch.
+                */
+               if (bio->bi_pool)
+                       bio_free(bio, bio->bi_pool);
+               else
+                       bio->bi_destructor(bio);
        }
 }
 EXPORT_SYMBOL(bio_put);
@@ -474,18 +470,17 @@ EXPORT_SYMBOL(__bio_clone);
  */
 struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
 {
-       struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
+       struct bio *b = bio_alloc(gfp_mask, bio->bi_max_vecs);
 
        if (!b)
                return NULL;
 
-       b->bi_destructor = bio_fs_destructor;
        __bio_clone(b, bio);
 
        if (bio_integrity(bio)) {
                int ret;
 
-               ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set);
+               ret = bio_integrity_clone(b, bio, gfp_mask);
 
                if (ret < 0) {
                        bio_put(b);