block: add a bi_write_stream field
authorChristoph Hellwig <hch@lst.de>
Tue, 6 May 2025 12:17:23 +0000 (17:47 +0530)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 May 2025 13:46:43 +0000 (07:46 -0600)
Add the ability to pass a write stream for placement control in the bio.
The new field fits in an existing hole, so does not change the size of
the struct.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Link: https://lore.kernel.org/r/20250506121732.8211-3-joshi.k@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c
block/blk-crypto-fallback.c
block/blk-merge.c
include/linux/blk_types.h

index 4e6c85a33d74dbc1f025c5dbc1965ad8f40aa4c1..1e42aefc7377ab1501e6986cb842dd5b80e97d51 100644 (file)
@@ -251,6 +251,7 @@ void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table,
        bio->bi_flags = 0;
        bio->bi_ioprio = 0;
        bio->bi_write_hint = 0;
+       bio->bi_write_stream = 0;
        bio->bi_status = 0;
        bio->bi_iter.bi_sector = 0;
        bio->bi_iter.bi_size = 0;
@@ -827,6 +828,7 @@ static int __bio_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp)
        bio_set_flag(bio, BIO_CLONED);
        bio->bi_ioprio = bio_src->bi_ioprio;
        bio->bi_write_hint = bio_src->bi_write_hint;
+       bio->bi_write_stream = bio_src->bi_write_stream;
        bio->bi_iter = bio_src->bi_iter;
 
        if (bio->bi_bdev) {
index f154be0b575ad5ca7afe36c044676dd9613f5b59..005c9157ffb3d4bedadf1cf623535c39ec391eee 100644 (file)
@@ -173,6 +173,7 @@ static struct bio *blk_crypto_fallback_clone_bio(struct bio *bio_src)
                bio_set_flag(bio, BIO_REMAPPED);
        bio->bi_ioprio          = bio_src->bi_ioprio;
        bio->bi_write_hint      = bio_src->bi_write_hint;
+       bio->bi_write_stream    = bio_src->bi_write_stream;
        bio->bi_iter.bi_sector  = bio_src->bi_iter.bi_sector;
        bio->bi_iter.bi_size    = bio_src->bi_iter.bi_size;
 
index fdd4efb54c6c70f883dd9a11efc76b57d78c9ac3..782308b73b5399d2eaa8430001382f7faede445a 100644 (file)
@@ -832,6 +832,8 @@ static struct request *attempt_merge(struct request_queue *q,
 
        if (req->bio->bi_write_hint != next->bio->bi_write_hint)
                return NULL;
+       if (req->bio->bi_write_stream != next->bio->bi_write_stream)
+               return NULL;
        if (req->bio->bi_ioprio != next->bio->bi_ioprio)
                return NULL;
        if (!blk_atomic_write_mergeable_rqs(req, next))
@@ -953,6 +955,8 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
                return false;
        if (rq->bio->bi_write_hint != bio->bi_write_hint)
                return false;
+       if (rq->bio->bi_write_stream != bio->bi_write_stream)
+               return false;
        if (rq->bio->bi_ioprio != bio->bi_ioprio)
                return false;
        if (blk_atomic_write_mergeable_rq_bio(rq, bio) == false)
index 5a46067e85b13453f8df5784d689cd40f05ccca4..f38425338c3fbb28ee32351aaeb62c6dd2e46a08 100644 (file)
@@ -220,6 +220,7 @@ struct bio {
        unsigned short          bi_flags;       /* BIO_* below */
        unsigned short          bi_ioprio;
        enum rw_hint            bi_write_hint;
+       u8                      bi_write_stream;
        blk_status_t            bi_status;
        atomic_t                __bi_remaining;