block: add a bi_write_stream field
authorChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 08:31:26 +0000 (09:31 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 19 Nov 2024 10:34:51 +0000 (11:34 +0100)
Add the ability to pass a write stream for placement control in the bio.

Signed-off-by: Christoph Hellwig <hch@lst.de>
block/bio.c
block/blk-crypto-fallback.c
block/blk-merge.c
block/bounce.c
include/linux/blk_types.h

index 699a78c85c75660fed2463759e2491bb12c63453..2aa86edc7cd6f5f50248ed2175e889ef252f7487 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 29a205482617c8479800b38c36881759cf1f9081..66762243a886b7726b095243cc191e155a3955e5 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 e01383c6e534b0a27a0db8c45d98a2a14d9ec69a..1e5327fb6c45b2fe302c40748479f97609de7306 100644 (file)
@@ -866,6 +866,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))
@@ -987,6 +989,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 0d898cd5ec497f7a3bc68e9ab1805f40cb9c9519..fb8f60f114d7de87bfb34c0a861ddab0ac9e6a9c 100644 (file)
@@ -170,6 +170,7 @@ static struct bio *bounce_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 dce7615c35e7e34b4091b30f095b6b1655b0eb39..4ca3449ce9c95aa5e3f2c7414871200556d3bdfd 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;