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