From d1bb67a34dd64f132620d4bce4696a0a6db5cbb1 Mon Sep 17 00:00:00 2001 From: Cunyin Chang Date: Mon, 13 Nov 2017 17:38:56 +0800 Subject: [PATCH] bdev/aio: make sure the aio backend support the lun reset command. This patch do not actually reset the aio controller, but make sure all the IOs inflight return back to client before we return success status of lun reset command. Change-Id: I473b5f8d795cdc2a32b69cfffcce5a2925a252f6 Signed-off-by: Cunyin Chang Reviewed-on: https://review.gerrithub.io/386837 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- lib/bdev/aio/bdev_aio.c | 52 ++++++++++++++++++++++++++++++++++++++--- lib/bdev/aio/bdev_aio.h | 3 +++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/lib/bdev/aio/bdev_aio.c b/lib/bdev/aio/bdev_aio.c index a41769e0c..dcb00ad90 100644 --- a/lib/bdev/aio/bdev_aio.c +++ b/lib/bdev/aio/bdev_aio.c @@ -128,7 +128,7 @@ bdev_aio_readv(struct file_disk *fdisk, struct spdk_io_channel *ch, SPDK_ERRLOG("%s: io_submit returned %d\n", __func__, rc); return -1; } - + aio_ch->io_inflight++; return nbytes; } @@ -158,7 +158,7 @@ bdev_aio_writev(struct file_disk *fdisk, struct spdk_io_channel *ch, SPDK_ERRLOG("%s: io_submit returned %d\n", __func__, rc); return -1; } - + aio_ch->io_inflight++; return len; } @@ -228,13 +228,59 @@ bdev_aio_poll(void *arg) } spdk_bdev_io_complete(spdk_bdev_io_from_ctx(aio_task), status); + ch->io_inflight--; } } +static int +_bdev_aio_get_io_inflight(void *io_device, struct spdk_io_channel *ch, + void *ctx) +{ + struct bdev_aio_io_channel *aio_ch = spdk_io_channel_get_ctx(ch); + + if (aio_ch->io_inflight) { + return -1; + } + return 0; +} + +static void +bdev_aio_reset_retry_timer(void *arg); + +static void +_bdev_aio_get_io_inflight_done(void *io_device, void *ctx, int status) +{ + struct file_disk *fdisk = ctx; + + if (status == -1) { + fdisk->reset_retry_timer = spdk_poller_register(bdev_aio_reset_retry_timer, fdisk, 500); + return; + } + + spdk_bdev_io_complete(spdk_bdev_io_from_ctx(fdisk->reset_task), SPDK_BDEV_IO_STATUS_SUCCESS); +} + +static void +bdev_aio_reset_retry_timer(void *arg) +{ + struct file_disk *fdisk = arg; + + if (fdisk->reset_retry_timer) { + spdk_poller_unregister(&fdisk->reset_retry_timer); + } + + spdk_for_each_channel(&fdisk->fd, + _bdev_aio_get_io_inflight, + fdisk, + _bdev_aio_get_io_inflight_done); +} + static void bdev_aio_reset(struct file_disk *fdisk, struct bdev_aio_task *aio_task) { - spdk_bdev_io_complete(spdk_bdev_io_from_ctx(aio_task), SPDK_BDEV_IO_STATUS_SUCCESS); + fdisk->reset_task = aio_task; + + bdev_aio_reset_retry_timer(fdisk); } static void bdev_aio_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) diff --git a/lib/bdev/aio/bdev_aio.h b/lib/bdev/aio/bdev_aio.h index c3bca41f9..77c483f31 100644 --- a/lib/bdev/aio/bdev_aio.h +++ b/lib/bdev/aio/bdev_aio.h @@ -52,9 +52,12 @@ struct bdev_aio_task { struct bdev_aio_io_channel { io_context_t io_ctx; struct spdk_poller *poller; + uint64_t io_inflight; }; struct file_disk { + struct bdev_aio_task *reset_task; + struct spdk_poller *reset_retry_timer; struct spdk_bdev disk; char *filename; int fd;