diff --git a/module/bdev/aio/bdev_aio.c b/module/bdev/aio/bdev_aio.c index d06a68550..1873f18cd 100644 --- a/module/bdev/aio/bdev_aio.c +++ b/module/bdev/aio/bdev_aio.c @@ -867,14 +867,10 @@ aio_bdev_unregister_cb(void *arg, int bdeverrno) } void -bdev_aio_delete(struct spdk_bdev *bdev, delete_aio_bdev_complete cb_fn, void *cb_arg) +bdev_aio_delete(const char *name, delete_aio_bdev_complete cb_fn, void *cb_arg) { struct delete_aio_bdev_ctx *ctx; - - if (!bdev || bdev->module != &aio_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; ctx = calloc(1, sizeof(*ctx)); if (ctx == NULL) { @@ -884,7 +880,10 @@ bdev_aio_delete(struct spdk_bdev *bdev, delete_aio_bdev_complete cb_fn, void *cb ctx->cb_fn = cb_fn; ctx->cb_arg = cb_arg; - spdk_bdev_unregister(bdev, aio_bdev_unregister_cb, ctx); + rc = spdk_bdev_unregister_by_name(name, &aio_if, aio_bdev_unregister_cb, ctx); + if (rc != 0) { + aio_bdev_unregister_cb(ctx, rc); + } } static int diff --git a/module/bdev/aio/bdev_aio.h b/module/bdev/aio/bdev_aio.h index 563aeb063..13ebb08ce 100644 --- a/module/bdev/aio/bdev_aio.h +++ b/module/bdev/aio/bdev_aio.h @@ -42,6 +42,6 @@ typedef void (*delete_aio_bdev_complete)(void *cb_arg, int bdeverrno); int create_aio_bdev(const char *name, const char *filename, uint32_t block_size); int bdev_aio_rescan(struct spdk_bdev *bdev); -void bdev_aio_delete(struct spdk_bdev *bdev, delete_aio_bdev_complete cb_fn, void *cb_arg); +void bdev_aio_delete(const char *name, delete_aio_bdev_complete cb_fn, void *cb_arg); #endif /* SPDK_BDEV_AIO_H */ diff --git a/module/bdev/aio/bdev_aio_rpc.c b/module/bdev/aio/bdev_aio_rpc.c index 4f78308ea..a6c864edb 100644 --- a/module/bdev/aio/bdev_aio_rpc.c +++ b/module/bdev/aio/bdev_aio_rpc.c @@ -180,7 +180,6 @@ rpc_bdev_aio_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_aio req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_aio_decoders, SPDK_COUNTOF(rpc_delete_aio_decoders), @@ -190,13 +189,7 @@ rpc_bdev_aio_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_aio_delete(bdev, _rpc_bdev_aio_delete_cb, request); + bdev_aio_delete(req.name, _rpc_bdev_aio_delete_cb, request); cleanup: free_rpc_delete_aio(&req); diff --git a/module/bdev/crypto/vbdev_crypto.c b/module/bdev/crypto/vbdev_crypto.c index a8c4ecb90..0c86c03b9 100644 --- a/module/bdev/crypto/vbdev_crypto.c +++ b/module/bdev/crypto/vbdev_crypto.c @@ -2085,29 +2085,28 @@ error_vbdev_alloc: /* RPC entry for deleting a crypto vbdev. */ void -delete_crypto_disk(struct spdk_bdev *bdev, spdk_delete_crypto_complete cb_fn, +delete_crypto_disk(const char *bdev_name, spdk_delete_crypto_complete cb_fn, void *cb_arg) { struct bdev_names *name; + int rc; - if (!bdev || bdev->module != &crypto_if) { - cb_fn(cb_arg, -ENODEV); - return; - } - - /* Remove the association (vbdev, bdev) from g_bdev_names. This is required so that the - * vbdev does not get re-created if the same bdev is constructed at some other time, - * unless the underlying bdev was hot-removed. - */ - TAILQ_FOREACH(name, &g_bdev_names, link) { - if (strcmp(name->opts->vbdev_name, bdev->name) == 0) { - vbdev_crypto_delete_name(name); - break; + /* Some cleanup happens in the destruct callback. */ + rc = spdk_bdev_unregister_by_name(bdev_name, &crypto_if, cb_fn, cb_arg); + if (rc == 0) { + /* Remove the association (vbdev, bdev) from g_bdev_names. This is required so that the + * vbdev does not get re-created if the same bdev is constructed at some other time, + * unless the underlying bdev was hot-removed. + */ + TAILQ_FOREACH(name, &g_bdev_names, link) { + if (strcmp(name->opts->vbdev_name, bdev_name) == 0) { + vbdev_crypto_delete_name(name); + break; + } } + } else { + cb_fn(cb_arg, rc); } - - /* Additional cleanup happens in the destruct callback. */ - spdk_bdev_unregister(bdev, cb_fn, cb_arg); } /* Because we specified this function in our crypto bdev function table when we diff --git a/module/bdev/crypto/vbdev_crypto.h b/module/bdev/crypto/vbdev_crypto.h index a2b1e95ea..ca93e5389 100644 --- a/module/bdev/crypto/vbdev_crypto.h +++ b/module/bdev/crypto/vbdev_crypto.h @@ -92,11 +92,11 @@ int create_crypto_disk(struct vbdev_crypto_opts *opts); /** * Delete crypto bdev. * - * \param bdev Pointer to crypto bdev. + * \param bdev_name Crypto bdev name. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void delete_crypto_disk(struct spdk_bdev *bdev, spdk_delete_crypto_complete cb_fn, +void delete_crypto_disk(const char *bdev_name, spdk_delete_crypto_complete cb_fn, void *cb_arg); /** diff --git a/module/bdev/crypto/vbdev_crypto_rpc.c b/module/bdev/crypto/vbdev_crypto_rpc.c index aae7805ca..50c62fa79 100644 --- a/module/bdev/crypto/vbdev_crypto_rpc.c +++ b/module/bdev/crypto/vbdev_crypto_rpc.c @@ -321,7 +321,6 @@ rpc_bdev_crypto_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_crypto req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_crypto_decoders, SPDK_COUNTOF(rpc_delete_crypto_decoders), @@ -331,13 +330,7 @@ rpc_bdev_crypto_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; - } - - delete_crypto_disk(bdev, rpc_bdev_crypto_delete_cb, request); + delete_crypto_disk(req.name, rpc_bdev_crypto_delete_cb, request); free_rpc_delete_crypto(&req); diff --git a/module/bdev/delay/vbdev_delay.c b/module/bdev/delay/vbdev_delay.c index 77012fa16..6e2eaaf9a 100644 --- a/module/bdev/delay/vbdev_delay.c +++ b/module/bdev/delay/vbdev_delay.c @@ -887,26 +887,25 @@ create_delay_disk(const char *bdev_name, const char *vbdev_name, uint64_t avg_re } void -delete_delay_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg) +delete_delay_disk(const char *vbdev_name, spdk_bdev_unregister_cb cb_fn, void *cb_arg) { struct bdev_association *assoc; + int rc; - if (!bdev || bdev->module != &delay_if) { - cb_fn(cb_arg, -ENODEV); - return; - } - - TAILQ_FOREACH(assoc, &g_bdev_associations, link) { - if (strcmp(assoc->vbdev_name, bdev->name) == 0) { - TAILQ_REMOVE(&g_bdev_associations, assoc, link); - free(assoc->bdev_name); - free(assoc->vbdev_name); - free(assoc); - break; + rc = spdk_bdev_unregister_by_name(vbdev_name, &delay_if, cb_fn, cb_arg); + if (rc == 0) { + TAILQ_FOREACH(assoc, &g_bdev_associations, link) { + if (strcmp(assoc->vbdev_name, vbdev_name) == 0) { + TAILQ_REMOVE(&g_bdev_associations, assoc, link); + free(assoc->bdev_name); + free(assoc->vbdev_name); + free(assoc); + break; + } } + } else { + cb_fn(cb_arg, rc); } - - spdk_bdev_unregister(bdev, cb_fn, cb_arg); } static void diff --git a/module/bdev/delay/vbdev_delay.h b/module/bdev/delay/vbdev_delay.h index 4f88a5e2f..18ae064b9 100644 --- a/module/bdev/delay/vbdev_delay.h +++ b/module/bdev/delay/vbdev_delay.h @@ -64,11 +64,11 @@ int create_delay_disk(const char *bdev_name, const char *vbdev_name, uint64_t av /** * Delete delay bdev. * - * \param bdev Pointer to delay bdev. + * \param vbdev_name Name of the delay bdev. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void delete_delay_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, +void delete_delay_disk(const char *vbdev_name, spdk_bdev_unregister_cb cb_fn, void *cb_arg); /** diff --git a/module/bdev/delay/vbdev_delay_rpc.c b/module/bdev/delay/vbdev_delay_rpc.c index d04c45b1b..6938269ee 100644 --- a/module/bdev/delay/vbdev_delay_rpc.c +++ b/module/bdev/delay/vbdev_delay_rpc.c @@ -199,7 +199,6 @@ rpc_bdev_delay_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_delay req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_delay_decoders, SPDK_COUNTOF(rpc_delete_delay_decoders), @@ -209,13 +208,7 @@ rpc_bdev_delay_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; - } - - delete_delay_disk(bdev, rpc_bdev_delay_delete_cb, request); + delete_delay_disk(req.name, rpc_bdev_delay_delete_cb, request); cleanup: free_rpc_delete_delay(&req); diff --git a/module/bdev/error/vbdev_error.c b/module/bdev/error/vbdev_error.c index 9db38061d..5b8f7fffe 100644 --- a/module/bdev/error/vbdev_error.c +++ b/module/bdev/error/vbdev_error.c @@ -332,14 +332,14 @@ vbdev_error_create(const char *base_bdev_name) } void -vbdev_error_delete(struct spdk_bdev *vbdev, spdk_delete_error_complete cb_fn, void *cb_arg) +vbdev_error_delete(const char *error_vbdev_name, spdk_delete_error_complete cb_fn, void *cb_arg) { - if (!vbdev || vbdev->module != &error_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(vbdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(error_vbdev_name, &error_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } static void diff --git a/module/bdev/error/vbdev_error.h b/module/bdev/error/vbdev_error.h index 8c0daaeac..4ce970f3d 100644 --- a/module/bdev/error/vbdev_error.h +++ b/module/bdev/error/vbdev_error.h @@ -55,11 +55,11 @@ int vbdev_error_create(const char *base_bdev_name); /** * Delete vbdev used to inject errors. * - * \param bdev Pointer to error vbdev. + * \param error_vbdev_name Name of the error vbdev. * \param cb_fn Function to call after deletion. * \param cb_arg Arguments to pass to cb_fn. */ -void vbdev_error_delete(struct spdk_bdev *vbdev, spdk_delete_error_complete cb_fn, +void vbdev_error_delete(const char *error_vbdev_name, spdk_delete_error_complete cb_fn, void *cb_arg); /** diff --git a/module/bdev/error/vbdev_error_rpc.c b/module/bdev/error/vbdev_error_rpc.c index a25c592d3..27b6b172e 100644 --- a/module/bdev/error/vbdev_error_rpc.c +++ b/module/bdev/error/vbdev_error_rpc.c @@ -147,7 +147,6 @@ rpc_bdev_error_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_error req = {NULL}; - struct spdk_bdev *vbdev; if (spdk_json_decode_object(params, rpc_delete_error_decoders, SPDK_COUNTOF(rpc_delete_error_decoders), @@ -157,13 +156,7 @@ rpc_bdev_error_delete(struct spdk_jsonrpc_request *request, goto cleanup; } - vbdev = spdk_bdev_get_by_name(req.name); - if (vbdev == NULL) { - spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); - goto cleanup; - } - - vbdev_error_delete(vbdev, rpc_bdev_error_delete_cb, request); + vbdev_error_delete(req.name, rpc_bdev_error_delete_cb, request); cleanup: free_rpc_delete_error(&req); diff --git a/module/bdev/ftl/bdev_ftl.c b/module/bdev/ftl/bdev_ftl.c index 48793e71f..38e279b95 100644 --- a/module/bdev/ftl/bdev_ftl.c +++ b/module/bdev/ftl/bdev_ftl.c @@ -455,15 +455,12 @@ bdev_ftl_initialize(void) void bdev_ftl_delete_bdev(const char *name, spdk_bdev_unregister_cb cb_fn, void *cb_arg) { - struct spdk_bdev *bdev; + int rc; - bdev = spdk_bdev_get_by_name(name); - if (bdev) { - spdk_bdev_unregister(bdev, cb_fn, cb_arg); - return; + rc = spdk_bdev_unregister_by_name(name, &g_ftl_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); } - - cb_fn(cb_arg, -ENODEV); } static void diff --git a/module/bdev/iscsi/bdev_iscsi.c b/module/bdev/iscsi/bdev_iscsi.c index 6307b5827..9ea6af98d 100644 --- a/module/bdev/iscsi/bdev_iscsi.c +++ b/module/bdev/iscsi/bdev_iscsi.c @@ -1065,14 +1065,14 @@ err: } void -delete_iscsi_disk(struct spdk_bdev *bdev, spdk_delete_iscsi_complete cb_fn, void *cb_arg) +delete_iscsi_disk(const char *bdev_name, spdk_delete_iscsi_complete cb_fn, void *cb_arg) { - if (!bdev || bdev->module != &g_iscsi_bdev_module) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(bdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(bdev_name, &g_iscsi_bdev_module, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } static int diff --git a/module/bdev/iscsi/bdev_iscsi.h b/module/bdev/iscsi/bdev_iscsi.h index 6a343123b..429f36138 100644 --- a/module/bdev/iscsi/bdev_iscsi.h +++ b/module/bdev/iscsi/bdev_iscsi.h @@ -66,10 +66,10 @@ int create_iscsi_disk(const char *bdev_name, const char *url, const char *initia /** * Delete iSCSI bdev. * - * \param bdev Pointer to iSCSI bdev. + * \param bdev_name Name of iSCSI bdev. * \param cb_fn Completion callback * \param cb_arg Completion callback custom arguments */ -void delete_iscsi_disk(struct spdk_bdev *bdev, spdk_delete_iscsi_complete cb_fn, void *cb_arg); +void delete_iscsi_disk(const char *bdev_name, spdk_delete_iscsi_complete cb_fn, void *cb_arg); #endif /* SPDK_BDEV_ISCSI_H */ diff --git a/module/bdev/iscsi/bdev_iscsi_rpc.c b/module/bdev/iscsi/bdev_iscsi_rpc.c index 46051fe85..e5619ccaa 100644 --- a/module/bdev/iscsi/bdev_iscsi_rpc.c +++ b/module/bdev/iscsi/bdev_iscsi_rpc.c @@ -135,7 +135,6 @@ rpc_bdev_iscsi_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_iscsi req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_iscsi_decoders, SPDK_COUNTOF(rpc_delete_iscsi_decoders), @@ -145,13 +144,7 @@ rpc_bdev_iscsi_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; - } - - delete_iscsi_disk(bdev, rpc_bdev_iscsi_delete_cb, request); + delete_iscsi_disk(req.name, rpc_bdev_iscsi_delete_cb, request); cleanup: free_rpc_delete_iscsi(&req); diff --git a/module/bdev/malloc/bdev_malloc.c b/module/bdev/malloc/bdev_malloc.c index ae5107b85..c316eb098 100644 --- a/module/bdev/malloc/bdev_malloc.c +++ b/module/bdev/malloc/bdev_malloc.c @@ -468,14 +468,14 @@ create_malloc_disk(struct spdk_bdev **bdev, const char *name, const struct spdk_ } void -delete_malloc_disk(struct spdk_bdev *bdev, spdk_delete_malloc_complete cb_fn, void *cb_arg) +delete_malloc_disk(const char *name, spdk_delete_malloc_complete cb_fn, void *cb_arg) { - if (!bdev || bdev->module != &malloc_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(bdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(name, &malloc_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } static int diff --git a/module/bdev/malloc/bdev_malloc.h b/module/bdev/malloc/bdev_malloc.h index 054cf3e3c..28ec5eae4 100644 --- a/module/bdev/malloc/bdev_malloc.h +++ b/module/bdev/malloc/bdev_malloc.h @@ -44,6 +44,6 @@ typedef void (*spdk_delete_malloc_complete)(void *cb_arg, int bdeverrno); int create_malloc_disk(struct spdk_bdev **bdev, const char *name, const struct spdk_uuid *uuid, uint64_t num_blocks, uint32_t block_size, uint32_t optimal_io_boundary); -void delete_malloc_disk(struct spdk_bdev *bdev, spdk_delete_malloc_complete cb_fn, void *cb_arg); +void delete_malloc_disk(const char *name, spdk_delete_malloc_complete cb_fn, void *cb_arg); #endif /* SPDK_BDEV_MALLOC_H */ diff --git a/module/bdev/malloc/bdev_malloc_rpc.c b/module/bdev/malloc/bdev_malloc_rpc.c index 76347fea8..88010c6b9 100644 --- a/module/bdev/malloc/bdev_malloc_rpc.c +++ b/module/bdev/malloc/bdev_malloc_rpc.c @@ -148,7 +148,6 @@ rpc_bdev_malloc_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_malloc req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_malloc_decoders, SPDK_COUNTOF(rpc_delete_malloc_decoders), @@ -159,14 +158,7 @@ rpc_bdev_malloc_delete(struct spdk_jsonrpc_request *request, goto cleanup; } - bdev = spdk_bdev_get_by_name(req.name); - if (bdev == NULL) { - SPDK_INFOLOG(bdev_malloc, "bdev '%s' does not exist\n", req.name); - spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); - goto cleanup; - } - - delete_malloc_disk(bdev, rpc_bdev_malloc_delete_cb, request); + delete_malloc_disk(req.name, rpc_bdev_malloc_delete_cb, request); cleanup: free_rpc_delete_malloc(&req); diff --git a/module/bdev/null/bdev_null.c b/module/bdev/null/bdev_null.c index 6d631b872..10b8d4ba4 100644 --- a/module/bdev/null/bdev_null.c +++ b/module/bdev/null/bdev_null.c @@ -344,14 +344,14 @@ bdev_null_create(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts *opts } void -bdev_null_delete(struct spdk_bdev *bdev, spdk_delete_null_complete cb_fn, void *cb_arg) +bdev_null_delete(const char *bdev_name, spdk_delete_null_complete cb_fn, void *cb_arg) { - if (!bdev || bdev->module != &null_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(bdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(bdev_name, &null_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } static int diff --git a/module/bdev/null/bdev_null.h b/module/bdev/null/bdev_null.h index c9d4ac704..ea8332cb7 100644 --- a/module/bdev/null/bdev_null.h +++ b/module/bdev/null/bdev_null.h @@ -57,11 +57,11 @@ int bdev_null_create(struct spdk_bdev **bdev, const struct spdk_null_bdev_opts * /** * Delete null bdev. * - * \param bdev Pointer to null bdev. + * \param bdev_name Name of null bdev. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void bdev_null_delete(struct spdk_bdev *bdev, spdk_delete_null_complete cb_fn, +void bdev_null_delete(const char *bdev_name, spdk_delete_null_complete cb_fn, void *cb_arg); /** * Resize null bdev. diff --git a/module/bdev/null/bdev_null_rpc.c b/module/bdev/null/bdev_null_rpc.c index a4ba2e1c1..92262d7e2 100644 --- a/module/bdev/null/bdev_null_rpc.c +++ b/module/bdev/null/bdev_null_rpc.c @@ -183,7 +183,6 @@ rpc_bdev_null_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_null req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_null_decoders, SPDK_COUNTOF(rpc_delete_null_decoders), @@ -193,13 +192,7 @@ rpc_bdev_null_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_null_delete(bdev, rpc_bdev_null_delete_cb, request); + bdev_null_delete(req.name, rpc_bdev_null_delete_cb, request); free_rpc_delete_null(&req); diff --git a/module/bdev/passthru/vbdev_passthru.c b/module/bdev/passthru/vbdev_passthru.c index 6092f07bc..257e858fc 100644 --- a/module/bdev/passthru/vbdev_passthru.c +++ b/module/bdev/passthru/vbdev_passthru.c @@ -737,31 +737,30 @@ bdev_passthru_create_disk(const char *bdev_name, const char *vbdev_name) } void -bdev_passthru_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg) +bdev_passthru_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); - return; - } - - /* Remove the association (vbdev, bdev) from g_bdev_names. This is required so that the - * vbdev does not get re-created if the same bdev is constructed at some other time, - * unless the underlying bdev was hot-removed. - */ - TAILQ_FOREACH(name, &g_bdev_names, link) { - if (strcmp(name->vbdev_name, bdev->name) == 0) { - TAILQ_REMOVE(&g_bdev_names, name, link); - free(name->bdev_name); - free(name->vbdev_name); - free(name); - break; + /* Some cleanup happens in the destruct callback. */ + rc = spdk_bdev_unregister_by_name(bdev_name, &passthru_if, cb_fn, cb_arg); + if (rc == 0) { + /* Remove the association (vbdev, bdev) from g_bdev_names. This is required so that the + * vbdev does not get re-created if the same bdev is constructed at some other time, + * unless the underlying bdev was hot-removed. + */ + TAILQ_FOREACH(name, &g_bdev_names, link) { + if (strcmp(name->vbdev_name, bdev_name) == 0) { + TAILQ_REMOVE(&g_bdev_names, name, link); + free(name->bdev_name); + free(name->vbdev_name); + free(name); + break; + } } + } else { + cb_fn(cb_arg, rc); } - - /* 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/module/bdev/passthru/vbdev_passthru.h b/module/bdev/passthru/vbdev_passthru.h index 716e187c1..c2cd51eca 100644 --- a/module/bdev/passthru/vbdev_passthru.h +++ b/module/bdev/passthru/vbdev_passthru.h @@ -51,11 +51,11 @@ int bdev_passthru_create_disk(const char *bdev_name, const char *vbdev_name); /** * Delete passthru bdev. * - * \param bdev Pointer to pass through bdev. + * \param bdev_name Name of the pass through bdev. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void bdev_passthru_delete_disk(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, +void bdev_passthru_delete_disk(const char *bdev_name, spdk_bdev_unregister_cb cb_fn, void *cb_arg); #endif /* SPDK_VBDEV_PASSTHRU_H */ diff --git a/module/bdev/passthru/vbdev_passthru_rpc.c b/module/bdev/passthru/vbdev_passthru_rpc.c index 57347d440..10ae3fd1b 100644 --- a/module/bdev/passthru/vbdev_passthru_rpc.c +++ b/module/bdev/passthru/vbdev_passthru_rpc.c @@ -124,7 +124,6 @@ rpc_bdev_passthru_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_bdev_passthru_delete req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_bdev_passthru_delete_decoders, SPDK_COUNTOF(rpc_bdev_passthru_delete_decoders), @@ -134,13 +133,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_delete_disk(bdev, rpc_bdev_passthru_delete_cb, request); + bdev_passthru_delete_disk(req.name, rpc_bdev_passthru_delete_cb, request); cleanup: free_rpc_bdev_passthru_delete(&req); diff --git a/module/bdev/pmem/bdev_pmem.c b/module/bdev/pmem/bdev_pmem.c index f5454d1d2..2b8053374 100644 --- a/module/bdev/pmem/bdev_pmem.c +++ b/module/bdev/pmem/bdev_pmem.c @@ -390,14 +390,14 @@ create_pmem_disk(const char *pmem_file, const char *name, struct spdk_bdev **bde } void -delete_pmem_disk(struct spdk_bdev *bdev, spdk_delete_pmem_complete cb_fn, void *cb_arg) +delete_pmem_disk(const char *name, spdk_delete_pmem_complete cb_fn, void *cb_arg) { - if (!bdev || bdev->module != &pmem_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(bdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(name, &pmem_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } static int diff --git a/module/bdev/pmem/bdev_pmem.h b/module/bdev/pmem/bdev_pmem.h index d9292b114..08ec83f19 100644 --- a/module/bdev/pmem/bdev_pmem.h +++ b/module/bdev/pmem/bdev_pmem.h @@ -54,11 +54,11 @@ int create_pmem_disk(const char *pmem_file, const char *name, struct spdk_bdev * /** * Delete pmem bdev. * - * \param bdev Pointer to pmem bdev. + * \param name Name of pmem bdev. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void delete_pmem_disk(struct spdk_bdev *bdev, spdk_delete_pmem_complete cb_fn, +void delete_pmem_disk(const char *name, spdk_delete_pmem_complete cb_fn, void *cb_arg); #endif /* SPDK_BDEV_PMEM_H */ diff --git a/module/bdev/pmem/bdev_pmem_rpc.c b/module/bdev/pmem/bdev_pmem_rpc.c index cefa1b7ad..7f21de4e9 100644 --- a/module/bdev/pmem/bdev_pmem_rpc.c +++ b/module/bdev/pmem/bdev_pmem_rpc.c @@ -120,7 +120,6 @@ rpc_bdev_pmem_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_pmem req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_pmem_decoders, SPDK_COUNTOF(rpc_delete_pmem_decoders), @@ -128,16 +127,10 @@ rpc_bdev_pmem_delete(struct spdk_jsonrpc_request *request, SPDK_DEBUGLOG(bdev_pmem, "spdk_json_decode_object failed\n"); spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "spdk_json_decode_object failed"); - } - - bdev = spdk_bdev_get_by_name(req.name); - if (bdev == NULL) { - SPDK_DEBUGLOG(bdev_pmem, "bdev '%s' does not exist\n", req.name); - spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV)); goto cleanup; } - delete_pmem_disk(bdev, _rpc_bdev_pmem_delete_cb, request); + delete_pmem_disk(req.name, _rpc_bdev_pmem_delete_cb, request); cleanup: free_rpc_delete_pmem(&req); diff --git a/module/bdev/rbd/bdev_rbd.c b/module/bdev/rbd/bdev_rbd.c index 8c51def35..2bf7673a3 100644 --- a/module/bdev/rbd/bdev_rbd.c +++ b/module/bdev/rbd/bdev_rbd.c @@ -1277,14 +1277,14 @@ bdev_rbd_create(struct spdk_bdev **bdev, const char *name, const char *user_id, } void -bdev_rbd_delete(struct spdk_bdev *bdev, spdk_delete_rbd_complete cb_fn, void *cb_arg) +bdev_rbd_delete(const char *name, spdk_delete_rbd_complete cb_fn, void *cb_arg) { - if (!bdev || bdev->module != &rbd_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; - spdk_bdev_unregister(bdev, cb_fn, cb_arg); + rc = spdk_bdev_unregister_by_name(name, &rbd_if, cb_fn, cb_arg); + if (rc != 0) { + cb_fn(cb_arg, rc); + } } int diff --git a/module/bdev/rbd/bdev_rbd.h b/module/bdev/rbd/bdev_rbd.h index 8f342ec5b..96faa5a34 100644 --- a/module/bdev/rbd/bdev_rbd.h +++ b/module/bdev/rbd/bdev_rbd.h @@ -59,11 +59,11 @@ int bdev_rbd_create(struct spdk_bdev **bdev, const char *name, const char *user_ /** * Delete rbd bdev. * - * \param bdev Pointer to rbd bdev. + * \param name Name of rbd bdev. * \param cb_fn Function to call after deletion. * \param cb_arg Argument to pass to cb_fn. */ -void bdev_rbd_delete(struct spdk_bdev *bdev, spdk_delete_rbd_complete cb_fn, +void bdev_rbd_delete(const char *name, spdk_delete_rbd_complete cb_fn, void *cb_arg); /** diff --git a/module/bdev/rbd/bdev_rbd_rpc.c b/module/bdev/rbd/bdev_rbd_rpc.c index 5baefcfa9..102102910 100644 --- a/module/bdev/rbd/bdev_rbd_rpc.c +++ b/module/bdev/rbd/bdev_rbd_rpc.c @@ -192,7 +192,6 @@ rpc_bdev_rbd_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_bdev_rbd_delete req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_bdev_rbd_delete_decoders, SPDK_COUNTOF(rpc_bdev_rbd_delete_decoders), @@ -202,13 +201,7 @@ rpc_bdev_rbd_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_rbd_delete(bdev, _rpc_bdev_rbd_delete_cb, request); + bdev_rbd_delete(req.name, _rpc_bdev_rbd_delete_cb, request); cleanup: free_rpc_bdev_rbd_delete(&req); diff --git a/module/bdev/uring/bdev_uring.c b/module/bdev/uring/bdev_uring.c index 2e438c2a7..51fab6384 100644 --- a/module/bdev/uring/bdev_uring.c +++ b/module/bdev/uring/bdev_uring.c @@ -551,14 +551,10 @@ uring_bdev_unregister_cb(void *arg, int bdeverrno) } void -delete_uring_bdev(struct spdk_bdev *bdev, spdk_delete_uring_complete cb_fn, void *cb_arg) +delete_uring_bdev(const char *name, spdk_delete_uring_complete cb_fn, void *cb_arg) { struct delete_uring_bdev_ctx *ctx; - - if (!bdev || bdev->module != &uring_if) { - cb_fn(cb_arg, -ENODEV); - return; - } + int rc; ctx = calloc(1, sizeof(*ctx)); if (ctx == NULL) { @@ -568,7 +564,10 @@ delete_uring_bdev(struct spdk_bdev *bdev, spdk_delete_uring_complete cb_fn, void ctx->cb_fn = cb_fn; ctx->cb_arg = cb_arg; - spdk_bdev_unregister(bdev, uring_bdev_unregister_cb, ctx); + rc = spdk_bdev_unregister_by_name(name, &uring_if, uring_bdev_unregister_cb, ctx); + if (rc != 0) { + uring_bdev_unregister_cb(ctx, rc); + } } static int diff --git a/module/bdev/uring/bdev_uring.h b/module/bdev/uring/bdev_uring.h index a35681832..f11d92117 100644 --- a/module/bdev/uring/bdev_uring.h +++ b/module/bdev/uring/bdev_uring.h @@ -45,6 +45,6 @@ typedef void (*spdk_delete_uring_complete)(void *cb_arg, int bdeverrno); struct spdk_bdev *create_uring_bdev(const char *name, const char *filename, uint32_t block_size); -void delete_uring_bdev(struct spdk_bdev *bdev, spdk_delete_uring_complete cb_fn, void *cb_arg); +void delete_uring_bdev(const char *name, spdk_delete_uring_complete cb_fn, void *cb_arg); #endif /* SPDK_BDEV_URING_H */ diff --git a/module/bdev/uring/bdev_uring_rpc.c b/module/bdev/uring/bdev_uring_rpc.c index aa291daca..b1d8de86d 100644 --- a/module/bdev/uring/bdev_uring_rpc.c +++ b/module/bdev/uring/bdev_uring_rpc.c @@ -128,7 +128,6 @@ rpc_bdev_uring_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { struct rpc_delete_uring req = {NULL}; - struct spdk_bdev *bdev; if (spdk_json_decode_object(params, rpc_delete_uring_decoders, SPDK_COUNTOF(rpc_delete_uring_decoders), @@ -138,13 +137,7 @@ rpc_bdev_uring_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; - } - - delete_uring_bdev(bdev, _rpc_bdev_uring_delete_cb, request); + delete_uring_bdev(req.name, _rpc_bdev_uring_delete_cb, request); cleanup: free_rpc_delete_uring(&req); diff --git a/module/bdev/virtio/bdev_virtio_blk.c b/module/bdev/virtio/bdev_virtio_blk.c index e92b21cc9..5f1dc8388 100644 --- a/module/bdev/virtio/bdev_virtio_blk.c +++ b/module/bdev/virtio/bdev_virtio_blk.c @@ -300,20 +300,7 @@ bdev_virtio_disk_destruct(void *ctx) int bdev_virtio_blk_dev_remove(const char *name, bdev_virtio_remove_cb cb_fn, void *cb_arg) { - struct spdk_bdev *bdev; - - bdev = spdk_bdev_get_by_name(name); - if (bdev == NULL) { - return -ENODEV; - } - - if (bdev->module != &virtio_blk_if) { - return -ENODEV; - } - - spdk_bdev_unregister(bdev, cb_fn, cb_arg); - - return 0; + return spdk_bdev_unregister_by_name(name, &virtio_blk_if, cb_fn, cb_arg); } static int diff --git a/module/bdev/zone_block/vbdev_zone_block.c b/module/bdev/zone_block/vbdev_zone_block.c index dccb305ae..7c351dcb1 100644 --- a/module/bdev/zone_block/vbdev_zone_block.c +++ b/module/bdev/zone_block/vbdev_zone_block.c @@ -913,22 +913,19 @@ void vbdev_zone_block_delete(const char *name, spdk_bdev_unregister_cb cb_fn, void *cb_arg) { struct bdev_zone_block_config *name_node; - struct spdk_bdev *bdev = NULL; + int rc; - bdev = spdk_bdev_get_by_name(name); - if (!bdev || bdev->module != &bdev_zoned_if) { - cb_fn(cb_arg, -ENODEV); - return; - } - - TAILQ_FOREACH(name_node, &g_bdev_configs, link) { - if (strcmp(name_node->vbdev_name, bdev->name) == 0) { - zone_block_remove_config(name_node); - break; + rc = spdk_bdev_unregister_by_name(name, &bdev_zoned_if, cb_fn, cb_arg); + if (rc == 0) { + TAILQ_FOREACH(name_node, &g_bdev_configs, link) { + if (strcmp(name_node->vbdev_name, name) == 0) { + zone_block_remove_config(name_node); + break; + } } + } else { + cb_fn(cb_arg, rc); } - - spdk_bdev_unregister(bdev, cb_fn, cb_arg); } static void diff --git a/test/unit/lib/bdev/crypto.c/crypto_ut.c b/test/unit/lib/bdev/crypto.c/crypto_ut.c index 268ab0c94..598194b8f 100644 --- a/test/unit/lib/bdev/crypto.c/crypto_ut.c +++ b/test/unit/lib/bdev/crypto.c/crypto_ut.c @@ -253,6 +253,9 @@ DEFINE_STUB(spdk_bdev_get_buf_align, size_t, (const struct spdk_bdev *bdev), 64) DEFINE_STUB(spdk_bdev_get_io_channel, struct spdk_io_channel *, (struct spdk_bdev_desc *desc), 0); DEFINE_STUB_V(spdk_bdev_unregister, (struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg)); +DEFINE_STUB(spdk_bdev_unregister_by_name, int, (const char *bdev_name, + struct spdk_bdev_module *module, + spdk_bdev_unregister_cb cb_fn, void *cb_arg), 0); DEFINE_STUB(spdk_bdev_open_ext, int, (const char *bdev_name, bool write, spdk_bdev_event_cb_t event_cb, void *event_ctx, struct spdk_bdev_desc **_desc), 0); diff --git a/test/unit/lib/bdev/pmem/bdev_pmem_ut.c b/test/unit/lib/bdev/pmem/bdev_pmem_ut.c index df30d6136..10ad91e00 100644 --- a/test/unit/lib/bdev/pmem/bdev_pmem_ut.c +++ b/test/unit/lib/bdev/pmem/bdev_pmem_ut.c @@ -268,9 +268,11 @@ spdk_bdev_register(struct spdk_bdev *bdev) return 0; } -void -spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg) +int +spdk_bdev_unregister_by_name(const char *name, struct spdk_bdev_module *module, + spdk_bdev_unregister_cb cb_fn, void *cb_arg) { + return 0; } int diff --git a/test/unit/lib/bdev/vbdev_zone_block.c/vbdev_zone_block_ut.c b/test/unit/lib/bdev/vbdev_zone_block.c/vbdev_zone_block_ut.c index 899418b78..a8178bbce 100644 --- a/test/unit/lib/bdev/vbdev_zone_block.c/vbdev_zone_block_ut.c +++ b/test/unit/lib/bdev/vbdev_zone_block.c/vbdev_zone_block_ut.c @@ -161,6 +161,22 @@ spdk_bdev_unregister(struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn, void } } +int +spdk_bdev_unregister_by_name(const char *bdev_name, struct spdk_bdev_module *module, + spdk_bdev_unregister_cb cb_fn, void *cb_arg) +{ + struct spdk_bdev *bdev; + + CU_ASSERT(module == &bdev_zoned_if); + + bdev = spdk_bdev_get_by_name(bdev_name); + SPDK_CU_ASSERT_FATAL(bdev != NULL); + + spdk_bdev_unregister(bdev, cb_fn, cb_arg); + + return 0; +} + int spdk_json_write_named_uint64(struct spdk_json_write_ctx *w, const char *name, uint64_t val) { struct rpc_construct_zone_block *req = g_rpc_req;