Push the lid and cns check into their respective handlers and, while
we're at it, rename the functions to be consistent with other
discovery handlers.

Signed-off-by: Christoph Hellwig <h...@lst.de>
[log...@deltatee.com: separated out of a larger draft patch from hch]
Signed-off-by: Logan Gunthorpe <log...@deltatee.com>
---
 drivers/nvme/target/discovery.c | 44 ++++++++++++++-------------------
 1 file changed, 19 insertions(+), 25 deletions(-)

diff --git a/drivers/nvme/target/discovery.c b/drivers/nvme/target/discovery.c
index 3764a8900850..825e61e61b0c 100644
--- a/drivers/nvme/target/discovery.c
+++ b/drivers/nvme/target/discovery.c
@@ -157,7 +157,7 @@ static size_t discovery_log_entries(struct nvmet_req *req)
        return entries;
 }
 
-static void nvmet_execute_get_disc_log_page(struct nvmet_req *req)
+static void nvmet_execute_disc_get_log_page(struct nvmet_req *req)
 {
        const int entry_size = sizeof(struct nvmf_disc_rsp_page_entry);
        struct nvmet_ctrl *ctrl = req->sq->ctrl;
@@ -171,6 +171,13 @@ static void nvmet_execute_get_disc_log_page(struct 
nvmet_req *req)
        u16 status = 0;
        void *buffer;
 
+       if (req->cmd->get_log_page.lid != NVME_LOG_DISC) {
+               req->error_loc =
+                       offsetof(struct nvme_get_log_page_command, lid);
+               status = NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
+               goto out;
+       }
+
        /* Spec requires dword aligned offsets */
        if (offset & 0x3) {
                status = NVME_SC_INVALID_FIELD | NVME_SC_DNR;
@@ -227,12 +234,18 @@ static void nvmet_execute_get_disc_log_page(struct 
nvmet_req *req)
        nvmet_req_complete(req, status);
 }
 
-static void nvmet_execute_identify_disc_ctrl(struct nvmet_req *req)
+static void nvmet_execute_disc_identify(struct nvmet_req *req)
 {
        struct nvmet_ctrl *ctrl = req->sq->ctrl;
        struct nvme_id_ctrl *id;
        u16 status = 0;
 
+       if (req->cmd->identify.cns != NVME_ID_CNS_CTRL) {
+               req->error_loc = offsetof(struct nvme_identify, cns);
+               status = NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
+               goto out;
+       }
+
        id = kzalloc(sizeof(*id), GFP_KERNEL);
        if (!id) {
                status = NVME_SC_INTERNAL;
@@ -344,31 +357,12 @@ u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)
                return 0;
        case nvme_admin_get_log_page:
                req->data_len = nvmet_get_log_page_len(cmd);
-
-               switch (cmd->get_log_page.lid) {
-               case NVME_LOG_DISC:
-                       req->execute = nvmet_execute_get_disc_log_page;
-                       return 0;
-               default:
-                       pr_err("unsupported get_log_page lid %d\n",
-                              cmd->get_log_page.lid);
-                       req->error_loc =
-                               offsetof(struct nvme_get_log_page_command, lid);
-                       return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
-               }
+               req->execute = nvmet_execute_disc_get_log_page;
+               return 0;
        case nvme_admin_identify:
                req->data_len = NVME_IDENTIFY_DATA_SIZE;
-               switch (cmd->identify.cns) {
-               case NVME_ID_CNS_CTRL:
-                       req->execute =
-                               nvmet_execute_identify_disc_ctrl;
-                       return 0;
-               default:
-                       pr_err("unsupported identify cns %d\n",
-                              cmd->identify.cns);
-                       req->error_loc = offsetof(struct nvme_identify, cns);
-                       return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
-               }
+               req->execute = nvmet_execute_disc_identify;
+               return 0;
        default:
                pr_err("unhandled cmd %d\n", cmd->common.opcode);
                req->error_loc = offsetof(struct nvme_common_command, opcode);
-- 
2.20.1

Reply via email to