xref: /spdk/lib/bdev/scsi_nvme.c (revision 8a0a98d35e21f282088edf28b9e8da66ec390e3a)
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 "spdk/bdev_module.h"
34 
35 #include "spdk/nvme_spec.h"
36 
37 void
38 spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk,
39 			 int *asc, int *ascq)
40 {
41 	int nvme_sct = bdev_io->error.nvme.sct;
42 	int nvme_sc = bdev_io->error.nvme.sc;
43 
44 	switch (nvme_sct) {
45 	case SPDK_NVME_SCT_GENERIC:
46 		switch (nvme_sc) {
47 		case SPDK_NVME_SC_SUCCESS:
48 			*sc   = SPDK_SCSI_STATUS_GOOD;
49 			*sk   = SPDK_SCSI_SENSE_NO_SENSE;
50 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
51 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
52 			break;
53 		case SPDK_NVME_SC_INVALID_OPCODE:
54 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
55 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
56 			*asc  = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE;
57 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
58 			break;
59 		case SPDK_NVME_SC_INVALID_FIELD:
60 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
61 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
62 			*asc  = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
63 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
64 			break;
65 		case SPDK_NVME_SC_DATA_TRANSFER_ERROR:
66 		case SPDK_NVME_SC_CAPACITY_EXCEEDED:
67 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
68 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
69 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
70 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
71 			break;
72 		case SPDK_NVME_SC_ABORTED_POWER_LOSS:
73 			*sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
74 			*sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
75 			*asc  = SPDK_SCSI_ASC_WARNING;
76 			*ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
77 			break;
78 		case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR:
79 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
80 			*sk   = SPDK_SCSI_SENSE_HARDWARE_ERROR;
81 			*asc  = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE;
82 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
83 			break;
84 		case SPDK_NVME_SC_ABORTED_BY_REQUEST:
85 		case SPDK_NVME_SC_ABORTED_SQ_DELETION:
86 		case SPDK_NVME_SC_ABORTED_FAILED_FUSED:
87 		case SPDK_NVME_SC_ABORTED_MISSING_FUSED:
88 			*sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
89 			*sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
90 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
91 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
92 			break;
93 		case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT:
94 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
95 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
96 			*asc  = SPDK_SCSI_ASC_ACCESS_DENIED;
97 			*ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER;
98 			break;
99 		case SPDK_NVME_SC_LBA_OUT_OF_RANGE:
100 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
101 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
102 			*asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
103 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
104 			break;
105 		case SPDK_NVME_SC_NAMESPACE_NOT_READY:
106 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
107 			*sk   = SPDK_SCSI_SENSE_NOT_READY;
108 			*asc  = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY;
109 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
110 			break;
111 		case SPDK_NVME_SC_RESERVATION_CONFLICT:
112 			*sc   = SPDK_SCSI_STATUS_RESERVATION_CONFLICT;
113 			*sk   = SPDK_SCSI_SENSE_NO_SENSE;
114 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
115 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
116 			break;
117 		case SPDK_NVME_SC_COMMAND_ID_CONFLICT:
118 		case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR:
119 		case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR:
120 		case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS:
121 		case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID:
122 		case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID:
123 		case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID:
124 		case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF:
125 		case SPDK_NVME_SC_INVALID_PRP_OFFSET:
126 		case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED:
127 		case SPDK_NVME_SC_INVALID_SGL_OFFSET:
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 }
262