Commit 64a0ca88 authored by Parav Pandit's avatar Parav Pandit Committed by Jens Axboe

nvmet: Introduced helper routine for controller status check.

This patch introduces helper function for checking controller
status during admin and io command processing which returns u16
status. As to bring consistency on returning status, other
friend functions also now return u16 status instead of int
to match the spec.

As part of the theseerror log prints in also prints qid on
which command error occured.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 4151dd9a
...@@ -480,22 +480,16 @@ static void nvmet_execute_keep_alive(struct nvmet_req *req) ...@@ -480,22 +480,16 @@ static void nvmet_execute_keep_alive(struct nvmet_req *req)
nvmet_req_complete(req, 0); nvmet_req_complete(req, 0);
} }
int nvmet_parse_admin_cmd(struct nvmet_req *req) u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
{ {
struct nvme_command *cmd = req->cmd; struct nvme_command *cmd = req->cmd;
u16 ret;
req->ns = NULL; req->ns = NULL;
if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) { ret = nvmet_check_ctrl_status(req, cmd);
pr_err("got admin cmd %d while CC.EN == 0\n", if (unlikely(ret))
cmd->common.opcode); return ret;
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
}
if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
pr_err("got admin cmd %d while CSTS.RDY == 0\n",
cmd->common.opcode);
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
}
switch (cmd->common.opcode) { switch (cmd->common.opcode) {
case nvme_admin_get_log_page: case nvme_admin_get_log_page:
...@@ -545,6 +539,7 @@ int nvmet_parse_admin_cmd(struct nvmet_req *req) ...@@ -545,6 +539,7 @@ int nvmet_parse_admin_cmd(struct nvmet_req *req)
return 0; return 0;
} }
pr_err("unhandled cmd %d\n", cmd->common.opcode); pr_err("unhandled cmd %d on qid %d\n", cmd->common.opcode,
req->sq->qid);
return NVME_SC_INVALID_OPCODE | NVME_SC_DNR; return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
} }
...@@ -661,6 +661,23 @@ u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid, ...@@ -661,6 +661,23 @@ u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid,
return status; return status;
} }
u16 nvmet_check_ctrl_status(struct nvmet_req *req, struct nvme_command *cmd)
{
if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) {
pr_err("got io cmd %d while CC.EN == 0 on qid = %d\n",
cmd->common.opcode, req->sq->qid);
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
}
if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
pr_err("got io cmd %d while CSTS.RDY == 0 on qid = %d\n",
cmd->common.opcode, req->sq->qid);
req->ns = NULL;
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
}
return 0;
}
static bool __nvmet_host_allowed(struct nvmet_subsys *subsys, static bool __nvmet_host_allowed(struct nvmet_subsys *subsys,
const char *hostnqn) const char *hostnqn)
{ {
......
...@@ -159,7 +159,7 @@ static void nvmet_execute_identify_disc_ctrl(struct nvmet_req *req) ...@@ -159,7 +159,7 @@ static void nvmet_execute_identify_disc_ctrl(struct nvmet_req *req)
nvmet_req_complete(req, status); nvmet_req_complete(req, status);
} }
int nvmet_parse_discovery_cmd(struct nvmet_req *req) u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)
{ {
struct nvme_command *cmd = req->cmd; struct nvme_command *cmd = req->cmd;
......
...@@ -73,7 +73,7 @@ static void nvmet_execute_prop_get(struct nvmet_req *req) ...@@ -73,7 +73,7 @@ static void nvmet_execute_prop_get(struct nvmet_req *req)
nvmet_req_complete(req, status); nvmet_req_complete(req, status);
} }
int nvmet_parse_fabrics_cmd(struct nvmet_req *req) u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req)
{ {
struct nvme_command *cmd = req->cmd; struct nvme_command *cmd = req->cmd;
...@@ -214,7 +214,7 @@ static void nvmet_execute_io_connect(struct nvmet_req *req) ...@@ -214,7 +214,7 @@ static void nvmet_execute_io_connect(struct nvmet_req *req)
goto out; goto out;
} }
int nvmet_parse_connect_cmd(struct nvmet_req *req) u16 nvmet_parse_connect_cmd(struct nvmet_req *req)
{ {
struct nvme_command *cmd = req->cmd; struct nvme_command *cmd = req->cmd;
......
...@@ -196,26 +196,19 @@ static void nvmet_execute_write_zeroes(struct nvmet_req *req) ...@@ -196,26 +196,19 @@ static void nvmet_execute_write_zeroes(struct nvmet_req *req)
} }
} }
int nvmet_parse_io_cmd(struct nvmet_req *req) u16 nvmet_parse_io_cmd(struct nvmet_req *req)
{ {
struct nvme_command *cmd = req->cmd; struct nvme_command *cmd = req->cmd;
u16 ret;
if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) { ret = nvmet_check_ctrl_status(req, cmd);
pr_err("got io cmd %d while CC.EN == 0\n", if (unlikely(ret)) {
cmd->common.opcode);
req->ns = NULL; req->ns = NULL;
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR; return ret;
}
if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
pr_err("got io cmd %d while CSTS.RDY == 0\n",
cmd->common.opcode);
req->ns = NULL;
return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
} }
req->ns = nvmet_find_namespace(req->sq->ctrl, cmd->rw.nsid); req->ns = nvmet_find_namespace(req->sq->ctrl, cmd->rw.nsid);
if (!req->ns) if (unlikely(!req->ns))
return NVME_SC_INVALID_NS | NVME_SC_DNR; return NVME_SC_INVALID_NS | NVME_SC_DNR;
switch (cmd->common.opcode) { switch (cmd->common.opcode) {
...@@ -237,7 +230,8 @@ int nvmet_parse_io_cmd(struct nvmet_req *req) ...@@ -237,7 +230,8 @@ int nvmet_parse_io_cmd(struct nvmet_req *req)
req->execute = nvmet_execute_write_zeroes; req->execute = nvmet_execute_write_zeroes;
return 0; return 0;
default: default:
pr_err("unhandled cmd %d\n", cmd->common.opcode); pr_err("unhandled cmd %d on qid %d\n", cmd->common.opcode,
req->sq->qid);
return NVME_SC_INVALID_OPCODE | NVME_SC_DNR; return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
} }
} }
...@@ -253,11 +253,11 @@ struct nvmet_async_event { ...@@ -253,11 +253,11 @@ struct nvmet_async_event {
u8 log_page; u8 log_page;
}; };
int nvmet_parse_connect_cmd(struct nvmet_req *req); u16 nvmet_parse_connect_cmd(struct nvmet_req *req);
int nvmet_parse_io_cmd(struct nvmet_req *req); u16 nvmet_parse_io_cmd(struct nvmet_req *req);
int nvmet_parse_admin_cmd(struct nvmet_req *req); u16 nvmet_parse_admin_cmd(struct nvmet_req *req);
int nvmet_parse_discovery_cmd(struct nvmet_req *req); u16 nvmet_parse_discovery_cmd(struct nvmet_req *req);
int nvmet_parse_fabrics_cmd(struct nvmet_req *req); u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req);
bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq, bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
struct nvmet_sq *sq, struct nvmet_fabrics_ops *ops); struct nvmet_sq *sq, struct nvmet_fabrics_ops *ops);
...@@ -278,6 +278,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, ...@@ -278,6 +278,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid, u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid,
struct nvmet_req *req, struct nvmet_ctrl **ret); struct nvmet_req *req, struct nvmet_ctrl **ret);
void nvmet_ctrl_put(struct nvmet_ctrl *ctrl); void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
u16 nvmet_check_ctrl_status(struct nvmet_req *req, struct nvme_command *cmd);
struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn, struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
enum nvme_subsys_type type); enum nvme_subsys_type type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment