bdev/aio: unregister io_device correctly
The io_device associated with the aio bdev was only getting unregistered when the aio bdev was explicitly deleted - not in the implicit deletion path at shutdown. Move the io_device_unregister into the destruct_cb - this makes sure the io_device is always unregistered, whether the bdev is getting unregistered via an explicit RPC or implicitly in the shutdown path. Fixes #618. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I44b77f5c38339f4cf97b02c0ee4002bf5fcc9998 Reviewed-on: https://review.gerrithub.io/c/442119 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ziye Yang <optimistyzy@gmail.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
parent
a3777e3f11
commit
d3bfd244f0
@ -201,6 +201,8 @@ bdev_aio_destruct(void *ctx)
|
|||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
SPDK_ERRLOG("bdev_aio_close() failed\n");
|
SPDK_ERRLOG("bdev_aio_close() failed\n");
|
||||||
}
|
}
|
||||||
|
spdk_io_device_unregister(fdisk, NULL);
|
||||||
|
aio_free_disk(fdisk);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,44 +628,39 @@ error_return:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
struct delete_aio_disk_ctx {
|
||||||
aio_io_device_unregister_cb(void *io_device)
|
spdk_delete_aio_complete cb_fn;
|
||||||
{
|
void *cb_arg;
|
||||||
struct file_disk *fdisk = io_device;
|
};
|
||||||
spdk_delete_aio_complete cb_fn = fdisk->delete_cb_fn;
|
|
||||||
void *cb_arg = fdisk->delete_cb_arg;
|
|
||||||
|
|
||||||
aio_free_disk(fdisk);
|
|
||||||
cb_fn(cb_arg, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
aio_bdev_unregister_cb(void *arg, int bdeverrno)
|
aio_bdev_unregister_cb(void *arg, int bdeverrno)
|
||||||
{
|
{
|
||||||
struct file_disk *fdisk = arg;
|
struct delete_aio_disk_ctx *ctx = arg;
|
||||||
|
|
||||||
if (bdeverrno != 0) {
|
ctx->cb_fn(ctx->cb_arg, bdeverrno);
|
||||||
fdisk->delete_cb_fn(fdisk->delete_cb_arg, bdeverrno);
|
free(ctx);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
spdk_io_device_unregister(fdisk, aio_io_device_unregister_cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
delete_aio_disk(struct spdk_bdev *bdev, spdk_delete_aio_complete cb_fn, void *cb_arg)
|
delete_aio_disk(struct spdk_bdev *bdev, spdk_delete_aio_complete cb_fn, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct file_disk *fdisk;
|
struct delete_aio_disk_ctx *ctx;
|
||||||
|
|
||||||
if (!bdev || bdev->module != &aio_if) {
|
if (!bdev || bdev->module != &aio_if) {
|
||||||
cb_fn(cb_arg, -ENODEV);
|
cb_fn(cb_arg, -ENODEV);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fdisk = bdev->ctxt;
|
ctx = calloc(1, sizeof(*ctx));
|
||||||
fdisk->delete_cb_fn = cb_fn;
|
if (ctx == NULL) {
|
||||||
fdisk->delete_cb_arg = cb_arg;
|
cb_fn(cb_arg, -ENOMEM);
|
||||||
spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, fdisk);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->cb_fn = cb_fn;
|
||||||
|
ctx->cb_arg = cb_arg;
|
||||||
|
spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -69,8 +69,6 @@ struct file_disk {
|
|||||||
int fd;
|
int fd;
|
||||||
TAILQ_ENTRY(file_disk) link;
|
TAILQ_ENTRY(file_disk) link;
|
||||||
bool block_size_override;
|
bool block_size_override;
|
||||||
spdk_delete_aio_complete delete_cb_fn;
|
|
||||||
void *delete_cb_arg;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spdk_bdev *create_aio_disk(const char *name, const char *filename, uint32_t block_size);
|
struct spdk_bdev *create_aio_disk(const char *name, const char *filename, uint32_t block_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user