]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
t10-pi: reduce ref tag code duplication
authorCaleb Sander Mateos <csander@purestorage.com>
Wed, 15 Apr 2026 21:08:47 +0000 (15:08 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 17 Apr 2026 20:23:26 +0000 (14:23 -0600)
t10_pi_ref_tag() and ext_pi_ref_tag() are identical except for the final
truncation of the ref tag to 32 or 48 bits. Factor out a helper
full_pi_ref_tag() to return the untruncated ref tag and use it in
t10_pi_ref_tag() and ext_pi_ref_tag().

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Reviewed-by: Anuj Gupta <anuj20.g@samsung.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260415210847.1730016-1-csander@purestorage.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/t10-pi.h

index 2c59fe3efcd424c10f0eb5fd3f5640c0e29487da..b6c2496866eab4c6b68c7a65eac46c950660e7c4 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/types.h>
 #include <linux/blk-mq.h>
+#include <linux/wordpart.h>
 
 /*
  * A T10 PI-capable target device can be formatted with different
@@ -25,6 +26,16 @@ enum t10_dif_type {
        T10_PI_TYPE3_PROTECTION = 0x3,
 };
 
+static inline u64 full_pi_ref_tag(const struct request *rq)
+{
+       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);
+}
+
 /*
  * T10 Protection Information tuple.
  */
@@ -39,12 +50,7 @@ struct t10_pi_tuple {
 
 static inline u32 t10_pi_ref_tag(struct request *rq)
 {
-       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;
+       return lower_32_bits(full_pi_ref_tag(rq));
 }
 
 struct crc64_pi_tuple {
@@ -64,12 +70,7 @@ static inline u64 lower_48_bits(u64 n)
 
 static inline u64 ext_pi_ref_tag(struct request *rq)
 {
-       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));
+       return lower_48_bits(full_pi_ref_tag(rq));
 }
 
 #endif