bio: make freeing of ->bi_io_vec conditional in bio_free()
authorJens Axboe <jens.axboe@oracle.com>
Wed, 18 Jul 2007 11:18:08 +0000 (13:18 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 16 Oct 2007 09:03:52 +0000 (11:03 +0200)
The empty barrier patches do not carry data, so they have no
iovec attached.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/bio.c

index ac987fc7acd99450f935ef11912db916379994c9..d59ddbf79626cd0ca546a15bac0196544445fafd 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -109,11 +109,14 @@ static inline struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned lon
 
 void bio_free(struct bio *bio, struct bio_set *bio_set)
 {
-       const int pool_idx = BIO_POOL_IDX(bio);
+       if (bio->bi_io_vec) {
+               const int pool_idx = BIO_POOL_IDX(bio);
 
-       BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
+               BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
+
+               mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
+       }
 
-       mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
        mempool_free(bio, bio_set->bio_pool);
 }