|
Hannes Reinecke |
274a72 |
From: Sagi Grimberg <sagi@grimberg.me>
|
|
Hannes Reinecke |
274a72 |
Date: Sun, 26 Jan 2020 23:23:28 -0800
|
|
Hannes Reinecke |
274a72 |
Subject: [PATCH] nvmet: fix dsm failure when payload does not match sgl
|
|
Hannes Reinecke |
274a72 |
Git-commit: b716e6889c95f64ba32af492461f6cc9341f3f05
|
|
Hannes Reinecke |
274a72 |
Patch-mainline: v5.6-rc1
|
|
Hannes Reinecke |
274a72 |
References: bsc#1169045
|
|
Hannes Reinecke |
274a72 |
descriptor
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
The host is allowed to pass the controller an sgl describing a buffer
|
|
Hannes Reinecke |
274a72 |
that is larger than the dsm payload itself, allow it when executing
|
|
Hannes Reinecke |
274a72 |
dsm.
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
Reported-by: Dakshaja Uppalapati <dakshaja@chelsio.com>
|
|
Hannes Reinecke |
274a72 |
Reviewed-by: Christoph Hellwig <hch@lst.de>,
|
|
Hannes Reinecke |
274a72 |
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
|
|
Hannes Reinecke |
274a72 |
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
|
|
Hannes Reinecke |
274a72 |
Signed-off-by: Keith Busch <kbusch@kernel.org>
|
|
Hannes Reinecke |
274a72 |
Acked-by: Hannes Reinecke <hare@suse.com>
|
|
Hannes Reinecke |
274a72 |
---
|
|
Hannes Reinecke |
274a72 |
drivers/nvme/target/core.c | 11 +++++++++++
|
|
Hannes Reinecke |
274a72 |
drivers/nvme/target/io-cmd-bdev.c | 2 +-
|
|
Hannes Reinecke |
274a72 |
drivers/nvme/target/io-cmd-file.c | 2 +-
|
|
Hannes Reinecke |
274a72 |
drivers/nvme/target/nvmet.h | 1 +
|
|
Hannes Reinecke |
274a72 |
4 files changed, 14 insertions(+), 2 deletions(-)
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
|
|
Hannes Reinecke |
274a72 |
index 35810a0a8d21..461987f669c5 100644
|
|
Hannes Reinecke |
274a72 |
--- a/drivers/nvme/target/core.c
|
|
Hannes Reinecke |
274a72 |
+++ b/drivers/nvme/target/core.c
|
|
Hannes Reinecke |
274a72 |
@@ -939,6 +939,17 @@ bool nvmet_check_data_len(struct nvmet_req *req, size_t data_len)
|
|
Hannes Reinecke |
274a72 |
}
|
|
Hannes Reinecke |
274a72 |
EXPORT_SYMBOL_GPL(nvmet_check_data_len);
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
+bool nvmet_check_data_len_lte(struct nvmet_req *req, size_t data_len)
|
|
Hannes Reinecke |
274a72 |
+{
|
|
Hannes Reinecke |
274a72 |
+ if (unlikely(data_len > req->transfer_len)) {
|
|
Hannes Reinecke |
274a72 |
+ req->error_loc = offsetof(struct nvme_common_command, dptr);
|
|
Hannes Reinecke |
274a72 |
+ nvmet_req_complete(req, NVME_SC_SGL_INVALID_DATA | NVME_SC_DNR);
|
|
Hannes Reinecke |
274a72 |
+ return false;
|
|
Hannes Reinecke |
274a72 |
+ }
|
|
Hannes Reinecke |
274a72 |
+
|
|
Hannes Reinecke |
274a72 |
+ return true;
|
|
Hannes Reinecke |
274a72 |
+}
|
|
Hannes Reinecke |
274a72 |
+
|
|
Hannes Reinecke |
274a72 |
int nvmet_req_alloc_sgl(struct nvmet_req *req)
|
|
Hannes Reinecke |
274a72 |
{
|
|
Hannes Reinecke |
274a72 |
struct pci_dev *p2p_dev = NULL;
|
|
Hannes Reinecke |
274a72 |
diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c
|
|
Hannes Reinecke |
274a72 |
index b6fca0e421ef..ea0e596be15d 100644
|
|
Hannes Reinecke |
274a72 |
--- a/drivers/nvme/target/io-cmd-bdev.c
|
|
Hannes Reinecke |
274a72 |
+++ b/drivers/nvme/target/io-cmd-bdev.c
|
|
Hannes Reinecke |
274a72 |
@@ -280,7 +280,7 @@ static void nvmet_bdev_execute_discard(struct nvmet_req *req)
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
static void nvmet_bdev_execute_dsm(struct nvmet_req *req)
|
|
Hannes Reinecke |
274a72 |
{
|
|
Hannes Reinecke |
274a72 |
- if (!nvmet_check_data_len(req, nvmet_dsm_len(req)))
|
|
Hannes Reinecke |
274a72 |
+ if (!nvmet_check_data_len_lte(req, nvmet_dsm_len(req)))
|
|
Hannes Reinecke |
274a72 |
return;
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
switch (le32_to_cpu(req->cmd->dsm.attributes)) {
|
|
Hannes Reinecke |
274a72 |
diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
|
|
Hannes Reinecke |
274a72 |
index caebfce06605..cd5670b83118 100644
|
|
Hannes Reinecke |
274a72 |
--- a/drivers/nvme/target/io-cmd-file.c
|
|
Hannes Reinecke |
274a72 |
+++ b/drivers/nvme/target/io-cmd-file.c
|
|
Hannes Reinecke |
274a72 |
@@ -336,7 +336,7 @@ static void nvmet_file_dsm_work(struct work_struct *w)
|
|
Hannes Reinecke |
274a72 |
|
|
Hannes Reinecke |
274a72 |
static void nvmet_file_execute_dsm(struct nvmet_req *req)
|
|
Hannes Reinecke |
274a72 |
{
|
|
Hannes Reinecke |
274a72 |
- if (!nvmet_check_data_len(req, nvmet_dsm_len(req)))
|
|
Hannes Reinecke |
274a72 |
+ if (!nvmet_check_data_len_lte(req, nvmet_dsm_len(req)))
|
|
Hannes Reinecke |
274a72 |
return;
|
|
Hannes Reinecke |
274a72 |
INIT_WORK(&req->f.work, nvmet_file_dsm_work);
|
|
Hannes Reinecke |
274a72 |
schedule_work(&req->f.work);
|
|
Hannes Reinecke |
274a72 |
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
|
|
Hannes Reinecke |
274a72 |
index 46df45e837c9..eda28b22a2c8 100644
|
|
Hannes Reinecke |
274a72 |
--- a/drivers/nvme/target/nvmet.h
|
|
Hannes Reinecke |
274a72 |
+++ b/drivers/nvme/target/nvmet.h
|
|
Hannes Reinecke |
274a72 |
@@ -374,6 +374,7 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
|
|
Hannes Reinecke |
274a72 |
struct nvmet_sq *sq, const struct nvmet_fabrics_ops *ops);
|
|
Hannes Reinecke |
274a72 |
void nvmet_req_uninit(struct nvmet_req *req);
|
|
Hannes Reinecke |
274a72 |
bool nvmet_check_data_len(struct nvmet_req *req, size_t data_len);
|
|
Hannes Reinecke |
274a72 |
+bool nvmet_check_data_len_lte(struct nvmet_req *req, size_t data_len);
|
|
Hannes Reinecke |
274a72 |
void nvmet_req_complete(struct nvmet_req *req, u16 status);
|
|
Hannes Reinecke |
274a72 |
int nvmet_req_alloc_sgl(struct nvmet_req *req);
|
|
Hannes Reinecke |
274a72 |
void nvmet_req_free_sgl(struct nvmet_req *req);
|
|
Hannes Reinecke |
274a72 |
--
|
|
Hannes Reinecke |
274a72 |
2.16.4
|
|
Hannes Reinecke |
274a72 |
|