2021-01-19 06:00:57

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 00/37] block: introduce bio_init_fields()

Hi,

This is a *compile only RFC* which adds a generic helper to initialize
the various fields of the bio that is repeated all the places in
file-systems, block layer, and drivers.

The new helper allows callers to initialize various members such as
bdev, sector, private, end io callback, io priority, and write hints.

The objective of this RFC is to only start a discussion, this it not
completely tested at all.                                                                                                            
Following diff shows code level benefits of this helper :-
 38 files changed, 124 insertions(+), 236 deletions(-)

-ck

Chaitanya Kulkarni (37):
block: introduce bio_init_fields() helper
fs: use bio_init_fields in block_dev
btrfs: use bio_init_fields in disk-io
btrfs: use bio_init_fields in volumes
ext4: use bio_init_fields in page_io
gfs2: use bio_init_fields in lops
gfs2: use bio_init_fields in meta_io
gfs2: use bio_init_fields in ops_fstype
iomap: use bio_init_fields in buffered-io
iomap: use bio_init_fields in direct-io
jfs: use bio_init_fields in logmgr
zonefs: use bio_init_fields in append
drdb: use bio_init_fields in actlog
drdb: use bio_init_fields in bitmap
drdb: use bio_init_fields in receiver
floppy: use bio_init_fields
pktcdvd: use bio_init_fields
bcache: use bio_init_fields in journal
bcache: use bio_init_fields in super
bcache: use bio_init_fields in writeback
dm-bufio: use bio_init_fields
dm-crypt: use bio_init_fields
dm-zoned: use bio_init_fields metadata
dm-zoned: use bio_init_fields target
dm-zoned: use bio_init_fields
dm log writes: use bio_init_fields
nvmet: use bio_init_fields in bdev-ns
target: use bio_init_fields in iblock
btrfs: use bio_init_fields in scrub
fs: use bio_init_fields in buffer
eros: use bio_init_fields in data
eros: use bio_init_fields in zdata
jfs: use bio_init_fields in metadata
nfs: use bio_init_fields in blocklayout
ocfs: use bio_init_fields in heartbeat
xfs: use bio_init_fields in xfs_buf
xfs: use bio_init_fields in xfs_log

block/blk-lib.c | 13 +++++--------
drivers/block/drbd/drbd_actlog.c | 5 +----
drivers/block/drbd/drbd_bitmap.c | 5 +----
drivers/block/drbd/drbd_receiver.c | 11 +++--------
drivers/block/floppy.c | 5 +----
drivers/block/pktcdvd.c | 12 ++++--------
drivers/md/bcache/journal.c | 21 ++++++++-------------
drivers/md/bcache/super.c | 19 +++++--------------
drivers/md/bcache/writeback.c | 14 ++++++--------
drivers/md/dm-bufio.c | 5 +----
drivers/md/dm-crypt.c | 4 +---
drivers/md/dm-log-writes.c | 21 ++++++---------------
drivers/md/dm-zoned-metadata.c | 15 +++++----------
drivers/md/dm-zoned-target.c | 9 +++------
drivers/md/md.c | 6 ++----
drivers/nvme/target/io-cmd-bdev.c | 4 +---
drivers/target/target_core_iblock.c | 11 +++--------
fs/block_dev.c | 17 +++++------------
fs/btrfs/disk-io.c | 11 ++++-------
fs/btrfs/scrub.c | 6 ++----
fs/btrfs/volumes.c | 4 +---
fs/buffer.c | 7 ++-----
fs/erofs/data.c | 6 ++----
fs/erofs/zdata.c | 9 +++------
fs/ext4/page-io.c | 6 ++----
fs/gfs2/lops.c | 6 ++----
fs/gfs2/meta_io.c | 5 ++---
fs/gfs2/ops_fstype.c | 7 ++-----
fs/iomap/buffered-io.c | 5 ++---
fs/iomap/direct-io.c | 15 +++++----------
fs/jfs/jfs_logmgr.c | 16 ++++------------
fs/jfs/jfs_metapage.c | 16 +++++++---------
fs/nfs/blocklayout/blocklayout.c | 8 ++------
fs/ocfs2/cluster/heartbeat.c | 4 +---
fs/xfs/xfs_buf.c | 6 ++----
fs/xfs/xfs_log.c | 6 ++----
fs/zonefs/super.c | 7 +++----
include/linux/bio.h | 13 +++++++++++++
38 files changed, 124 insertions(+), 236 deletions(-)

