Commit 2bb2afd0 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I5cc1e88a7e389ab173ef1195bd817d2aac6a70d1
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16556


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent a6b0b5b0
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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 */
+1 −7
Original line number Diff line number Diff line
@@ -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);