diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2021-07-02 20:47:46 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2021-07-02 20:47:46 +0000 |
commit | 5b7ddc4bd2dcdde201ffa2681ede9a0a029bad96 (patch) | |
tree | 352b477f97c1c36105310589c7568259c76e9385 /nvme-status.c | |
parent | Adding upstream version 1.12. (diff) | |
download | nvme-cli-5b7ddc4bd2dcdde201ffa2681ede9a0a029bad96.tar.xz nvme-cli-5b7ddc4bd2dcdde201ffa2681ede9a0a029bad96.zip |
Adding upstream version 1.14.upstream/1.14
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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 |