From: Sasha Levin Date: Wed, 27 Nov 2024 18:04:23 +0000 (-0500) Subject: Fixes for 4.19 X-Git-Tag: v4.19.325~127 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8695c48eb938536d439c877f5994eb2608061aad;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/nvme-fix-metadata-handling-in-nvme-passthrough.patch b/queue-4.19/nvme-fix-metadata-handling-in-nvme-passthrough.patch new file mode 100644 index 00000000000..3b37e9b503a --- /dev/null +++ b/queue-4.19/nvme-fix-metadata-handling-in-nvme-passthrough.patch @@ -0,0 +1,69 @@ +From 6e9db79e50dfe5ab77665d6276a548bc622f6ab8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Nov 2024 14:29:53 +0000 +Subject: nvme: fix metadata handling in nvme-passthrough + +From: Puranjay Mohan + +[ Upstream commit 7c2fd76048e95dd267055b5f5e0a48e6e7c81fd9 ] + +On an NVMe namespace that does not support metadata, it is possible to +send an IO command with metadata through io-passthru. This allows issues +like [1] to trigger in the completion code path. +nvme_map_user_request() doesn't check if the namespace supports metadata +before sending it forward. It also allows admin commands with metadata to +be processed as it ignores metadata when bdev == NULL and may report +success. + +Reject an IO command with metadata when the NVMe namespace doesn't +support it and reject an admin command if it has metadata. + +[1] https://lore.kernel.org/all/mb61pcylvnym8.fsf@amazon.com/ + +Suggested-by: Christoph Hellwig +Signed-off-by: Puranjay Mohan +Reviewed-by: Christoph Hellwig +Reviewed-by: Sagi Grimberg +Reviewed-by: Anuj Gupta +Signed-off-by: Keith Busch +[ Move the changes from nvme_map_user_request() to nvme_submit_user_cmd() + to make it work on 4.19 ] +Signed-off-by: Hagar Hemdan +Signed-off-by: Sasha Levin +--- + drivers/nvme/host/core.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index 6adff541282be..fcf062f3b507d 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -802,11 +802,16 @@ static int nvme_submit_user_cmd(struct request_queue *q, + bool write = nvme_is_write(cmd); + struct nvme_ns *ns = q->queuedata; + struct gendisk *disk = ns ? ns->disk : NULL; ++ bool supports_metadata = disk && blk_get_integrity(disk); ++ bool has_metadata = meta_buffer && meta_len; + struct request *req; + struct bio *bio = NULL; + void *meta = NULL; + int ret; + ++ if (has_metadata && !supports_metadata) ++ return -EINVAL; ++ + req = nvme_alloc_request(q, cmd, 0, NVME_QID_ANY); + if (IS_ERR(req)) + return PTR_ERR(req); +@@ -821,7 +826,7 @@ static int nvme_submit_user_cmd(struct request_queue *q, + goto out; + bio = req->bio; + bio->bi_disk = disk; +- if (disk && meta_buffer && meta_len) { ++ if (has_metadata) { + meta = nvme_add_user_metadata(bio, meta_buffer, meta_len, + meta_seed, write); + if (IS_ERR(meta)) { +-- +2.43.0 + diff --git a/queue-4.19/series b/queue-4.19/series index bdb6f4fef5d..1a553c0aedf 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -13,3 +13,4 @@ selftests-watchdog-test-fix-system-accidentally-rese.patch x86-amd_nb-fix-compile-testing-without-config_amd_nb.patch net-usb-qmi_wwan-add-quectel-rg650v.patch proc-softirqs-replace-seq_printf-with-seq_put_decima.patch +nvme-fix-metadata-handling-in-nvme-passthrough.patch