Skip to content

Commit

Permalink
block: Add an explicit bio flag for bios that own their bvec
Browse files Browse the repository at this point in the history
This is for the new bio splitting code. When we split a bio, if the
split occured on a bvec boundry we reuse the bvec for the new bio. But
that means bio_free() can't free it, hence the explicit flag.

Signed-off-by: Kent Overstreet <koverstreet@google.com>
CC: Jens Axboe <axboe@kernel.dk>
Acked-by: Tejun Heo <tj@kernel.org>
  • Loading branch information
Kent Overstreet committed Mar 23, 2013
1 parent a078760 commit a38352e
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 6 deletions.
4 changes: 3 additions & 1 deletion fs/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ static void bio_free(struct bio *bio)
__bio_free(bio);

if (bs) {
if (bio_has_allocated_vec(bio))
if (bio_flagged(bio, BIO_OWNS_VEC))
bvec_free(bs->bvec_pool, bio->bi_io_vec, BIO_POOL_IDX(bio));

/*
Expand Down Expand Up @@ -451,6 +451,8 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)

if (unlikely(!bvl))
goto err_free;

bio->bi_flags |= 1 << BIO_OWNS_VEC;
} else if (nr_iovecs) {
bvl = bio->bi_inline_vecs;
}
Expand Down
5 changes: 0 additions & 5 deletions include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,6 @@ static inline void *bio_data(struct bio *bio)
return NULL;
}

static inline int bio_has_allocated_vec(struct bio *bio)
{
return bio->bi_io_vec && bio->bi_io_vec != bio->bi_inline_vecs;
}

/*
* will die
*/
Expand Down
1 change: 1 addition & 0 deletions include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ struct bio {
* BIO_POOL_IDX()
*/
#define BIO_RESET_BITS 12
#define BIO_OWNS_VEC 12 /* bio_free() should free bvec */

#define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag)))

Expand Down

0 comments on commit a38352e

Please sign in to comment.