From a75931cd0e49042de5707295e5f7c2ec4acef29c Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Fri, 29 Jan 2021 06:50:47 +0100 Subject: [PATCH] block: pass a bdev argument to bio_kmalloc Clean up some code and prepare for always having a valid bi_bdev in the bio. Signed-off-by: Christoph Hellwig --- block/bio.c | 8 ++++++-- block/blk-crypto-fallback.c | 4 ++-- block/blk-map.c | 8 ++++---- drivers/block/pktcdvd.c | 4 ++-- drivers/md/bcache/debug.c | 3 +-- drivers/md/dm-bufio.c | 4 ++-- drivers/md/raid1.c | 2 +- drivers/md/raid10.c | 4 ++-- drivers/target/target_core_pscsi.c | 2 +- fs/btrfs/volumes.c | 4 +++- fs/squashfs/block.c | 2 +- include/linux/bio.h | 3 ++- 12 files changed, 27 insertions(+), 21 deletions(-) diff --git a/block/bio.c b/block/bio.c index 9baaa18c2d34..f56b71153f40 100644 --- a/block/bio.c +++ b/block/bio.c @@ -507,14 +507,16 @@ EXPORT_SYMBOL(bio_alloc_bioset); /** * bio_kmalloc - kmalloc a bio for I/O - * @gfp_mask: the GFP_* mask given to the slab allocator + * @bdev: block device to allocate the bio for. * @nr_iovecs: number of iovecs to pre-allocate + * @gfp_mask: the GFP_* mask given to the slab allocator * * Use kmalloc to allocate and initialize a bio. * * Returns: Pointer to new bio on success, NULL on failure. */ -struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs) +struct bio *bio_kmalloc(struct block_device *bdev, unsigned int nr_iovecs, + gfp_t gfp_mask) { struct bio *bio; @@ -525,6 +527,8 @@ struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs) 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->bi_pool = NULL; return bio; } diff --git a/block/blk-crypto-fallback.c b/block/blk-crypto-fallback.c index e8327c50d7c9..3c2906cb30b6 100644 --- a/block/blk-crypto-fallback.c +++ b/block/blk-crypto-fallback.c @@ -164,10 +164,10 @@ static struct bio *blk_crypto_clone_bio(struct bio *bio_src) struct bio_vec bv; struct bio *bio; - bio = bio_kmalloc(GFP_NOIO, bio_segments(bio_src)); + bio = bio_kmalloc(bio_src->bi_bdev, bio_segments(bio_src), GFP_NOIO); if (!bio) return NULL; - bio->bi_bdev = bio_src->bi_bdev; + if (bio_flagged(bio_src, BIO_REMAPPED)) bio_set_flag(bio, BIO_REMAPPED); bio->bi_opf = bio_src->bi_opf; diff --git a/block/blk-map.c b/block/blk-map.c index 21630dccac62..38fa596059df 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -155,7 +155,7 @@ static int bio_copy_user_iov(struct request *rq, struct rq_map_data *map_data, nr_pages = BIO_MAX_PAGES; ret = -ENOMEM; - bio = bio_kmalloc(gfp_mask, nr_pages); + bio = bio_kmalloc(NULL, nr_pages, gfp_mask); if (!bio) goto out_bmd; bio->bi_opf |= req_op(rq); @@ -251,7 +251,7 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, if (!iov_iter_count(iter)) return -EINVAL; - bio = bio_kmalloc(gfp_mask, iov_iter_npages(iter, BIO_MAX_PAGES)); + bio = bio_kmalloc(NULL, iov_iter_npages(iter, BIO_MAX_PAGES), gfp_mask); if (!bio) return -ENOMEM; bio->bi_opf |= req_op(rq); @@ -390,7 +390,7 @@ static struct bio *bio_map_kern(struct request_queue *q, void *data, int offset, i; struct bio *bio; - bio = bio_kmalloc(gfp_mask, nr_pages); + bio = bio_kmalloc(NULL, nr_pages, gfp_mask); if (!bio) return ERR_PTR(-ENOMEM); @@ -477,7 +477,7 @@ static struct bio *bio_copy_kern(struct request_queue *q, void *data, return ERR_PTR(-EINVAL); nr_pages = end - start; - bio = bio_kmalloc(gfp_mask, nr_pages); + bio = bio_kmalloc(NULL, nr_pages, gfp_mask); if (!bio) return ERR_PTR(-ENOMEM); diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 461233dc7359..2d33fe898c1b 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c @@ -529,7 +529,7 @@ static struct packet_data *pkt_alloc_packet_data(int frames) goto no_pkt; pkt->frames = frames; - pkt->w_bio = bio_kmalloc(GFP_KERNEL, frames); + pkt->w_bio = bio_kmalloc(NULL, frames, GFP_KERNEL); if (!pkt->w_bio) goto no_bio; @@ -543,7 +543,7 @@ static struct packet_data *pkt_alloc_packet_data(int frames) bio_list_init(&pkt->orig_bios); for (i = 0; i < frames; i++) { - struct bio *bio = bio_kmalloc(GFP_KERNEL, 1); + struct bio *bio = bio_kmalloc(NULL, 1, GFP_KERNEL); if (!bio) goto no_rd_bio; diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index 1b54534973b0..23fad089be2b 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c @@ -110,10 +110,9 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) struct bio_vec bv, cbv; struct bvec_iter iter, citer = { 0 }; - check = bio_kmalloc(GFP_NOIO, bio_segments(bio)); + check = bio_kmalloc(bio->bi_bdev, bio_segments(bio), GFP_NOIO); if (!check) return; - bio_set_dev(check, bio->bi_bdev); check->bi_opf = REQ_OP_READ; check->bi_iter.bi_sector = bio->bi_iter.bi_sector; check->bi_iter.bi_size = bio->bi_iter.bi_size; diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index fce4cbf9529d..845697e144bb 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -626,7 +626,8 @@ static void use_bio(struct dm_buffer *b, int rw, sector_t sector, if (unlikely(b->c->sectors_per_block_bits < PAGE_SHIFT - SECTOR_SHIFT)) vec_size += 2; - bio = bio_kmalloc(GFP_NOWAIT | __GFP_NORETRY | __GFP_NOWARN, vec_size); + bio = bio_kmalloc(b->c->bdev, vec_size, + GFP_NOWAIT | __GFP_NORETRY | __GFP_NOWARN); if (!bio) { dmio: use_dmio(b, rw, sector, n_sectors, offset); @@ -634,7 +635,6 @@ dmio: } bio->bi_iter.bi_sector = sector; - bio_set_dev(bio, b->c->bdev); bio_set_op_attrs(bio, rw, 0); bio->bi_end_io = bio_complete; bio->bi_private = b; diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 61ebba71152a..27b3f8adecd8 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -165,7 +165,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data) * Allocate bios : 1 for reading, n-1 for writing */ for (j = pi->raid_disks ; j-- ; ) { - bio = bio_kmalloc(gfp_flags, RESYNC_PAGES); + bio = bio_kmalloc(NULL, RESYNC_PAGES, gfp_flags); if (!bio) goto out_free_bio; r1_bio->bios[j] = bio; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index e877f3f75430..3843706cd15c 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -145,13 +145,13 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data) * Allocate bios. */ for (j = nalloc ; j-- ; ) { - bio = bio_kmalloc(gfp_flags, RESYNC_PAGES); + bio = bio_kmalloc(NULL, RESYNC_PAGES, gfp_flags); if (!bio) goto out_free_bio; r10_bio->devs[j].bio = bio; if (!conf->have_replacement) continue; - bio = bio_kmalloc(gfp_flags, RESYNC_PAGES); + bio = bio_kmalloc(NULL, RESYNC_PAGES, gfp_flags); if (!bio) goto out_free_bio; r10_bio->devs[j].repl_bio = bio; diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 33770e5808ce..8b264937e025 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -832,7 +832,7 @@ static inline struct bio *pscsi_get_bio(int nr_vecs) * Use bio_malloc() following the comment in for bio -> struct request * in block/blk-core.c:blk_make_request() */ - bio = bio_kmalloc(GFP_KERNEL, nr_vecs); + bio = bio_kmalloc(NULL, nr_vecs, GFP_KERNEL); if (!bio) { pr_err("PSCSI: bio_kmalloc() failed\n"); return NULL; diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 584ba093cf49..e9749b08d967 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -420,8 +420,10 @@ static struct btrfs_device *__alloc_device(struct btrfs_fs_info *fs_info) /* * Preallocate a bio that's always going to be used for flushing device * barriers and matches the device lifespan + * + * bi_bdev will be set later before the bio is used. */ - dev->flush_bio = bio_kmalloc(GFP_KERNEL, 0); + dev->flush_bio = bio_kmalloc(NULL, 0, GFP_KERNEL); if (!dev->flush_bio) { kfree(dev); return ERR_PTR(-ENOMEM); diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index 0f7a8baca618..a9f6861ccf2d 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c @@ -90,7 +90,7 @@ static int squashfs_bio_read(struct super_block *sb, u64 index, int length, if (page_count <= BIO_MAX_PAGES) bio = bio_alloc(sb->s_bdev, page_count, GFP_NOIO); else - bio = bio_kmalloc(GFP_NOIO, page_count); + bio = bio_kmalloc(sb->s_bdev, page_count, GFP_NOIO); if (!bio) return -ENOMEM; diff --git a/include/linux/bio.h b/include/linux/bio.h index 5ca149d60c41..d0e87174d263 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -409,7 +409,8 @@ extern int bioset_init_from_src(struct bio_set *bs, struct bio_set *src); struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned int nr_iovecs, gfp_t gfp_mask, struct bio_set *bs); -struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs); +struct bio *bio_kmalloc(struct block_device *bdev, unsigned int nr_iovecs, + gfp_t gfp_mask); extern void bio_put(struct bio *); void __bio_clone_fast(struct bio *, struct bio *); -- 2.50.1