aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei <tom.leiming@gmail.com>2016-11-22 10:57:21 -0500
committerJens Axboe <axboe@fb.com>2016-11-22 10:57:21 -0500
commit3a83f4677539bce8eaa2bca9ee9c20e172d7ab04 (patch)
treeedb5ffeed2c07c342bd6d9adb0180fab472c1666
parent9a794fb9bddeda0b8c8c13858038318f3cbd4b7e (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.c8
-rw-r--r--drivers/block/floppy.c3
-rw-r--r--drivers/md/bcache/io.c4
-rw-r--r--drivers/md/bcache/journal.c4
-rw-r--r--drivers/md/bcache/movinggc.c6
-rw-r--r--drivers/md/bcache/request.c2
-rw-r--r--drivers/md/bcache/super.c12
-rw-r--r--drivers/md/bcache/writeback.c5
-rw-r--r--drivers/md/dm-bufio.c4
-rw-r--r--drivers/md/dm.c2
-rw-r--r--drivers/md/multipath.c2
-rw-r--r--drivers/md/raid5-cache.c2
-rw-r--r--drivers/md/raid5.c9
-rw-r--r--drivers/nvme/target/io-cmd.c4
-rw-r--r--fs/block_dev.c4
-rw-r--r--fs/logfs/dev_bdev.c4
-rw-r--r--include/linux/bio.h3
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
273void bio_init(struct bio *bio) 273void 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}
279EXPORT_SYMBOL(bio_init); 283EXPORT_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
45static void nvmet_execute_rw(struct nvmet_req *req) 43static 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 *);
420extern int submit_bio_wait(struct bio *bio); 420extern int submit_bio_wait(struct bio *bio);
421extern void bio_advance(struct bio *, unsigned); 421extern void bio_advance(struct bio *, unsigned);
422 422
423extern void bio_init(struct bio *); 423extern void bio_init(struct bio *bio, struct bio_vec *table,
424 unsigned short max_vecs);
424extern void bio_reset(struct bio *); 425extern void bio_reset(struct bio *);
425void bio_chain(struct bio *, struct bio *); 426void bio_chain(struct bio *, struct bio *);
426 427