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