On 05/18/2012 05:59 AM, koverstreet@xxxxxxxxxx wrote: > From: Kent Overstreet <koverstreet@xxxxxxxxxx> > For the osdblk.c and exofs/ore.c bits. Thanks looks nice. ACK-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx> > Signed-off-by: Kent Overstreet <koverstreet@xxxxxxxxxx> > --- > drivers/block/osdblk.c | 3 +-- > drivers/block/rbd.c | 8 ++------ > fs/bio.c | 13 +++++++++++++ > fs/exofs/ore.c | 5 ++--- > include/linux/bio.h | 1 + > 5 files changed, 19 insertions(+), 11 deletions(-) > > diff --git a/drivers/block/osdblk.c b/drivers/block/osdblk.c > index 87311eb..1bbc681 100644 > --- a/drivers/block/osdblk.c > +++ b/drivers/block/osdblk.c > @@ -266,11 +266,10 @@ static struct bio *bio_chain_clone(struct bio *old_chain, gfp_t gfpmask) > struct bio *tmp, *new_chain = NULL, *tail = NULL; > > while (old_chain) { > - tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs); > + tmp = bio_clone_kmalloc(old_chain, gfpmask); > if (!tmp) > goto err_out; > > - __bio_clone(tmp, old_chain); > tmp->bi_bdev = NULL; > gfpmask &= ~__GFP_WAIT; > tmp->bi_next = NULL; > diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c > index 013c7a5..5a953c6 100644 > --- a/drivers/block/rbd.c > +++ b/drivers/block/rbd.c > @@ -729,7 +729,7 @@ static struct bio *bio_chain_clone(struct bio **old, struct bio **next, > } > > while (old_chain && (total < len)) { > - tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs); > + tmp = bio_clone_kmalloc(old_chain, gfpmask); > if (!tmp) > goto err_out; > > @@ -751,13 +751,9 @@ static struct bio *bio_chain_clone(struct bio **old, struct bio **next, > if (!bp) > goto err_out; > > - __bio_clone(tmp, &bp->bio1); > - > *next = &bp->bio2; > - } else { > - __bio_clone(tmp, old_chain); > + } else > *next = old_chain->bi_next; > - } > > tmp->bi_bdev = NULL; > gfpmask &= ~__GFP_WAIT; > diff --git a/fs/bio.c b/fs/bio.c > index 4cb621f..e2c0970 100644 > --- a/fs/bio.c > +++ b/fs/bio.c > @@ -491,6 +491,19 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) > } > EXPORT_SYMBOL(bio_clone); > > +struct bio *bio_clone_kmalloc(struct bio *bio, gfp_t gfp_mask) > +{ > + struct bio *b = bio_kmalloc(gfp_mask, bio->bi_max_vecs); > + > + if (!b) > + return NULL; > + > + __bio_clone(b, bio); > + > + return b; > +} > +EXPORT_SYMBOL(bio_clone_kmalloc); > + > /** > * bio_get_nr_vecs - return approx number of vecs > * @bdev: I/O target > diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c > index 49cf230..95c7264 100644 > --- a/fs/exofs/ore.c > +++ b/fs/exofs/ore.c > @@ -820,8 +820,8 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp) > struct bio *bio; > > if (per_dev != master_dev) { > - bio = bio_kmalloc(GFP_KERNEL, > - master_dev->bio->bi_max_vecs); > + bio = bio_clone_kmalloc(master_dev->bio, > + GFP_KERNEL); > if (unlikely(!bio)) { > ORE_DBGMSG( > "Failed to allocate BIO size=%u\n", > @@ -830,7 +830,6 @@ static int _write_mirror(struct ore_io_state *ios, int cur_comp) > goto out; > } > > - __bio_clone(bio, master_dev->bio); > bio->bi_bdev = NULL; > bio->bi_next = NULL; > per_dev->offset = master_dev->offset; > diff --git a/include/linux/bio.h b/include/linux/bio.h > index e068a68..b27f16b 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -225,6 +225,7 @@ extern int bio_phys_segments(struct request_queue *, struct bio *); > extern void __bio_clone(struct bio *, struct bio *); > extern struct bio *bio_clone_bioset(struct bio *, gfp_t, struct bio_set *bs); > extern struct bio *bio_clone(struct bio *, gfp_t); > +struct bio *bio_clone_kmalloc(struct bio *, gfp_t); > > extern void bio_init(struct bio *); > -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel