diff --git a/lib/bdev/aio/bdev_aio.c b/lib/bdev/aio/bdev_aio.c index d9321004d..12b1d900a 100644 --- a/lib/bdev/aio/bdev_aio.c +++ b/lib/bdev/aio/bdev_aio.c @@ -201,6 +201,8 @@ bdev_aio_destruct(void *ctx) if (rc < 0) { SPDK_ERRLOG("bdev_aio_close() failed\n"); } + spdk_io_device_unregister(fdisk, NULL); + aio_free_disk(fdisk); return rc; } @@ -626,44 +628,39 @@ error_return: return NULL; } -static void -aio_io_device_unregister_cb(void *io_device) -{ - 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); -} +struct delete_aio_disk_ctx { + spdk_delete_aio_complete cb_fn; + void *cb_arg; +}; static void aio_bdev_unregister_cb(void *arg, int bdeverrno) { - struct file_disk *fdisk = arg; + struct delete_aio_disk_ctx *ctx = arg; - if (bdeverrno != 0) { - fdisk->delete_cb_fn(fdisk->delete_cb_arg, bdeverrno); - return; - } - - spdk_io_device_unregister(fdisk, aio_io_device_unregister_cb); + ctx->cb_fn(ctx->cb_arg, bdeverrno); + free(ctx); } void 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) { cb_fn(cb_arg, -ENODEV); return; } - fdisk = bdev->ctxt; - fdisk->delete_cb_fn = cb_fn; - fdisk->delete_cb_arg = cb_arg; - spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, fdisk); + ctx = calloc(1, sizeof(*ctx)); + if (ctx == NULL) { + cb_fn(cb_arg, -ENOMEM); + return; + } + + ctx->cb_fn = cb_fn; + ctx->cb_arg = cb_arg; + spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, ctx); } static int diff --git a/lib/bdev/aio/bdev_aio.h b/lib/bdev/aio/bdev_aio.h index 7d59c7805..1fc6eaa6b 100644 --- a/lib/bdev/aio/bdev_aio.h +++ b/lib/bdev/aio/bdev_aio.h @@ -69,8 +69,6 @@ struct file_disk { int fd; TAILQ_ENTRY(file_disk) link; 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);