--
2.22.1


2021-01-19 06:02:02

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 06/37] gfs2: use bio_init_fields in lops

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/gfs2/lops.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 3922b26264f5..9f8a9757b086 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -264,10 +264,8 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd *sdp, u64 blkno,
struct super_block *sb = sdp->sd_vfs;
struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);

- bio->bi_iter.bi_sector = blkno << sdp->sd_fsb2bb_shift;
- bio_set_dev(bio, sb->s_bdev);
- bio->bi_end_io = end_io;
- bio->bi_private = sdp;
+ bio_init_fields(bio, sb->s_bdev, blkno << sdp->sd_fsb2bb_shift,
+ sdp, end_io, 0, 0);

return bio;
}
--
2.22.1

2021-01-19 06:02:24

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 17/37] pktcdvd: use bio_init_fields

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/block/pktcdvd.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index b8bb8ec7538d..47eb4e0bd4c3 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -1028,10 +1028,8 @@ static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt)

bio = pkt->r_bios[f];
bio_reset(bio);
- bio->bi_iter.bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9);
- bio_set_dev(bio, pd->bdev);
- bio->bi_end_io = pkt_end_io_read;
- bio->bi_private = pkt;
+ bio_init_fields(bio, pd->bdev, pkt->sector + f * (CD_FRAMESIZE >> 9), pkt,
+ pkt_end_io_read, 0, 0);

p = (f * CD_FRAMESIZE) / PAGE_SIZE;
offset = (f * CD_FRAMESIZE) % PAGE_SIZE;
@@ -1208,10 +1206,8 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt)
int f;

bio_reset(pkt->w_bio);
- pkt->w_bio->bi_iter.bi_sector = pkt->sector;
- bio_set_dev(pkt->w_bio, pd->bdev);
- pkt->w_bio->bi_end_io = pkt_end_io_packet_write;
- pkt->w_bio->bi_private = pkt;
+ bio_init_fields(pkt->w_bio, pd->bdev, pkt->sector, pkt,
+ pkt_end_io_packet_write, 0, 0);

/* XXX: locking? */
for (f = 0; f < pkt->frames; f++) {
--
2.22.1

2021-01-19 06:02:24

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 15/37] drdb: use bio_init_fields in receiver

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/block/drbd/drbd_receiver.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 09c86ef3f0fd..2715081a4603 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1296,9 +1296,7 @@ static void submit_one_flush(struct drbd_device *device, struct issue_flush_cont

octx->device = device;
octx->ctx = ctx;
- bio_set_dev(bio, device->ldev->backing_bdev);
- bio->bi_private = octx;
- bio->bi_end_io = one_flush_endio;
+ bio_init_fields(bio, device->ldev->backing_bdev, 0, octx, one_flush_endio, 0, 0);
bio->bi_opf = REQ_OP_FLUSH | REQ_PREFLUSH;

device->flush_jif = jiffies;
@@ -1693,12 +1691,9 @@ int drbd_submit_peer_request(struct drbd_device *device,
goto fail;
}
/* > peer_req->i.sector, unless this is the first bio */
- bio->bi_iter.bi_sector = sector;
- bio_set_dev(bio, device->ldev->backing_bdev);
+ bio_init_fields(bio, device->ldev->backing_bdev, sector, peer_req,
+ drbd_peer_request_endio, 0, 0);
bio_set_op_attrs(bio, op, op_flags);
- bio->bi_private = peer_req;
- bio->bi_end_io = drbd_peer_request_endio;
-
bio->bi_next = bios;
bios = bio;
++n_bios;
--
2.22.1

2021-01-19 06:02:25

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 18/37] bcache: use bio_init_fields in journal

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/md/bcache/journal.c | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index aefbdb7e003b..0aabcb5cf2ad 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -54,12 +54,10 @@ reread: left = ca->sb.bucket_size - offset;
len = min_t(unsigned int, left, PAGE_SECTORS << JSET_BITS);

bio_reset(bio);
- bio->bi_iter.bi_sector = bucket + offset;
- bio_set_dev(bio, ca->bdev);
+ bio_init_fields(bio, ca->bdev, bucket + offset,
+ &cl, journal_read_endio, 0, 0);
bio->bi_iter.bi_size = len << 9;

