bdev: add API to translate to SCSI status
Move the scsi_nvme translation code from the SCSI library into bdev, and provide a generic way to translate any bdev_io status into a SCSI status. Change-Id: Ib61a6209387c24543e31574e2b5ca249e2ac8b74 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
95d9ffc26a
commit
dc9e11163e
@ -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_ */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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 *
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user