diff options
Diffstat (limited to 'nvme-status.c')
-rw-r--r-- | nvme-status.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/nvme-status.c b/nvme-status.c index 1b060dc..270eb06 100644 --- a/nvme-status.c +++ b/nvme-status.c @@ -97,7 +97,6 @@ static inline __u8 nvme_cmd_specific_status_to_errno(__u16 status) case NVME_SC_NS_ALREADY_ATTACHED: return EALREADY; case NVME_SC_THIN_PROV_NOT_SUPP: - case NVME_SC_ONCS_NOT_SUPPORTED: return EOPNOTSUPP; case NVME_SC_DEVICE_SELF_TEST_IN_PROGRESS: return EINPROGRESS; @@ -127,6 +126,22 @@ static inline __u8 nvme_fabrics_status_to_errno(__u16 status) return EIO; } +static inline __u8 nvme_path_status_to_errno(__u16 status) +{ + switch (status) { + case NVME_SC_INTERNAL_PATH_ERROR: + case NVME_SC_ANA_PERSISTENT_LOSS: + case NVME_SC_ANA_INACCESSIBLE: + case NVME_SC_ANA_TRANSITION: + case NVME_SC_CTRL_PATHING_ERROR: + case NVME_SC_HOST_PATHING_ERROR: + case NVME_SC_HOST_CMD_ABORT: + return EACCES; + } + + return EIO; +} + /* * nvme_status_to_errno - It converts given status to errno mapped * @status: >= 0 for nvme status field in completion queue entry, @@ -142,8 +157,11 @@ __u8 nvme_status_to_errno(int status, bool fabrics) if (!status) return 0; - if (status < 0) - return ECOMM; + if (status < 0) { + if (errno) + return errno; + return status; + } /* * The actual status code is enough with masking 0xff, but we need to @@ -152,12 +170,17 @@ __u8 nvme_status_to_errno(int status, bool fabrics) status &= 0x7ff; sct = nvme_status_type(status); - if (sct == NVME_SCT_GENERIC) + switch (sct) { + case NVME_SCT_GENERIC: return nvme_generic_status_to_errno(status); - else if (sct == NVME_SCT_CMD_SPECIFIC && !fabrics) - return nvme_cmd_specific_status_to_errno(status); - else if (sct == NVME_SCT_CMD_SPECIFIC && fabrics) + case NVME_SCT_CMD_SPECIFIC: + if (!fabrics) { + return nvme_cmd_specific_status_to_errno(status); + } return nvme_fabrics_status_to_errno(status); + case NVME_SCT_PATH: + return nvme_path_status_to_errno(status); + } /* * Media, integrity related status, and the others will be mapped to |