From 2bb2afd085f280e0a31ac081e4c5728b5cf39664 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 27 Jan 2023 11:06:24 +0900 Subject: [PATCH] external_bdev_passthru: Use bdev_unregister_by_name() to delete a passthru bdev spdk_bdev_unregister_by_name() is safer than spdk_bdev_get_by_name() + spdk_bdev_unregister(). It is ensured that the specified callback is executed after unwinding stack for spdk_bdev_unregister_by_name(). Signed-off-by: Shuhei Matsumoto Change-Id: I5cc1e88a7e389ab173ef1195bd817d2aac6a70d1 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16556 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- test/external_code/passthru/vbdev_passthru.c | 13 ++++++------- test/external_code/passthru/vbdev_passthru.h | 4 ++-- test/external_code/passthru/vbdev_passthru_rpc.c | 8 +------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/test/external_code/passthru/vbdev_passthru.c b/test/external_code/passthru/vbdev_passthru.c index 407b86fde..3c2ba8825 100644 --- a/test/external_code/passthru/vbdev_passthru.c +++ b/test/external_code/passthru/vbdev_passthru.c @@ -697,13 +697,15 @@ bdev_passthru_external_create_disk(const char *bdev_name, const char *vbdev_name } void -bdev_passthru_external_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, +bdev_passthru_external_delete_disk(const char *bdev_name, spdk_bdev_unregister_cb cb_fn, void *cb_arg) { struct bdev_names *name; + int rc; - if (!bdev || bdev->module != &passthru_if) { - cb_fn(cb_arg, -ENODEV); + rc = spdk_bdev_unregister_by_name(bdev_name, &passthru_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); return; } @@ -712,7 +714,7 @@ bdev_passthru_external_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_ * unless the underlying bdev was hot-removed. */ TAILQ_FOREACH(name, &g_bdev_names, link) { - if (strcmp(name->vbdev_name, bdev->name) == 0) { + if (strcmp(name->vbdev_name, bdev_name) == 0) { TAILQ_REMOVE(&g_bdev_names, name, link); free(name->bdev_name); free(name->vbdev_name); @@ -720,9 +722,6 @@ bdev_passthru_external_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_ break; } } - - /* Additional cleanup happens in the destruct callback. */ - spdk_bdev_unregister(bdev, cb_fn, cb_arg); } /* Because we specified this function in our pt bdev function table when we diff --git a/test/external_code/passthru/vbdev_passthru.h b/test/external_code/passthru/vbdev_passthru.h index 1cfdaa5b8..977ec4f47 100644 --- a/test/external_code/passthru/vbdev_passthru.h +++ b/test/external_code/passthru/vbdev_passthru.h @@ -23,11 +23,11 @@ int bdev_passthru_external_create_disk(const char *bdev_name, const char *vbdev_ /** * Delete passthru bdev. * - * \param bdev Pointer to pass through bdev. + * \param bdev_name Name of the pass through bdev to delete. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void bdev_passthru_external_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, +void bdev_passthru_external_delete_disk(const char *bdev_name, spdk_bdev_unregister_cb cb_fn, void *cb_arg); #endif /* SPDK_VBDEV_PASSTHRU_H */ diff --git a/test/external_code/passthru/vbdev_passthru_rpc.c b/test/external_code/passthru/vbdev_passthru_rpc.c index 5f169c003..604212336 100644 --- a/test/external_code/passthru/vbdev_passthru_rpc.c +++ b/test/external_code/passthru/vbdev_passthru_rpc.c @@ -107,13 +107,7 @@ rpc_bdev_passthru_delete(struct spdk_jsonrpc_request *request, goto cleanup; } - bdev = spdk_bdev_get_by_name(req.name); - if (bdev == NULL) { - spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); - goto cleanup; - } - - bdev_passthru_external_delete_disk(bdev, rpc_bdev_passthru_delete_cb, request); + bdev_passthru_external_delete_disk(req.name, rpc_bdev_passthru_delete_cb, request); cleanup: free_rpc_bdev_passthru_delete(&req);