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:
Jim Harris 2019-01-25 13:57:46 -07:00 committed by Darek Stojaczyk
parent a3777e3f11
commit d3bfd244f0
2 changed files with 19 additions and 24 deletions

View File

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

View File

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