Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755507Ab2EXAEA (ORCPT ); Wed, 23 May 2012 20:04:00 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:47332 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753396Ab2EXADZ (ORCPT ); Wed, 23 May 2012 20:03:25 -0400 From: Kent Overstreet To: linux-kernel@vger.kernel.org, linux-bcache@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Cc: Kent Overstreet , tj@kernel.org, axboe@kernel.dk, agk@redhat.com, neilb@suse.de, drbd-dev@lists.linbit.com, bharrosh@panasas.com, vgoyal@redhat.com, mpatocka@redhat.com, sage@newdream.net, yehuda@hq.newdream.net Subject: [PATCH v2 04/14] block: Add bio_clone_kmalloc() Date: Wed, 23 May 2012 17:02:41 -0700 Message-Id: <1337817771-25038-5-git-send-email-koverstreet@google.com> X-Mailer: git-send-email 1.7.9.3.327.g2980b In-Reply-To: <1337817771-25038-1-git-send-email-koverstreet@google.com> References: <1337817771-25038-1-git-send-email-koverstreet@google.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3631 Lines: 121 Signed-off-by: Kent Overstreet --- 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 *); -- 1.7.9.3.327.g2980b -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/