aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorParav Pandit <parav@mellanox.com>2017-02-28 00:21:33 -0500
committerJens Axboe <axboe@fb.com>2017-04-04 11:48:23 -0400
commit64a0ca88eaa66e3d219296b17aa08b78894e42c8 (patch)
treeda9d6c8470ede1cc415e7117d29cd3a5a9baed1d
parent4151dd9a58c6b2758514fc88a1a3b02f9ab8b076 (diff)
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: Parav Pandit <parav@mellanox.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--drivers/nvme/target/admin-cmd.c19
-rw-r--r--drivers/nvme/target/core.c17
-rw-r--r--drivers/nvme/target/discovery.c2
-rw-r--r--drivers/nvme/target/fabrics-cmd.c4
-rw-r--r--drivers/nvme/target/io-cmd.c22
-rw-r--r--drivers/nvme/target/nvmet.h11
6 files changed, 41 insertions, 34 deletions
diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index 42b8bba97e7d..105ace88d07e 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -480,22 +480,16 @@ static void nvmet_execute_keep_alive(struct nvmet_req *req)
480 nvmet_req_complete(req, 0); 480 nvmet_req_complete(req, 0);
481} 481}
482 482
483int nvmet_parse_admin_cmd(struct nvmet_req *req) 483u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
484{ 484{
485 struct nvme_command *cmd = req->cmd; 485 struct nvme_command *cmd = req->cmd;
486 u16 ret;
486 487
487 req->ns = NULL; 488 req->ns = NULL;
488 489
489 if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) { 490 ret = nvmet_check_ctrl_status(req, cmd);
490 pr_err("got admin cmd %d while CC.EN == 0\n", 491 if (unlikely(ret))
491 cmd->common.opcode); 492 return ret;
492 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
493 }
494 if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
495 pr_err("got admin cmd %d while CSTS.RDY == 0\n",
496 cmd->common.opcode);
497 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
498 }
499 493
500 switch (cmd->common.opcode) { 494 switch (cmd->common.opcode) {
501 case nvme_admin_get_log_page: 495 case nvme_admin_get_log_page:
@@ -545,6 +539,7 @@ int nvmet_parse_admin_cmd(struct nvmet_req *req)
545 return 0; 539 return 0;
546 } 540 }
547 541
548 pr_err("unhandled cmd %d\n", cmd->common.opcode); 542 pr_err("unhandled cmd %d on qid %d\n", cmd->common.opcode,
543 req->sq->qid);
549 return NVME_SC_INVALID_OPCODE | NVME_SC_DNR; 544 return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
550} 545}
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 2536119a580d..cf90713043da 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -661,6 +661,23 @@ out:
661 return status; 661 return status;
662} 662}
663 663
664u16 nvmet_check_ctrl_status(struct nvmet_req *req, struct nvme_command *cmd)
665{
666 if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) {
667 pr_err("got io cmd %d while CC.EN == 0 on qid = %d\n",
668 cmd->common.opcode, req->sq->qid);
669 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
670 }
671
672 if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
673 pr_err("got io cmd %d while CSTS.RDY == 0 on qid = %d\n",
674 cmd->common.opcode, req->sq->qid);
675 req->ns = NULL;
676 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
677 }
678 return 0;
679}
680
664static bool __nvmet_host_allowed(struct nvmet_subsys *subsys, 681static bool __nvmet_host_allowed(struct nvmet_subsys *subsys,
665 const char *hostnqn) 682 const char *hostnqn)
666{ 683{
diff --git a/drivers/nvme/target/discovery.c b/drivers/nvme/target/discovery.c
index 745f26f35244..1aaf597e81fc 100644
--- a/drivers/nvme/target/discovery.c
+++ b/drivers/nvme/target/discovery.c
@@ -159,7 +159,7 @@ out:
159 nvmet_req_complete(req, status); 159 nvmet_req_complete(req, status);
160} 160}
161 161
162int nvmet_parse_discovery_cmd(struct nvmet_req *req) 162u16 nvmet_parse_discovery_cmd(struct nvmet_req *req)
163{ 163{
164 struct nvme_command *cmd = req->cmd; 164 struct nvme_command *cmd = req->cmd;
165 165
diff --git a/drivers/nvme/target/fabrics-cmd.c b/drivers/nvme/target/fabrics-cmd.c
index 8bd022af3df6..2a3c15b57f6e 100644
--- a/drivers/nvme/target/fabrics-cmd.c
+++ b/drivers/nvme/target/fabrics-cmd.c
@@ -73,7 +73,7 @@ static void nvmet_execute_prop_get(struct nvmet_req *req)
73 nvmet_req_complete(req, status); 73 nvmet_req_complete(req, status);
74} 74}
75 75
76int nvmet_parse_fabrics_cmd(struct nvmet_req *req) 76u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req)
77{ 77{
78 struct nvme_command *cmd = req->cmd; 78 struct nvme_command *cmd = req->cmd;
79 79
@@ -214,7 +214,7 @@ out_ctrl_put:
214 goto out; 214 goto out;
215} 215}
216 216
217int nvmet_parse_connect_cmd(struct nvmet_req *req) 217u16 nvmet_parse_connect_cmd(struct nvmet_req *req)
218{ 218{
219 struct nvme_command *cmd = req->cmd; 219 struct nvme_command *cmd = req->cmd;
220 220
diff --git a/drivers/nvme/target/io-cmd.c b/drivers/nvme/target/io-cmd.c
index 190b68741a6a..27623f2bfe6b 100644
--- a/drivers/nvme/target/io-cmd.c
+++ b/drivers/nvme/target/io-cmd.c
@@ -196,26 +196,19 @@ static void nvmet_execute_write_zeroes(struct nvmet_req *req)
196 } 196 }
197} 197}
198 198
199int nvmet_parse_io_cmd(struct nvmet_req *req) 199u16 nvmet_parse_io_cmd(struct nvmet_req *req)
200{ 200{
201 struct nvme_command *cmd = req->cmd; 201 struct nvme_command *cmd = req->cmd;
202 u16 ret;
202 203
203 if (unlikely(!(req->sq->ctrl->cc & NVME_CC_ENABLE))) { 204 ret = nvmet_check_ctrl_status(req, cmd);
204 pr_err("got io cmd %d while CC.EN == 0\n", 205 if (unlikely(ret)) {
205 cmd->common.opcode);
206 req->ns = NULL; 206 req->ns = NULL;
207 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR; 207 return ret;
208 }
209
210 if (unlikely(!(req->sq->ctrl->csts & NVME_CSTS_RDY))) {
211 pr_err("got io cmd %d while CSTS.RDY == 0\n",
212 cmd->common.opcode);
213 req->ns = NULL;
214 return NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR;
215 } 208 }
216 209
217 req->ns = nvmet_find_namespace(req->sq->ctrl, cmd->rw.nsid); 210 req->ns = nvmet_find_namespace(req->sq->ctrl, cmd->rw.nsid);
218 if (!req->ns) 211 if (unlikely(!req->ns))
219 return NVME_SC_INVALID_NS | NVME_SC_DNR; 212 return NVME_SC_INVALID_NS | NVME_SC_DNR;
220 213
221 switch (cmd->common.opcode) { 214 switch (cmd->common.opcode) {
@@ -237,7 +230,8 @@ int nvmet_parse_io_cmd(struct nvmet_req *req)
237 req->execute = nvmet_execute_write_zeroes; 230 req->execute = nvmet_execute_write_zeroes;
238 return 0; 231 return 0;
239 default: 232 default:
240 pr_err("unhandled cmd %d\n", cmd->common.opcode); 233 pr_err("unhandled cmd %d on qid %d\n", cmd->common.opcode,
234 req->sq->qid);
241 return NVME_SC_INVALID_OPCODE | NVME_SC_DNR; 235 return NVME_SC_INVALID_OPCODE | NVME_SC_DNR;
242 } 236 }
243} 237}
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index f7ff15f17ca9..7cb77ba5993b 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -253,11 +253,11 @@ struct nvmet_async_event {
253 u8 log_page; 253 u8 log_page;
254}; 254};
255 255
256int nvmet_parse_connect_cmd(struct nvmet_req *req); 256u16 nvmet_parse_connect_cmd(struct nvmet_req *req);
257int nvmet_parse_io_cmd(struct nvmet_req *req); 257u16 nvmet_parse_io_cmd(struct nvmet_req *req);
258int nvmet_parse_admin_cmd(struct nvmet_req *req); 258u16 nvmet_parse_admin_cmd(struct nvmet_req *req);
259int nvmet_parse_discovery_cmd(struct nvmet_req *req); 259u16 nvmet_parse_discovery_cmd(struct nvmet_req *req);
260int nvmet_parse_fabrics_cmd(struct nvmet_req *req); 260u16 nvmet_parse_fabrics_cmd(struct nvmet_req *req);
261 261
262bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq, 262bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
263 struct nvmet_sq *sq, struct nvmet_fabrics_ops *ops); 263 struct nvmet_sq *sq, struct nvmet_fabrics_ops *ops);
@@ -278,6 +278,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
278u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid, 278u16 nvmet_ctrl_find_get(const char *subsysnqn, const char *hostnqn, u16 cntlid,
279 struct nvmet_req *req, struct nvmet_ctrl **ret); 279 struct nvmet_req *req, struct nvmet_ctrl **ret);
280void nvmet_ctrl_put(struct nvmet_ctrl *ctrl); 280void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
281u16 nvmet_check_ctrl_status(struct nvmet_req *req, struct nvme_command *cmd);
281 282
282struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn, 283struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
283 enum nvme_subsys_type type); 284 enum nvme_subsys_type type);