diff options
author | Ming Lei <tom.leiming@gmail.com> | 2016-11-22 10:57:21 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-11-22 10:57:21 -0500 |
commit | 3a83f4677539bce8eaa2bca9ee9c20e172d7ab04 (patch) | |
tree | edb5ffeed2c07c342bd6d9adb0180fab472c1666 | |
parent | 9a794fb9bddeda0b8c8c13858038318f3cbd4b7e (diff) |
block: bio: pass bvec table to bio_init()
Some drivers often use external bvec table, so introduce
this helper for this case. It is always safe to access the
bio->bi_io_vec in this way for this case.
After converting to this usage, it will becomes a bit easier
to evaluate the remaining direct access to bio->bi_io_vec,
so it can help to prepare for the following multipage bvec
support.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Fixed up the new O_DIRECT cases.
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | block/bio.c | 8 | ||||
-rw-r--r-- | drivers/block/floppy.c | 3 | ||||
-rw-r--r-- | drivers/md/bcache/io.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/journal.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/movinggc.c | 6 | ||||
-rw-r--r-- | drivers/md/bcache/request.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/super.c | 12 | ||||
-rw-r--r-- | drivers/md/bcache/writeback.c | 5 | ||||
-rw-r--r-- | drivers/md/dm-bufio.c | 4 | ||||
-rw-r--r-- | drivers/md/dm.c | 2 | ||||
-rw-r--r-- | drivers/md/multipath.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5-cache.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5.c | 9 | ||||
-rw-r--r-- | drivers/nvme/target/io-cmd.c | 4 | ||||
-rw-r--r-- | fs/block_dev.c | 4 | ||||
-rw-r--r-- | fs/logfs/dev_bdev.c | 4 | ||||
-rw-r--r-- | include/linux/bio.h | 3 |
17 files changed, 28 insertions, 50 deletions
diff --git a/block/bio.c b/block/bio.c index 2cf6ebabc68c..de257ced69b1 100644 --- a/block/bio.c +++ b/block/bio.c | |||
@@ -270,11 +270,15 @@ static void bio_free(struct bio *bio) | |||
270 | } | 270 | } |
271 | } | 271 | } |
272 | 272 | ||
273 | void bio_init(struct bio *bio) | 273 | void bio_init(struct bio *bio, struct bio_vec *table, |
274 | unsigned short max_vecs) | ||
274 | { | 275 | { |
275 | memset(bio, 0, sizeof(*bio)); | 276 | memset(bio, 0, sizeof(*bio)); |
276 | atomic_set(&bio->__bi_remaining, 1); | 277 | atomic_set(&bio->__bi_remaining, 1); |
277 | atomic_set(&bio->__bi_cnt, 1); | 278 | atomic_set(&bio->__bi_cnt, 1); |
279 | |||
280 | bio->bi_io_vec = table; | ||
281 | bio->bi_max_vecs = max_vecs; | ||
278 | } | 282 | } |
279 | EXPORT_SYMBOL(bio_init); | 283 | EXPORT_SYMBOL(bio_init); |
280 | 284 | ||
@@ -480,7 +484,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs) | |||
480 | return NULL; | 484 | return NULL; |
481 | 485 | ||
482 | bio = p + front_pad; | 486 | bio = p + front_pad; |
483 | bio_init(bio); | 487 | bio_init(bio, NULL, 0); |
484 | 488 | ||
485 | if (nr_iovecs > inline_vecs) { | 489 | if (nr_iovecs > inline_vecs) { |
486 | unsigned long idx = 0; | 490 | unsigned long idx = 0; |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index e3d8e4ced4a2..6a3ff2b2e3ae 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -3806,8 +3806,7 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) | |||
3806 | 3806 | ||
3807 | cbdata.drive = drive; | 3807 | cbdata.drive = drive; |
3808 | 3808 | ||
3809 | bio_init(&bio); | 3809 | bio_init(&bio, &bio_vec, 1); |
3810 | bio.bi_io_vec = &bio_vec; | ||
3811 | bio_vec.bv_page = page; | 3810 | bio_vec.bv_page = page; |
3812 | bio_vec.bv_len = size; | 3811 | bio_vec.bv_len = size; |
3813 | bio_vec.bv_offset = 0; | 3812 | bio_vec.bv_offset = 0; |
diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index e97b0acf7b8d..db45a88c0ce9 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c | |||
@@ -24,9 +24,7 @@ struct bio *bch_bbio_alloc(struct cache_set *c) | |||
24 | struct bbio *b = mempool_alloc(c->bio_meta, GFP_NOIO); | 24 | struct bbio *b = mempool_alloc(c->bio_meta, GFP_NOIO); |
25 | struct bio *bio = &b->bio; | 25 | struct bio *bio = &b->bio; |
26 | 26 | ||
27 | bio_init(bio); | 27 | bio_init(bio, bio->bi_inline_vecs, bucket_pages(c)); |
28 | bio->bi_max_vecs = bucket_pages(c); | ||
29 | bio->bi_io_vec = bio->bi_inline_vecs; | ||
30 | 28 | ||
31 | return bio; | 29 | return bio; |
32 | } | 30 | } |
diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 6925023e12d4..1198e53d5670 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c | |||
@@ -448,13 +448,11 @@ static void do_journal_discard(struct cache *ca) | |||
448 | 448 | ||
449 | atomic_set(&ja->discard_in_flight, DISCARD_IN_FLIGHT); | 449 | atomic_set(&ja->discard_in_flight, DISCARD_IN_FLIGHT); |
450 | 450 | ||
451 | bio_init(bio); | 451 | bio_init(bio, bio->bi_inline_vecs, 1); |
452 | bio_set_op_attrs(bio, REQ_OP_DISCARD, 0); | 452 | bio_set_op_attrs(bio, REQ_OP_DISCARD, 0); |
453 | bio->bi_iter.bi_sector = bucket_to_sector(ca->set, | 453 | bio->bi_iter.bi_sector = bucket_to_sector(ca->set, |
454 | ca->sb.d[ja->discard_idx]); | 454 | ca->sb.d[ja->discard_idx]); |
455 | bio->bi_bdev = ca->bdev; | 455 | bio->bi_bdev = ca->bdev; |
456 | bio->bi_max_vecs = 1; | ||
457 | bio->bi_io_vec = bio->bi_inline_vecs; | ||
458 | bio->bi_iter.bi_size = bucket_bytes(ca); | 456 | bio->bi_iter.bi_size = bucket_bytes(ca); |
459 | bio->bi_end_io = journal_discard_endio; | 457 | bio->bi_end_io = journal_discard_endio; |
460 | 458 | ||
diff --git a/drivers/md/bcache/movinggc.c b/drivers/md/bcache/movinggc.c index 5c4bddecfaf0..13b8a907006d 100644 --- a/drivers/md/bcache/movinggc.c +++ b/drivers/md/bcache/movinggc.c | |||
@@ -77,15 +77,13 @@ static void moving_init(struct moving_io *io) | |||
77 | { | 77 | { |
78 | struct bio *bio = &io->bio.bio; | 78 | struct bio *bio = &io->bio.bio; |
79 | 79 | ||
80 | bio_init(bio); | 80 | bio_init(bio, bio->bi_inline_vecs, |
81 | DIV_ROUND_UP(KEY_SIZE(&io->w->key), PAGE_SECTORS)); | ||
81 | bio_get(bio); | 82 | bio_get(bio); |
82 | bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); | 83 | bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); |
83 | 84 | ||
84 | bio->bi_iter.bi_size = KEY_SIZE(&io->w->key) << 9; | 85 | bio->bi_iter.bi_size = KEY_SIZE(&io->w->key) << 9; |
85 | bio->bi_max_vecs = DIV_ROUND_UP(KEY_SIZE(&io->w->key), | ||
86 | PAGE_SECTORS); | ||
87 | bio->bi_private = &io->cl; | 86 | bio->bi_private = &io->cl; |
88 | bio->bi_io_vec = bio->bi_inline_vecs; | ||
89 | bch_bio_map(bio, NULL); | 87 | bch_bio_map(bio, NULL); |
90 | } | 88 | } |
91 | 89 | ||
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 0d99b5f4b3e6..f49c5417527d 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
@@ -623,7 +623,7 @@ static void do_bio_hook(struct search *s, struct bio *orig_bio) | |||
623 | { | 623 | { |
624 | struct bio *bio = &s->bio.bio; | 624 | struct bio *bio = &s->bio.bio; |
625 | 625 | ||
626 | bio_init(bio); | 626 | bio_init(bio, NULL, 0); |
627 | __bio_clone_fast(bio, orig_bio); | 627 | __bio_clone_fast(bio, orig_bio); |
628 | bio->bi_end_io = request_endio; | 628 | bio->bi_end_io = request_endio; |
629 | bio->bi_private = &s->cl; | 629 | bio->bi_private = &s->cl; |
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 988edf928466..2fb5bfeb43e2 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c | |||
@@ -1152,9 +1152,7 @@ static void register_bdev(struct cache_sb *sb, struct page *sb_page, | |||
1152 | dc->bdev = bdev; | 1152 | dc->bdev = bdev; |
1153 | dc->bdev->bd_holder = dc; | 1153 | dc->bdev->bd_holder = dc; |
1154 | 1154 | ||
1155 | bio_init(&dc->sb_bio); | 1155 | bio_init(&dc->sb_bio, dc->sb_bio.bi_inline_vecs, 1); |
1156 | dc->sb_bio.bi_max_vecs = 1; | ||
1157 | dc->sb_bio.bi_io_vec = dc->sb_bio.bi_inline_vecs; | ||
1158 | dc->sb_bio.bi_io_vec[0].bv_page = sb_page; | 1156 | dc->sb_bio.bi_io_vec[0].bv_page = sb_page; |
1159 | get_page(sb_page); | 1157 | get_page(sb_page); |
1160 | 1158 | ||
@@ -1814,9 +1812,7 @@ static int cache_alloc(struct cache *ca) | |||
1814 | __module_get(THIS_MODULE); | 1812 | __module_get(THIS_MODULE); |
1815 | kobject_init(&ca->kobj, &bch_cache_ktype); | 1813 | kobject_init(&ca->kobj, &bch_cache_ktype); |
1816 | 1814 | ||
1817 | bio_init(&ca->journal.bio); | 1815 | bio_init(&ca->journal.bio, ca->journal.bio.bi_inline_vecs, 8); |
1818 | ca->journal.bio.bi_max_vecs = 8; | ||
1819 | ca->journal.bio.bi_io_vec = ca->journal.bio.bi_inline_vecs; | ||
1820 | 1816 | ||
1821 | free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; | 1817 | free = roundup_pow_of_two(ca->sb.nbuckets) >> 10; |
1822 | 1818 | ||
@@ -1852,9 +1848,7 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, | |||
1852 | ca->bdev = bdev; | 1848 | ca->bdev = bdev; |
1853 | ca->bdev->bd_holder = ca; | 1849 | ca->bdev->bd_holder = ca; |
1854 | 1850 | ||
1855 | bio_init(&ca->sb_bio); | 1851 | bio_init(&ca->sb_bio, ca->sb_bio.bi_inline_vecs, 1); |
1856 | ca->sb_bio.bi_max_vecs = 1; | ||
1857 | ca->sb_bio.bi_io_vec = ca->sb_bio.bi_inline_vecs; | ||
1858 | ca->sb_bio.bi_io_vec[0].bv_page = sb_page; | 1852 | ca->sb_bio.bi_io_vec[0].bv_page = sb_page; |
1859 | get_page(sb_page); | 1853 | get_page(sb_page); |
1860 | 1854 | ||
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index e51644e503a5..69e1ae59cab8 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c | |||
@@ -106,14 +106,13 @@ static void dirty_init(struct keybuf_key *w) | |||
106 | struct dirty_io *io = w->private; | 106 | struct dirty_io *io = w->private; |
107 | struct bio *bio = &io->bio; | 107 | struct bio *bio = &io->bio; |
108 | 108 | ||
109 | bio_init(bio); | 109 | bio_init(bio, bio->bi_inline_vecs, |
110 | DIV_ROUND_UP(KEY_SIZE(&w->key), PAGE_SECTORS)); | ||
110 | if (!io->dc->writeback_percent) | 111 | if (!io->dc->writeback_percent) |
111 | bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); | 112 | bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); |
112 | 113 | ||
113 | bio->bi_iter.bi_size = KEY_SIZE(&w->key) << 9; | 114 | bio->bi_iter.bi_size = KEY_SIZE(&w->key) << 9; |
114 | bio->bi_max_vecs = DIV_ROUND_UP(KEY_SIZE(&w->key), PAGE_SECTORS); | ||
115 | bio->bi_private = w; | 115 | bio->bi_private = w; |
116 | bio->bi_io_vec = bio->bi_inline_vecs; | ||
117 | bch_bio_map(bio, NULL); | 116 | bch_bio_map(bio, NULL); |
118 | } | 117 | } |
119 | 118 | ||
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index b3ba142e59a4..262e75365cc0 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c | |||
@@ -611,9 +611,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, | |||
611 | char *ptr; | 611 | char *ptr; |
612 | int len; | 612 | int len; |
613 | 613 | ||
614 | bio_init(&b->bio); | 614 | bio_init(&b->bio, b->bio_vec, DM_BUFIO_INLINE_VECS); |
615 | b->bio.bi_io_vec = b->bio_vec; | ||
616 | b->bio.bi_max_vecs = DM_BUFIO_INLINE_VECS; | ||
617 | b->bio.bi_iter.bi_sector = block << b->c->sectors_per_block_bits; | 615 | b->bio.bi_iter.bi_sector = block << b->c->sectors_per_block_bits; |
618 | b->bio.bi_bdev = b->c->bdev; | 616 | b->bio.bi_bdev = b->c->bdev; |
619 | b->bio.bi_end_io = inline_endio; | 617 | b->bio.bi_end_io = inline_endio; |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index b2abfa41af3e..7915467d3726 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1525,7 +1525,7 @@ static struct mapped_device *alloc_dev(int minor) | |||
1525 | if (!md->bdev) | 1525 | if (!md->bdev) |
1526 | goto bad; | 1526 | goto bad; |
1527 | 1527 | ||
1528 | bio_init(&md->flush_bio); | 1528 | bio_init(&md->flush_bio, NULL, 0); |
1529 | md->flush_bio.bi_bdev = md->bdev; | 1529 | md->flush_bio.bi_bdev = md->bdev; |
1530 | md->flush_bio.bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; | 1530 | md->flush_bio.bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; |
1531 | 1531 | ||
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 673efbd6fc47..4da06d813b8f 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -130,7 +130,7 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) | |||
130 | } | 130 | } |
131 | multipath = conf->multipaths + mp_bh->path; | 131 | multipath = conf->multipaths + mp_bh->path; |
132 | 132 | ||
133 | bio_init(&mp_bh->bio); | 133 | bio_init(&mp_bh->bio, NULL, 0); |
134 | __bio_clone_fast(&mp_bh->bio, bio); | 134 | __bio_clone_fast(&mp_bh->bio, bio); |
135 | 135 | ||
136 | mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset; | 136 | mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset; |
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index 28d015c6fffe..25e9622d7d80 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c | |||
@@ -1201,7 +1201,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev) | |||
1201 | INIT_LIST_HEAD(&log->io_end_ios); | 1201 | INIT_LIST_HEAD(&log->io_end_ios); |
1202 | INIT_LIST_HEAD(&log->flushing_ios); | 1202 | INIT_LIST_HEAD(&log->flushing_ios); |
1203 | INIT_LIST_HEAD(&log->finished_ios); | 1203 | INIT_LIST_HEAD(&log->finished_ios); |
1204 | bio_init(&log->flush_bio); | 1204 | bio_init(&log->flush_bio, NULL, 0); |
1205 | 1205 | ||
1206 | log->io_kc = KMEM_CACHE(r5l_io_unit, 0); | 1206 | log->io_kc = KMEM_CACHE(r5l_io_unit, 0); |
1207 | if (!log->io_kc) | 1207 | if (!log->io_kc) |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 70acdd379e44..5f9e28443c8a 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2004,13 +2004,8 @@ static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp, | |||
2004 | for (i = 0; i < disks; i++) { | 2004 | for (i = 0; i < disks; i++) { |
2005 | struct r5dev *dev = &sh->dev[i]; | 2005 | struct r5dev *dev = &sh->dev[i]; |
2006 | 2006 | ||
2007 | bio_init(&dev->req); | 2007 | bio_init(&dev->req, &dev->vec, 1); |
2008 | dev->req.bi_io_vec = &dev->vec; | 2008 | bio_init(&dev->rreq, &dev->rvec, 1); |
2009 | dev->req.bi_max_vecs = 1; | ||
2010 | |||
2011 | bio_init(&dev->rreq); | ||
2012 | dev->rreq.bi_io_vec = &dev->rvec; | ||
2013 | dev->rreq.bi_max_vecs = 1; | ||
2014 | } | 2009 | } |
2015 | } | 2010 | } |
2016 | return sh; | 2011 | return sh; |
diff --git a/drivers/nvme/target/io-cmd.c b/drivers/nvme/target/io-cmd.c index ef52b1e70144..c4dc9ea8ade0 100644 --- a/drivers/nvme/target/io-cmd.c +++ b/drivers/nvme/target/io-cmd.c | |||
@@ -37,9 +37,7 @@ static void nvmet_inline_bio_init(struct nvmet_req *req) | |||
37 | { | 37 | { |
38 | struct bio *bio = &req->inline_bio; | 38 | struct bio *bio = &req->inline_bio; |
39 | 39 | ||
40 | bio_init(bio); | 40 | bio_init(bio, req->inline_bvec, NVMET_MAX_INLINE_BIOVEC); |
41 | bio->bi_max_vecs = NVMET_MAX_INLINE_BIOVEC; | ||
42 | bio->bi_io_vec = req->inline_bvec; | ||
43 | } | 41 | } |
44 | 42 | ||
45 | static void nvmet_execute_rw(struct nvmet_req *req) | 43 | static void nvmet_execute_rw(struct nvmet_req *req) |
diff --git a/fs/block_dev.c b/fs/block_dev.c index b0c790a19db9..7022ddc55b12 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -222,9 +222,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter, | |||
222 | return -ENOMEM; | 222 | return -ENOMEM; |
223 | } | 223 | } |
224 | 224 | ||
225 | bio_init(&bio); | 225 | bio_init(&bio, vecs, nr_pages); |
226 | bio.bi_max_vecs = nr_pages; | ||
227 | bio.bi_io_vec = vecs; | ||
228 | bio.bi_bdev = bdev; | 226 | bio.bi_bdev = bdev; |
229 | bio.bi_iter.bi_sector = pos >> 9; | 227 | bio.bi_iter.bi_sector = pos >> 9; |
230 | bio.bi_private = current; | 228 | bio.bi_private = current; |
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index a8329cc47dec..dc8cafeee038 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
@@ -19,9 +19,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int op) | |||
19 | struct bio bio; | 19 | struct bio bio; |
20 | struct bio_vec bio_vec; | 20 | struct bio_vec bio_vec; |
21 | 21 | ||
22 | bio_init(&bio); | 22 | bio_init(&bio, &bio_vec, 1); |
23 | bio.bi_max_vecs = 1; | ||
24 | bio.bi_io_vec = &bio_vec; | ||
25 | bio_vec.bv_page = page; | 23 | bio_vec.bv_page = page; |
26 | bio_vec.bv_len = PAGE_SIZE; | 24 | bio_vec.bv_len = PAGE_SIZE; |
27 | bio_vec.bv_offset = 0; | 25 | bio_vec.bv_offset = 0; |
diff --git a/include/linux/bio.h b/include/linux/bio.h index d367cd37a7f7..70a7244f08a7 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
@@ -420,7 +420,8 @@ extern int bio_phys_segments(struct request_queue *, struct bio *); | |||
420 | extern int submit_bio_wait(struct bio *bio); | 420 | extern int submit_bio_wait(struct bio *bio); |
421 | extern void bio_advance(struct bio *, unsigned); | 421 | extern void bio_advance(struct bio *, unsigned); |
422 | 422 | ||
423 | extern void bio_init(struct bio *); | 423 | extern void bio_init(struct bio *bio, struct bio_vec *table, |
424 | unsigned short max_vecs); | ||
424 | extern void bio_reset(struct bio *); | 425 | extern void bio_reset(struct bio *); |
425 | void bio_chain(struct bio *, struct bio *); | 426 | void bio_chain(struct bio *, struct bio *); |
426 | 427 | ||