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