linux/drivers/nvme/host
Mikulas Patocka c63b44fb33 block: change rq_integrity_vec to respect the iterator
[ Upstream commit cf546dd289 ]

If we allocate a bio that is larger than NVMe maximum request size,
attach integrity metadata to it and send it to the NVMe subsystem, the
integrity metadata will be corrupted.

Splitting the bio works correctly. The function bio_split will clone the
bio, trim the iterator of the first bio and advance the iterator of the
second bio.

However, the function rq_integrity_vec has a bug - it returns the first
vector of the bio's metadata and completely disregards the metadata
iterator that was advanced when the bio was split. Thus, the second bio
uses the same metadata as the first bio and this leads to metadata
corruption.

This commit changes rq_integrity_vec, so that it calls mp_bvec_iter_bvec
instead of returning the first vector. mp_bvec_iter_bvec reads the
iterator and uses it to build a bvec for the current position in the
iterator.

The "queue_max_integrity_segments(rq->q) > 1" check was removed, because
the updated rq_integrity_vec function works correctly with multiple
segments.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Reviewed-by: Anuj Gupta <anuj20.g@samsung.com>
Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/49d1afaa-f934-6ed2-a678-e0d428c63a65@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-08-14 13:58:41 +02:00
..
apple.c nvme-apple: return directly instead of else 2023-04-13 08:55:06 +02:00
auth.c nvme-auth: set explanation code for failure2 msgs 2023-12-20 17:01:57 +01:00
constants.c nvme fixes for Linux 6.5 2023-06-30 14:04:08 -06:00
core.c nvme: avoid double free special payload 2024-07-25 09:50:46 +02:00
fabrics.c nvme: blank out authentication fabrics options if not configured 2023-12-03 07:33:06 +01:00
fabrics.h nvme: fix reconnection fail due to reserved tag allocation 2024-03-26 18:20:09 -04:00
fault_inject.c nvme: fix parameter check in nvme_fault_inject_init() 2023-07-12 08:48:33 -07:00
fc.c nvme-fc: do not wait in vain when unloading module 2024-03-01 13:34:52 +01:00
fc.h nvme-fc: Update header and host for common definitions for LS handling 2020-05-09 16:18:33 -06:00
hwmon.c nvme: host: hwmon: constify pointers to hwmon_channel_info 2023-08-21 12:54:02 -07:00
ioctl.c nvme-ioctl: move capable() admin check to the end 2024-01-20 11:51:41 +01:00
Kconfig nvme-auth: Diffie-Hellman key exchange support 2022-08-02 17:14:49 -06:00
Makefile SCSI misc on 20230629 2023-06-30 11:57:07 -07:00
multipath.c nvme-multipath: find NUMA path only for online numa-node 2024-07-11 12:49:20 +02:00
nvme.h nvme: fix NVME_NS_DEAC may incorrectly identifying the disk as EXT_LBA. 2024-07-25 09:50:50 +02:00
pci.c block: change rq_integrity_vec to respect the iterator 2024-08-14 13:58:41 +02:00
pr.c nvme: fix nvme_pr_* status code parsing 2024-06-21 14:38:29 +02:00
rdma.c nvme: ensure reset state check ordering 2024-01-20 11:51:41 +01:00
sysfs.c nvme: warn only once for legacy uuid attribute 2023-07-12 08:48:19 -07:00
tcp.c nvme: ensure reset state check ordering 2024-01-20 11:51:41 +01:00
trace.c nvme: implement In-Band authentication 2022-08-02 17:14:49 -06:00
trace.h nvme: fix async event trace event 2023-04-13 08:59:04 +02:00
zns.c scsi: nvme: zns: Set zone limits before revalidating zones 2023-07-05 21:58:10 -04:00