[PATCH v2 2/7] nvme: revise nvme_set_queue_count to return error on some nvme status codes

James Smart jsmart2021 at gmail.com
Fri May 11 17:50:23 PDT 2018


If the SET_FEATURES command failed with an nvme completion failure only,
the current code ignores the failure and lets the controller continue to
initialize but with the io queue count degraded (not existent).

In cases where the failure may have been due to the transport detecting
an error condition or a connectivity loss, the nvme status failure was
manufactured and not a valid representation of the controller. It is better
to fail the command so that a subsequent (re)connect can resolve the state.

The status codes that transports may generate are NVME_SC_ABORT_REQ and
NVME_SC_INTERNAL. In those cases, return a positive error value with the
value being the status code.

Signed-off-by: James Smart <james.smart at broadcom.com>

---
v2:
  replaced logic in fc.c which checked for io queue count of zero
  and recognized failure with change to nvme_set_queue_count() to
  return error if one of the transport error completion values

 drivers/nvme/host/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f3779f350769..7a39ce8d9d5e 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1007,7 +1007,8 @@ int nvme_set_queue_count(struct nvme_ctrl *ctrl, int *count)
 
 	status = nvme_set_features(ctrl, NVME_FEAT_NUM_QUEUES, q_count, NULL, 0,
 			&result);
-	if (status < 0)
+	if (status < 0 ||
+	    status == NVME_SC_ABORT_REQ || status == NVME_SC_INTERNAL)
 		return status;
 
 	/*
-- 
2.13.1




More information about the Linux-nvme mailing list