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:
parent
a6b0b5b072
commit
2bb2afd085
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user