From 7a260a5e99724a63f21bffa984392adaba8192c6 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Thu, 25 Jul 2019 09:42:19 +0200 Subject: [PATCH] bdev: Create generic _spdk_bdev_open function This is a part of a change that will introduce new spdk_bdev_open_ext function. This will make possible to pass callback function while opening bdev which will be called when some bdev events occur. Signed-off-by: Maciej Szwed Change-Id: I3e552edd5c90dacd39885e75e9114e48dddf50ea Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/463157 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/bdev/bdev.c | 58 +++++++++++++++++--------- test/unit/lib/bdev/mt/bdev.c/bdev_ut.c | 3 +- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 1603adced..7e54964a8 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -4277,11 +4277,15 @@ spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void } } -int -spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_cb, - void *remove_ctx, struct spdk_bdev_desc **_desc) +static void +_spdk_bdev_dummy_event_cb(void *remove_ctx) +{ + SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Bdev remove event received with no remove callback specified"); +} + +static int +_spdk_bdev_open(struct spdk_bdev *bdev, bool write, struct spdk_bdev_desc *desc) { - struct spdk_bdev_desc *desc; struct spdk_thread *thread; struct set_qos_limit_ctx *ctx; @@ -4291,27 +4295,16 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ return -ENOTSUP; } - desc = calloc(1, sizeof(*desc)); - if (desc == NULL) { - SPDK_ERRLOG("Failed to allocate memory for bdev descriptor\n"); - return -ENOMEM; - } - SPDK_DEBUGLOG(SPDK_LOG_BDEV, "Opening descriptor %p for bdev %s on thread %p\n", desc, bdev->name, spdk_get_thread()); desc->bdev = bdev; desc->thread = thread; - desc->remove_cb = remove_cb; - desc->remove_ctx = remove_ctx; desc->write = write; - *_desc = desc; pthread_mutex_lock(&bdev->internal.mutex); if (bdev->internal.status == SPDK_BDEV_STATUS_REMOVING) { pthread_mutex_unlock(&bdev->internal.mutex); - free(desc); - *_desc = NULL; return -ENODEV; } @@ -4319,8 +4312,6 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ SPDK_ERRLOG("Could not open %s - %s module already claimed it\n", bdev->name, bdev->internal.claim_module->name); pthread_mutex_unlock(&bdev->internal.mutex); - free(desc); - *_desc = NULL; return -EPERM; } @@ -4330,8 +4321,6 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ if (ctx == NULL) { SPDK_ERRLOG("Failed to allocate memory for QoS context\n"); pthread_mutex_unlock(&bdev->internal.mutex); - free(desc); - *_desc = NULL; return -ENOMEM; } ctx->bdev = bdev; @@ -4347,6 +4336,37 @@ spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_ return 0; } +int +spdk_bdev_open(struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_cb, + void *remove_ctx, struct spdk_bdev_desc **_desc) +{ + struct spdk_bdev_desc *desc; + int rc; + + desc = calloc(1, sizeof(*desc)); + if (desc == NULL) { + SPDK_ERRLOG("Failed to allocate memory for bdev descriptor\n"); + return -ENOMEM; + } + + if (remove_cb == NULL) { + remove_cb = _spdk_bdev_dummy_event_cb; + } + + desc->remove_cb = remove_cb; + desc->remove_ctx = remove_ctx; + + rc = _spdk_bdev_open(bdev, write, desc); + if (rc != 0) { + free(desc); + desc = NULL; + } + + *_desc = desc; + + return rc; +} + void spdk_bdev_close(struct spdk_bdev_desc *desc) { diff --git a/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c b/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c index 0e8fdbfd1..193988e12 100644 --- a/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c +++ b/test/unit/lib/bdev/mt/bdev.c/bdev_ut.c @@ -351,7 +351,7 @@ static void unregister_and_close(void) { bool done, remove_notify; - struct spdk_bdev_desc *desc; + struct spdk_bdev_desc *desc = NULL; setup_test(); set_thread(0); @@ -381,6 +381,7 @@ unregister_and_close(void) spdk_bdev_close(desc); poll_threads(); + desc = NULL; /* The unregister should have completed */ CU_ASSERT(done == true);