[RFC 05/12] bio: add bio_set_status

Andreas Gruenbacher <[email protected]>
Newsgroups gmane.linux.block,gmane.comp.file-systems.btrfs,gmane.linux.raid,gmane.linux.kernel
Message-ID <[email protected]>
Add a bio_set_status(bio, status) helper that sets bio->bi_status to
status if status != BLK_STS_OK.  Replace instances of this pattern in
the code with a call to the new helper.

The WRITE_ONCE() in bio_set_status() ensures that the compiler won't
reorder things in a weird way, but it isn't needed to prevent tearing
because a single-byte field like bi_status cannot tear.

Created with Coccinelle using the following semantic patch:

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

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

Signed-off-by: Andreas Gruenbacher <[email protected]>
---
 block/blk-mq.c      | 3 +--
 drivers/md/dm.c     | 3 +--
 include/linux/bio.h | 6 ++++++
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/block/blk-mq.c b/block/blk-mq.c
index d626d32f6e57..bc837aa51daa 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -969,8 +969,7 @@ bool blk_update_request(struct request *req, blk_status_t error,
 		struct bio *bio = req->bio;
 		unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes);
 
-		if (unlikely(error))
-			bio->bi_status = error;
+		bio_set_status(bio, error);
 
 		if (bio_bytes == bio->bi_iter.bi_size) {
 			req->bio = bio->bi_next;
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 6c83ab940af7..cbc64377fa96 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -983,8 +983,7 @@ static void __dm_io_complete(struct dm_io *io, bool first_stage)
 		queue_io(md, bio);
 	} else {
 		/* done with normal IO or empty flush */
-		if (io_error)
-			bio->bi_status = io_error;
+		bio_set_status(bio, io_error);
 		bio_endio(bio);
 	}
 }
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 38ebf03036cb..bf4df0b15ee1 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -376,6 +376,12 @@ void submit_bio(struct bio *bio);
 
 extern void bio_endio(struct bio *);
 
+static inline void bio_set_status(struct bio *bio, blk_status_t status)
+{
+	if (status)
+		WRITE_ONCE(bio->bi_status, status);
+}
+
 static inline void bio_io_error(struct bio *bio)
 {
 	bio->bi_status = BLK_STS_IOERR;
-- 
2.51.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.