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/bdev_module.h" 7 : 8 : #include "spdk/nvme_spec.h" 9 : 10 : void 11 26 : spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk, 12 : int *asc, int *ascq) 13 : { 14 26 : int nvme_sct = bdev_io->internal.error.nvme.sct; 15 26 : int nvme_sc = bdev_io->internal.error.nvme.sc; 16 : 17 26 : switch (nvme_sct) { 18 : case SPDK_NVME_SCT_GENERIC: 19 12 : switch (nvme_sc) { 20 : case SPDK_NVME_SC_SUCCESS: 21 1 : *sc = SPDK_SCSI_STATUS_GOOD; 22 1 : *sk = SPDK_SCSI_SENSE_NO_SENSE; 23 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 24 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 25 1 : break; 26 : case SPDK_NVME_SC_INVALID_OPCODE: 27 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 28 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 29 1 : *asc = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE; 30 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 31 1 : break; 32 : case SPDK_NVME_SC_INVALID_FIELD: 33 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 34 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 35 1 : *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; 36 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 37 1 : break; 38 : case SPDK_NVME_SC_DATA_TRANSFER_ERROR: 39 : case SPDK_NVME_SC_CAPACITY_EXCEEDED: 40 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 41 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 42 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 43 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 44 1 : break; 45 : case SPDK_NVME_SC_ABORTED_POWER_LOSS: 46 1 : *sc = SPDK_SCSI_STATUS_TASK_ABORTED; 47 1 : *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; 48 1 : *asc = SPDK_SCSI_ASC_WARNING; 49 1 : *ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED; 50 1 : break; 51 : case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR: 52 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 53 1 : *sk = SPDK_SCSI_SENSE_HARDWARE_ERROR; 54 1 : *asc = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE; 55 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 56 1 : break; 57 : case SPDK_NVME_SC_ABORTED_BY_REQUEST: 58 : case SPDK_NVME_SC_ABORTED_SQ_DELETION: 59 : case SPDK_NVME_SC_ABORTED_FAILED_FUSED: 60 : case SPDK_NVME_SC_ABORTED_MISSING_FUSED: 61 1 : *sc = SPDK_SCSI_STATUS_TASK_ABORTED; 62 1 : *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; 63 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 64 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 65 1 : break; 66 : case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT: 67 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 68 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 69 1 : *asc = SPDK_SCSI_ASC_ACCESS_DENIED; 70 1 : *ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER; 71 1 : break; 72 : case SPDK_NVME_SC_LBA_OUT_OF_RANGE: 73 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 74 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 75 1 : *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; 76 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 77 1 : break; 78 : case SPDK_NVME_SC_NAMESPACE_NOT_READY: 79 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 80 1 : *sk = SPDK_SCSI_SENSE_NOT_READY; 81 1 : *asc = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY; 82 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 83 1 : break; 84 : case SPDK_NVME_SC_RESERVATION_CONFLICT: 85 1 : *sc = SPDK_SCSI_STATUS_RESERVATION_CONFLICT; 86 1 : *sk = SPDK_SCSI_SENSE_NO_SENSE; 87 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 88 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 89 1 : break; 90 : case SPDK_NVME_SC_COMMAND_ID_CONFLICT: 91 : case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR: 92 : case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR: 93 : case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS: 94 : case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID: 95 : case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID: 96 : case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID: 97 : case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF: 98 : case SPDK_NVME_SC_INVALID_PRP_OFFSET: 99 : case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED: 100 : case SPDK_NVME_SC_INVALID_SGL_OFFSET: 101 : case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT: 102 : case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED: 103 : case SPDK_NVME_SC_KEEP_ALIVE_INVALID: 104 1 : case SPDK_NVME_SC_FORMAT_IN_PROGRESS: 105 : default: 106 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 107 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 108 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 109 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 110 1 : break; 111 : } 112 12 : break; 113 : case SPDK_NVME_SCT_COMMAND_SPECIFIC: 114 5 : switch (nvme_sc) { 115 : case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID: 116 : case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED: 117 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 118 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 119 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 120 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 121 1 : break; 122 : case SPDK_NVME_SC_INVALID_FORMAT: 123 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 124 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 125 1 : *asc = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED; 126 1 : *ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED; 127 1 : break; 128 : case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES: 129 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 130 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 131 1 : *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; 132 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 133 1 : break; 134 : case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_RANGE: 135 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 136 1 : *sk = SPDK_SCSI_SENSE_DATA_PROTECT; 137 1 : *asc = SPDK_SCSI_ASC_WRITE_PROTECTED; 138 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 139 1 : break; 140 : case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER: 141 : case SPDK_NVME_SC_INVALID_QUEUE_SIZE: 142 : case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED: 143 : case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT: 144 : case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE: 145 : case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR: 146 : case SPDK_NVME_SC_INVALID_LOG_PAGE: 147 : case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET: 148 : case SPDK_NVME_SC_INVALID_QUEUE_DELETION: 149 : case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE: 150 : case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE: 151 : case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC: 152 : case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET: 153 : case SPDK_NVME_SC_FIRMWARE_REQ_RESET: 154 : case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION: 155 : case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED: 156 : case SPDK_NVME_SC_OVERLAPPING_RANGE: 157 : case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY: 158 : case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE: 159 : case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED: 160 : case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE: 161 : case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED: 162 : case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED: 163 : case SPDK_NVME_SC_CONTROLLER_LIST_INVALID: 164 1 : case SPDK_NVME_SC_INVALID_PROTECTION_INFO: 165 : default: 166 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 167 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 168 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 169 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 170 1 : break; 171 : } 172 5 : break; 173 : case SPDK_NVME_SCT_MEDIA_ERROR: 174 8 : switch (nvme_sc) { 175 : case SPDK_NVME_SC_WRITE_FAULTS: 176 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 177 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 178 1 : *asc = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT; 179 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 180 1 : break; 181 : case SPDK_NVME_SC_UNRECOVERED_READ_ERROR: 182 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 183 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 184 1 : *asc = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR; 185 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 186 1 : break; 187 : case SPDK_NVME_SC_GUARD_CHECK_ERROR: 188 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 189 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 190 1 : *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED; 191 1 : *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED; 192 1 : break; 193 : case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR: 194 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 195 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 196 1 : *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; 197 1 : *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; 198 1 : break; 199 : case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR: 200 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 201 1 : *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 202 1 : *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; 203 1 : *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; 204 1 : break; 205 : case SPDK_NVME_SC_COMPARE_FAILURE: 206 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 207 1 : *sk = SPDK_SCSI_SENSE_MISCOMPARE; 208 1 : *asc = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION; 209 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 210 1 : break; 211 : case SPDK_NVME_SC_ACCESS_DENIED: 212 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 213 1 : *sk = SPDK_SCSI_SENSE_DATA_PROTECT; 214 1 : *asc = SPDK_SCSI_ASC_ACCESS_DENIED; 215 1 : *ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS; 216 1 : break; 217 1 : case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK: 218 : default: 219 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 220 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 221 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 222 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 223 1 : break; 224 : } 225 8 : break; 226 1 : case SPDK_NVME_SCT_VENDOR_SPECIFIC: 227 : default: 228 1 : *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 229 1 : *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 230 1 : *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 231 1 : *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 232 1 : break; 233 : } 234 26 : }