Unverified Commit 76e45252 authored by Anuj Gupta's avatar Anuj Gupta Committed by Christian Brauner
Browse files

block: introduce pi_tuple_size field in blk_integrity



Introduce a new pi_tuple_size field in struct blk_integrity to
explicitly represent the size (in bytes) of the protection information
(PI) tuple. This is a prep patch.
Add validation in blk_validate_integrity_limits() to ensure that
pi size matches the expected size for known checksum types and never
exceeds the pi_tuple_size.

Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAnuj Gupta <anuj20.g@samsung.com>
Link: https://lore.kernel.org/20250630090548.3317-3-anuj20.g@samsung.com


Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent c6603b1d
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
#include <linux/jiffies.h>
#include <linux/gfp.h>
#include <linux/dma-mapping.h>
#include <linux/t10-pi.h>
#include <linux/crc64.h>

#include "blk.h"
#include "blk-rq-qos.h"
@@ -135,6 +137,42 @@ static int blk_validate_integrity_limits(struct queue_limits *lim)
		return -EINVAL;
	}

	if (bi->pi_tuple_size > bi->metadata_size) {
		pr_warn("pi_tuple_size (%u) exceeds metadata_size (%u)\n",
			 bi->pi_tuple_size,
			 bi->metadata_size);
		return -EINVAL;
	}

	switch (bi->csum_type) {
	case BLK_INTEGRITY_CSUM_NONE:
		if (bi->pi_tuple_size) {
			pr_warn("pi_tuple_size must be 0 when checksum type \
				 is none\n");
			return -EINVAL;
		}
		break;
	case BLK_INTEGRITY_CSUM_CRC:
	case BLK_INTEGRITY_CSUM_IP:
		if (bi->pi_tuple_size != sizeof(struct t10_pi_tuple)) {
			pr_warn("pi_tuple_size mismatch for T10 PI: expected \
				 %zu, got %u\n",
				 sizeof(struct t10_pi_tuple),
				 bi->pi_tuple_size);
			return -EINVAL;
		}
		break;
	case BLK_INTEGRITY_CSUM_CRC64:
		if (bi->pi_tuple_size != sizeof(struct crc64_pi_tuple)) {
			pr_warn("pi_tuple_size mismatch for CRC64 PI: \
				 expected %zu, got %u\n",
				 sizeof(struct crc64_pi_tuple),
				 bi->pi_tuple_size);
			return -EINVAL;
		}
		break;
	}

	if (!bi->interval_exp)
		bi->interval_exp = ilog2(lim->logical_block_size);

+2 −0
Original line number Diff line number Diff line
@@ -1867,6 +1867,8 @@ static bool nvme_init_integrity(struct nvme_ns_head *head,
	}

	bi->metadata_size = head->ms;
	if (bi->csum_type)
		bi->pi_tuple_size = head->pi_size;
	bi->pi_offset = info->pi_offset;
	return true;
}
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ void sd_dif_config_host(struct scsi_disk *sdkp, struct queue_limits *lim)
		bi->flags |= BLK_INTEGRITY_REF_TAG;

	bi->metadata_size = sizeof(struct t10_pi_tuple);
	bi->pi_tuple_size = bi->metadata_size;

	if (dif && type) {
		bi->flags |= BLK_INTEGRITY_DEVICE_CAPABLE;
+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ struct blk_integrity {
	unsigned char				pi_offset;
	unsigned char				interval_exp;
	unsigned char				tag_size;
	unsigned char				pi_tuple_size;
};

typedef unsigned int __bitwise blk_mode_t;