1 /*- 2 * BSD LICENSE 3 * 4 * Copyright (c) 2016 FUJITSU LIMITED, All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * * Neither the name of the copyright holder nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include "spdk/bdev_module.h" 34 35 #include "spdk/nvme_spec.h" 36 37 void 38 spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk, 39 int *asc, int *ascq) 40 { 41 int nvme_sct = bdev_io->error.nvme.sct; 42 int nvme_sc = bdev_io->error.nvme.sc; 43 44 switch (nvme_sct) { 45 case SPDK_NVME_SCT_GENERIC: 46 switch (nvme_sc) { 47 case SPDK_NVME_SC_SUCCESS: 48 *sc = SPDK_SCSI_STATUS_GOOD; 49 *sk = SPDK_SCSI_SENSE_NO_SENSE; 50 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 51 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 52 break; 53 case SPDK_NVME_SC_INVALID_OPCODE: 54 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 55 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 56 *asc = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE; 57 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 58 break; 59 case SPDK_NVME_SC_INVALID_FIELD: 60 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 61 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 62 *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; 63 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 64 break; 65 case SPDK_NVME_SC_DATA_TRANSFER_ERROR: 66 case SPDK_NVME_SC_CAPACITY_EXCEEDED: 67 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 68 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 69 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 70 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 71 break; 72 case SPDK_NVME_SC_ABORTED_POWER_LOSS: 73 *sc = SPDK_SCSI_STATUS_TASK_ABORTED; 74 *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; 75 *asc = SPDK_SCSI_ASC_WARNING; 76 *ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED; 77 break; 78 case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR: 79 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 80 *sk = SPDK_SCSI_SENSE_HARDWARE_ERROR; 81 *asc = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE; 82 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 83 break; 84 case SPDK_NVME_SC_ABORTED_BY_REQUEST: 85 case SPDK_NVME_SC_ABORTED_SQ_DELETION: 86 case SPDK_NVME_SC_ABORTED_FAILED_FUSED: 87 case SPDK_NVME_SC_ABORTED_MISSING_FUSED: 88 *sc = SPDK_SCSI_STATUS_TASK_ABORTED; 89 *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; 90 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 91 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 92 break; 93 case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT: 94 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 95 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 96 *asc = SPDK_SCSI_ASC_ACCESS_DENIED; 97 *ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER; 98 break; 99 case SPDK_NVME_SC_LBA_OUT_OF_RANGE: 100 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 101 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 102 *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE; 103 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 104 break; 105 case SPDK_NVME_SC_NAMESPACE_NOT_READY: 106 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 107 *sk = SPDK_SCSI_SENSE_NOT_READY; 108 *asc = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY; 109 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 110 break; 111 case SPDK_NVME_SC_RESERVATION_CONFLICT: 112 *sc = SPDK_SCSI_STATUS_RESERVATION_CONFLICT; 113 *sk = SPDK_SCSI_SENSE_NO_SENSE; 114 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 115 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 116 break; 117 case SPDK_NVME_SC_COMMAND_ID_CONFLICT: 118 case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR: 119 case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR: 120 case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS: 121 case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID: 122 case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID: 123 case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID: 124 case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF: 125 case SPDK_NVME_SC_INVALID_PRP_OFFSET: 126 case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED: 127 case SPDK_NVME_SC_INVALID_SGL_OFFSET: 128 case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT: 129 case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED: 130 case SPDK_NVME_SC_KEEP_ALIVE_INVALID: 131 case SPDK_NVME_SC_FORMAT_IN_PROGRESS: 132 default: 133 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 134 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 135 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 136 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 137 break; 138 } 139 break; 140 case SPDK_NVME_SCT_COMMAND_SPECIFIC: 141 switch (nvme_sc) { 142 case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID: 143 case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED: 144 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 145 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 146 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 147 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 148 break; 149 case SPDK_NVME_SC_INVALID_FORMAT: 150 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 151 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 152 *asc = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED; 153 *ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED; 154 break; 155 case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES: 156 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 157 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 158 *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB; 159 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 160 break; 161 case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_PAGE: 162 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 163 *sk = SPDK_SCSI_SENSE_DATA_PROTECT; 164 *asc = SPDK_SCSI_ASC_WRITE_PROTECTED; 165 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 166 break; 167 case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER: 168 case SPDK_NVME_SC_MAXIMUM_QUEUE_SIZE_EXCEEDED: 169 case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED: 170 case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT: 171 case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE: 172 case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR: 173 case SPDK_NVME_SC_INVALID_LOG_PAGE: 174 case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET: 175 case SPDK_NVME_SC_INVALID_QUEUE_DELETION: 176 case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE: 177 case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE: 178 case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC: 179 case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET: 180 case SPDK_NVME_SC_FIRMWARE_REQ_RESET: 181 case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION: 182 case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED: 183 case SPDK_NVME_SC_OVERLAPPING_RANGE: 184 case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY: 185 case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE: 186 case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED: 187 case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE: 188 case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED: 189 case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED: 190 case SPDK_NVME_SC_CONTROLLER_LIST_INVALID: 191 case SPDK_NVME_SC_INVALID_PROTECTION_INFO: 192 default: 193 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 194 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 195 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 196 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 197 break; 198 } 199 break; 200 case SPDK_NVME_SCT_MEDIA_ERROR: 201 switch (nvme_sc) { 202 case SPDK_NVME_SC_WRITE_FAULTS: 203 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 204 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 205 *asc = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT; 206 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 207 break; 208 case SPDK_NVME_SC_UNRECOVERED_READ_ERROR: 209 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 210 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 211 *asc = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR; 212 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 213 break; 214 case SPDK_NVME_SC_GUARD_CHECK_ERROR: 215 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 216 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 217 *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED; 218 *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED; 219 break; 220 case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR: 221 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 222 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 223 *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; 224 *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; 225 break; 226 case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR: 227 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 228 *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR; 229 *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; 230 *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; 231 break; 232 case SPDK_NVME_SC_COMPARE_FAILURE: 233 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 234 *sk = SPDK_SCSI_SENSE_MISCOMPARE; 235 *asc = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION; 236 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 237 break; 238 case SPDK_NVME_SC_ACCESS_DENIED: 239 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 240 *sk = SPDK_SCSI_SENSE_DATA_PROTECT; 241 *asc = SPDK_SCSI_ASC_ACCESS_DENIED; 242 *ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS; 243 break; 244 case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK: 245 default: 246 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 247 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 248 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 249 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 250 break; 251 } 252 break; 253 case SPDK_NVME_SCT_VENDOR_SPECIFIC: 254 default: 255 *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; 256 *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST; 257 *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; 258 *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; 259 break; 260 } 261 } 262