From: Christoph Hellwig Date: Mon, 25 Jan 2021 17:13:54 +0000 (+0100) Subject: block: pass a bdev argument to bio_init X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Fbio_alloc;p=users%2Fhch%2Fblock.git block: pass a bdev argument to bio_init Clean up some code and prepare for always having a valid bi_bdev in the bio. Signed-off-by: Christoph Hellwig --- diff --git a/block/bio.c b/block/bio.c index f56b71153f40..65a4406709ce 100644 --- a/block/bio.c +++ b/block/bio.c @@ -264,13 +264,15 @@ static void bio_free(struct bio *bio) * they must remember to pair any call to bio_init() with bio_uninit() * when IO has completed, or when the bio is released. */ -void bio_init(struct bio *bio, struct bio_vec *table, +void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table, unsigned short max_vecs) { memset(bio, 0, sizeof(*bio)); atomic_set(&bio->__bi_remaining, 1); atomic_set(&bio->__bi_cnt, 1); + if (bdev) + bio_set_dev(bio, bdev); bio->bi_io_vec = table; bio->bi_max_vecs = max_vecs; } @@ -487,15 +489,13 @@ struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned int nr_iovecs, goto err_free; bio->bi_flags |= idx << BVEC_POOL_OFFSET; - bio_init(bio, bvl, bvec_nr_vecs(idx)); + bio_init(bio, bdev, bvl, bvec_nr_vecs(idx)); } else if (nr_iovecs) { - bio_init(bio, bio->bi_inline_vecs, BIO_INLINE_VECS); + bio_init(bio, bdev, bio->bi_inline_vecs, BIO_INLINE_VECS); } else { - bio_init(bio, NULL, 0); + bio_init(bio, bdev, NULL, 0); } - if (bdev) - bio_set_dev(bio, bdev); bio->bi_pool = bs; return bio; @@ -526,9 +526,7 @@ struct bio *bio_kmalloc(struct block_device *bdev, unsigned int nr_iovecs, bio = kmalloc(struct_size(bio, bi_inline_vecs, nr_iovecs), gfp_mask); if (unlikely(!bio)) return NULL; - bio_init(bio, nr_iovecs ? bio->bi_inline_vecs : NULL, nr_iovecs); - if (bdev) - bio_set_dev(bio, bdev); + bio_init(bio, bdev, nr_iovecs ? bio->bi_inline_vecs : NULL, nr_iovecs); bio->bi_pool = NULL; return bio; } diff --git a/block/blk-flush.c b/block/blk-flush.c index 7942ca6ed321..50a7ca9b52a6 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -440,8 +440,7 @@ int blkdev_issue_flush(struct block_device *bdev) { struct bio bio; - bio_init(&bio, NULL, 0); - bio_set_dev(&bio, bdev); + bio_init(&bio, bdev, NULL, 0); bio.bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; return submit_bio_wait(&bio); } diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index dfe1dfc901cc..b1113fcfbe9b 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -4218,8 +4218,7 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive) cbdata.drive = drive; - bio_init(&bio, &bio_vec, 1); - bio_set_dev(&bio, bdev); + bio_init(&bio, bdev, &bio_vec, 1); bio_add_page(&bio, page, block_size(bdev), 0); bio.bi_iter.bi_sector = 0; diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 7ee6adf8fbf8..e1c17ed4c888 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -717,8 +717,7 @@ static ssize_t writeback_store(struct device *dev, continue; } - bio_init(&bio, &bio_vec, 1); - bio_set_dev(&bio, zram->bdev); + bio_init(&bio, zram->bdev, &bio_vec, 1); bio.bi_iter.bi_sector = blk_idx * (PAGE_SIZE >> 9); bio.bi_opf = REQ_OP_WRITE | REQ_SYNC; diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 28ddcaa5358b..a7bc025273df 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c @@ -833,7 +833,7 @@ static int nvm_bb_chunk_sense(struct nvm_dev *dev, struct ppa_addr ppa) if (!page) return -ENOMEM; - bio_init(&bio, &bio_vec, 1); + bio_init(&bio, NULL, &bio_vec, 1); bio_add_page(&bio, page, PAGE_SIZE, 0); bio_set_op_attrs(&bio, REQ_OP_READ, 0); diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c index 3ee85758f5f8..4dd257bb57eb 100644 --- a/drivers/md/bcache/io.c +++ b/drivers/md/bcache/io.c @@ -26,9 +26,8 @@ struct bio *bch_bbio_alloc(struct cache_set *c) struct bbio *b = mempool_alloc(&c->bio_meta, GFP_NOIO); struct bio *bio = &b->bio; - bio_init(bio, bio->bi_inline_vecs, meta_bucket_pages(&c->cache->sb)); - bio_set_dev(bio, c->cache->bdev); - + bio_init(bio, c->cache->bdev, bio->bi_inline_vecs, + meta_bucket_pages(&c->cache->sb)); return bio; } diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 718c3c6199e8..8050915e9426 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -611,11 +611,10 @@ static void do_journal_discard(struct cache *ca) atomic_set(&ja->discard_in_flight, DISCARD_IN_FLIGHT); - bio_init(bio, bio->bi_inline_vecs, 1); + bio_init(bio, ca->bdev, bio->bi_inline_vecs, 1); bio_set_op_attrs(bio, REQ_OP_DISCARD, 0); bio->bi_iter.bi_sector = bucket_to_sector(ca->set, ca->sb.d[ja->discard_idx]); - bio_set_dev(bio, ca->bdev); bio->bi_iter.bi_size = bucket_bytes(ca); bio->bi_end_io = journal_discard_endio; @@ -775,7 +774,6 @@ static void journal_write_unlocked(struct closure *cl) bio_reset(bio); bio->bi_iter.bi_sector = PTR_OFFSET(k, i); - bio_set_dev(bio, ca->bdev); bio->bi_iter.bi_size = sectors << 9; bio->bi_end_io = journal_write_endio; diff --git a/drivers/md/bcache/movinggc.c b/drivers/md/bcache/movinggc.c index a22f4bbb79e6..9ca72a9067ce 100644 --- a/drivers/md/bcache/movinggc.c +++ b/drivers/md/bcache/movinggc.c @@ -79,9 +79,8 @@ static void moving_init(struct moving_io *io) { struct bio *bio = &io->bio.bio; - bio_init(bio, bio->bi_inline_vecs, + bio_init(bio, io->op.c->cache->bdev, bio->bi_inline_vecs, DIV_ROUND_UP(KEY_SIZE(&io->w->key), PAGE_SECTORS)); - bio_set_dev(bio, io->op.c->cache->bdev); bio_get(bio); bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 84917158da7c..b8f592df7173 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c @@ -685,8 +685,7 @@ static void do_bio_hook(struct search *s, { struct bio *bio = &s->bio.bio; - bio_init(bio, NULL, 0); - bio->bi_bdev = orig_bio->bi_bdev; + bio_init(bio, orig_bio->bi_bdev, NULL, 0); __bio_clone_fast(bio, orig_bio); /* * bi_end_io can be set separately somewhere else, e.g. the diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 193fe7652329..dd0ee870e2bd 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -341,8 +341,7 @@ void bch_write_bdev_super(struct cached_dev *dc, struct closure *parent) down(&dc->sb_write_mutex); closure_init(cl, parent); - bio_init(bio, dc->sb_bv, 1); - bio_set_dev(bio, dc->bdev); + bio_init(bio, dc->bdev, dc->sb_bv, 1); bio->bi_end_io = write_bdev_super_endio; bio->bi_private = dc; @@ -385,8 +384,7 @@ void bcache_write_super(struct cache_set *c) if (ca->sb.version < version) ca->sb.version = version; - bio_init(bio, ca->sb_bv, 1); - bio_set_dev(bio, ca->bdev); + bio_init(bio, ca->bdev, ca->sb_bv, 1); bio->bi_end_io = write_super_endio; bio->bi_private = ca; @@ -2242,7 +2240,7 @@ static int cache_alloc(struct cache *ca) __module_get(THIS_MODULE); kobject_init(&ca->kobj, &bch_cache_ktype); - bio_init(&ca->journal.bio, ca->journal.bio.bi_inline_vecs, 8); + bio_init(&ca->journal.bio, ca->bdev, ca->journal.bio.bi_inline_vecs, 8); /* * when ca->sb.njournal_buckets is not zero, journal exists, diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 681d135f20d8..3c00db4c27da 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c @@ -249,12 +249,12 @@ struct dirty_io { struct bio bio; }; -static void dirty_init(struct keybuf_key *w) +static void dirty_init(struct keybuf_key *w, struct block_device *bdev) { struct dirty_io *io = w->private; struct bio *bio = &io->bio; - bio_init(bio, bio->bi_inline_vecs, + bio_init(bio, bdev, bio->bi_inline_vecs, DIV_ROUND_UP(KEY_SIZE(&w->key), PAGE_SECTORS)); if (!io->dc->writeback_percent) bio_set_prio(bio, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0)); @@ -356,10 +356,9 @@ static void write_dirty(struct closure *cl) * to clean up. */ if (KEY_DIRTY(&w->key)) { - dirty_init(w); + dirty_init(w, io->dc->bdev); bio_set_op_attrs(&io->bio, REQ_OP_WRITE, 0); io->bio.bi_iter.bi_sector = KEY_START(&w->key); - bio_set_dev(&io->bio, io->dc->bdev); io->bio.bi_end_io = dirty_endio; /* I/O request sent to backing device */ @@ -469,10 +468,9 @@ static void read_dirty(struct cached_dev *dc) io->dc = dc; io->sequence = sequence++; - dirty_init(w); + dirty_init(w, dc->disk.c->cache->bdev); bio_set_op_attrs(&io->bio, REQ_OP_READ, 0); io->bio.bi_iter.bi_sector = PTR_OFFSET(&w->key, 0); - bio_set_dev(&io->bio, dc->disk.c->cache->bdev); io->bio.bi_end_io = read_dirty_endio; if (bch_bio_alloc_pages(&io->bio, GFP_KERNEL)) diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 11890db71f3f..e254e763d7f8 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c @@ -1131,7 +1131,6 @@ static int flush_data(struct dm_snapshot *s) struct bio *flush_bio = &s->flush_bio; bio_reset(flush_bio); - bio_set_dev(flush_bio, s->origin->bdev); flush_bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; return submit_bio_wait(flush_bio); @@ -1339,7 +1338,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) s->first_merging_chunk = 0; s->num_merging_chunks = 0; bio_list_init(&s->bios_queued_during_merge); - bio_init(&s->flush_bio, NULL, 0); + bio_init(&s->flush_bio, s->origin->bdev, NULL, 0); /* Allocate hash table for COW data */ if (init_hash_tables(s)) { diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index ebb8d72939a4..b9efbc6e3685 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -2998,7 +2998,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, pool->low_water_triggered = false; pool->suspended = true; pool->out_of_data_space = false; - bio_init(&pool->flush_bio, NULL, 0); + bio_init(&pool->flush_bio, data_dev, NULL, 0); pool->shared_read_ds = dm_deferred_set_create(); if (!pool->shared_read_ds) { @@ -3208,7 +3208,6 @@ static int metadata_pre_commit_callback(void *context) struct bio *flush_bio = &pool->flush_bio; bio_reset(flush_bio); - bio_set_dev(flush_bio, pool->data_dev); flush_bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; return submit_bio_wait(flush_bio); diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 0787f4ee2539..bb57ac40d1b4 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1425,9 +1425,8 @@ static int __send_empty_flush(struct clone_info *ci) * need to reference it after submit. It's just used as * the basis for the clone(s). */ - bio_init(&flush_bio, NULL, 0); + bio_init(&flush_bio, ci->io->md->disk->part0, NULL, 0); flush_bio.bi_opf = REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC; - bio_set_dev(&flush_bio, ci->io->md->disk->part0); ci->bio = &flush_bio; ci->sector_count = 0; diff --git a/drivers/md/md-multipath.c b/drivers/md/md-multipath.c index 776bbe542db5..4954d2291537 100644 --- a/drivers/md/md-multipath.c +++ b/drivers/md/md-multipath.c @@ -121,11 +121,10 @@ static bool multipath_make_request(struct mddev *mddev, struct bio * bio) } multipath = conf->multipaths + mp_bh->path; - bio_init(&mp_bh->bio, NULL, 0); + bio_init(&mp_bh->bio, multipath->rdev->bdev, NULL, 0); __bio_clone_fast(&mp_bh->bio, bio); mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset; - bio_set_dev(&mp_bh->bio, multipath->rdev->bdev); mp_bh->bio.bi_opf |= REQ_FAILFAST_TRANSPORT; mp_bh->bio.bi_end_io = multipath_end_request; mp_bh->bio.bi_private = mp_bh; diff --git a/drivers/md/md.c b/drivers/md/md.c index 85b56b9418f9..8384b189d594 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1016,12 +1016,8 @@ int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, struct bio bio; struct bio_vec bvec; - bio_init(&bio, &bvec, 1); - - if (metadata_op && rdev->meta_bdev) - bio_set_dev(&bio, rdev->meta_bdev); - else - bio_set_dev(&bio, rdev->bdev); + bio_init(&bio, (metadata_op && rdev->meta_bdev) ? + rdev->meta_bdev : rdev->bdev, &bvec, 1); bio.bi_opf = op | op_flags; if (metadata_op) bio.bi_iter.bi_sector = sector + rdev->sb_start; diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index a1378548a4f8..b2cb955a1850 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1303,7 +1303,6 @@ void r5l_flush_stripe_to_raid(struct r5l_log *log) if (!do_flush) return; bio_reset(&log->flush_bio); - bio_set_dev(&log->flush_bio, log->rdev->bdev); log->flush_bio.bi_end_io = r5l_log_flush_endio; log->flush_bio.bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; submit_bio(&log->flush_bio); @@ -3108,7 +3107,7 @@ int r5l_init_log(struct r5conf *conf, struct md_rdev *rdev) INIT_LIST_HEAD(&log->io_end_ios); INIT_LIST_HEAD(&log->flushing_ios); INIT_LIST_HEAD(&log->finished_ios); - bio_init(&log->flush_bio, NULL, 0); + bio_init(&log->flush_bio, log->rdev->bdev, NULL, 0); log->io_kc = KMEM_CACHE(r5l_io_unit, 0); if (!log->io_kc) diff --git a/drivers/md/raid5-ppl.c b/drivers/md/raid5-ppl.c index 51a8d88295ef..58d21a47c17c 100644 --- a/drivers/md/raid5-ppl.c +++ b/drivers/md/raid5-ppl.c @@ -250,7 +250,7 @@ static struct ppl_io_unit *ppl_new_iounit(struct ppl_log *log, INIT_LIST_HEAD(&io->stripe_list); atomic_set(&io->pending_stripes, 0); atomic_set(&io->pending_flushes, 0); - bio_init(&io->bio, io->biovec, PPL_IO_INLINE_BVECS); + bio_init(&io->bio, log->rdev->bdev, io->biovec, PPL_IO_INLINE_BVECS); pplhdr = page_address(io->header_page); clear_page(pplhdr); @@ -466,7 +466,6 @@ static void ppl_submit_iounit(struct ppl_io_unit *io) bio->bi_end_io = ppl_log_endio; bio->bi_opf = REQ_OP_WRITE | REQ_FUA; - bio_set_dev(bio, log->rdev->bdev); bio->bi_iter.bi_sector = log->next_io_sector; bio_add_page(bio, io->header_page, PAGE_SIZE, 0); bio->bi_write_hint = ppl_conf->write_hint; diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 92c5dafb4d90..799fe425186c 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -2309,8 +2309,12 @@ static struct stripe_head *alloc_stripe(struct kmem_cache *sc, gfp_t gfp, for (i = 0; i < disks; i++) { struct r5dev *dev = &sh->dev[i]; - bio_init(&dev->req, &dev->vec, 1); - bio_init(&dev->rreq, &dev->rvec, 1); + /* + * No bdev available yet, will be initialized later + * before adding pages to the bio. + */ + bio_init(&dev->req, NULL, &dev->vec, 1); + bio_init(&dev->rreq, NULL, &dev->rvec, 1); } if (raid5_has_ppl(conf)) { diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index b7d13fe14866..e13fa33e378d 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -261,8 +261,8 @@ static void nvmet_bdev_execute_rw(struct nvmet_req *req) if (req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN) { bio = &req->b.inline_bio; - bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); - bio_set_dev(bio, req->ns->bdev); + bio_init(bio, req->ns->bdev, req->inline_bvec, + ARRAY_SIZE(req->inline_bvec)); } else { bio = bio_alloc(req->ns->bdev, sg_cnt, GFP_KERNEL); } @@ -321,8 +321,8 @@ static void nvmet_bdev_execute_flush(struct nvmet_req *req) if (!nvmet_check_transfer_len(req, 0)) return; - bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); - bio_set_dev(bio, req->ns->bdev); + bio_init(bio, req->ns->bdev, req->inline_bvec, + ARRAY_SIZE(req->inline_bvec)); bio->bi_private = req; bio->bi_end_io = nvmet_bio_done; bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH; diff --git a/drivers/nvme/target/passthru.c b/drivers/nvme/target/passthru.c index 482fe03b2dc3..447dd2020179 100644 --- a/drivers/nvme/target/passthru.c +++ b/drivers/nvme/target/passthru.c @@ -196,7 +196,8 @@ static int nvmet_passthru_map_sg(struct nvmet_req *req, struct request *rq) if (req->transfer_len <= NVMET_MAX_INLINE_DATA_LEN) { bio = &req->p.inline_bio; - bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec)); + bio_init(bio, NULL, req->inline_bvec, + ARRAY_SIZE(req->inline_bvec)); } else { bio = bio_alloc(NULL, req->sg_cnt, GFP_KERNEL); bio->bi_end_io = bio_put; diff --git a/fs/block_dev.c b/fs/block_dev.c index 6c4c1fca138a..c138ede160f7 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -237,8 +237,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter, return -ENOMEM; } - bio_init(&bio, vecs, nr_pages); - bio_set_dev(&bio, bdev); + bio_init(&bio, bdev, vecs, nr_pages); bio.bi_iter.bi_sector = pos >> 9; bio.bi_write_hint = iocb->ki_hint; bio.bi_private = current; diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c index 0f971179b00c..910b73105af3 100644 --- a/fs/iomap/buffered-io.c +++ b/fs/iomap/buffered-io.c @@ -537,10 +537,9 @@ iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff, struct bio_vec bvec; struct bio bio; - bio_init(&bio, &bvec, 1); + bio_init(&bio, iomap->bdev, &bvec, 1); bio.bi_opf = REQ_OP_READ; bio.bi_iter.bi_sector = iomap_sector(iomap, block_start); - bio_set_dev(&bio, iomap->bdev); __bio_add_page(&bio, page, plen, poff); return submit_bio_wait(&bio); } diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index fa2d05e65ff1..16fd406a6fce 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1701,8 +1701,8 @@ xlog_write_iclog( return; } - bio_init(&iclog->ic_bio, iclog->ic_bvec, howmany(count, PAGE_SIZE)); - bio_set_dev(&iclog->ic_bio, log->l_targ->bt_bdev); + bio_init(&iclog->ic_bio, log->l_targ->bt_bdev, iclog->ic_bvec, + howmany(count, PAGE_SIZE)); iclog->ic_bio.bi_iter.bi_sector = log->l_logBBstart + bno; iclog->ic_bio.bi_end_io = xlog_bio_end_io; iclog->ic_bio.bi_private = iclog; diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c index 51cfe2ee7a4b..9a4dd2f4caff 100644 --- a/fs/zonefs/super.c +++ b/fs/zonefs/super.c @@ -1475,10 +1475,9 @@ static int zonefs_read_super(struct super_block *sb) if (!page) return -ENOMEM; - bio_init(&bio, &bio_vec, 1); + bio_init(&bio, sb->s_bdev, &bio_vec, 1); bio.bi_iter.bi_sector = 0; bio.bi_opf = REQ_OP_READ; - bio_set_dev(&bio, sb->s_bdev); bio_add_page(&bio, page, PAGE_SIZE, 0); ret = submit_bio_wait(&bio); diff --git a/include/linux/bio.h b/include/linux/bio.h index d0e87174d263..efd1734bb026 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -459,8 +459,8 @@ struct request_queue; extern int submit_bio_wait(struct bio *bio); extern void bio_advance(struct bio *, unsigned); -extern void bio_init(struct bio *bio, struct bio_vec *table, - unsigned short max_vecs); +void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table, + unsigned short max_vecs); extern void bio_uninit(struct bio *); extern void bio_reset(struct bio *); void bio_chain(struct bio *, struct bio *);