Skip to content

Commit 921e81d

Browse files
Kanchan Joshiaxboe
authored andcommitted
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>
1 parent 60d21aa commit 921e81d

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

drivers/nvme/host/core.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1771,6 +1771,7 @@ static void nvme_init_integrity(struct gendisk *disk,
17711771
}
17721772

17731773
integrity.tuple_size = head->ms;
1774+
integrity.pi_offset = head->pi_offset;
17741775
blk_integrity_register(disk, &integrity);
17751776
blk_queue_max_integrity_segments(disk->queue, max_integrity_segments);
17761777
}
@@ -1880,11 +1881,16 @@ static int nvme_init_ms(struct nvme_ctrl *ctrl, struct nvme_ns_head *head,
18801881
free_data:
18811882
kfree(nvm);
18821883
set_pi:
1883-
if (head->pi_size && (first || head->ms == head->pi_size))
1884+
if (head->pi_size && head->ms >= head->pi_size)
18841885
head->pi_type = id->dps & NVME_NS_DPS_PI_MASK;
18851886
else
18861887
head->pi_type = 0;
18871888

1889+
if (first)
1890+
head->pi_offset = 0;
1891+
else
1892+
head->pi_offset = head->ms - head->pi_size;
1893+
18881894
return ret;
18891895
}
18901896

drivers/nvme/host/nvme.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,7 @@ struct nvme_ns_head {
463463
u16 ms;
464464
u16 pi_size;
465465
u8 pi_type;
466+
u8 pi_offset;
466467
u8 guard_type;
467468
u16 sgs;
468469
u32 sws;

0 commit comments

Comments
 (0)