diff options
author | Kanchan Joshi <joshi.k@samsung.com> | 2024-02-01 18:31:26 +0530 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2024-02-12 08:49:31 -0700 |
commit | 921e81db524d17db683cc29aed7ff02f06ea3f96 (patch) | |
tree | d1fb6092cef43c70910a840436d8cd0eed327cbf | |
parent | 60d21aac52e26531affdadb7543fe5b93f58b450 (diff) | |
download | linux-stable-921e81db524d17db683cc29aed7ff02f06ea3f96.tar.gz linux-stable-921e81db524d17db683cc29aed7ff02f06ea3f96.tar.bz2 linux-stable-921e81db524d17db683cc29aed7ff02f06ea3f96.zip |
nvme: allow integrity when PI is not in first bytes
NVM command set 1.0 (or later) mandates PI to be in the last bytes of
metadata. But this was not supported in the block-layer, and driver
registered a nop profile.
Since block-integrity can now handle flexible PI offset, change the
driver to support this configuration.
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240201130126.211402-4-joshi.k@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/nvme/host/core.c | 8 | ||||
-rw-r--r-- | drivers/nvme/host/nvme.h | 1 |
2 files changed, 8 insertions, 1 deletions
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 0d124a8ca9c3..6e7f9b13fba2 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -1771,6 +1771,7 @@ static void nvme_init_integrity(struct gendisk *disk, } integrity.tuple_size = head->ms; + integrity.pi_offset = head->pi_offset; blk_integrity_register(disk, &integrity); blk_queue_max_integrity_segments(disk->queue, max_integrity_segments); } @@ -1880,11 +1881,16 @@ static int nvme_init_ms(struct nvme_ctrl *ctrl, struct nvme_ns_head *head, free_data: kfree(nvm); set_pi: - if (head->pi_size && (first || head->ms == head->pi_size)) + if (head->pi_size && head->ms >= head->pi_size) head->pi_type = id->dps & NVME_NS_DPS_PI_MASK; else head->pi_type = 0; + if (first) + head->pi_offset = 0; + else + head->pi_offset = head->ms - head->pi_size; + return ret; } diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 3897334e3950..4a484fc8a073 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -463,6 +463,7 @@ struct nvme_ns_head { u16 ms; u16 pi_size; u8 pi_type; + u8 pi_offset; u8 guard_type; u16 sgs; u32 sws; |