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 <cunyin.chang@intel.com>
Reviewed-on: https://review.gerrithub.io/386837
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Cunyin Chang 2017-11-13 17:38:56 +08:00 committed by Jim Harris
parent 479134e9d4
commit d1bb67a34d
2 changed files with 52 additions and 3 deletions

View File

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

View File

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