mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-02 08:32:55 +00:00
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: Christoph Hellwig <hch@lst.de> Signed-off-by: Anuj Gupta <anuj20.g@samsung.com> Link: https://lore.kernel.org/20250630090548.3317-3-anuj20.g@samsung.com Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
c6603b1d65
commit
76e45252a4
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user