From patchwork Wed Feb 20 00:22:38 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kent Overstreet X-Patchwork-Id: 2165731 Return-Path: X-Original-To: patchwork-dm-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by patchwork2.kernel.org (Postfix) with ESMTP id 9CFF5DF24C for ; Wed, 20 Feb 2013 00:43:16 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r1K0dl1R020163; Tue, 19 Feb 2013 19:39:48 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r1K0NInU011158 for ; Tue, 19 Feb 2013 19:23:18 -0500 Received: from mx1.redhat.com (ext-mx16.extmail.prod.ext.phx2.redhat.com [10.5.110.21]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r1K0NIOe009529 for ; Tue, 19 Feb 2013 19:23:18 -0500 Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r1K0NG5O014883 for ; Tue, 19 Feb 2013 19:23:17 -0500 Received: by mail-pa0-f48.google.com with SMTP id hz10so3654242pad.35 for ; Tue, 19 Feb 2013 16:23:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=11dvxb59B5jDlTy6qmjE5DuPZQXtvE5+EFZPP/dJ10g=; b=dHKbz0R2lvrPa4zAiKGqDfKZKVUJXFjjUiVLAqh+1Dqd4eLiBhGBQ0kGeXVfjVquK1 ZSWDF2wOoNOcY5XwNQb+HsIyEx8IUtXYsQQ4GT/WOTGR1SvMSz1Ly1RBgWNUZk3Yx/sM 4ajMwshshDtIkxGJMmYkop9HFqIAyO1dPCL7OQiyJqySODUN7WYhCW6kKOTLnMvSCl7c 6v1m0kC/F8Kdhh+VhyUnGxPK4qav1aizGMf9vRL4FK2x21lfPZ3XMLNqqVOgucKNW4aZ 0aoYykhfE3RB0MGDhVm3a4KA8dYc7BXgLzD3l255wJmSeD8LNO5lJEdprifoinFw7QR3 YNtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=11dvxb59B5jDlTy6qmjE5DuPZQXtvE5+EFZPP/dJ10g=; b=avbjrQRKabkAsjSk5HQVBnzPTzYmF230/WHVboZRo0cBuyTTXKOTXgxX8cFet9jzKT yY1B0QtnsMJaudrlohVO/kQkuVjmD9XekRl5lfkXpR5rRVWzKlroyJhwRjjtctt+/fik 7ZrIdm1yiNn4zDc7O4SfTqwq+LBze1zhCRfkOmkp/I6+4QKLW05/99RUtsDABnGlraBa M/RHeQY/lCeU5Ghhig/MJ1ypOOgy01l+ydhETlDAKnNgb8Jz4xQcPkxvMrReyzgEYDKB b1rJ/9JXmH+W3m6KBf6g0E28Dvx7RnPHmAX+5FV48w0yzrclwjUl92tUKepe3DwQIWhk XtIA== X-Received: by 10.68.202.34 with SMTP id kf2mr45591647pbc.44.1361319796609; Tue, 19 Feb 2013 16:23:16 -0800 (PST) Received: from formenos.mtv.corp.google.com (formenos.mtv.corp.google.com [172.18.126.133]) by mx.google.com with ESMTPS id s9sm25722932pav.7.2013.02.19.16.23.15 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 19 Feb 2013 16:23:15 -0800 (PST) From: Kent Overstreet To: linux-kernel@vger.kernel.org Date: Tue, 19 Feb 2013 16:22:38 -0800 Message-Id: <1361319761-23873-25-git-send-email-koverstreet@google.com> In-Reply-To: <1361319761-23873-1-git-send-email-koverstreet@google.com> References: <1361319761-23873-1-git-send-email-koverstreet@google.com> X-Gm-Message-State: ALoCoQkEGgn2Sto8B+zFlYqwiWky4SQ6Hl3tQ1w7SKNJWuYuwxT5sUaiZe113Cu4JtZQxAis3x1mlOn8X+n4wYH0gd4t5xaTlN6U0iXdBR8zLWwAL8OV7at/Ei5zrO587bQwHmiSVrYXolClSCb69579QtYgndQAoqm8V0S2hTJrzr9AHwQXiq7WiQYTy3jupR0YI/eg/Ene X-RedHat-Spam-Score: -3.738 (BAYES_00, DCC_REPUT_00_12, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Scanned-By: MIMEDefang 2.68 on 10.5.110.21 X-loop: dm-devel@redhat.com Cc: axboe@kernel.dk, Kent Overstreet , dm-devel@redhat.com, Alexander Viro , Alasdair Kergon Subject: [dm-devel] [PATCH 24/27] block: Convert some code to bio_for_each_segment_all() X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com More prep work for immutable bvecs: A few places in the code were either open coding or using the wrong version - fix. After we introduce the bvec iter, it'll no longer be possible to modify the biovec through bio_for_each_segment_all() - it doesn't increment a pointer to the current bvec, you pass in a struct bio_vec (not a pointer) which is updated with what the current biovec would be (taking into account bi_bvec_done and bi_size). So because of that it's more worthwhile to be consistent about bio_for_each_segment()/bio_for_each_segment_all() usage. Signed-off-by: Kent Overstreet CC: Jens Axboe CC: NeilBrown CC: Alasdair Kergon CC: dm-devel@redhat.com CC: Alexander Viro --- drivers/md/dm-crypt.c | 3 +-- drivers/md/raid1.c | 10 +++------- fs/bio.c | 20 ++++++++++---------- fs/direct-io.c | 8 ++++---- mm/bounce.c | 2 +- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index f7369f9..a7923bf 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -858,8 +858,7 @@ static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone) unsigned int i; struct bio_vec *bv; - for (i = 0; i < clone->bi_vcnt; i++) { - bv = bio_iovec_idx(clone, i); + bio_for_each_segment_all(bv, clone, i) { BUG_ON(!bv->bv_page); mempool_free(bv->bv_page, cc->page_pool); bv->bv_page = NULL; diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 3716fe4..981fd4f 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -925,7 +925,7 @@ static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio) if (unlikely(!bvecs)) return; - bio_for_each_segment(bvec, bio, i) { + bio_for_each_segment_all(bvec, bio, i) { bvecs[i] = *bvec; bvecs[i].bv_page = alloc_page(GFP_NOIO); if (unlikely(!bvecs[i].bv_page)) @@ -1282,12 +1282,8 @@ read_again: struct bio_vec *bvec; int j; - /* Yes, I really want the '__' version so that - * we clear any unused pointer in the io_vec, rather - * than leave them unchanged. This is important - * because when we come to free the pages, we won't - * know the original bi_idx, so we just free - * them all + /* + * We trimmed the bio, so _all is legit */ bio_for_each_segment_all(bvec, mbio, j) bvec->bv_page = r1_bio->behind_bvecs[j].bv_page; diff --git a/fs/bio.c b/fs/bio.c index 618f904..fe3aee90 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -1548,11 +1548,11 @@ EXPORT_SYMBOL(bio_copy_kern); */ void bio_set_pages_dirty(struct bio *bio) { - struct bio_vec *bvec = bio->bi_io_vec; + struct bio_vec *bvec; int i; - for (i = 0; i < bio->bi_vcnt; i++) { - struct page *page = bvec[i].bv_page; + bio_for_each_segment_all(bvec, bio, i) { + struct page *page = bvec->bv_page; if (page && !PageCompound(page)) set_page_dirty_lock(page); @@ -1561,11 +1561,11 @@ void bio_set_pages_dirty(struct bio *bio) static void bio_release_pages(struct bio *bio) { - struct bio_vec *bvec = bio->bi_io_vec; + struct bio_vec *bvec; int i; - for (i = 0; i < bio->bi_vcnt; i++) { - struct page *page = bvec[i].bv_page; + bio_for_each_segment_all(bvec, bio, i) { + struct page *page = bvec->bv_page; if (page) put_page(page); @@ -1614,16 +1614,16 @@ static void bio_dirty_fn(struct work_struct *work) void bio_check_pages_dirty(struct bio *bio) { - struct bio_vec *bvec = bio->bi_io_vec; + struct bio_vec *bvec; int nr_clean_pages = 0; int i; - for (i = 0; i < bio->bi_vcnt; i++) { - struct page *page = bvec[i].bv_page; + bio_for_each_segment_all(bvec, bio, i) { + struct page *page = bvec->bv_page; if (PageDirty(page) || PageCompound(page)) { page_cache_release(page); - bvec[i].bv_page = NULL; + bvec->bv_page = NULL; } else { nr_clean_pages++; } diff --git a/fs/direct-io.c b/fs/direct-io.c index cf5b44b..b51510b 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -441,8 +441,8 @@ static struct bio *dio_await_one(struct dio *dio) static int dio_bio_complete(struct dio *dio, struct bio *bio) { const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); - struct bio_vec *bvec = bio->bi_io_vec; - int page_no; + struct bio_vec *bvec; + unsigned i; if (!uptodate) dio->io_error = -EIO; @@ -450,8 +450,8 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) if (dio->is_async && dio->rw == READ) { bio_check_pages_dirty(bio); /* transfers ownership */ } else { - for (page_no = 0; page_no < bio->bi_vcnt; page_no++) { - struct page *page = bvec[page_no].bv_page; + bio_for_each_segment_all(bvec, bio, i) { + struct page *page = bvec->bv_page; if (dio->rw == READ && !PageCompound(page)) set_page_dirty_lock(page); diff --git a/mm/bounce.c b/mm/bounce.c index 89324e2..bd7079a 100644 --- a/mm/bounce.c +++ b/mm/bounce.c @@ -194,7 +194,7 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig, bounce: bio = bio_clone_bioset(*bio_orig, GFP_NOIO, fs_bio_set); - bio_for_each_segment(to, bio, i) { + bio_for_each_segment_all(to, bio, i) { struct page *page = to->bv_page; if (page_to_pfn(page) <= queue_bounce_pfn(q))