From 51b29671f8e6fd0be611bbb36abbafe83edb9788 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 21 May 2025 10:06:10 +0000 Subject: [PATCH] Revert "block: remove the write_hint field from struct request" This reverts commit 3e12e8c273ebcf346bfafdf7066764324912b070 which is commit 61952bb73486fff0f5550bccdf4062d9dd0fb163 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Ifefd0168a7f8a8f5112b143781619285394bbca3 Signed-off-by: Greg Kroah-Hartman --- block/blk-merge.c | 16 ++++++---------- block/blk-mq.c | 2 ++ drivers/scsi/sd.c | 6 +++--- include/linux/blk-mq.h | 1 + 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 993300e0d470..1ffd87335004 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -830,11 +830,9 @@ static struct request *attempt_merge(struct request_queue *q, if (rq_data_dir(req) != rq_data_dir(next)) return NULL; - if (req->bio && next->bio) { - /* Don't merge requests with different write hints. */ - if (req->bio->bi_write_hint != next->bio->bi_write_hint) - return NULL; - } + /* Don't merge requests with different write hints. */ + if (req->write_hint != next->write_hint) + return NULL; if (req->ioprio != next->ioprio) return NULL; @@ -966,11 +964,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (!bio_crypt_rq_ctx_compatible(rq, bio)) return false; - if (rq->bio) { - /* Don't merge requests with different write hints. */ - if (rq->bio->bi_write_hint != bio->bi_write_hint) - return false; - } + /* Don't merge requests with different write hints. */ + if (rq->write_hint != bio->bi_write_hint) + return false; if (rq->ioprio != bio_prio(bio)) return false; diff --git a/block/blk-mq.c b/block/blk-mq.c index e7ec16e5bea7..15ab7521e249 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2678,6 +2678,7 @@ static void blk_mq_bio_to_request(struct request *rq, struct bio *bio, rq->cmd_flags |= REQ_FAILFAST_MASK; rq->__sector = bio->bi_iter.bi_sector; + rq->write_hint = bio->bi_write_hint; blk_rq_bio_prep(rq, bio, nr_segs); if (bio_integrity(bio)) rq->nr_integrity_segments = blk_rq_count_integrity_sg(rq->q, @@ -3331,6 +3332,7 @@ int blk_rq_prep_clone(struct request *rq, struct request *rq_src, } rq->nr_phys_segments = rq_src->nr_phys_segments; rq->ioprio = rq_src->ioprio; + rq->write_hint = rq_src->write_hint; if (rq->bio && blk_crypto_rq_bio_prep(rq, rq->bio, gfp_mask) < 0) goto free_and_out; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index af62a8ed8620..585a5c9b1930 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1185,8 +1185,8 @@ static u8 sd_group_number(struct scsi_cmnd *cmd) if (!sdkp->rscs) return 0; - return min3((u32)rq->bio->bi_write_hint, - (u32)sdkp->permanent_stream_count, 0x3fu); + return min3((u32)rq->write_hint, (u32)sdkp->permanent_stream_count, + 0x3fu); } static blk_status_t sd_setup_rw32_cmnd(struct scsi_cmnd *cmd, bool write, @@ -1384,7 +1384,7 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd) ret = sd_setup_rw16_cmnd(cmd, write, lba, nr_blocks, protect | fua, dld); } else if ((nr_blocks > 0xff) || (lba > 0x1fffff) || - sdp->use_10_for_rw || protect || rq->bio->bi_write_hint) { + sdp->use_10_for_rw || protect || rq->write_hint) { ret = sd_setup_rw10_cmnd(cmd, write, lba, nr_blocks, protect | fua); } else { diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 1f66c6329c35..374e8639539a 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -157,6 +157,7 @@ struct request { struct blk_crypto_keyslot *crypt_keyslot; #endif + enum rw_hint write_hint; unsigned short ioprio; enum mq_rq_state state;