Commit 921e81db authored by Kanchan Joshi's avatar Kanchan Joshi Committed by Jens Axboe
Browse files

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: default avatarKanchan Joshi <joshi.k@samsung.com>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240201130126.211402-4-joshi.k@samsung.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 60d21aac
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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;
}

+1 −0
Original line number Diff line number Diff line
@@ -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;