From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from zimbra.linbit.com (zimbra.linbit.com [212.69.161.123]) by mail09.linbit.com (LINBIT Mail Daemon) with ESMTP id 3FBDC1005413 for ; Fri, 25 May 2012 22:30:11 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by zimbra.linbit.com (Postfix) with ESMTP id 377601B40F5 for ; Fri, 25 May 2012 22:30:11 +0200 (CEST) Received: from zimbra.linbit.com ([127.0.0.1]) by localhost (zimbra.linbit.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id cUbUddfgPtD8 for ; Fri, 25 May 2012 22:30:11 +0200 (CEST) Received: from soda.linbit (tuerlsteher.linbit.com [86.59.100.100]) by zimbra.linbit.com (Postfix) with ESMTP id 0C4B81B4315 for ; Fri, 25 May 2012 22:30:11 +0200 (CEST) Resent-Message-ID: <20120525203010.GM1903@soda.linbit> Received: from mail-pb0-f54.google.com (mail-pb0-f54.google.com [209.85.160.54]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (No client certificate requested) by mail09.linbit.com (LINBIT Mail Daemon) with ESMTPS id 4EC161013804 for ; Fri, 25 May 2012 22:26:21 +0200 (CEST) Received: by mail-pb0-f54.google.com with SMTP id ro2so2900232pbb.27 for ; Fri, 25 May 2012 13:26:21 -0700 (PDT) From: Kent Overstreet To: linux-kernel@vger.kernel.org, linux-bcache@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org Date: Fri, 25 May 2012 13:25:32 -0700 Message-Id: <1337977539-16977-10-git-send-email-koverstreet@google.com> In-Reply-To: <1337977539-16977-1-git-send-email-koverstreet@google.com> References: <1337977539-16977-1-git-send-email-koverstreet@google.com> Cc: axboe@kernel.dk, yehuda@hq.newdream.net, neilb@suse.de, Kent Overstreet , mpatocka@redhat.com, vgoyal@redhat.com, bharrosh@panasas.com, tj@kernel.org, sage@newdream.net, agk@redhat.com, drbd-dev@lists.linbit.com Subject: [Drbd-dev] [PATCH v3 09/16] block: Add bio_clone_kmalloc() List-Id: Coordination of development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Signed-off-by: Kent Overstreet Change-Id: I4aad3ae23640e847056f9de54d6cb75b0ddaa85b --- drivers/block/osdblk.c | 3 +-- fs/bio.c | 13 +++++++++++++ fs/exofs/ore.c | 5 ++--- include/linux/bio.h | 1 + 4 files changed, 17 insertions(+), 5 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/fs/bio.c b/fs/bio.c index 62c4af81..d212ee2 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -489,6 +489,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 486233c..8f280f7 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -220,6 +220,7 @@ extern int bio_phys_segments(struct request_queue *, struct bio *); extern void __bio_clone(struct bio *, struct bio *); extern struct bio *bio_clone(struct bio *, gfp_t); +struct bio *bio_clone_kmalloc(struct bio *, gfp_t); extern void bio_init(struct bio *); extern void bio_reset(struct bio *); -- 1.7.9.3.327.g2980b