]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/lib/scsi/scsi_nvme.c
bump version to 12.2.12-pve1
[ceph.git] / ceph / src / spdk / lib / scsi / scsi_nvme.c
CommitLineData
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
36void
37spdk_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}