hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/block/bounce.c
....@@ -18,7 +18,7 @@
1818 #include <linux/init.h>
1919 #include <linux/hash.h>
2020 #include <linux/highmem.h>
21
-#include <linux/bootmem.h>
21
+#include <linux/memblock.h>
2222 #include <linux/printk.h>
2323 #include <asm/tlbflush.h>
2424
....@@ -163,13 +163,13 @@
163163 {
164164 struct bio *bio_orig = bio->bi_private;
165165 struct bio_vec *bvec, orig_vec;
166
- int i;
167166 struct bvec_iter orig_iter = bio_orig->bi_iter;
167
+ struct bvec_iter_all iter_all;
168168
169169 /*
170170 * free up bounce indirect pages used
171171 */
172
- bio_for_each_segment_all(bvec, bio, i) {
172
+ bio_for_each_segment_all(bvec, bio, iter_all) {
173173 orig_vec = bio_iter_iovec(bio_orig, orig_iter);
174174 if (bvec->bv_page != orig_vec.bv_page) {
175175 dec_zone_page_state(bvec->bv_page, NR_BOUNCE);
....@@ -267,17 +267,21 @@
267267 break;
268268 }
269269
270
- bio_crypt_clone(bio, bio_src, gfp_mask);
270
+ if (bio_crypt_clone(bio, bio_src, gfp_mask) < 0)
271
+ goto err_put;
271272
272273 if (bio_integrity(bio_src) &&
273
- bio_integrity_clone(bio, bio_src, gfp_mask) < 0) {
274
- bio_put(bio);
275
- return NULL;
276
- }
274
+ bio_integrity_clone(bio, bio_src, gfp_mask) < 0)
275
+ goto err_put;
277276
278
- bio_clone_blkcg_association(bio, bio_src);
277
+ bio_clone_blkg_association(bio, bio_src);
278
+ blkcg_bio_issue_init(bio);
279279
280280 return bio;
281
+
282
+err_put:
283
+ bio_put(bio);
284
+ return NULL;
281285 }
282286
283287 static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
....@@ -304,13 +308,18 @@
304308 if (!passthrough && sectors < bio_sectors(*bio_orig)) {
305309 bio = bio_split(*bio_orig, sectors, GFP_NOIO, &bounce_bio_split);
306310 bio_chain(bio, *bio_orig);
307
- generic_make_request(*bio_orig);
311
+ submit_bio_noacct(*bio_orig);
308312 *bio_orig = bio;
309313 }
310314 bio = bounce_clone_bio(*bio_orig, GFP_NOIO, passthrough ? NULL :
311315 &bounce_bio_set);
312316
313
- bio_for_each_segment_all(to, bio, i) {
317
+ /*
318
+ * Bvec table can't be updated by bio_for_each_segment_all(),
319
+ * so retrieve bvec from the table directly. This way is safe
320
+ * because the 'bio' is single-page bvec.
321
+ */
322
+ for (i = 0, to = bio->bi_io_vec; i < bio->bi_vcnt; to++, i++) {
314323 struct page *page = to->bv_page;
315324
316325 if (page_to_pfn(page) <= q->limits.bounce_pfn)