From: Kent Overstreet <koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
To: linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Cc: Kent Overstreet
<koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
axboe-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org,
neilb-l3A5Bk7waGM@public.gmane.org,
vgoyal-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Subject: [PATCH v3 23/26] block: Add bio_alloc_pages()
Date: Mon, 24 Sep 2012 15:35:03 -0700 [thread overview]
Message-ID: <1348526106-17074-24-git-send-email-koverstreet@google.com> (raw)
In-Reply-To: <1348526106-17074-1-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
More utility code to replace stuff that's getting open coded.
Signed-off-by: Kent Overstreet <koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
CC: Jens Axboe <axboe-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
CC: NeilBrown <neilb-l3A5Bk7waGM@public.gmane.org>
---
drivers/md/raid1.c | 16 +++-------------
fs/bio.c | 28 ++++++++++++++++++++++++++++
include/linux/bio.h | 1 +
3 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index dff0473..97f80b9 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -92,7 +92,6 @@ static void r1bio_pool_free(void *r1_bio, void *data)
static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
{
struct pool_info *pi = data;
- struct page *page;
struct r1bio *r1_bio;
struct bio *bio;
int i, j;
@@ -122,14 +121,10 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
j = 1;
while(j--) {
bio = r1_bio->bios[j];
- for (i = 0; i < RESYNC_PAGES; i++) {
- page = alloc_page(gfp_flags);
- if (unlikely(!page))
- goto out_free_pages;
+ bio->bi_vcnt = RESYNC_PAGES;
- bio->bi_io_vec[i].bv_page = page;
- bio->bi_vcnt = i+1;
- }
+ if (bio_alloc_pages(bio, gfp_flags))
+ goto out_free_bio;
}
/* If not user-requests, copy the page pointers to all bios */
if (!test_bit(MD_RECOVERY_REQUESTED, &pi->mddev->recovery)) {
@@ -143,11 +138,6 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
return r1_bio;
-out_free_pages:
- for (j=0 ; j < pi->raid_disks; j++)
- for (i=0; i < r1_bio->bios[j]->bi_vcnt ; i++)
- put_page(r1_bio->bios[j]->bi_io_vec[i].bv_page);
- j = -1;
out_free_bio:
while (++j < pi->raid_disks)
bio_put(r1_bio->bios[j]);
diff --git a/fs/bio.c b/fs/bio.c
index 6ba9f27..8e10d49 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -828,6 +828,34 @@ void bio_advance(struct bio *bio, unsigned bytes)
EXPORT_SYMBOL(bio_advance);
/**
+ * bio_alloc_pages - allocates a single page for each bvec in a bio
+ * @bio: bio to allocate pages for
+ * @gfp_mask: flags for allocation
+ *
+ * Allocates pages up to @bio->bi_vcnt.
+ *
+ * Returns 0 on success, -ENOMEM on failure. On failure, any allocated pages are
+ * freed.
+ */
+int bio_alloc_pages(struct bio *bio, gfp_t gfp_mask)
+{
+ int i;
+ struct bio_vec *bv;
+
+ bio_for_each_segment_all(bv, bio, i) {
+ bv->bv_page = alloc_page(gfp_mask);
+ if (!bv->bv_page) {
+ while (--bv >= bio->bi_io_vec)
+ __free_page(bv->bv_page);
+ return -ENOMEM;
+ }
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(bio_alloc_pages);
+
+/**
* bio_copy_data - copy contents of data buffers from one chain of bios to
* another
* @src: source bio list
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 32966c9..5a55ce5 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -292,6 +292,7 @@ static inline void bio_flush_dcache_pages(struct bio *bi)
#endif
extern void bio_copy_data(struct bio *dst, struct bio *src);
+extern int bio_alloc_pages(struct bio *bio, gfp_t gfp);
extern struct bio *bio_copy_user(struct request_queue *, struct rq_map_data *,
unsigned long, unsigned int, int, gfp_t);
--
1.7.12
next prev parent reply other threads:[~2012-09-24 22:35 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-24 22:34 [PATCH v3 00/26] Prep work for immutable bio vecs Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 01/26] block: Fix a buffer overrun in bio_integrity_split() Kent Overstreet
[not found] ` <1348526106-17074-2-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-01 21:23 ` [dm-devel] " Vivek Goyal
[not found] ` <20121001212336.GA17165-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-01 21:36 ` Kent Overstreet
2012-10-01 21:42 ` Kent Overstreet
[not found] ` <20121001214241.GE26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 14:08 ` Vivek Goyal
[not found] ` <20121002140847.GD758-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:26 ` Kent Overstreet
[not found] ` <20121002202643.GQ26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:32 ` Vivek Goyal
2012-10-02 21:01 ` Kent Overstreet
[not found] ` <20121002210143.GT26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 21:58 ` [dm-devel] " Vivek Goyal
[not found] ` <20121002215845.GB14471-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 22:07 ` Kent Overstreet
2012-10-02 22:30 ` Martin K. Petersen
2012-09-24 22:34 ` [PATCH v3 02/26] block: Convert integrity to bvec_alloc_bs() Kent Overstreet
2012-10-02 15:12 ` [dm-devel] " Vivek Goyal
2012-10-02 20:52 ` Kent Overstreet
[not found] ` <20121002205249.GR26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 22:05 ` [dm-devel] " Vivek Goyal
2012-10-02 22:17 ` Kent Overstreet
[not found] ` <1348526106-17074-3-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 15:37 ` Vivek Goyal
2012-10-02 21:00 ` Kent Overstreet
[not found] ` <20121002210006.GS26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 22:02 ` Vivek Goyal
2012-09-24 22:34 ` [PATCH v3 03/26] block: Add bio_advance() Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 04/26] block: Refactor blk_update_request() Kent Overstreet
2012-10-02 18:43 ` [dm-devel] " Vivek Goyal
[not found] ` <20121002184359.GC3283-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:10 ` Kent Overstreet
2012-10-02 20:14 ` Vivek Goyal
[not found] ` <20121002201451.GH758-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:25 ` Kent Overstreet
2012-10-02 18:59 ` Vivek Goyal
[not found] ` <20121002185955.GD3283-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:09 ` [dm-devel] " Kent Overstreet
[not found] ` <1348526106-17074-1-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-24 22:34 ` [PATCH v3 05/26] md: Convert md_trim_bio() to use bio_advance() Kent Overstreet
[not found] ` <1348526106-17074-6-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-26 0:38 ` NeilBrown
[not found] ` <20120926103827.4d880cf4-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2012-09-27 4:41 ` Kent Overstreet
2012-09-24 22:35 ` Kent Overstreet [this message]
2012-09-24 22:34 ` [PATCH v3 06/26] block: Add bio_end_sector() Kent Overstreet
[not found] ` <1348526106-17074-7-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-25 11:54 ` Lars Ellenberg
[not found] ` <20120925115452.GF8143-w1SgEEioFePxa46PmUWvFg@public.gmane.org>
2012-09-25 22:06 ` [Drbd-dev] " Kent Overstreet
[not found] ` <20120925220624.GC22647-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-26 15:16 ` Lars Ellenberg
2012-10-02 18:10 ` [dm-devel] " Vivek Goyal
[not found] ` <20121002181001.GB3283-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:20 ` Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 07/26] block: Use bio_sectors() more consistently Kent Overstreet
[not found] ` <1348526106-17074-8-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-24 23:04 ` Jim Paris
[not found] ` <20120924230449.GA2040-SRSuHwkuBJlaX0KmTac7FA@public.gmane.org>
2012-09-24 23:09 ` Kent Overstreet
2012-09-25 0:54 ` Ed Cashin
2012-09-24 22:34 ` [PATCH v3 08/26] block: Change bio_split() to respect the current value of bi_idx Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 09/26] block: Remove bi_idx references Kent Overstreet
[not found] ` <1348526106-17074-10-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 19:24 ` [dm-devel] " Vivek Goyal
2012-10-02 20:16 ` Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 10/26] block: Remove some unnecessary bi_vcnt usage Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 11/26] block: Add submit_bio_wait(), remove from md Kent Overstreet
[not found] ` <1348526106-17074-12-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-09-25 5:51 ` [dm-devel] " Hannes Reinecke
2012-09-25 22:15 ` Kent Overstreet
2012-10-02 19:41 ` Vivek Goyal
[not found] ` <20121002194132.GF3283-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:11 ` Kent Overstreet
[not found] ` <20121002201105.GL26488-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:16 ` Vivek Goyal
[not found] ` <20121002201630.GI758-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-02 20:22 ` Kent Overstreet
2012-10-04 6:07 ` Hannes Reinecke
2012-09-24 22:34 ` [PATCH v3 12/26] raid10: Use bio_reset() Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 13/26] raid1: use bio_reset() Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 14/26] raid5: " Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 15/26] raid1: Refactor narrow_write_error() to not use bi_idx Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 16/26] block: Add bio_copy_data() Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 17/26] pktcdvd: use bio_copy_data() Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 18/26] pktcdvd: Use bio_reset() in disabled code to kill bi_idx usage Kent Overstreet
2012-09-24 22:34 ` [PATCH v3 19/26] raid1: use bio_copy_data() Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 20/26] bounce: Refactor __blk_queue_bounce to not use bi_io_vec Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 21/26] block: Add bio_for_each_segment_all() Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 22/26] block: Convert some code to bio_for_each_segment_all() Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 24/26] block: Add an explicit bio flag for bios that own their bvec Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 25/26] bio-integrity: Add explicit field for owner of bip_buf Kent Overstreet
2012-09-24 22:35 ` [PATCH v3 26/26] block: Add BIO_SUBMITTED flag, kill BIO_CLONED Kent Overstreet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1348526106-17074-24-git-send-email-koverstreet@google.com \
--to=koverstreet-hpiqsd4aklfqt0dzr+alfa@public.gmane.org \
--cc=axboe-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org \
--cc=dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=neilb-l3A5Bk7waGM@public.gmane.org \
--cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=vgoyal-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).