- bio->bi_end_io = journal_read_endio;
- bio->bi_private = &cl;
bio_set_op_attrs(bio, REQ_OP_READ, 0);
bch_bio_map(bio, data);

@@ -588,6 +586,7 @@ static void do_journal_discard(struct cache *ca)
{
struct journal_device *ja = &ca->journal;
struct bio *bio = &ja->discard_bio;
+ sector_t sect;

if (!ca->discard) {
ja->discard_idx = ja->last_idx;
@@ -613,12 +612,10 @@ static void do_journal_discard(struct cache *ca)

bio_init(bio, 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;
-
+ sect = bucket_to_sector(ca->set, ca->sb.d[ja->discard_idx]);
+ bio_init_fields(bio, ca->bdev, sect, NULL,
+ journal_discard_endio, 0, 0);
closure_get(&ca->set->cl);
INIT_WORK(&ja->discard_work, journal_discard_work);
queue_work(bch_journal_wq, &ja->discard_work);
@@ -774,12 +771,10 @@ static void journal_write_unlocked(struct closure *cl)
atomic_long_add(sectors, &ca->meta_sectors_written);

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;
- bio->bi_private = w;
+ bio_init_fields(bio, ca->bdev, PTR_OFFSET(k, i), w,
+ journal_write_endio, 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE,
REQ_SYNC|REQ_META|REQ_PREFLUSH|REQ_FUA);
bch_bio_map(bio, w->data);
--
2.22.1

2021-01-19 06:02:25

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 24/37] dm-zoned: use bio_init_fields target

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/md/dm-zoned-target.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c
index 697f9de37355..8b232b9e3386 100644
--- a/drivers/md/dm-zoned-target.c
+++ b/drivers/md/dm-zoned-target.c
@@ -129,14 +129,11 @@ static int dmz_submit_bio(struct dmz_target *dmz, struct dm_zone *zone,
if (!clone)
return -ENOMEM;

- bio_set_dev(clone, dev->bdev);
bioctx->dev = dev;
- clone->bi_iter.bi_sector =
- dmz_start_sect(dmz->metadata, zone) + dmz_blk2sect(chunk_block);
clone->bi_iter.bi_size = dmz_blk2sect(nr_blocks) << SECTOR_SHIFT;
- clone->bi_end_io = dmz_clone_endio;
- clone->bi_private = bioctx;
-
+ bio_init_fields(clone, dev->bdev,
+ dmz_start_sect(dmz->metadata, zone) + dmz, bioctx,
+ dmz_clone_endio, 0, 0);
bio_advance(bio, clone->bi_iter.bi_size);

refcount_inc(&bioctx->ref);
--
2.22.1

2021-01-19 06:02:29

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 20/37] bcache: use bio_init_fields in writeback

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/md/bcache/writeback.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c
index a129e4d2707c..e2b769bbdb14 100644
--- a/drivers/md/bcache/writeback.c
+++ b/drivers/md/bcache/writeback.c
@@ -358,10 +358,8 @@ static void write_dirty(struct closure *cl)
if (KEY_DIRTY(&w->key)) {
dirty_init(w);
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;
-
+ bio_init_fields(&io->bio, io->dc->bdev, KEY_START(&w->key), NULL,
+ dirty_endio, 0, 0);
/* I/O request sent to backing device */
closure_bio_submit(io->dc->disk.c, &io->bio, cl);
}
@@ -471,10 +469,10 @@ static void read_dirty(struct cached_dev *dc)

dirty_init(w);
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,
- PTR_CACHE(dc->disk.c, &w->key, 0)->bdev);
- io->bio.bi_end_io = read_dirty_endio;
+ bio_init_fields(&io->bio,
+ PTR_CACHE(dc->disk.c, &w->key, 0)->bdev,
+ PTR_OFFSET(&w->key, 0), NULL,
+ read_dirty_endio, 0, 0);

if (bch_bio_alloc_pages(&io->bio, GFP_KERNEL))
goto err_free;
--
2.22.1

2021-01-19 06:02:29

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 27/37] nvmet: use bio_init_fields in bdev-ns

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/nvme/target/io-cmd-bdev.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c
index 125dde3f410e..302ec6bc2a55 100644
--- a/drivers/nvme/target/io-cmd-bdev.c
+++ b/drivers/nvme/target/io-cmd-bdev.c
@@ -323,9 +323,7 @@ static void nvmet_bdev_execute_flush(struct nvmet_req *req)
return;

