[RFC v2 11/17] bio: bio_set_status from non-zero errno

Andreas Gruenbacher <[email protected]>
Newsgroups gmane.linux.raid,gmane.linux.block,gmane.comp.file-systems.btrfs,gmane.linux.kernel
Message-ID <[email protected]>
In these instances, the compiler knows that errno is not 0 and so it can
optimize 'bio_set_status(bio, errno_to_blk_status(errno))' as
'bio->bi_status = __errno_to_blk_status(errno)'.

Created with Coccinelle using the following semantic patch:

@@
struct bio *bio;
expression errno;
@@
- if (errno)
-       bio->bi_status = errno_to_blk_status(errno);
+ if (errno)
+	bio_set_status(bio, errno_to_blk_status(errno));

@@
struct bio *bio;
expression errno;
@@
- if (unlikely(errno))
-       bio->bi_status = errno_to_blk_status(errno);
+ if (unlikely(errno))
+	bio_set_status(bio, errno_to_blk_status(errno));

@@
expression status;
struct bio *bio;
@@
if (IS_ERR(status)) {
<...
-       bio->bi_status = errno_to_blk_status(PTR_ERR(status));
+       bio_set_status(bio, errno_to_blk_status(PTR_ERR(status)));
...>
}

@@
expression errno;
struct bio *bio;
@@
if (!errno)
	return;
-bio->bi_status = errno_to_blk_status(errno);
+bio_set_status(bio, errno_to_blk_status(errno));

@@
expression errno;
struct bio bio;
@@
if (errno)
-       bio.bi_status = errno_to_blk_status(errno);
+       bio_set_status(&bio, errno_to_blk_status(errno));

@@
expression errno;
struct bio bio;
@@
if (IS_ERR_VALUE(errno))
-       bio.bi_status = errno_to_blk_status(errno);
+       bio_set_status(&bio, errno_to_blk_status(errno));

@@
expression errno;
struct bio *bio;
@@
if (errno) {
<...
-       bio->bi_status = errno_to_blk_status(errno);
+       bio_set_status(bio, errno_to_blk_status(errno));
...>
}

@@
expression errno;
struct iomap_ioend *ioend;
struct bio bio;
@@
if (errno) {
<...
-       ioend->io_bio.bi_status = errno_to_blk_status(errno);
+       bio_set_status(&ioend->io_bio, errno_to_blk_status(errno));
...>
}

@@
expression errno;
struct bio *bio;
@@
if (errno < 0) {
<...
-       bio->bi_status = errno_to_blk_status(errno);
+       bio_set_status(bio, errno_to_blk_status(errno));
...>
}

@@
expression errno;
struct bio *bio;
@@
if (unlikely(errno < 0)) {
<...
-       bio->bi_status = errno_to_blk_status(errno);
+       bio_set_status(bio, errno_to_blk_status(errno));
...>
}

@@
expression errno;
struct bio *bio;
@@
if (unlikely(errno != 0)) {
<...
-       bio->bi_status = errno_to_blk_status(errno);
+       bio_set_status(bio, errno_to_blk_status(errno));
...>
}

Signed-off-by: Andreas Gruenbacher <[email protected]>
---
 block/blk-merge.c             | 4 ++--
 drivers/block/drbd/drbd_req.c | 2 +-
 drivers/md/dm-ebs-target.c    | 2 +-
 drivers/md/dm-integrity.c     | 6 +++---
 drivers/md/raid10.c           | 6 ++++--
 drivers/nvdimm/btt.c          | 2 +-
 drivers/nvdimm/pmem.c         | 2 +-
 fs/btrfs/bio.c                | 2 +-
 fs/btrfs/direct-io.c          | 2 +-
 fs/btrfs/raid56.c             | 4 ++--
 fs/crypto/bio.c               | 2 +-
 fs/erofs/fscache.c            | 8 +++++---
 fs/iomap/ioend.c              | 2 +-
 fs/xfs/xfs_aops.c             | 2 +-
 14 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/block/blk-merge.c b/block/blk-merge.c
