From 2e3f07ac407c5fbd67adf64a6dcf765669a15dd0 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Tue, 23 May 2017 10:51:50 -0700 Subject: [PATCH] bdev: add spdk_io_channel parameter to spdk_bdev_reset This ensures that all spdk_bdev_io structures now have an attached channel, simplifying some future work around things like counting the number of outstanding IOs for a given channel (which otherwise would have had to account specially for resets). Reset semantics are still that they affect the entire bdev and not just the channel it was submitted on. Signed-off-by: Jim Harris Change-Id: I8aad21a88faacecfd94bdba350059528eb62c390 Reviewed-on: https://review.gerrithub.io/362251 Reviewed-by: Daniel Verkamp Reviewed-by: Ben Walker Tested-by: SPDK Automated Test System --- include/spdk/bdev.h | 4 ++-- lib/bdev/bdev.c | 5 ++++- lib/scsi/lun.c | 2 ++ lib/scsi/scsi_bdev.c | 2 +- test/lib/bdev/bdevio/bdevio.c | 2 +- test/lib/bdev/bdevperf/bdevperf.c | 2 +- test/lib/scsi/scsi_bdev/scsi_bdev_ut.c | 3 ++- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index e4408e7ba..a247360e5 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -232,8 +232,8 @@ struct spdk_bdev_io *spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_chan uint64_t offset, uint64_t length, spdk_bdev_io_completion_cb cb, void *cb_arg); int spdk_bdev_free_io(struct spdk_bdev_io *bdev_io); -int spdk_bdev_reset(struct spdk_bdev *bdev, enum spdk_bdev_reset_type, - spdk_bdev_io_completion_cb cb, void *cb_arg); +int spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch, + enum spdk_bdev_reset_type, spdk_bdev_io_completion_cb cb, void *cb_arg); struct spdk_io_channel *spdk_bdev_get_io_channel(struct spdk_bdev *bdev, uint32_t priority); /** diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 2768d709f..d3d6f6ca5 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -830,10 +830,12 @@ spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch, } int -spdk_bdev_reset(struct spdk_bdev *bdev, enum spdk_bdev_reset_type reset_type, +spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch, + enum spdk_bdev_reset_type reset_type, spdk_bdev_io_completion_cb cb, void *cb_arg) { struct spdk_bdev_io *bdev_io; + struct spdk_bdev_channel *channel = spdk_io_channel_get_ctx(ch); int rc; assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED); @@ -843,6 +845,7 @@ spdk_bdev_reset(struct spdk_bdev *bdev, enum spdk_bdev_reset_type reset_type, return -1; } + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_RESET; bdev_io->u.reset.type = reset_type; spdk_bdev_io_init(bdev_io, bdev, cb_arg, cb); diff --git a/lib/scsi/lun.c b/lib/scsi/lun.c index 5245029c5..51179828a 100644 --- a/lib/scsi/lun.c +++ b/lib/scsi/lun.c @@ -104,6 +104,8 @@ spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task, return -1; } + task->ch = task->lun->io_channel; + switch (func) { case SPDK_SCSI_TASK_FUNC_ABORT_TASK: task->response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED; diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 430818583..dbf3aa1eb 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -1947,6 +1947,6 @@ 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) { - return spdk_bdev_reset(bdev, SPDK_BDEV_RESET_SOFT, + return spdk_bdev_reset(bdev, task->ch, SPDK_BDEV_RESET_SOFT, spdk_bdev_scsi_task_complete_mgmt, task); } diff --git a/test/lib/bdev/bdevio/bdevio.c b/test/lib/bdev/bdevio/bdevio.c index bb3cdc16c..60b3bcc03 100644 --- a/test/lib/bdev/bdevio/bdevio.c +++ b/test/lib/bdev/bdevio/bdevio.c @@ -660,7 +660,7 @@ __blockdev_reset(void *arg1, void *arg2) struct io_target *target = req->target; int rc; - rc = spdk_bdev_reset(target->bdev, *reset_type, quick_test_complete, NULL); + rc = spdk_bdev_reset(target->bdev, target->ch, *reset_type, quick_test_complete, NULL); if (rc < 0) { g_completion_success = false; wake_ut_thread(); diff --git a/test/lib/bdev/bdevperf/bdevperf.c b/test/lib/bdev/bdevperf/bdevperf.c index 86582a630..412ae7782 100644 --- a/test/lib/bdev/bdevperf/bdevperf.c +++ b/test/lib/bdev/bdevperf/bdevperf.c @@ -394,7 +394,7 @@ reset_target(void *arg) /* Do reset. */ rte_mempool_get(task_pool, (void **)&task); task->target = target; - spdk_bdev_reset(target->bdev, SPDK_BDEV_RESET_SOFT, + spdk_bdev_reset(target->bdev, target->ch, SPDK_BDEV_RESET_SOFT, reset_cb, task); } diff --git a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c index 3484aeab2..a7c6a1629 100644 --- a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +++ b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c @@ -224,7 +224,8 @@ spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch, } int -spdk_bdev_reset(struct spdk_bdev *bdev, enum spdk_bdev_reset_type reset_type, +spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch, + enum spdk_bdev_reset_type reset_type, spdk_bdev_io_completion_cb cb, void *cb_arg) { return 0;