]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: t10-pi: Return correct ref tag when queue has no integrity profile
authorAnuj Gupta <anuj20.g@samsung.com>
Thu, 4 Jul 2024 06:15:15 +0000 (11:45 +0530)
committerJens Axboe <axboe@kernel.dk>
Thu, 4 Jul 2024 08:02:33 +0000 (02:02 -0600)
Commit c6e56cf6b2e7 ("block: move integrity information into
queue_limits") changed the ref tag calculation logic. It would break if
there is no integrity profile. This in turn causes read/write failures
for such cases.

Fixes: c6e56cf6b2e7 ("block: move integrity information into queue_limits")
Signed-off-by: Anuj Gupta <anuj20.g@samsung.com>
Link: https://lore.kernel.org/r/20240704061515.282343-1-joshi.k@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/t10-pi.h

index 1773610010ebaf84261fa93319cbcff0ded7b561..2c59fe3efcd424c10f0eb5fd3f5640c0e29487da 100644 (file)
@@ -39,8 +39,11 @@ struct t10_pi_tuple {
 
 static inline u32 t10_pi_ref_tag(struct request *rq)
 {
-       unsigned int shift = rq->q->limits.integrity.interval_exp;
+       unsigned int shift = ilog2(queue_logical_block_size(rq->q));
 
+       if (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) &&
+           rq->q->limits.integrity.interval_exp)
+               shift = rq->q->limits.integrity.interval_exp;
        return blk_rq_pos(rq) >> (shift - SECTOR_SHIFT) & 0xffffffff;
 }
 
@@ -61,8 +64,11 @@ static inline u64 lower_48_bits(u64 n)
 
 static inline u64 ext_pi_ref_tag(struct request *rq)
 {
-       unsigned int shift = rq->q->limits.integrity.interval_exp;
+       unsigned int shift = ilog2(queue_logical_block_size(rq->q));
 
+       if (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) &&
+           rq->q->limits.integrity.interval_exp)
+               shift = rq->q->limits.integrity.interval_exp;
        return lower_48_bits(blk_rq_pos(rq) >> (shift - SECTOR_SHIFT));
 }