]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*- |
2 | * BSD LICENSE | |
3 | * | |
4 | * Copyright (c) 2016 FUJITSU LIMITED, All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions | |
8 | * are met: | |
9 | * | |
10 | * * Redistributions of source code must retain the above copyright | |
11 | * notice, this list of conditions and the following disclaimer. | |
12 | * * Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in | |
14 | * the documentation and/or other materials provided with the | |
15 | * distribution. | |
16 | * * Neither the name of the copyright holder nor the names of its | |
17 | * contributors may be used to endorse or promote products derived | |
18 | * from this software without specific prior written permission. | |
19 | * | |
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
24 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
25 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
26 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
27 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
28 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
29 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
30 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
31 | */ | |
32 | ||
33 | #include "scsi_internal.h" | |
34 | #include "spdk/nvme_spec.h" | |
35 | ||
36 | void | |
37 | spdk_scsi_nvme_translate(struct spdk_bdev_io *bdev_io, int *sc, int *sk, | |
38 | int *asc, int *ascq) | |
39 | { | |
40 | int nvme_sct = bdev_io->error.nvme.sct; | |
41 | int nvme_sc = bdev_io->error.nvme.sc; | |
42 | ||
43 | switch (nvme_sct) { | |
44 | case SPDK_NVME_SCT_GENERIC: | |
45 | switch (nvme_sc) { | |
46 | case SPDK_NVME_SC_SUCCESS: | |
47 | *sc = SPDK_SCSI_STATUS_GOOD; | |
48 | *sk = SPDK_SCSI_SENSE_NO_SENSE; | |
49 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
50 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
51 | break; | |
52 | case SPDK_NVME_SC_INVALID_OPCODE: | |
53 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
54 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
55 | *asc = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE; | |
56 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
57 | break; | |
58 | case SPDK_NVME_SC_INVALID_FIELD: | |
59 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
60 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
61 | *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; | |
62 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
63 | break; | |
64 | case SPDK_NVME_SC_DATA_TRANSFER_ERROR: | |
65 | case SPDK_NVME_SC_CAPACITY_EXCEEDED: | |
66 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
67 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
68 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
69 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
70 | break; | |
71 | case SPDK_NVME_SC_ABORTED_POWER_LOSS: | |
72 | *sc = SPDK_SCSI_STATUS_TASK_ABORTED; | |
73 | *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; | |
74 | *asc = SPDK_SCSI_ASC_WARNING; | |
75 | *ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED; | |
76 | break; | |
77 | case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR: | |
78 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
79 | *sk = SPDK_SCSI_SENSE_HARDWARE_ERROR; | |
80 | *asc = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE; | |
81 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
82 | break; | |
83 | case SPDK_NVME_SC_ABORTED_BY_REQUEST: | |
84 | case SPDK_NVME_SC_ABORTED_SQ_DELETION: | |
85 | case SPDK_NVME_SC_ABORTED_FAILED_FUSED: | |
86 | case SPDK_NVME_SC_ABORTED_MISSING_FUSED: | |
87 | *sc = SPDK_SCSI_STATUS_TASK_ABORTED; | |
88 | *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; | |
89 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
90 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
91 | break; | |
92 | case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT: | |
93 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
94 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
95 | *asc = SPDK_SCSI_ASC_ACCESS_DENIED; | |
96 | *ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER; | |
97 | break; | |
98 | case SPDK_NVME_SC_LBA_OUT_OF_RANGE: | |
99 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
100 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
101 | *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; | |
102 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
103 | break; | |
104 | case SPDK_NVME_SC_NAMESPACE_NOT_READY: | |
105 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
106 | *sk = SPDK_SCSI_SENSE_NOT_READY; | |
107 | *asc = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY; | |
108 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
109 | break; | |
110 | case SPDK_NVME_SC_RESERVATION_CONFLICT: | |
111 | *sc = SPDK_SCSI_STATUS_RESERVATION_CONFLICT; | |
112 | *sk = SPDK_SCSI_SENSE_NO_SENSE; | |
113 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
114 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
115 | break; | |
116 | case SPDK_NVME_SC_COMMAND_ID_CONFLICT: | |
117 | case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR: | |
118 | case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR: | |
119 | case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS: | |
120 | case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID: | |
121 | case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID: | |
122 | case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID: | |
123 | case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF: | |
124 | case SPDK_NVME_SC_INVALID_PRP_OFFSET: | |
125 | case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED: | |
126 | case SPDK_NVME_SC_INVALID_SGL_OFFSET: | |
127 | case SPDK_NVME_SC_INVALID_SGL_SUBTYPE: | |
128 | case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT: | |
129 | case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED: | |
130 | case SPDK_NVME_SC_KEEP_ALIVE_INVALID: | |
131 | case SPDK_NVME_SC_FORMAT_IN_PROGRESS: | |
132 | default: | |
133 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
134 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
135 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
136 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
137 | break; | |
138 | } | |
139 | break; | |
140 | case SPDK_NVME_SCT_COMMAND_SPECIFIC: | |
141 | switch (nvme_sc) { | |
142 | case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID: | |
143 | case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED: | |
144 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
145 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
146 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
147 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
148 | break; | |
149 | case SPDK_NVME_SC_INVALID_FORMAT: | |
150 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
151 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
152 | *asc = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED; | |
153 | *ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED; | |
154 | break; | |
155 | case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES: | |
156 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
157 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
158 | *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; | |
159 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
160 | break; | |
161 | case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_PAGE: | |
162 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
163 | *sk = SPDK_SCSI_SENSE_DATA_PROTECT; | |
164 | *asc = SPDK_SCSI_ASC_WRITE_PROTECTED; | |
165 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
166 | break; | |
167 | case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER: | |
168 | case SPDK_NVME_SC_MAXIMUM_QUEUE_SIZE_EXCEEDED: | |
169 | case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED: | |
170 | case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT: | |
171 | case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE: | |
172 | case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR: | |
173 | case SPDK_NVME_SC_INVALID_LOG_PAGE: | |
174 | case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET: | |
175 | case SPDK_NVME_SC_INVALID_QUEUE_DELETION: | |
176 | case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE: | |
177 | case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE: | |
178 | case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC: | |
179 | case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET: | |
180 | case SPDK_NVME_SC_FIRMWARE_REQ_RESET: | |
181 | case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION: | |
182 | case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED: | |
183 | case SPDK_NVME_SC_OVERLAPPING_RANGE: | |
184 | case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY: | |
185 | case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE: | |
186 | case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED: | |
187 | case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE: | |
188 | case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED: | |
189 | case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED: | |
190 | case SPDK_NVME_SC_CONTROLLER_LIST_INVALID: | |
191 | case SPDK_NVME_SC_INVALID_PROTECTION_INFO: | |
192 | default: | |
193 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
194 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
195 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
196 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
197 | break; | |
198 | } | |
199 | break; | |
200 | case SPDK_NVME_SCT_MEDIA_ERROR: | |
201 | switch (nvme_sc) { | |
202 | case SPDK_NVME_SC_WRITE_FAULTS: | |
203 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
204 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
205 | *asc = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT; | |
206 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
207 | break; | |
208 | case SPDK_NVME_SC_UNRECOVERED_READ_ERROR: | |
209 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
210 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
211 | *asc = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR; | |
212 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
213 | break; | |
214 | case SPDK_NVME_SC_GUARD_CHECK_ERROR: | |
215 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
216 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
217 | *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED; | |
218 | *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED; | |
219 | break; | |
220 | case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR: | |
221 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
222 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
223 | *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; | |
224 | *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; | |
225 | break; | |
226 | case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR: | |
227 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
228 | *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; | |
229 | *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; | |
230 | *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; | |
231 | break; | |
232 | case SPDK_NVME_SC_COMPARE_FAILURE: | |
233 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
234 | *sk = SPDK_SCSI_SENSE_MISCOMPARE; | |
235 | *asc = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION; | |
236 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
237 | break; | |
238 | case SPDK_NVME_SC_ACCESS_DENIED: | |
239 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
240 | *sk = SPDK_SCSI_SENSE_DATA_PROTECT; | |
241 | *asc = SPDK_SCSI_ASC_ACCESS_DENIED; | |
242 | *ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS; | |
243 | break; | |
244 | case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK: | |
245 | default: | |
246 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
247 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
248 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
249 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
250 | break; | |
251 | } | |
252 | break; | |
253 | case SPDK_NVME_SCT_VENDOR_SPECIFIC: | |
254 | default: | |
255 | *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; | |
256 | *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; | |
257 | *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; | |
258 | *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; | |
259 | break; | |
260 | } | |
261 | } |