Commit a5f03278 authored by Tsuyoshi Uchida's avatar Tsuyoshi Uchida Committed by Daniel Verkamp
Browse files

scsi: translate nvme error to scsi error (#54)

This patch translates NVMe status code to SCSI sense according to NVM
Express: SCSI Translation Reference.

http://nvmexpress.org/wp-content/uploads/NVM_Express_-_SCSI_Translation_Reference-1_5_20150624_Gold.pdf
parent c257e5b4
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ struct spdk_bdev_fn_table {

/** Blockdev I/O completion status */
enum spdk_bdev_io_status {
	SPDK_BDEV_IO_STATUS_NVME_ERROR = -2,
	SPDK_BDEV_IO_STATUS_FAILED = -1,
	SPDK_BDEV_IO_STATUS_PENDING = 0,
	SPDK_BDEV_IO_STATUS_SUCCESS = 1,
@@ -242,6 +243,17 @@ struct spdk_bdev_io {
		} reset;
	} u;

	/** Error information from a device */
	union {
		/** Only valid when status is SPDK_BDEV_IO_STATUS_NVME_ERROR */
		struct {
			/** NVMe status code type */
			int sct;
			/** NVMe status code */
			int sc;
		} nvme;
	} error;

	/** User function that will be called when this completes */
	spdk_bdev_io_completion_cb cb;

+2 −2
Original line number Diff line number Diff line
@@ -260,8 +260,8 @@ void spdk_scsi_task_alloc_data(struct spdk_scsi_task *task, uint32_t alloc_len,
			       uint8_t **data);
void spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc,
				     int ascq);
void spdk_scsi_task_set_check_condition(struct spdk_scsi_task *task, int sk,
					int asc, int ascq);
void spdk_scsi_task_set_status(struct spdk_scsi_task *task, int sc, int sk, int asc,
			       int ascq);

static inline struct spdk_scsi_task *
spdk_scsi_task_get_primary(struct spdk_scsi_task *task)
+32 −0
Original line number Diff line number Diff line
@@ -85,6 +85,38 @@ enum spdk_scsi_sense {
	SPDK_SCSI_SENSE_MISCOMPARE = 0x0e,
};

enum spdk_scsi_asc {
	SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE = 0x00,
	SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT = 0x03,
	SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY = 0x04,
	SPDK_SCSI_ASC_WARNING = 0x0b,
	SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED = 0x10,
	SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = 0x10,
	SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = 0x10,
	SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR = 0x11,
	SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION = 0x1d,
	SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x20,
	SPDK_SCSI_ASC_ACCESS_DENIED = 0x20,
	SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE = 0x21,
	SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB = 0x24,
	SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED = 0x25,
	SPDK_SCSI_ASC_WRITE_PROTECTED = 0x27,
	SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED = 0x31,
	SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x44,
};

enum spdk_scsi_ascq {
	SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE = 0x00,
	SPDK_SCSI_ASCQ_BECOMING_READY = 0x01,
	SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED = 0x01,
	SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED = 0x01,
	SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = 0x02,
	SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS = 0x02,
	SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = 0x03,
	SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED = 0x08,
	SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER = 0x09,
};

enum spdk_spc_opcode {
	/* SPC3 related */
	SPDK_SPC_ACCESS_CONTROL_IN = 0x86,
+5 −3
Original line number Diff line number Diff line
@@ -602,16 +602,18 @@ nvme_ctrlr_initialize_blockdevs(struct spdk_nvme_ctrlr *ctrlr, int bdev_per_ns,
static void
queued_done(void *ref, const struct spdk_nvme_cpl *cpl)
{
	struct nvme_blockio *bio = ref;
	struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx((struct nvme_blockio *)ref);
	enum spdk_bdev_io_status status;

	if (spdk_nvme_cpl_is_error(cpl)) {
		status = SPDK_BDEV_IO_STATUS_FAILED;
		bdev_io->error.nvme.sct = cpl->status.sct;
		bdev_io->error.nvme.sc = cpl->status.sc;
		status = SPDK_BDEV_IO_STATUS_NVME_ERROR;
	} else {
		status = SPDK_BDEV_IO_STATUS_SUCCESS;
	}

	spdk_bdev_io_complete(spdk_bdev_io_from_ctx(bio), status);
	spdk_bdev_io_complete(bdev_io, status);
}

static void
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

CFLAGS += $(ENV_CFLAGS)
C_SRCS = dev.c lun.c lun_db.c port.c scsi.c scsi_bdev.c scsi_rpc.c task.c
C_SRCS = dev.c lun.c lun_db.c port.c scsi.c scsi_bdev.c scsi_nvme.c scsi_rpc.c task.c
LIBNAME = scsi

include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk
Loading