From d3bfd244f09bbdd47938559919d821948ad137a7 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Fri, 25 Jan 2019 13:57:46 -0700 Subject: [PATCH] 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 Change-Id: I44b77f5c38339f4cf97b02c0ee4002bf5fcc9998 Reviewed-on: https://review.gerrithub.io/c/442119 Tested-by: SPDK CI Jenkins Reviewed-by: Ziye Yang Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Darek Stojaczyk --- lib/bdev/aio/bdev_aio.c | 41 +++++++++++++++++++---------------------- lib/bdev/aio/bdev_aio.h | 2 -- 2 files changed, 19 insertions(+), 24 deletions(-) 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);