bio_init(bio, req->inline_bvec, ARRAY_SIZE(req->inline_bvec));
- bio_set_dev(bio, req->ns->bdev);
- bio->bi_private = req;
- bio->bi_end_io = nvmet_bio_done;
+ bio_init_fields(bio, req->ns->bdev, 0, req, nvmet_bio_done, 0, 0);
bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;

submit_bio(bio);
--
2.22.1

2021-01-19 06:02:34

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 33/37] jfs: use bio_init_fields in metadata

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/jfs/jfs_metapage.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c
index 176580f54af9..5cea9c137a48 100644
--- a/fs/jfs/jfs_metapage.c
+++ b/fs/jfs/jfs_metapage.c
@@ -417,10 +417,10 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
len = min(xlen, (int)JFS_SBI(inode->i_sb)->nbperpage);

bio = bio_alloc(GFP_NOFS, 1);
- bio_set_dev(bio, inode->i_sb->s_bdev);
- bio->bi_iter.bi_sector = pblock << (inode->i_blkbits - 9);
- bio->bi_end_io = metapage_write_end_io;
- bio->bi_private = page;
+ bio_init_fields(bio, inode->i_sb->s_bdev,
+ pblock << (inode->i_blkbits - 9),
+ page, metapage_write_end_io, 0, 0);
+
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);

/* Don't call bio_add_page yet, we may add to this vec */
@@ -497,11 +497,9 @@ static int metapage_readpage(struct file *fp, struct page *page)
submit_bio(bio);

bio = bio_alloc(GFP_NOFS, 1);
- bio_set_dev(bio, inode->i_sb->s_bdev);
- bio->bi_iter.bi_sector =
- pblock << (inode->i_blkbits - 9);
- bio->bi_end_io = metapage_read_end_io;
- bio->bi_private = page;
+ bio_init_fields(bio, inode->i_sb->s_bdev,
+ pblock << (inode->i_blkbits - 9,
+ page, metapage_read_end_io, 0, 0);
bio_set_op_attrs(bio, REQ_OP_READ, 0);
len = xlen << inode->i_blkbits;
offset = block_offset << inode->i_blkbits;
--
2.22.1

2021-01-19 06:02:34

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 26/37] dm log writes: use bio_init_fields

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/md/dm-log-writes.c | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/drivers/md/dm-log-writes.c b/drivers/md/dm-log-writes.c
index e3d35c6c9f71..35c2e0418561 100644
--- a/drivers/md/dm-log-writes.c
+++ b/drivers/md/dm-log-writes.c
@@ -223,11 +223,9 @@ static int write_metadata(struct log_writes_c *lc, void *entry,
goto error;
}
bio->bi_iter.bi_size = 0;
- bio->bi_iter.bi_sector = sector;
- bio_set_dev(bio, lc->logdev->bdev);
bio->bi_end_io = (sector == WRITE_LOG_SUPER_SECTOR) ?
log_end_super : log_end_io;
- bio->bi_private = lc;
+ bio_init_fields(bio, lc->logdev->bdev, sector, lc, NULL, 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);

page = alloc_page(GFP_KERNEL);
@@ -283,10 +281,8 @@ static int write_inline_data(struct log_writes_c *lc, void *entry,
}

bio->bi_iter.bi_size = 0;
- bio->bi_iter.bi_sector = sector;
- bio_set_dev(bio, lc->logdev->bdev);
- bio->bi_end_io = log_end_io;
- bio->bi_private = lc;
+ bio_init_fields(bio, lc->logdev->bdev, sector, lc, log_end_io,
+ 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);

