nvmet: Cleanup discovery execute handlers
authorChristoph Hellwig <hch@lst.de>
Wed, 23 Oct 2019 16:35:42 +0000 (10:35 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 4 Nov 2019 17:56:41 +0000 (10:56 -0700)
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 <hch@lst.de>
[split patch, update changelog]
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/target/discovery.c

index 3764a8900850fa975f783ffe9f6dd73d7bb83eee..825e61e61b0c713f8386f16d5bcc19c9a592906a 100644 (file)
@@ -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 @@ out:
        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);