gpt: add support for bdev_io_wait when no memory
according to commit: bdev: add spdk_bdev_queue_io_wait This patch will make io_wait to support gpt Change-Id: I73795756f232f1b596b65ecbc7e3ba4d990c9fe0 Signed-off-by: Ni Xun <nixun@baidu.com> Signed-off-by: Li Lin <lilin24@baidu.com> Signed-off-by: Zhang Yu <zhangyu31@baidu.com> Reviewed-on: https://review.gerrithub.io/428338 Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
parent
3785a4d83b
commit
08ed55bb1d
@ -51,10 +51,12 @@
|
||||
|
||||
static int vbdev_gpt_init(void);
|
||||
static void vbdev_gpt_examine(struct spdk_bdev *bdev);
|
||||
static int vbdev_gpt_get_ctx_size(void);
|
||||
|
||||
static struct spdk_bdev_module gpt_if = {
|
||||
.name = "gpt",
|
||||
.module_init = vbdev_gpt_init,
|
||||
.get_ctx_size = vbdev_gpt_get_ctx_size,
|
||||
.examine_disk = vbdev_gpt_examine,
|
||||
|
||||
};
|
||||
@ -79,6 +81,14 @@ struct gpt_channel {
|
||||
struct spdk_bdev_part_channel part_ch;
|
||||
};
|
||||
|
||||
struct gpt_io {
|
||||
struct spdk_io_channel *ch;
|
||||
struct spdk_bdev_io *bdev_io;
|
||||
|
||||
/* for bdev_io_wait */
|
||||
struct spdk_bdev_io_wait_entry bdev_io_wait;
|
||||
};
|
||||
|
||||
static SPDK_BDEV_PART_TAILQ g_gpt_disks = TAILQ_HEAD_INITIALIZER(g_gpt_disks);
|
||||
|
||||
static bool g_gpt_disabled;
|
||||
@ -156,16 +166,49 @@ vbdev_gpt_destruct(void *ctx)
|
||||
return spdk_bdev_part_free(&gpt_disk->part);
|
||||
}
|
||||
|
||||
static void
|
||||
vbdev_gpt_resubmit_request(void *arg)
|
||||
{
|
||||
struct gpt_io *io = (struct gpt_io *)arg;
|
||||
|
||||
vbdev_gpt_submit_request(io->ch, io->bdev_io);
|
||||
}
|
||||
|
||||
static void
|
||||
vbdev_gpt_queue_io(struct gpt_io *io)
|
||||
{
|
||||
int rc;
|
||||
|
||||
io->bdev_io_wait.bdev = io->bdev_io->bdev;
|
||||
io->bdev_io_wait.cb_fn = vbdev_gpt_resubmit_request;
|
||||
io->bdev_io_wait.cb_arg = io;
|
||||
|
||||
rc = spdk_bdev_queue_io_wait(io->bdev_io->bdev,
|
||||
io->ch, &io->bdev_io_wait);
|
||||
if (rc != 0) {
|
||||
SPDK_ERRLOG("Queue io failed in vbdev_gpt_queue_io, rc=%d.\n", rc);
|
||||
spdk_bdev_io_complete(io->bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
vbdev_gpt_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io)
|
||||
{
|
||||
struct gpt_channel *ch = spdk_io_channel_get_ctx(_ch);
|
||||
struct gpt_io *io = (struct gpt_io *)bdev_io->driver_ctx;
|
||||
int rc;
|
||||
|
||||
rc = spdk_bdev_part_submit_request(&ch->part_ch, bdev_io);
|
||||
if (rc) {
|
||||
SPDK_ERRLOG("gpt: error on bdev_io submission, rc=%d.\n", rc);
|
||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||
if (rc == -ENOMEM) {
|
||||
SPDK_DEBUGLOG(SPDK_LOG_VBDEV_GPT, "gpt: no memory, queue io\n");
|
||||
io->ch = _ch;
|
||||
io->bdev_io = bdev_io;
|
||||
vbdev_gpt_queue_io(io);
|
||||
} else {
|
||||
SPDK_ERRLOG("gpt: error on bdev_io submission, rc=%d.\n", rc);
|
||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -384,6 +427,12 @@ vbdev_gpt_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
vbdev_gpt_get_ctx_size(void)
|
||||
{
|
||||
return sizeof(struct gpt_io);
|
||||
}
|
||||
|
||||
static void
|
||||
vbdev_gpt_examine(struct spdk_bdev *bdev)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user