* [PATCH] block: fix memory leak in bio_clone() @ 2009-03-09 9:13 Li Zefan 2009-03-09 9:21 ` Li Zefan 2009-03-09 9:24 ` Jens Axboe 0 siblings, 2 replies; 11+ messages in thread From: Li Zefan @ 2009-03-09 9:13 UTC (permalink / raw) To: Jens Axboe; +Cc: LKML If bio_integrity_clone() fails, bio_clone() returns NULL without freeing the newly allocated bio. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> --- fs/bio.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/fs/bio.c b/fs/bio.c index 124b95c..896330e 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -465,8 +465,10 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) ret = bio_integrity_clone(b, bio, fs_bio_set); - if (ret < 0) + if (ret < 0) { + bio_put(bio); return NULL; + } } return b; -- 1.5.4.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:13 [PATCH] block: fix memory leak in bio_clone() Li Zefan @ 2009-03-09 9:21 ` Li Zefan 2009-03-09 9:24 ` Jens Axboe 1 sibling, 0 replies; 11+ messages in thread From: Li Zefan @ 2009-03-09 9:21 UTC (permalink / raw) To: Jens Axboe; +Cc: LKML Sorry, there was a typo in the previous patch.. ============= From: Li Zefan <lizf@cn.fujitsu.com> Subject: [PATCH] block: fix memory leak in bio_clone() If bio_integrity_clone() fails, bio_clone() returns NULL without freeing the newly allocated bio. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> --- fs/bio.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/fs/bio.c b/fs/bio.c index 124b95c..c687847 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -465,8 +465,10 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) ret = bio_integrity_clone(b, bio, fs_bio_set); - if (ret < 0) + if (ret < 0) { + bio_put(b); return NULL; + } } return b; -- 1.5.4.rc3 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:13 [PATCH] block: fix memory leak in bio_clone() Li Zefan 2009-03-09 9:21 ` Li Zefan @ 2009-03-09 9:24 ` Jens Axboe 2009-03-09 9:34 ` Li Zefan 2009-03-09 16:10 ` Martin K. Petersen 1 sibling, 2 replies; 11+ messages in thread From: Jens Axboe @ 2009-03-09 9:24 UTC (permalink / raw) To: Li Zefan; +Cc: LKML, martin.petersen On Mon, Mar 09 2009, Li Zefan wrote: > If bio_integrity_clone() fails, bio_clone() returns NULL without freeing > the newly allocated bio. > > Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> > --- > fs/bio.c | 4 +++- > 1 files changed, 3 insertions(+), 1 deletions(-) > > diff --git a/fs/bio.c b/fs/bio.c > index 124b95c..896330e 100644 > --- a/fs/bio.c > +++ b/fs/bio.c > @@ -465,8 +465,10 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) > > ret = bio_integrity_clone(b, bio, fs_bio_set); > > - if (ret < 0) > + if (ret < 0) { > + bio_put(bio); > return NULL; > + } > } > > return b; > -- 1.5.4.rc3 Good spotting. But it looks like there are actually several problems there. bio_integrity_clone() is mempool backed. Currently that ret < 0 can never trigger, since bio_integrity_clone() has hard-wired __GFP_WAIT as the mempool mask. So the leak will not occur, but it does mean that it isn't honoring the gfp_mask passed in to bio_clone(), which is the first bug. The second bug is that it should be using its own bioset, as it is illegal to do multiple __GFP_WAIT allocations on a single mempool and always expect progress. -- Jens Axboe ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:24 ` Jens Axboe @ 2009-03-09 9:34 ` Li Zefan 2009-03-09 9:38 ` Jens Axboe 2009-03-09 16:10 ` Martin K. Petersen 1 sibling, 1 reply; 11+ messages in thread From: Li Zefan @ 2009-03-09 9:34 UTC (permalink / raw) To: Jens Axboe; +Cc: LKML, martin.petersen Jens Axboe wrote: > On Mon, Mar 09 2009, Li Zefan wrote: >> If bio_integrity_clone() fails, bio_clone() returns NULL without freeing >> the newly allocated bio. >> >> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> >> --- >> fs/bio.c | 4 +++- >> 1 files changed, 3 insertions(+), 1 deletions(-) >> >> diff --git a/fs/bio.c b/fs/bio.c >> index 124b95c..896330e 100644 >> --- a/fs/bio.c >> +++ b/fs/bio.c >> @@ -465,8 +465,10 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) >> >> ret = bio_integrity_clone(b, bio, fs_bio_set); >> >> - if (ret < 0) >> + if (ret < 0) { >> + bio_put(bio); >> return NULL; >> + } >> } >> >> return b; >> -- 1.5.4.rc3 > > Good spotting. But it looks like there are actually several problems > there. bio_integrity_clone() is mempool backed. Currently that ret < 0 > can never trigger, since bio_integrity_clone() has hard-wired __GFP_WAIT Do you mean GFP_NOIO? > as the mempool mask. So the leak will not occur, but it does mean that > it isn't honoring the gfp_mask passed in to bio_clone(), which is the I noticed there was a patch to do this, and seems you planed to merge it into .29? "[PATCH] Add gfp_mask to bio_integrity_clone()" http://lkml.org/lkml/2008/10/30/11 > first bug. The second bug is that it should be using its own bioset, as > it is illegal to do multiple __GFP_WAIT allocations on a single mempool > and always expect progress. > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:34 ` Li Zefan @ 2009-03-09 9:38 ` Jens Axboe 2009-03-09 9:51 ` Li Zefan 0 siblings, 1 reply; 11+ messages in thread From: Jens Axboe @ 2009-03-09 9:38 UTC (permalink / raw) To: Li Zefan; +Cc: LKML, martin.petersen On Mon, Mar 09 2009, Li Zefan wrote: > Jens Axboe wrote: > > On Mon, Mar 09 2009, Li Zefan wrote: > >> If bio_integrity_clone() fails, bio_clone() returns NULL without freeing > >> the newly allocated bio. > >> > >> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> > >> --- > >> fs/bio.c | 4 +++- > >> 1 files changed, 3 insertions(+), 1 deletions(-) > >> > >> diff --git a/fs/bio.c b/fs/bio.c > >> index 124b95c..896330e 100644 > >> --- a/fs/bio.c > >> +++ b/fs/bio.c > >> @@ -465,8 +465,10 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) > >> > >> ret = bio_integrity_clone(b, bio, fs_bio_set); > >> > >> - if (ret < 0) > >> + if (ret < 0) { > >> + bio_put(bio); > >> return NULL; > >> + } > >> } > >> > >> return b; > >> -- 1.5.4.rc3 > > > > Good spotting. But it looks like there are actually several problems > > there. bio_integrity_clone() is mempool backed. Currently that ret < 0 > > can never trigger, since bio_integrity_clone() has hard-wired __GFP_WAIT > > Do you mean GFP_NOIO? The __GFP_WAIT part of GFP_NOIO is the important bit :-) > > as the mempool mask. So the leak will not occur, but it does mean that > > it isn't honoring the gfp_mask passed in to bio_clone(), which is the > > I noticed there was a patch to do this, and seems you planed to merge > it into .29? > > "[PATCH] Add gfp_mask to bio_integrity_clone()" > > http://lkml.org/lkml/2008/10/30/11 Hmm strange, apparently that never got queued up and I had forgotten all about that issue until your email. I'll add it asap. > > first bug. The second bug is that it should be using its own bioset, as > > it is illegal to do multiple __GFP_WAIT allocations on a single mempool > > and always expect progress. That one still stands. -- Jens Axboe ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:38 ` Jens Axboe @ 2009-03-09 9:51 ` Li Zefan 2009-03-09 9:54 ` Jens Axboe 0 siblings, 1 reply; 11+ messages in thread From: Li Zefan @ 2009-03-09 9:51 UTC (permalink / raw) To: Jens Axboe; +Cc: LKML, martin.petersen >>> as the mempool mask. So the leak will not occur, but it does mean that >>> it isn't honoring the gfp_mask passed in to bio_clone(), which is the >> I noticed there was a patch to do this, and seems you planed to merge >> it into .29? >> >> "[PATCH] Add gfp_mask to bio_integrity_clone()" >> >> http://lkml.org/lkml/2008/10/30/11 > > Hmm strange, apparently that never got queued up and I had forgotten all > about that issue until your email. I'll add it asap. > I found bio_integrity_clone() is not using the gfp_mask passed by bio_clone(), so I googled it in LKML before I fix it. :) >>> first bug. The second bug is that it should be using its own bioset, as >>> it is illegal to do multiple __GFP_WAIT allocations on a single mempool >>> and always expect progress. > > That one still stands. > Yes, and I'd leave it to you or Martin. ;) ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:51 ` Li Zefan @ 2009-03-09 9:54 ` Jens Axboe 0 siblings, 0 replies; 11+ messages in thread From: Jens Axboe @ 2009-03-09 9:54 UTC (permalink / raw) To: Li Zefan; +Cc: LKML, martin.petersen On Mon, Mar 09 2009, Li Zefan wrote: > >>> as the mempool mask. So the leak will not occur, but it does mean that > >>> it isn't honoring the gfp_mask passed in to bio_clone(), which is the > >> I noticed there was a patch to do this, and seems you planed to merge > >> it into .29? > >> > >> "[PATCH] Add gfp_mask to bio_integrity_clone()" > >> > >> http://lkml.org/lkml/2008/10/30/11 > > > > Hmm strange, apparently that never got queued up and I had forgotten all > > about that issue until your email. I'll add it asap. > > > > I found bio_integrity_clone() is not using the gfp_mask passed by bio_clone(), > so I googled it in LKML before I fix it. :) I've got both patches queued up now: http://git.kernel.dk/?p=linux-2.6-block.git;a=shortlog;h=refs/heads/for-linus > >>> first bug. The second bug is that it should be using its own bioset, as > >>> it is illegal to do multiple __GFP_WAIT allocations on a single mempool > >>> and always expect progress. > > > > That one still stands. > > > > Yes, and I'd leave it to you or Martin. ;) I'll let Martin sort that out, it can easily wait for the next release. -- Jens Axboe ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 9:24 ` Jens Axboe 2009-03-09 9:34 ` Li Zefan @ 2009-03-09 16:10 ` Martin K. Petersen 2009-03-09 19:21 ` Jens Axboe 1 sibling, 1 reply; 11+ messages in thread From: Martin K. Petersen @ 2009-03-09 16:10 UTC (permalink / raw) To: Jens Axboe; +Cc: Li Zefan, LKML, martin.petersen >>>>> "Jens" == Jens Axboe <jens.axboe@oracle.com> writes: Jens> So the leak will not occur, but it does mean that it isn't Jens> honoring the gfp_mask passed in to bio_clone(), which is the first Jens> bug. bio_integrity_clone() had no mask because all callers of it used GFP_NOIO explicitly. But as you now recall there is a patch queued that adds the mask :) Jens> The second bug is that it should be using its own bioset, as it is Jens> illegal to do multiple __GFP_WAIT allocations on a single mempool Jens> and always expect progress. So how do you propose I go about this? The original intent was to contain all the integrity blah inside the bio_set to make it completely transparent to the caller. That's why the bip mempool is hanging off of the bio_set. But obviously two bvecs are needed per bio, one to describe data and to describe the integrity buffer. Having two bvec mempools per bio_set seems icky. I guess what you are suggesting is that we could have a dedicated bio_integrity_set akin to the bio_split_pool. That removes the caller's option of passing a dedicated bio_set to the clone command, though. Will that have forward progress implications for stacking drivers? -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 16:10 ` Martin K. Petersen @ 2009-03-09 19:21 ` Jens Axboe 2009-03-10 3:42 ` Martin K. Petersen 0 siblings, 1 reply; 11+ messages in thread From: Jens Axboe @ 2009-03-09 19:21 UTC (permalink / raw) To: Martin K. Petersen; +Cc: Li Zefan, LKML On Mon, Mar 09 2009, Martin K. Petersen wrote: > Jens> The second bug is that it should be using its own bioset, as it is > Jens> illegal to do multiple __GFP_WAIT allocations on a single mempool > Jens> and always expect progress. > > So how do you propose I go about this? > > The original intent was to contain all the integrity blah inside the > bio_set to make it completely transparent to the caller. That's why the > bip mempool is hanging off of the bio_set. But obviously two bvecs are > needed per bio, one to describe data and to describe the integrity > buffer. > > Having two bvec mempools per bio_set seems icky. I guess what you are > suggesting is that we could have a dedicated bio_integrity_set akin to > the bio_split_pool. That removes the caller's option of passing a > dedicated bio_set to the clone command, though. Will that have forward > progress implications for stacking drivers? I was just wondering why you wanted to pass the bio_set in to bio_integrity_clone(), why would the caller care? Even two mempools isn't that bad. You can reuse the slab of course, and the mempool should only have a single entry preallocated. But I agree, it should not be in the bio_set. A dedicated bio_set for the integrity stuff would be the way to go, and that should provide you all the forward progress guarantees you need. -- Jens Axboe ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-09 19:21 ` Jens Axboe @ 2009-03-10 3:42 ` Martin K. Petersen 2009-03-10 7:29 ` Jens Axboe 0 siblings, 1 reply; 11+ messages in thread From: Martin K. Petersen @ 2009-03-10 3:42 UTC (permalink / raw) To: Jens Axboe; +Cc: Martin K. Petersen, Li Zefan, LKML >>>>> "Jens" == Jens Axboe <jens.axboe@oracle.com> writes: Jens> A dedicated bio_set for the integrity stuff would be the way to Jens> go, and that should provide you all the forward progress Jens> guarantees you need. Ok. Against your for-linus branch... Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> --- fs/bio-integrity.c | 85 +++++++++++++++------------------------------------- fs/bio.c | 9 +---- include/linux/bio.h | 18 ++--------- 3 files changed, 32 insertions(+), 80 deletions(-) diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index fe2b1aa..31c46a2 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c @@ -26,23 +26,23 @@ #include <linux/workqueue.h> static struct kmem_cache *bio_integrity_slab __read_mostly; +static mempool_t *bio_integrity_pool; +static struct bio_set *integrity_bio_set; static struct workqueue_struct *kintegrityd_wq; /** - * bio_integrity_alloc_bioset - Allocate integrity payload and attach it to bio + * bio_integrity_alloc - Allocate integrity payload and attach it to bio * @bio: bio to attach integrity metadata to * @gfp_mask: Memory allocation mask * @nr_vecs: Number of integrity metadata scatter-gather elements - * @bs: bio_set to allocate from * * Description: This function prepares a bio for attaching integrity * metadata. nr_vecs specifies the maximum number of pages containing * integrity metadata that can be attached. */ -struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio, - gfp_t gfp_mask, - unsigned int nr_vecs, - struct bio_set *bs) +struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, + gfp_t gfp_mask, + unsigned int nr_vecs) { struct bio_integrity_payload *bip; struct bio_vec *iv; @@ -50,7 +50,7 @@ struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio, BUG_ON(bio == NULL); - bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask); + bip = mempool_alloc(bio_integrity_pool, gfp_mask); if (unlikely(bip == NULL)) { printk(KERN_ERR "%s: could not alloc bip\n", __func__); return NULL; @@ -58,10 +58,10 @@ struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio, memset(bip, 0, sizeof(*bip)); - iv = bvec_alloc_bs(gfp_mask, nr_vecs, &idx, bs); + iv = bvec_alloc_bs(gfp_mask, nr_vecs, &idx, integrity_bio_set); if (unlikely(iv == NULL)) { printk(KERN_ERR "%s: could not alloc bip_vec\n", __func__); - mempool_free(bip, bs->bio_integrity_pool); + mempool_free(bip, bio_integrity_pool); return NULL; } @@ -72,35 +72,16 @@ struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio, return bip; } -EXPORT_SYMBOL(bio_integrity_alloc_bioset); - -/** - * bio_integrity_alloc - Allocate integrity payload and attach it to bio - * @bio: bio to attach integrity metadata to - * @gfp_mask: Memory allocation mask - * @nr_vecs: Number of integrity metadata scatter-gather elements - * - * Description: This function prepares a bio for attaching integrity - * metadata. nr_vecs specifies the maximum number of pages containing - * integrity metadata that can be attached. - */ -struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, - gfp_t gfp_mask, - unsigned int nr_vecs) -{ - return bio_integrity_alloc_bioset(bio, gfp_mask, nr_vecs, fs_bio_set); -} EXPORT_SYMBOL(bio_integrity_alloc); /** * bio_integrity_free - Free bio integrity payload * @bio: bio containing bip to be freed - * @bs: bio_set this bio was allocated from * * Description: Used to free the integrity portion of a bio. Usually * called from bio_free(). */ -void bio_integrity_free(struct bio *bio, struct bio_set *bs) +void bio_integrity_free(struct bio *bio) { struct bio_integrity_payload *bip = bio->bi_integrity; @@ -111,8 +92,8 @@ void bio_integrity_free(struct bio *bio, struct bio_set *bs) && bip->bip_buf != NULL) kfree(bip->bip_buf); - bvec_free_bs(bs, bip->bip_vec, bip->bip_pool); - mempool_free(bip, bs->bio_integrity_pool); + bvec_free_bs(integrity_bio_set, bip->bip_vec, bip->bip_pool); + mempool_free(bip, bio_integrity_pool); bio->bi_integrity = NULL; } @@ -686,19 +667,17 @@ EXPORT_SYMBOL(bio_integrity_split); * @bio: New bio * @bio_src: Original bio * @gfp_mask: Memory allocation mask - * @bs: bio_set to allocate bip from * * Description: Called to allocate a bip when cloning a bio */ -int bio_integrity_clone(struct bio *bio, struct bio *bio_src, - gfp_t gfp_mask, struct bio_set *bs) +int bio_integrity_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp_mask) { struct bio_integrity_payload *bip_src = bio_src->bi_integrity; struct bio_integrity_payload *bip; BUG_ON(bip_src == NULL); - bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs); + bip = bio_integrity_alloc(bio, gfp_mask, bip_src->bip_vcnt); if (bip == NULL) return -EIO; @@ -714,37 +693,25 @@ int bio_integrity_clone(struct bio *bio, struct bio *bio_src, } EXPORT_SYMBOL(bio_integrity_clone); -int bioset_integrity_create(struct bio_set *bs, int pool_size) +static int __init bio_integrity_init(void) { - bs->bio_integrity_pool = mempool_create_slab_pool(pool_size, - bio_integrity_slab); - if (!bs->bio_integrity_pool) - return -1; - - return 0; -} -EXPORT_SYMBOL(bioset_integrity_create); + kintegrityd_wq = create_workqueue("kintegrityd"); -void bioset_integrity_free(struct bio_set *bs) -{ - if (bs->bio_integrity_pool) - mempool_destroy(bs->bio_integrity_pool); -} -EXPORT_SYMBOL(bioset_integrity_free); + if (!kintegrityd_wq) + panic("Failed to create kintegrityd\n"); -void __init bio_integrity_init_slab(void) -{ bio_integrity_slab = KMEM_CACHE(bio_integrity_payload, SLAB_HWCACHE_ALIGN|SLAB_PANIC); -} -static int __init integrity_init(void) -{ - kintegrityd_wq = create_workqueue("kintegrityd"); + bio_integrity_pool = mempool_create_slab_pool(BIO_POOL_SIZE, + bio_integrity_slab); + if (!bio_integrity_pool) + panic("bio_integrity: can't allocate bip pool\n"); - if (!kintegrityd_wq) - panic("Failed to create kintegrityd\n"); + integrity_bio_set = bioset_create(BIO_POOL_SIZE, 0); + if (!integrity_bio_set) + panic("bio_integrity: can't allocate bio_set\n"); return 0; } -subsys_initcall(integrity_init); +subsys_initcall(bio_integrity_init); diff --git a/fs/bio.c b/fs/bio.c index d4f0632..3db3af7 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -248,7 +248,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 @@ -463,7 +463,7 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) 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); @@ -1526,7 +1526,6 @@ void bioset_free(struct bio_set *bs) if (bs->bio_pool) mempool_destroy(bs->bio_pool); - bioset_integrity_free(bs); biovec_free_pools(bs); bio_put_slab(bs); @@ -1567,9 +1566,6 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad) if (!bs->bio_pool) goto bad; - if (bioset_integrity_create(bs, pool_size)) - goto bad; - if (!biovec_create_pools(bs, pool_size)) return bs; @@ -1600,7 +1596,6 @@ static int __init init_bio(void) if (!bio_slabs) panic("bio: can't allocate bios\n"); - bio_integrity_init_slab(); biovec_init_slabs(); fs_bio_set = bioset_create(BIO_POOL_SIZE, 0); diff --git a/include/linux/bio.h b/include/linux/bio.h index d8bd43b..b05b1d4 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -426,9 +426,6 @@ struct bio_set { unsigned int front_pad; mempool_t *bio_pool; -#if defined(CONFIG_BLK_DEV_INTEGRITY) - mempool_t *bio_integrity_pool; -#endif mempool_t *bvec_pool; }; @@ -519,9 +516,8 @@ static inline int bio_has_data(struct bio *bio) #define bio_integrity(bio) (bio->bi_integrity != NULL) -extern struct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *, gfp_t, unsigned int, struct bio_set *); extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int); -extern void bio_integrity_free(struct bio *, struct bio_set *); +extern void bio_integrity_free(struct bio *); extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int); extern int bio_integrity_enabled(struct bio *bio); extern int bio_integrity_set_tag(struct bio *, void *, unsigned int); @@ -531,27 +527,21 @@ extern void bio_integrity_endio(struct bio *, int); extern void bio_integrity_advance(struct bio *, unsigned int); extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int); extern void bio_integrity_split(struct bio *, struct bio_pair *, int); -extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *); -extern int bioset_integrity_create(struct bio_set *, int); -extern void bioset_integrity_free(struct bio_set *); -extern void bio_integrity_init_slab(void); +extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t); #else /* CONFIG_BLK_DEV_INTEGRITY */ #define bio_integrity(a) (0) -#define bioset_integrity_create(a, b) (0) #define bio_integrity_prep(a) (0) #define bio_integrity_enabled(a) (0) -#define bio_integrity_clone(a, b, c,d ) (0) -#define bioset_integrity_free(a) do { } while (0) -#define bio_integrity_free(a, b) do { } while (0) +#define bio_integrity_clone(a, b, c) (0) +#define bio_integrity_free(a) do { } while (0) #define bio_integrity_endio(a, b) do { } while (0) #define bio_integrity_advance(a, b) do { } while (0) #define bio_integrity_trim(a, b, c) do { } while (0) #define bio_integrity_split(a, b, c) do { } while (0) #define bio_integrity_set_tag(a, b, c) do { } while (0) #define bio_integrity_get_tag(a, b, c) do { } while (0) -#define bio_integrity_init_slab(a) do { } while (0) #endif /* CONFIG_BLK_DEV_INTEGRITY */ ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] block: fix memory leak in bio_clone() 2009-03-10 3:42 ` Martin K. Petersen @ 2009-03-10 7:29 ` Jens Axboe 0 siblings, 0 replies; 11+ messages in thread From: Jens Axboe @ 2009-03-10 7:29 UTC (permalink / raw) To: Martin K. Petersen; +Cc: Li Zefan, LKML On Mon, Mar 09 2009, Martin K. Petersen wrote: > >>>>> "Jens" == Jens Axboe <jens.axboe@oracle.com> writes: > > Jens> A dedicated bio_set for the integrity stuff would be the way to > Jens> go, and that should provide you all the forward progress > Jens> guarantees you need. > > Ok. Against your for-linus branch... > > Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Great, that's also a lot less invasive and ifdef'y. Applied for 2.6.30. -- Jens Axboe ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2009-03-10 7:29 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-03-09 9:13 [PATCH] block: fix memory leak in bio_clone() Li Zefan 2009-03-09 9:21 ` Li Zefan 2009-03-09 9:24 ` Jens Axboe 2009-03-09 9:34 ` Li Zefan 2009-03-09 9:38 ` Jens Axboe 2009-03-09 9:51 ` Li Zefan 2009-03-09 9:54 ` Jens Axboe 2009-03-09 16:10 ` Martin K. Petersen 2009-03-09 19:21 ` Jens Axboe 2009-03-10 3:42 ` Martin K. Petersen 2009-03-10 7:29 ` Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox