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