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:
Daniel Verkamp 2017-01-18 15:15:35 -07:00 committed by Ben Walker
parent 95d9ffc26a
commit dc9e11163e
10 changed files with 81 additions and 32 deletions

View File

@ -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_ */

View File

@ -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);

View File

@ -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

View File

@ -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)
{

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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 *

View File

@ -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