index 37864c5d287e..27ea5ffb8f77 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -122,7 +122,7 @@ struct bio *bio_submit_split_bioset(struct bio *bio, unsigned int split_sectors,
 	struct bio *split = bio_split(bio, split_sectors, GFP_NOIO, bs);
 
 	if (IS_ERR(split)) {
-		bio->bi_status = errno_to_blk_status(PTR_ERR(split));
+		bio_set_status(bio, errno_to_blk_status(PTR_ERR(split)));
 		bio_endio(bio);
 		return NULL;
 	}
@@ -143,7 +143,7 @@ EXPORT_SYMBOL_GPL(bio_submit_split_bioset);
 static struct bio *bio_submit_split(struct bio *bio, int split_sectors)
 {
 	if (unlikely(split_sectors < 0)) {
-		bio->bi_status = errno_to_blk_status(split_sectors);
+		bio_set_status(bio, errno_to_blk_status(split_sectors));
 		bio_endio(bio);
 		return NULL;
 	}
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index baa08d56494d..983b2ff5eb6b 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -177,7 +177,7 @@ void complete_master_bio(struct drbd_device *device,
 		struct bio_and_error *m)
 {
 	if (unlikely(m->error))
-		m->bio->bi_status = errno_to_blk_status(m->error);
+		bio_set_status(m->bio, errno_to_blk_status(m->error));
 	bio_endio(m->bio);
 	dec_ap_bio(device);
 }
diff --git a/drivers/md/dm-ebs-target.c b/drivers/md/dm-ebs-target.c
index 6abb31ca9662..2c97c36df23a 100644
--- a/drivers/md/dm-ebs-target.c
+++ b/drivers/md/dm-ebs-target.c
@@ -217,7 +217,7 @@ static void __ebs_process_bios(struct work_struct *ws)
 		}
 
 		if (r < 0)
-			bio->bi_status = errno_to_blk_status(r);
+			bio_set_status(bio, errno_to_blk_status(r));
 	}
 
 	/*
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
index 6d04b067060d..c5c7c167b45d 100644
--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -2593,7 +2593,7 @@ static int dm_integrity_map_inline(struct dm_integrity_io *dio, bool from_map)
 
 	bip = bio_integrity_alloc(bio, GFP_NOIO, 1);
 	if (IS_ERR(bip)) {
-		bio->bi_status = errno_to_blk_status(PTR_ERR(bip));
+		bio_set_status(bio, errno_to_blk_status(PTR_ERR(bip)));
 		bio_endio(bio);
 		return DM_MAPIO_SUBMITTED;
 	}
@@ -2661,7 +2661,7 @@ static void dm_integrity_inline_recheck(struct work_struct *w)
 		bip = bio_integrity_alloc(outgoing_bio, GFP_NOIO, 1);
 		if (IS_ERR(bip)) {
 			bio_put(outgoing_bio);
-			bio->bi_status = errno_to_blk_status(PTR_ERR(bip));
+			bio_set_status(bio, errno_to_blk_status(PTR_ERR(bip)));
 			bio_endio(bio);
 			return;
 		}
@@ -2679,7 +2679,7 @@ static void dm_integrity_inline_recheck(struct work_struct *w)
 		r = submit_bio_wait(outgoing_bio);
 		if (unlikely(r != 0)) {
 			bio_put(outgoing_bio);
-			bio->bi_status = errno_to_blk_status(r);
+			bio_set_status(bio, errno_to_blk_status(r));
 			bio_endio(bio);
 			return;
 		}
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index 59b900672a7a..3e15e190f103 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1665,7 +1665,8 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
 		split_size = stripe_size - remainder;
 		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
 		if (IS_ERR(split)) {
-			bio->bi_status = errno_to_blk_status(PTR_ERR(split));
+			bio_set_status(bio,
+				       errno_to_blk_status(PTR_ERR(split)));
 			bio_endio(bio);
 			return 0;
 		}
@@ -1682,7 +1683,8 @@ static int raid10_handle_discard(struct mddev *mddev, struct bio *bio)
 		split_size = bio_sectors(bio) - remainder;
 		split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split);
 		if (IS_ERR(split)) {
-			bio->bi_status = errno_to_blk_status(PTR_ERR(split));
+			bio_set_status(bio,
+				       errno_to_blk_status(PTR_ERR(split)));
 			bio_endio(bio);
 			return 0;
 		}
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 3da30dcbf26c..3b9a7d7b9694 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1468,7 +1468,7 @@ static void btt_submit_bio(struct bio *bio)
 					(op_is_write(bio_op(bio))) ? "WRITE" :
 					"READ",
 					(unsigned long long) iter.bi_sector, len);
-			bio->bi_status = errno_to_blk_status(err);
+			bio_set_status(bio, errno_to_blk_status(err));
 			break;
 		}
 	}
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 4fdcbe56a3bc..6b64a217d180 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -233,7 +233,7 @@ static void pmem_submit_bio(struct bio *bio)
 		ret = nvdimm_flush(nd_region, bio);
 
 	if (ret)
-		bio->bi_status = errno_to_blk_status(ret);
+		bio_set_status(bio, errno_to_blk_status(ret));
 
 	bio_endio(bio);
 }
diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c
index 519635e2833a..1947f1cb7d08 100644
--- a/fs/btrfs/bio.c
+++ b/fs/btrfs/bio.c
@@ -540,7 +540,7 @@ static void run_one_async_start(struct btrfs_work *work)
 
 	ret = btrfs_bio_csum(async->bbio);
 	if (ret)
-		async->bbio->bio.bi_status = errno_to_blk_status(ret);
+		bio_set_status(&async->bbio->bio, errno_to_blk_status(ret));
 }
 
 /*
diff --git a/fs/btrfs/direct-io.c b/fs/btrfs/direct-io.c
index 802d4dbe5b38..04facbbe6994 100644
--- a/fs/btrfs/direct-io.c
+++ b/fs/btrfs/direct-io.c
@@ -738,7 +738,7 @@ static void btrfs_dio_submit_io(const struct iomap_iter *iter, struct bio *bio,
 			btrfs_finish_ordered_extent(dio_data->ordered, NULL,
 						    file_offset, dip->bytes,
 						    !ret);
-			bio->bi_status = errno_to_blk_status(ret);
+			bio_set_status(bio, errno_to_blk_status(ret));
 			iomap_dio_bio_end_io(bio);
 			return;
 		}
diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c
index 0135dceb7baa..b60ab0bb08ad 100644
--- a/fs/btrfs/raid56.c
+++ b/fs/btrfs/raid56.c
@@ -1750,7 +1750,7 @@ void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
 
 	rbio = alloc_rbio(fs_info, bioc);
 	if (IS_ERR(rbio)) {
-		bio->bi_status = errno_to_blk_status(PTR_ERR(rbio));
+		bio_set_status(bio, errno_to_blk_status(PTR_ERR(rbio)));
 		bio_endio(bio);
 		return;
 	}
@@ -2148,7 +2148,7 @@ void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
 
 	rbio = alloc_rbio(fs_info, bioc);
 	if (IS_ERR(rbio)) {
-		bio->bi_status = errno_to_blk_status(PTR_ERR(rbio));
+		bio_set_status(bio, errno_to_blk_status(PTR_ERR(rbio)));
 		bio_endio(bio);
 		return;
 	}
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index 5f5599020e94..21a3a1c170a2 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -39,7 +39,7 @@ bool fscrypt_decrypt_bio(struct bio *bio)
 							   fi.offset);
 
 		if (err) {
-			bio->bi_status = errno_to_blk_status(err);
+			bio_set_status(bio, errno_to_blk_status(err));
 			return false;
 		}
 	}
diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c
index 362acf828279..9d84bf24e501 100644
--- a/fs/erofs/fscache.c
+++ b/fs/erofs/fscache.c
@@ -183,8 +183,10 @@ static void erofs_fscache_bio_endio(void *priv, ssize_t transferred_or_error)
 {
 	struct erofs_fscache_bio *io = priv;
 
-	if (IS_ERR_VALUE(transferred_or_error))
-		io->bio.bi_status = errno_to_blk_status(transferred_or_error);
+	if (IS_ERR_VALUE(transferred_or_error)) {
+		bio_set_status(&io->bio,
+			       errno_to_blk_status(transferred_or_error));
+	}
 	io->bio.bi_end_io(&io->bio);
 	BUILD_BUG_ON(offsetof(struct erofs_fscache_bio, io) != 0);
 	erofs_fscache_io_put(&io->io);
@@ -215,7 +217,7 @@ void erofs_fscache_submit_bio(struct bio *bio)
 	erofs_fscache_io_put(&io->io);
 	if (!ret)
 		return;
-	bio->bi_status = errno_to_blk_status(ret);
+	bio_set_status(bio, errno_to_blk_status(ret));
 	bio->bi_end_io(bio);
 }
 
diff --git a/fs/iomap/ioend.c b/fs/iomap/ioend.c
index b49fa75eab26..1ebe6730d013 100644
--- a/fs/iomap/ioend.c
+++ b/fs/iomap/ioend.c
@@ -87,7 +87,7 @@ int iomap_ioend_writeback_submit(struct iomap_writepage_ctx *wpc, int error)
 		error = -EIO;
 
 	if (error) {
-		ioend->io_bio.bi_status = errno_to_blk_status(error);
+		bio_set_status(&ioend->io_bio, errno_to_blk_status(error));
 		bio_endio(&ioend->io_bio);
 		return error;
 	}
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index a26f79815533..bd2b828164cb 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -653,7 +653,7 @@ xfs_zoned_writeback_submit(
 
 	ioend->io_bio.bi_end_io = xfs_end_bio;
 	if (error) {
-		ioend->io_bio.bi_status = errno_to_blk_status(error);
+		bio_set_status(&ioend->io_bio, errno_to_blk_status(error));
 		bio_endio(&ioend->io_bio);
 		return error;
 	}
-- 
2.52.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.