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:
parent
479134e9d4
commit
d1bb67a34d
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user