diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index ca608c8ce..86addff3d 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -379,4 +379,16 @@ void spdk_bdev_io_set_scsi_error(struct spdk_bdev_io *bdev_io, enum spdk_scsi_st */ void spdk_bdev_io_get_nvme_status(const struct spdk_bdev_io *bdev_io, int *sct, int *sc); +/** + * Get the status of bdev_io as a SCSI status code. + * + * \param bdev_io I/O to get the status from. + * \param sc SCSI Status Code. + * \param sk SCSI Sense Key. + * \param asc SCSI Additional Sense Code. + * \param ascq SCSI Additional Sense Code Qualifier. + */ +void spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io, + int *sc, int *sk, int *asc, int *ascq); + #endif /* SPDK_BDEV_H_ */ diff --git a/include/spdk_internal/bdev.h b/include/spdk_internal/bdev.h index b0e03f1e2..5b242c0d2 100644 --- a/include/spdk_internal/bdev.h +++ b/include/spdk_internal/bdev.h @@ -169,6 +169,9 @@ void spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, */ void spdk_bdev_io_complete_nvme_status(struct spdk_bdev_io *bdev_io, int sct, int sc); +void spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, + int *sc, int *sk, int *asc, int *ascq); + void spdk_bdev_module_list_add(struct spdk_bdev_module_if *bdev_module); void spdk_vbdev_module_list_add(struct spdk_bdev_module_if *vbdev_module); diff --git a/lib/bdev/Makefile b/lib/bdev/Makefile index b88285f96..4e7e735d1 100644 --- a/lib/bdev/Makefile +++ b/lib/bdev/Makefile @@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk CFLAGS += $(ENV_CFLAGS) -I. -C_SRCS = bdev.c +C_SRCS = bdev.c scsi_nvme.c LIBNAME = bdev DIRS-y += malloc nvme rpc split diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index e25656cdd..d7f45cf28 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -47,6 +47,7 @@ #include "spdk/io_channel.h" #include "spdk/queue.h" #include "spdk/nvme_spec.h" +#include "spdk/scsi_spec.h" #include "spdk_internal/bdev.h" #include "spdk_internal/event.h" @@ -925,6 +926,40 @@ spdk_bdev_io_set_scsi_error(struct spdk_bdev_io *bdev_io, enum spdk_scsi_status bdev_io->error.scsi.ascq = ascq; } +void +spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io, + int *sc, int *sk, int *asc, int *ascq) +{ + assert(sc != NULL); + assert(sk != NULL); + assert(asc != NULL); + assert(ascq != NULL); + + switch (bdev_io->status) { + case SPDK_BDEV_IO_STATUS_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_BDEV_IO_STATUS_NVME_ERROR: + spdk_scsi_nvme_translate(bdev_io, sc, sk, asc, ascq); + break; + case SPDK_BDEV_IO_STATUS_SCSI_ERROR: + *sc = bdev_io->error.scsi.sc; + *sk = bdev_io->error.scsi.sk; + *asc = bdev_io->error.scsi.asc; + *ascq = bdev_io->error.scsi.ascq; + break; + default: + *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; + *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; + *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; + *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; + break; + } +} + void spdk_bdev_io_complete_nvme_status(struct spdk_bdev_io *bdev_io, int sct, int sc) { diff --git a/lib/scsi/scsi_nvme.c b/lib/bdev/scsi_nvme.c similarity index 98% rename from lib/scsi/scsi_nvme.c rename to lib/bdev/scsi_nvme.c index dc33050f9..e6561ee44 100644 --- a/lib/scsi/scsi_nvme.c +++ b/lib/bdev/scsi_nvme.c @@ -30,11 +30,12 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "scsi_internal.h" +#include "spdk_internal/bdev.h" + #include "spdk/nvme_spec.h" void -spdk_scsi_nvme_translate(struct spdk_bdev_io *bdev_io, int *sc, int *sk, +spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk, int *asc, int *ascq) { int nvme_sct = bdev_io->error.nvme.sct; diff --git a/lib/scsi/Makefile b/lib/scsi/Makefile index e2326821a..c394bf3fa 100644 --- a/lib/scsi/Makefile +++ b/lib/scsi/Makefile @@ -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_nvme.c scsi_rpc.c task.c +C_SRCS = dev.c lun.c lun_db.c port.c scsi.c scsi_bdev.c scsi_rpc.c task.c LIBNAME = scsi include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 2b7a3d8d0..c3c16e2a7 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -1227,30 +1227,10 @@ spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_sta struct spdk_scsi_task *task = cb_arg; if (task->type == SPDK_SCSI_TASK_TYPE_CMD) { - if (status == SPDK_BDEV_IO_STATUS_SUCCESS) { - task->status = SPDK_SCSI_STATUS_GOOD; - } else { - int sc, sk, asc, ascq; + int sc, sk, asc, ascq; - switch (status) { - case SPDK_BDEV_IO_STATUS_NVME_ERROR: - spdk_scsi_nvme_translate(bdev_io, &sc, &sk, &asc, &ascq); - break; - case SPDK_BDEV_IO_STATUS_SCSI_ERROR: - sc = bdev_io->error.scsi.sc; - sk = bdev_io->error.scsi.sk; - asc = bdev_io->error.scsi.asc; - ascq = bdev_io->error.scsi.ascq; - break; - default: - sc = SPDK_SCSI_STATUS_CHECK_CONDITION; - sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; - asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; - ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; - break; - } - spdk_scsi_task_set_status(task, sc, sk, asc, ascq); - } + spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq); + spdk_scsi_task_set_status(task, sc, sk, asc, ascq); } else if (task->type == SPDK_SCSI_TASK_TYPE_MANAGE) { if (status == SPDK_BDEV_IO_STATUS_SUCCESS) task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS; diff --git a/lib/scsi/scsi_internal.h b/lib/scsi/scsi_internal.h index bce6d6a50..faa08b235 100644 --- a/lib/scsi/scsi_internal.h +++ b/lib/scsi/scsi_internal.h @@ -161,8 +161,6 @@ int spdk_scsi_port_construct(struct spdk_scsi_port *port, uint64_t id, int spdk_bdev_scsi_execute(struct spdk_bdev *bdev, struct spdk_scsi_task *task); int spdk_bdev_scsi_reset(struct spdk_bdev *bdev, struct spdk_scsi_task *task); -void spdk_scsi_nvme_translate(struct spdk_bdev_io *bdev_io, int *sc, int *sk, int *asc, int *ascq); - struct spdk_scsi_parameters { uint32_t max_unmap_lba_count; uint32_t max_unmap_block_descriptor_count; diff --git a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c index 30ac96914..42e9e62b9 100644 --- a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +++ b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c @@ -109,9 +109,29 @@ spdk_init_task(struct spdk_scsi_task *task) } void -spdk_scsi_nvme_translate(struct spdk_bdev_io *bdev_io, int *sc, int *sk, - int *asc, int *ascq) +spdk_bdev_io_get_scsi_status(const struct spdk_bdev_io *bdev_io, + int *sc, int *sk, int *asc, int *ascq) { + switch (bdev_io->status) { + case SPDK_BDEV_IO_STATUS_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_BDEV_IO_STATUS_SCSI_ERROR: + *sc = bdev_io->error.scsi.sc; + *sk = bdev_io->error.scsi.sk; + *asc = bdev_io->error.scsi.asc; + *ascq = bdev_io->error.scsi.ascq; + break; + default: + *sc = SPDK_SCSI_STATUS_CHECK_CONDITION; + *sk = SPDK_SCSI_SENSE_ABORTED_COMMAND; + *asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE; + *ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE; + break; + } } struct spdk_bdev_io * diff --git a/test/lib/scsi/scsi_nvme/Makefile b/test/lib/scsi/scsi_nvme/Makefile index 20af60743..d26f1e525 100644 --- a/test/lib/scsi/scsi_nvme/Makefile +++ b/test/lib/scsi/scsi_nvme/Makefile @@ -37,7 +37,7 @@ include $(SPDK_ROOT_DIR)/mk/spdk.app.mk SPDK_LIB_LIST = log cunit CFLAGS += -I$(SPDK_ROOT_DIR)/test -CFLAGS += -I$(SPDK_ROOT_DIR)/lib/scsi +CFLAGS += -I$(SPDK_ROOT_DIR)/lib/bdev LIBS += $(SPDK_LIB_LINKER_ARGS) LIBS += -lcunit