for (i = 0; i < bio_pages; i++) {
@@ -370,10 +366,8 @@ static int log_one_block(struct log_writes_c *lc,
goto error;
}
bio->bi_iter.bi_size = 0;
- bio->bi_iter.bi_sector = sector;
- bio_set_dev(bio, lc->logdev->bdev);
- bio->bi_end_io = log_end_io;
- bio->bi_private = lc;
+ bio_init_fields(bio, lc->logdev->bdev, sector, lc, log_end_io,
+ 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);

for (i = 0; i < block->vec_cnt; i++) {
@@ -392,10 +386,7 @@ static int log_one_block(struct log_writes_c *lc,
goto error;
}
bio->bi_iter.bi_size = 0;
- bio->bi_iter.bi_sector = sector;
- bio_set_dev(bio, lc->logdev->bdev);
- bio->bi_end_io = log_end_io;
- bio->bi_private = lc;
+ bio_init_fields(bio, lc->logdev->bdev, sector, lc, log_end_io, 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);

ret = bio_add_page(bio, block->vecs[i].bv_page,
--
2.22.1

2021-01-19 06:02:36

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 23/37] dm-zoned: use bio_init_fields metadata

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/md/dm-zoned-metadata.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
index b298fefb022e..f114d595ce23 100644
--- a/drivers/md/dm-zoned-metadata.c
+++ b/drivers/md/dm-zoned-metadata.c
@@ -577,10 +577,8 @@ static struct dmz_mblock *dmz_get_mblock_slow(struct dmz_metadata *zmd,
spin_unlock(&zmd->mblk_lock);

/* Submit read BIO */
- bio->bi_iter.bi_sector = dmz_blk2sect(block);
- bio_set_dev(bio, dev->bdev);
- bio->bi_private = mblk;
- bio->bi_end_io = dmz_mblock_bio_end_io;
+ bio_init_fields(bio, dev->bdev, dmz_blk2sect(block), mblk,
+ dmz_mblock_bio_end_io, 0, 0);
bio_set_op_attrs(bio, REQ_OP_READ, REQ_META | REQ_PRIO);
bio_add_page(bio, mblk->page, DMZ_BLOCK_SIZE, 0);
submit_bio(bio);
@@ -733,10 +731,8 @@ static int dmz_write_mblock(struct dmz_metadata *zmd, struct dmz_mblock *mblk,

set_bit(DMZ_META_WRITING, &mblk->state);

- bio->bi_iter.bi_sector = dmz_blk2sect(block);
- bio_set_dev(bio, dev->bdev);
- bio->bi_private = mblk;
- bio->bi_end_io = dmz_mblock_bio_end_io;
+ bio_init_fields(bio, dev->bdev, dmz_blk2sect(block), mblk,
+ dmz_mblock_bio_end_io, 0, 0);
bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_META | REQ_PRIO);
bio_add_page(bio, mblk->page, DMZ_BLOCK_SIZE, 0);
submit_bio(bio);
@@ -763,8 +759,7 @@ static int dmz_rdwr_block(struct dmz_dev *dev, int op,
if (!bio)
return -ENOMEM;

- bio->bi_iter.bi_sector = dmz_blk2sect(block);
- bio_set_dev(bio, dev->bdev);
+ bio_init_fields(bio, dev->bdev, dmz_blk2sect(block), NULL, NULL, 0, 0);
bio_set_op_attrs(bio, op, REQ_SYNC | REQ_META | REQ_PRIO);
bio_add_page(bio, page, DMZ_BLOCK_SIZE, 0);
ret = submit_bio_wait(bio);
--
2.22.1

2021-01-19 06:02:44

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 34/37] nfs: use bio_init_fields in blocklayout

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/nfs/blocklayout/blocklayout.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index 3be6836074ae..7ac96519c8b7 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -128,12 +128,8 @@ bl_alloc_init_bio(int npg, struct block_device *bdev, sector_t disk_sector,
bio = bio_alloc(GFP_NOIO, npg);
}

- if (bio) {
- bio->bi_iter.bi_sector = disk_sector;
- bio_set_dev(bio, bdev);
- bio->bi_end_io = end_io;
- bio->bi_private = par;
- }
+ if (bio)
+ bio_init_fields(bio, bdev, disk_sector, par, end_io, 0, 0);
return bio;
}

--
2.22.1

2021-01-19 06:02:44

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 36/37] xfs: use bio_init_fields in xfs_buf

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/xfs/xfs_buf.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index f8400bbd6473..1c157cfc5f8f 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -1508,10 +1508,8 @@ xfs_buf_ioapply_map(
nr_pages = min(total_nr_pages, BIO_MAX_PAGES);

bio = bio_alloc(GFP_NOIO, nr_pages);
- bio_set_dev(bio, bp->b_target->bt_bdev);
- bio->bi_iter.bi_sector = sector;
- bio->bi_end_io = xfs_buf_bio_end_io;
- bio->bi_private = bp;
+ bio_init_fields(bio, bp->b_target->bt_bdev, sector, bp,
+ xfs_buf_bio_end_io, 0, 0);
bio->bi_opf = op;

for (; size && nr_pages; nr_pages--, page_index++) {
--
2.22.1

2021-01-19 06:02:46

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 35/37] ocfs: use bio_init_fields in heartbeat

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/ocfs2/cluster/heartbeat.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c
index 0179a73a3fa2..dd37aaac4f32 100644
--- a/fs/ocfs2/cluster/heartbeat.c
+++ b/fs/ocfs2/cluster/heartbeat.c
@@ -528,10 +528,8 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg,
}

/* Must put everything in 512 byte sectors for the bio... */
+ bio_init_fields(bio, reg->hr_bdev, 0, wc, o2hb_bio_end_io, 0, 0);
bio->bi_iter.bi_sector = (reg->hr_start_block + cs) << (bits - 9);
- bio_set_dev(bio, reg->hr_bdev);
- bio->bi_private = wc;
- bio->bi_end_io = o2hb_bio_end_io;
bio_set_op_attrs(bio, op, op_flags);

vec_start = (cs << bits) % PAGE_SIZE;
--
2.22.1

2021-01-19 06:02:47

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 28/37] target: use bio_init_fields in iblock

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
drivers/target/target_core_iblock.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
index 8ed93fd205c7..ec65a9494bee 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -324,10 +324,7 @@ iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num, int op,
return NULL;
}

