diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-11-23 20:19:00 -0500 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-24 01:33:49 -0500 |
commit | 7988613b0e5b2638caf6cd493cc78e9595eba19c (patch) | |
tree | cc9fc4e235278035313ee32940740f61269f8fb3 /drivers/md/bcache | |
parent | a4ad39b1d10584dfcfcfb0d510faab2c7f034399 (diff) |
block: Convert bio_for_each_segment() to bvec_iter
More prep work for immutable biovecs - with immutable bvecs drivers
won't be able to use the biovec directly, they'll need to use helpers
that take into account bio->bi_iter.bi_bvec_done.
This updates callers for the new usage without changing the
implementation yet.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: "Ed L. Cashin" <ecashin@coraid.com>
Cc: Nick Piggin <npiggin@kernel.dk>
Cc: Lars Ellenberg <drbd-dev@lists.linbit.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Paul Clements <Paul.Clements@steeleye.com>
Cc: Jim Paris <jim@jtan.com>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Yehuda Sadeh <yehuda@inktank.com>
Cc: Sage Weil <sage@inktank.com>
Cc: Alex Elder <elder@inktank.com>
Cc: ceph-devel@vger.kernel.org
Cc: Joshua Morris <josh.h.morris@us.ibm.com>
Cc: Philip Kelleher <pjk1939@linux.vnet.ibm.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Neil Brown <neilb@suse.de>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: linux390@de.ibm.com
Cc: Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
Cc: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
Cc: support@lsi.com
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Guo Chao <yan@linux.vnet.ibm.com>
Cc: Asai Thambi S P <asamymuthupa@micron.com>
Cc: Selvan Mani <smani@micron.com>
Cc: Sam Bradshaw <sbradshaw@micron.com>
Cc: Matthew Wilcox <matthew.r.wilcox@intel.com>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Quoc-Son Anh <quoc-sonx.anh@intel.com>
Cc: Sebastian Ott <sebott@linux.vnet.ibm.com>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Jerome Marchand <jmarchan@redhat.com>
Cc: Seth Jennings <sjenning@linux.vnet.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Mike Snitzer <snitzer@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Jan Kara <jack@suse.cz>
Cc: linux-m68k@lists.linux-m68k.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: drbd-user@lists.linbit.com
Cc: nbd-general@lists.sourceforge.net
Cc: cbe-oss-dev@lists.ozlabs.org
Cc: xen-devel@lists.xensource.com
Cc: virtualization@lists.linux-foundation.org
Cc: linux-raid@vger.kernel.org
Cc: linux-s390@vger.kernel.org
Cc: DL-MPTFusionLinux@lsi.com
Cc: linux-scsi@vger.kernel.org
Cc: devel@driverdev.osuosl.org
Cc: linux-fsdevel@vger.kernel.org
Cc: cluster-devel@redhat.com
Cc: linux-mm@kvack.org
Acked-by: Geoff Levand <geoff@infradead.org>
Diffstat (limited to 'drivers/md/bcache')
-rw-r--r-- | drivers/md/bcache/btree.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/debug.c | 19 | ||||
-rw-r--r-- | drivers/md/bcache/io.c | 69 | ||||
-rw-r--r-- | drivers/md/bcache/request.c | 26 |
4 files changed, 54 insertions, 64 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index 038a6d2aced3..b62f37925374 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c | |||
@@ -362,7 +362,7 @@ static void btree_node_write_done(struct closure *cl) | |||
362 | struct bio_vec *bv; | 362 | struct bio_vec *bv; |
363 | int n; | 363 | int n; |
364 | 364 | ||
365 | __bio_for_each_segment(bv, b->bio, n, 0) | 365 | bio_for_each_segment_all(bv, b->bio, n) |
366 | __free_page(bv->bv_page); | 366 | __free_page(bv->bv_page); |
367 | 367 | ||
368 | __btree_node_write_done(cl); | 368 | __btree_node_write_done(cl); |
@@ -421,7 +421,7 @@ static void do_btree_node_write(struct btree *b) | |||
421 | struct bio_vec *bv; | 421 | struct bio_vec *bv; |
422 | void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1)); | 422 | void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1)); |
423 | 423 | ||
424 | bio_for_each_segment(bv, b->bio, j) | 424 | bio_for_each_segment_all(bv, b->bio, j) |
425 | memcpy(page_address(bv->bv_page), | 425 | memcpy(page_address(bv->bv_page), |
426 | base + j * PAGE_SIZE, PAGE_SIZE); | 426 | base + j * PAGE_SIZE, PAGE_SIZE); |
427 | 427 | ||
diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 92b3fd468a03..03cb4d114e16 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c | |||
@@ -173,7 +173,8 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) | |||
173 | { | 173 | { |
174 | char name[BDEVNAME_SIZE]; | 174 | char name[BDEVNAME_SIZE]; |
175 | struct bio *check; | 175 | struct bio *check; |
176 | struct bio_vec *bv; | 176 | struct bio_vec bv, *bv2; |
177 | struct bvec_iter iter; | ||
177 | int i; | 178 | int i; |
178 | 179 | ||
179 | check = bio_clone(bio, GFP_NOIO); | 180 | check = bio_clone(bio, GFP_NOIO); |
@@ -185,13 +186,13 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) | |||
185 | 186 | ||
186 | submit_bio_wait(READ_SYNC, check); | 187 | submit_bio_wait(READ_SYNC, check); |
187 | 188 | ||
188 | bio_for_each_segment(bv, bio, i) { | 189 | bio_for_each_segment(bv, bio, iter) { |
189 | void *p1 = kmap_atomic(bv->bv_page); | 190 | void *p1 = kmap_atomic(bv.bv_page); |
190 | void *p2 = page_address(check->bi_io_vec[i].bv_page); | 191 | void *p2 = page_address(check->bi_io_vec[iter.bi_idx].bv_page); |
191 | 192 | ||
192 | cache_set_err_on(memcmp(p1 + bv->bv_offset, | 193 | cache_set_err_on(memcmp(p1 + bv.bv_offset, |
193 | p2 + bv->bv_offset, | 194 | p2 + bv.bv_offset, |
194 | bv->bv_len), | 195 | bv.bv_len), |
195 | dc->disk.c, | 196 | dc->disk.c, |
196 | "verify failed at dev %s sector %llu", | 197 | "verify failed at dev %s sector %llu", |
197 | bdevname(dc->bdev, name), | 198 | bdevname(dc->bdev, name), |
@@ -200,8 +201,8 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) | |||
200 | kunmap_atomic(p1); | 201 | kunmap_atomic(p1); |
201 | } | 202 | } |
202 | 203 | ||
203 | bio_for_each_segment_all(bv, check, i) | 204 | bio_for_each_segment_all(bv2, check, i) |
204 | __free_page(bv->bv_page); | 205 | __free_page(bv2->bv_page); |
205 | out_put: | 206 | out_put: |
206 | bio_put(check); | 207 | bio_put(check); |
207 | } | 208 | } |
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index dc44f0689eb7..9b5b6a41a9b6 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c | |||
@@ -22,12 +22,12 @@ static void bch_bi_idx_hack_endio(struct bio *bio, int error) | |||
22 | static void bch_generic_make_request_hack(struct bio *bio) | 22 | static void bch_generic_make_request_hack(struct bio *bio) |
23 | { | 23 | { |
24 | if (bio->bi_iter.bi_idx) { | 24 | if (bio->bi_iter.bi_idx) { |
25 | int i; | 25 | struct bio_vec bv; |
26 | struct bio_vec *bv; | 26 | struct bvec_iter iter; |
27 | struct bio *clone = bio_alloc(GFP_NOIO, bio_segments(bio)); | 27 | struct bio *clone = bio_alloc(GFP_NOIO, bio_segments(bio)); |
28 | 28 | ||
29 | bio_for_each_segment(bv, bio, i) | 29 | bio_for_each_segment(bv, bio, iter) |
30 | clone->bi_io_vec[clone->bi_vcnt++] = *bv; | 30 | clone->bi_io_vec[clone->bi_vcnt++] = bv; |
31 | 31 | ||
32 | clone->bi_iter.bi_sector = bio->bi_iter.bi_sector; | 32 | clone->bi_iter.bi_sector = bio->bi_iter.bi_sector; |
33 | clone->bi_bdev = bio->bi_bdev; | 33 | clone->bi_bdev = bio->bi_bdev; |
@@ -73,8 +73,9 @@ static void bch_generic_make_request_hack(struct bio *bio) | |||
73 | struct bio *bch_bio_split(struct bio *bio, int sectors, | 73 | struct bio *bch_bio_split(struct bio *bio, int sectors, |
74 | gfp_t gfp, struct bio_set *bs) | 74 | gfp_t gfp, struct bio_set *bs) |
75 | { | 75 | { |
76 | unsigned idx = bio->bi_iter.bi_idx, vcnt = 0, nbytes = sectors << 9; | 76 | unsigned vcnt = 0, nbytes = sectors << 9; |
77 | struct bio_vec *bv; | 77 | struct bio_vec bv; |
78 | struct bvec_iter iter; | ||
78 | struct bio *ret = NULL; | 79 | struct bio *ret = NULL; |
79 | 80 | ||
80 | BUG_ON(sectors <= 0); | 81 | BUG_ON(sectors <= 0); |
@@ -86,49 +87,35 @@ struct bio *bch_bio_split(struct bio *bio, int sectors, | |||
86 | ret = bio_alloc_bioset(gfp, 1, bs); | 87 | ret = bio_alloc_bioset(gfp, 1, bs); |
87 | if (!ret) | 88 | if (!ret) |
88 | return NULL; | 89 | return NULL; |
89 | idx = 0; | ||
90 | goto out; | 90 | goto out; |
91 | } | 91 | } |
92 | 92 | ||
93 | bio_for_each_segment(bv, bio, idx) { | 93 | bio_for_each_segment(bv, bio, iter) { |
94 | vcnt = idx - bio->bi_iter.bi_idx; | 94 | vcnt++; |
95 | 95 | ||
96 | if (!nbytes) { | 96 | if (nbytes <= bv.bv_len) |
97 | ret = bio_alloc_bioset(gfp, vcnt, bs); | 97 | break; |
98 | if (!ret) | ||
99 | return NULL; | ||
100 | 98 | ||
101 | memcpy(ret->bi_io_vec, __bio_iovec(bio), | 99 | nbytes -= bv.bv_len; |
102 | sizeof(struct bio_vec) * vcnt); | 100 | } |
103 | 101 | ||
104 | break; | 102 | ret = bio_alloc_bioset(gfp, vcnt, bs); |
105 | } else if (nbytes < bv->bv_len) { | 103 | if (!ret) |
106 | ret = bio_alloc_bioset(gfp, ++vcnt, bs); | 104 | return NULL; |
107 | if (!ret) | ||
108 | return NULL; | ||
109 | 105 | ||
110 | memcpy(ret->bi_io_vec, __bio_iovec(bio), | 106 | bio_for_each_segment(bv, bio, iter) { |
111 | sizeof(struct bio_vec) * vcnt); | 107 | ret->bi_io_vec[ret->bi_vcnt++] = bv; |
112 | 108 | ||
113 | ret->bi_io_vec[vcnt - 1].bv_len = nbytes; | 109 | if (ret->bi_vcnt == vcnt) |
114 | bv->bv_offset += nbytes; | ||
115 | bv->bv_len -= nbytes; | ||
116 | break; | 110 | break; |
117 | } | ||
118 | |||
119 | nbytes -= bv->bv_len; | ||
120 | } | 111 | } |
112 | |||
113 | ret->bi_io_vec[ret->bi_vcnt - 1].bv_len = nbytes; | ||
121 | out: | 114 | out: |
122 | ret->bi_bdev = bio->bi_bdev; | 115 | ret->bi_bdev = bio->bi_bdev; |
123 | ret->bi_iter.bi_sector = bio->bi_iter.bi_sector; | 116 | ret->bi_iter.bi_sector = bio->bi_iter.bi_sector; |
124 | ret->bi_iter.bi_size = sectors << 9; | 117 | ret->bi_iter.bi_size = sectors << 9; |
125 | ret->bi_rw = bio->bi_rw; | 118 | ret->bi_rw = bio->bi_rw; |
126 | ret->bi_vcnt = vcnt; | ||
127 | ret->bi_max_vecs = vcnt; | ||
128 | |||
129 | bio->bi_iter.bi_sector += sectors; | ||
130 | bio->bi_iter.bi_size -= sectors << 9; | ||
131 | bio->bi_iter.bi_idx = idx; | ||
132 | 119 | ||
133 | if (bio_integrity(bio)) { | 120 | if (bio_integrity(bio)) { |
134 | if (bio_integrity_clone(ret, bio, gfp)) { | 121 | if (bio_integrity_clone(ret, bio, gfp)) { |
@@ -137,9 +124,10 @@ out: | |||
137 | } | 124 | } |
138 | 125 | ||
139 | bio_integrity_trim(ret, 0, bio_sectors(ret)); | 126 | bio_integrity_trim(ret, 0, bio_sectors(ret)); |
140 | bio_integrity_trim(bio, bio_sectors(ret), bio_sectors(bio)); | ||
141 | } | 127 | } |
142 | 128 | ||
129 | bio_advance(bio, ret->bi_iter.bi_size); | ||
130 | |||
143 | return ret; | 131 | return ret; |
144 | } | 132 | } |
145 | 133 | ||
@@ -155,12 +143,13 @@ static unsigned bch_bio_max_sectors(struct bio *bio) | |||
155 | 143 | ||
156 | if (bio_segments(bio) > max_segments || | 144 | if (bio_segments(bio) > max_segments || |
157 | q->merge_bvec_fn) { | 145 | q->merge_bvec_fn) { |
158 | struct bio_vec *bv; | 146 | struct bio_vec bv; |
159 | int i, seg = 0; | 147 | struct bvec_iter iter; |
148 | unsigned seg = 0; | ||
160 | 149 | ||
161 | ret = 0; | 150 | ret = 0; |
162 | 151 | ||
163 | bio_for_each_segment(bv, bio, i) { | 152 | bio_for_each_segment(bv, bio, iter) { |
164 | struct bvec_merge_data bvm = { | 153 | struct bvec_merge_data bvm = { |
165 | .bi_bdev = bio->bi_bdev, | 154 | .bi_bdev = bio->bi_bdev, |
166 | .bi_sector = bio->bi_iter.bi_sector, | 155 | .bi_sector = bio->bi_iter.bi_sector, |
@@ -172,11 +161,11 @@ static unsigned bch_bio_max_sectors(struct bio *bio) | |||
172 | break; | 161 | break; |
173 | 162 | ||
174 | if (q->merge_bvec_fn && | 163 | if (q->merge_bvec_fn && |
175 | q->merge_bvec_fn(q, &bvm, bv) < (int) bv->bv_len) | 164 | q->merge_bvec_fn(q, &bvm, &bv) < (int) bv.bv_len) |
176 | break; | 165 | break; |
177 | 166 | ||
178 | seg++; | 167 | seg++; |
179 | ret += bv->bv_len >> 9; | 168 | ret += bv.bv_len >> 9; |
180 | } | 169 | } |
181 | } | 170 | } |
182 | 171 | ||
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 47a9bbc75124..4c0a422fd49f 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
@@ -198,14 +198,14 @@ static bool verify(struct cached_dev *dc, struct bio *bio) | |||
198 | 198 | ||
199 | static void bio_csum(struct bio *bio, struct bkey *k) | 199 | static void bio_csum(struct bio *bio, struct bkey *k) |
200 | { | 200 | { |
201 | struct bio_vec *bv; | 201 | struct bio_vec bv; |
202 | struct bvec_iter iter; | ||
202 | uint64_t csum = 0; | 203 | uint64_t csum = 0; |
203 | int i; | ||
204 | 204 | ||
205 | bio_for_each_segment(bv, bio, i) { | 205 | bio_for_each_segment(bv, bio, iter) { |
206 | void *d = kmap(bv->bv_page) + bv->bv_offset; | 206 | void *d = kmap(bv.bv_page) + bv.bv_offset; |
207 | csum = bch_crc64_update(csum, d, bv->bv_len); | 207 | csum = bch_crc64_update(csum, d, bv.bv_len); |
208 | kunmap(bv->bv_page); | 208 | kunmap(bv.bv_page); |
209 | } | 209 | } |
210 | 210 | ||
211 | k->ptr[KEY_PTRS(k)] = csum & (~0ULL >> 1); | 211 | k->ptr[KEY_PTRS(k)] = csum & (~0ULL >> 1); |
@@ -1182,17 +1182,17 @@ void bch_cached_dev_request_init(struct cached_dev *dc) | |||
1182 | static int flash_dev_cache_miss(struct btree *b, struct search *s, | 1182 | static int flash_dev_cache_miss(struct btree *b, struct search *s, |
1183 | struct bio *bio, unsigned sectors) | 1183 | struct bio *bio, unsigned sectors) |
1184 | { | 1184 | { |
1185 | struct bio_vec *bv; | 1185 | struct bio_vec bv; |
1186 | int i; | 1186 | struct bvec_iter iter; |
1187 | 1187 | ||
1188 | /* Zero fill bio */ | 1188 | /* Zero fill bio */ |
1189 | 1189 | ||
1190 | bio_for_each_segment(bv, bio, i) { | 1190 | bio_for_each_segment(bv, bio, iter) { |
1191 | unsigned j = min(bv->bv_len >> 9, sectors); | 1191 | unsigned j = min(bv.bv_len >> 9, sectors); |
1192 | 1192 | ||
1193 | void *p = kmap(bv->bv_page); | 1193 | void *p = kmap(bv.bv_page); |
1194 | memset(p + bv->bv_offset, 0, j << 9); | 1194 | memset(p + bv.bv_offset, 0, j << 9); |
1195 | kunmap(bv->bv_page); | 1195 | kunmap(bv.bv_page); |
1196 | 1196 | ||
1197 | sectors -= j; | 1197 | sectors -= j; |
1198 | } | 1198 | } |