1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2017 Intel Corporation.
3 * Copyright (c) 2016 FUJITSU LIMITED, All rights reserved.
4 */
5
6 #include "spdk_internal/cunit.h"
7
8 #include "bdev/scsi_nvme.c"
9
10 static int
null_init(void)11 null_init(void)
12 {
13 return 0;
14 }
15
16 static int
null_clean(void)17 null_clean(void)
18 {
19 return 0;
20 }
21
22 static void
scsi_nvme_translate_test(void)23 scsi_nvme_translate_test(void)
24 {
25 struct spdk_bdev_io bdev_io;
26 int sc, sk, asc, ascq;
27
28 /* SPDK_NVME_SCT_GENERIC */
29 bdev_io.internal.error.nvme.sct = SPDK_NVME_SCT_GENERIC;
30 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_SUCCESS;
31 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
32 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_GOOD);
33 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_NO_SENSE);
34 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
35 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
36
37 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INVALID_OPCODE;
38 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
39 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
40 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
41 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE);
42 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
43
44 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INVALID_FIELD;
45 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
46 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
47 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
48 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB);
49 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
50
51 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_DATA_TRANSFER_ERROR;
52 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
53 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
54 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
55 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
56 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
57
58 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_ABORTED_POWER_LOSS;
59 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
60 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_TASK_ABORTED);
61 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ABORTED_COMMAND);
62 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_WARNING);
63 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED);
64
65 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
66 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
67 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
68 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_HARDWARE_ERROR);
69 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE);
70 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
71
72 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST;
73 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
74 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_TASK_ABORTED);
75 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ABORTED_COMMAND);
76 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
77 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
78
79 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT;
80 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
81 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
82 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
83 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_ACCESS_DENIED);
84 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER);
85
86 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_LBA_OUT_OF_RANGE;
87 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
88 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
89 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
90 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
91 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
92
93 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_NAMESPACE_NOT_READY;
94 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
95 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
96 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_NOT_READY);
97 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY);
98 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
99
100 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_RESERVATION_CONFLICT;
101 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
102 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_RESERVATION_CONFLICT);
103 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_NO_SENSE);
104 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
105 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
106
107 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS;
108 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
109 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
110 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
111 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
112 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
113
114 /* SPDK_NVME_SCT_COMMAND_SPECIFIC */
115 bdev_io.internal.error.nvme.sct = SPDK_NVME_SCT_COMMAND_SPECIFIC;
116 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_COMPLETION_QUEUE_INVALID;
117 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
118 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
119 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
120 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
121 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
122
123 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_INVALID_FORMAT;
124 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
125 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
126 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
127 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED);
128 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED);
129
130 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_CONFLICTING_ATTRIBUTES;
131 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
132 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
133 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
134 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB);
135 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
136
137 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_RANGE;
138 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
139 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
140 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_DATA_PROTECT);
141 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_WRITE_PROTECTED);
142 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
143
144 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_OVERLAPPING_RANGE;
145 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
146 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
147 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
148 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
149 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
150
151 /* SPDK_NVME_SCT_MEDIA_ERROR */
152 bdev_io.internal.error.nvme.sct = SPDK_NVME_SCT_MEDIA_ERROR;
153 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_WRITE_FAULTS;
154 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
155 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
156 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
157 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT);
158 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
159
160 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_UNRECOVERED_READ_ERROR;
161 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
162 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
163 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
164 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR);
165 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
166
167 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_GUARD_CHECK_ERROR;
168 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
169 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
170 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
171 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED);
172 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED);
173
174 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR;
175 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
176 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
177 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
178 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED);
179 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED);
180
181 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR;
182 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
183 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
184 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MEDIUM_ERROR);
185 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED);
186 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED);
187
188 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_COMPARE_FAILURE;
189 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
190 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
191 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_MISCOMPARE);
192 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION);
193 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
194
195 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_ACCESS_DENIED;
196 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
197 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
198 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_DATA_PROTECT);
199 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_ACCESS_DENIED);
200 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS);
201
202 bdev_io.internal.error.nvme.sc = SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK;
203 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
204 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
205 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
206 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
207 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
208
209 /* SPDK_NVME_SCT_VENDOR_SPECIFIC */
210 bdev_io.internal.error.nvme.sct = SPDK_NVME_SCT_VENDOR_SPECIFIC;
211 bdev_io.internal.error.nvme.sc = 0xff;
212 spdk_scsi_nvme_translate(&bdev_io, &sc, &sk, &asc, &ascq);
213 CU_ASSERT_EQUAL(sc, SPDK_SCSI_STATUS_CHECK_CONDITION);
214 CU_ASSERT_EQUAL(sk, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
215 CU_ASSERT_EQUAL(asc, SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
216 CU_ASSERT_EQUAL(ascq, SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
217 }
218
219 int
main(int argc,char ** argv)220 main(int argc, char **argv)
221 {
222 CU_pSuite suite = NULL;
223 unsigned int num_failures;
224
225 CU_initialize_registry();
226
227 suite = CU_add_suite("scsi_nvme_suite", null_init, null_clean);
228
229 CU_ADD_TEST(suite, scsi_nvme_translate_test);
230
231 num_failures = spdk_ut_run_tests(argc, argv, NULL);
232 CU_cleanup_registry();
233 return num_failures;
234 }
235