- bio_set_dev(bio, ib_dev->ibd_bd);
- bio->bi_private = cmd;
- bio->bi_end_io = &iblock_bio_done;
- bio->bi_iter.bi_sector = lba;
+ bio_init_fields(bio, ib_dev->ibd_bd, lba, cmd, &iblock_bio_done, 0, 0);
bio_set_op_attrs(bio, op, op_flags);

return bio;
@@ -380,11 +377,9 @@ iblock_execute_sync_cache(struct se_cmd *cmd)
target_complete_cmd(cmd, SAM_STAT_GOOD);

bio = bio_alloc(GFP_KERNEL, 0);
- bio->bi_end_io = iblock_end_io_flush;
- bio_set_dev(bio, ib_dev->ibd_bd);
+ bio_init_fields(bio, ib_dev->ibd_bd, 0, immed ? NULL : cmd,
+ iblock_end_io_flush, 0, 0);
bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
- if (!immed)
- bio->bi_private = cmd;
submit_bio(bio);
return 0;
}
--
2.22.1

2021-01-19 06:02:54

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 04/37] btrfs: use bio_init_fields in volumes

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/btrfs/volumes.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index ee086fc56c30..836167212252 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -6371,14 +6371,12 @@ static void submit_stripe_bio(struct btrfs_bio *bbio, struct bio *bio,

bio->bi_private = bbio;
btrfs_io_bio(bio)->device = dev;
- bio->bi_end_io = btrfs_end_bio;
- bio->bi_iter.bi_sector = physical >> 9;
+ bio_init_fields(bio, dev->bdev, physical >> 9, bbio, btrfs_end_bio, 0, 0);
btrfs_debug_in_rcu(fs_info,
"btrfs_map_bio: rw %d 0x%x, sector=%llu, dev=%lu (%s id %llu), size=%u",
bio_op(bio), bio->bi_opf, bio->bi_iter.bi_sector,
(unsigned long)dev->bdev->bd_dev, rcu_str_deref(dev->name),
dev->devid, bio->bi_iter.bi_size);
- bio_set_dev(bio, dev->bdev);

btrfs_bio_counter_inc_noblocked(fs_info);

--
2.22.1

2021-01-19 06:03:18

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 30/37] fs: use bio_init_fields in buffer

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/buffer.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/fs/buffer.c b/fs/buffer.c
index 32647d2011df..32e9f780e134 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -3027,16 +3027,13 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,

fscrypt_set_bio_crypt_ctx_bh(bio, bh, GFP_NOIO);

- bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
- bio_set_dev(bio, bh->b_bdev);
+ bio_init_fields(bio, bh->b_bdev, bh->b_blocknr * (bh->b_size >> 9),
+ bh, end_bio_bh_io_sync, 0, 0);
bio->bi_write_hint = write_hint;

bio_add_page(bio, bh->b_page, bh->b_size, bh_offset(bh));
BUG_ON(bio->bi_iter.bi_size != bh->b_size);

- bio->bi_end_io = end_bio_bh_io_sync;
- bio->bi_private = bh;
-
if (buffer_meta(bh))
op_flags |= REQ_META;
if (buffer_prio(bh))
--
2.22.1

2021-01-19 06:03:27

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 37/37] xfs: use bio_init_fields in xfs_log

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/xfs/xfs_log.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index fa2d05e65ff1..062ee664a910 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -1702,10 +1702,8 @@ xlog_write_iclog(
}

bio_init(&iclog->ic_bio, iclog->ic_bvec, howmany(count, PAGE_SIZE));
- bio_set_dev(&iclog->ic_bio, log->l_targ->bt_bdev);
- 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;
+ bio_init_fields(&iclog->ic_bio, log->l_targ->bt_bdev,
+ log->l_logBBstart + bno, iclog, xlog_bio_end_io, 0, 0);

/*
* We use REQ_SYNC | REQ_IDLE here to tell the block layer the are more
--
2.22.1

2021-01-19 06:08:32

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 11/37] jfs: use bio_init_fields in logmgr

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/jfs/jfs_logmgr.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c
index 9330eff210e0..ee7407ca32c0 100644
--- a/fs/jfs/jfs_logmgr.c
+++ b/fs/jfs/jfs_logmgr.c
@@ -1980,15 +1980,11 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp)
bp->l_flag |= lbmREAD;

bio = bio_alloc(GFP_NOFS, 1);
-
- bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9);
- bio_set_dev(bio, log->bdev);
-
+ bio_init_fields(bio, log->bdev, bp->l_blkno << (log->l2bsize - 9),
+ log->bdev, 0, lbmIODone, bp, 0, 0);
bio_add_page(bio, bp->l_page, LOGPSIZE, bp->l_offset);
BUG_ON(bio->bi_iter.bi_size != LOGPSIZE);

- bio->bi_end_io = lbmIODone;
- bio->bi_private = bp;
bio->bi_opf = REQ_OP_READ;
/*check if journaling to disk has been disabled*/
if (log->no_integrity) {
@@ -2125,14 +2121,10 @@ static void lbmStartIO(struct lbuf * bp)
jfs_info("lbmStartIO");

bio = bio_alloc(GFP_NOFS, 1);
- bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9);
- bio_set_dev(bio, log->bdev);
-
+ bio_init_fields(bio, log->bdev, bp->l_blkno << (log->l2bsize - 9),
+ log->bdev, 0, lbmIODone, bp, 0, 0);
bio_add_page(bio, bp->l_page, LOGPSIZE, bp->l_offset);
BUG_ON(bio->bi_iter.bi_size != LOGPSIZE);
-
- bio->bi_end_io = lbmIODone;
- bio->bi_private = bp;
bio->bi_opf = REQ_OP_WRITE | REQ_SYNC;

/* check if journaling to disk has been disabled */
--
2.22.1

2021-01-19 06:08:36

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 05/37] ext4: use bio_init_fields in page_io

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/ext4/page-io.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index 03a44a0de86a..53a79a7aac15 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -400,10 +400,8 @@ static void io_submit_init_bio(struct ext4_io_submit *io,
*/
bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
fscrypt_set_bio_crypt_ctx_bh(bio, bh, GFP_NOIO);
- bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
- bio_set_dev(bio, bh->b_bdev);
- bio->bi_end_io = ext4_end_bio;
- bio->bi_private = ext4_get_io_end(io->io_end);
+ bio_init_fields(bio, bh->b_bdev, bh->b_blocknr * (bh->b_size >> 9),
+ ext4_get_io_end(io->io_end), ext4_end_bio, 0, 0);
io->io_bio = bio;
io->io_next_block = bh->b_blocknr;
wbc_init_bio(io->io_wbc, bio);
--
2.22.1

2021-01-19 06:08:39

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 02/37] fs: use bio_init_fields in block_dev

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/block_dev.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 3e5b02f6606c..44b992976ee5 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -239,12 +239,9 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
}

