From 919166548690320ac61a94534ee99458e2519e0a Mon Sep 17 00:00:00 2001 From: Denis Barakhtanov Date: Fri, 28 Oct 2022 14:36:52 +1100 Subject: [PATCH] bdev/daos: early bdev creation failure detection If during a channel creation, an error happens, due to incorrect parameters e.g. wrong pool / container name, or some other internal DAOS errors (like reaching CART context limit), bdev_daos_io_channel_create_cb() signals about such errors, however, spdk_io_device_register() does not takes them into account. The device creation succeeds, returning successful RPC response and leaving bdev in the bdev lists but it's completely unusable and not amendable. This patch tries to detect it early and return an RPC error on failure. Signed-off-by: Denis Barakhtanov Change-Id: I04758e6243566b4e619a1420aa7c01f6041441a6 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15168 Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot --- module/bdev/daos/bdev_daos.c | 16 +++++++++++++++- module/bdev/daos/bdev_daos_rpc.c | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/module/bdev/daos/bdev_daos.c b/module/bdev/daos/bdev_daos.c index ec56e2b42..477b9c363 100644 --- a/module/bdev/daos/bdev_daos.c +++ b/module/bdev/daos/bdev_daos.c @@ -583,7 +583,7 @@ bdev_daos_io_channel_create_cb(void *io_device, void *ctx_buf) ch->disk = io_device; if (spdk_call_unaffinitized(_bdev_daos_io_channel_create_cb, ch) == NULL) { - return EINVAL; + return -EINVAL; } SPDK_DEBUGLOG(bdev_daos, "%s: starting daos event queue poller\n", @@ -634,6 +634,7 @@ create_bdev_daos(struct spdk_bdev **bdev, int rc; size_t len; struct bdev_daos *daos; + struct bdev_daos_io_channel ch = {}; SPDK_NOTICELOG("%s: creating bdev_daos disk on '%s:%s'\n", name, pool, cont); @@ -717,6 +718,19 @@ create_bdev_daos(struct spdk_bdev **bdev, return rc; } + /* We try to connect to the DAOS container during channel creation, so simulate + * creating a channel here, so that we can return a failure when the DAOS bdev + * is created, instead of finding it out later when the first channel is created + * and leaving unusable bdev registered. + */ + rc = bdev_daos_io_channel_create_cb(daos, &ch); + if (rc) { + SPDK_ERRLOG("'%s' could not initialize io-channel: %s", name, strerror(-rc)); + bdev_daos_free(daos); + return rc; + } + bdev_daos_io_channel_destroy_cb(daos, &ch); + spdk_io_device_register(daos, bdev_daos_io_channel_create_cb, bdev_daos_io_channel_destroy_cb, sizeof(struct bdev_daos_io_channel), diff --git a/module/bdev/daos/bdev_daos_rpc.c b/module/bdev/daos/bdev_daos_rpc.c index 1c6aa1795..58c6499fe 100644 --- a/module/bdev/daos/bdev_daos_rpc.c +++ b/module/bdev/daos/bdev_daos_rpc.c @@ -29,6 +29,7 @@ free_rpc_construct_daos(struct rpc_construct_daos *r) free(r->uuid); free(r->pool); free(r->cont); + free(r->oclass); } static const struct spdk_json_object_decoder rpc_construct_daos_decoders[] = {