summaryrefslogtreecommitdiffstats
path: root/src/spdk/lib/bdev/scsi_nvme.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/lib/bdev/scsi_nvme.c')
-rw-r--r--src/spdk/lib/bdev/scsi_nvme.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/src/spdk/lib/bdev/scsi_nvme.c b/src/spdk/lib/bdev/scsi_nvme.c
new file mode 100644
index 00000000..385b9036
--- /dev/null
+++ b/src/spdk/lib/bdev/scsi_nvme.c
@@ -0,0 +1,261 @@
+/*-
+ * BSD LICENSE
+ *
+ * Copyright (c) 2016 FUJITSU LIMITED, All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "spdk/bdev_module.h"
+
+#include "spdk/nvme_spec.h"
+
+void
+spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk,
+ int *asc, int *ascq)
+{
+ int nvme_sct = bdev_io->internal.error.nvme.sct;
+ int nvme_sc = bdev_io->internal.error.nvme.sc;
+
+ switch (nvme_sct) {
+ case SPDK_NVME_SCT_GENERIC:
+ switch (nvme_sc) {
+ case SPDK_NVME_SC_SUCCESS:
+ *sc = SPDK_SCSI_STATUS_GOOD;
+ *sk = SPDK_SCSI_SENSE_NO_SENSE;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_INVALID_OPCODE:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_INVALID_FIELD:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_DATA_TRANSFER_ERROR:
+ case SPDK_NVME_SC_CAPACITY_EXCEEDED:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_ABORTED_POWER_LOSS:
+ *sc = SPDK_SCSI_STATUS_TASK_ABORTED;
+ *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND;
+ *asc = SPDK_SCSI_ASC_WARNING;
+ *ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
+ break;
+ case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_HARDWARE_ERROR;
+ *asc = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_ABORTED_BY_REQUEST:
+ case SPDK_NVME_SC_ABORTED_SQ_DELETION:
+ case SPDK_NVME_SC_ABORTED_FAILED_FUSED:
+ case SPDK_NVME_SC_ABORTED_MISSING_FUSED:
+ *sc = SPDK_SCSI_STATUS_TASK_ABORTED;
+ *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_ACCESS_DENIED;
+ *ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER;
+ break;
+ case SPDK_NVME_SC_LBA_OUT_OF_RANGE:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_NAMESPACE_NOT_READY:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_NOT_READY;
+ *asc = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_RESERVATION_CONFLICT:
+ *sc = SPDK_SCSI_STATUS_RESERVATION_CONFLICT;
+ *sk = SPDK_SCSI_SENSE_NO_SENSE;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_COMMAND_ID_CONFLICT:
+ case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR:
+ case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR:
+ case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS:
+ case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID:
+ case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID:
+ case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID:
+ case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF:
+ case SPDK_NVME_SC_INVALID_PRP_OFFSET:
+ case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED:
+ case SPDK_NVME_SC_INVALID_SGL_OFFSET:
+ case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT:
+ case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED:
+ case SPDK_NVME_SC_KEEP_ALIVE_INVALID:
+ case SPDK_NVME_SC_FORMAT_IN_PROGRESS:
+ default:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ }
+ break;
+ case SPDK_NVME_SCT_COMMAND_SPECIFIC:
+ switch (nvme_sc) {
+ case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID:
+ case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_INVALID_FORMAT:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED;
+ *ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED;
+ break;
+ case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_PAGE:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_DATA_PROTECT;
+ *asc = SPDK_SCSI_ASC_WRITE_PROTECTED;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER:
+ case SPDK_NVME_SC_MAXIMUM_QUEUE_SIZE_EXCEEDED:
+ case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED:
+ case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT:
+ case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE:
+ case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR:
+ case SPDK_NVME_SC_INVALID_LOG_PAGE:
+ case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET:
+ case SPDK_NVME_SC_INVALID_QUEUE_DELETION:
+ case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE:
+ case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE:
+ case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC:
+ case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET:
+ case SPDK_NVME_SC_FIRMWARE_REQ_RESET:
+ case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION:
+ case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED:
+ case SPDK_NVME_SC_OVERLAPPING_RANGE:
+ case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY:
+ case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE:
+ case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED:
+ case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE:
+ case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED:
+ case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED:
+ case SPDK_NVME_SC_CONTROLLER_LIST_INVALID:
+ case SPDK_NVME_SC_INVALID_PROTECTION_INFO:
+ default:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ }
+ break;
+ case SPDK_NVME_SCT_MEDIA_ERROR:
+ switch (nvme_sc) {
+ case SPDK_NVME_SC_WRITE_FAULTS:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_UNRECOVERED_READ_ERROR:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_GUARD_CHECK_ERROR:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
+ *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
+ break;
+ case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
+ *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
+ break;
+ case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MEDIUM_ERROR;
+ *asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
+ *ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
+ break;
+ case SPDK_NVME_SC_COMPARE_FAILURE:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_MISCOMPARE;
+ *asc = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ case SPDK_NVME_SC_ACCESS_DENIED:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_DATA_PROTECT;
+ *asc = SPDK_SCSI_ASC_ACCESS_DENIED;
+ *ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS;
+ break;
+ case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK:
+ default:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ }
+ break;
+ case SPDK_NVME_SCT_VENDOR_SPECIFIC:
+ default:
+ *sc = SPDK_SCSI_STATUS_CHECK_CONDITION;
+ *sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
+ *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
+ *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
+ break;
+ }
+}