xref: /spdk/test/unit/lib/bdev/scsi_nvme.c/scsi_nvme_ut.c (revision 26cac6bf15cd3e90bf6221c5c53672ec2befca30)
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
11 null_init(void)
12 {
13 	return 0;
14 }
15 
16 static int
17 null_clean(void)
18 {
19 	return 0;
20 }
21 
22 static 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
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