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 <smatsumoto@nvidia.com>
Change-Id: I5cc1e88a7e389ab173ef1195bd817d2aac6a70d1
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16556
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2023-01-27 11:06:24 +09:00 committed by Jim Harris
parent a6b0b5b072
commit 2bb2afd085
3 changed files with 9 additions and 16 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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);