bio_init(&bio, vecs, nr_pages);
- bio_set_dev(&bio, bdev);
- bio.bi_iter.bi_sector = pos >> 9;
- bio.bi_write_hint = iocb->ki_hint;
- bio.bi_private = current;
- bio.bi_end_io = blkdev_bio_end_io_simple;
- bio.bi_ioprio = iocb->ki_ioprio;
+ bio_init_fields(&bio, bdev, pos >> 9, current, blkdev_bio_end_io_simple,
+ iocb->ki_ioprio, iocb->ki_hint);
+

ret = bio_iov_iter_get_pages(&bio, iter);
if (unlikely(ret))
@@ -390,12 +387,8 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
blk_start_plug(&plug);

for (;;) {
- bio_set_dev(bio, bdev);
- bio->bi_iter.bi_sector = pos >> 9;
- bio->bi_write_hint = iocb->ki_hint;
- bio->bi_private = dio;
- bio->bi_end_io = blkdev_bio_end_io;
- bio->bi_ioprio = iocb->ki_ioprio;
+ bio_init_fields(bio, bdev, pos >> 9, dio, blkdev_bio_end_io,
+ iocb->ki_ioprio, iocb->ki_hint);

ret = bio_iov_iter_get_pages(bio, iter);
if (unlikely(ret)) {
--
2.22.1

2021-01-19 06:08:41

by Chaitanya Kulkarni

[permalink] [raw]
Subject: [RFC PATCH 09/37] iomap: use bio_init_fields in buffered-io

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
fs/iomap/buffered-io.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index 16a1e82e3aeb..d256799569cf 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -1222,10 +1222,9 @@ iomap_alloc_ioend(struct inode *inode, struct iomap_writepage_ctx *wpc,
struct bio *bio;

bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, &iomap_ioend_bioset);
- bio_set_dev(bio, wpc->iomap.bdev);
- bio->bi_iter.bi_sector = sector;
+ bio_init_fields(bio, wpc->iomap.bdev, sector, NULL, NULL, 0,
+ inode->i_write_hint);
bio->bi_opf = REQ_OP_WRITE | wbc_to_write_flags(wbc);
- bio->bi_write_hint = inode->i_write_hint;
wbc_init_bio(wbc, bio);

ioend = container_of(bio, struct iomap_ioend, io_inline_bio);
--
2.22.1

2021-01-19 23:02:52

by Mike Snitzer

[permalink] [raw]
Subject: Re: [RFC PATCH 00/37] block: introduce bio_init_fields()

On Tue, Jan 19 2021 at 12:05am -0500,
Chaitanya Kulkarni <[email protected]> wrote:

> Hi,
>
> This is a *compile only RFC* which adds a generic helper to initialize
> the various fields of the bio that is repeated all the places in
> file-systems, block layer, and drivers.
>
> The new helper allows callers to initialize various members such as
> bdev, sector, private, end io callback, io priority, and write hints.
>
> The objective of this RFC is to only start a discussion, this it not
> completely tested at all.                                                                                                            
> Following diff shows code level benefits of this helper :-
>  38 files changed, 124 insertions(+), 236 deletions(-)


Please no... this is just obfuscation.

Adding yet another field to set would create a cascade of churn
throughout kernel (and invariably many callers won't need the new field
initialized, so you keep passing 0 for more and more fields).

Nacked-by: Mike Snitzer <[email protected]>

2021-01-20 03:30:09

by Chaitanya Kulkarni

[permalink] [raw]
Subject: Re: [RFC PATCH 00/37] block: introduce bio_init_fields()

On 1/18/21 21:06, Chaitanya Kulkarni wrote:
> Hi,
>
> This is a *compile only RFC* which adds a generic helper to initialize
> the various fields of the bio that is repeated all the places in
> file-systems, block layer, and drivers.
>
> The new helper allows callers to initialize various members such as
> bdev, sector, private, end io callback, io priority, and write hints.
>
> The objective of this RFC is to only start a discussion, this it not
> completely tested at all.
> Following diff shows code level benefits of this helper :-
> 38 files changed, 124 insertions(+), 236 deletions(-)
>
> -ck
Thanks for replying Mike, Josef and Christoph.

I'll move forward with Christoph's suggestion and get rid of
optional parameters which is making this API hard to use.