From 787b5efe02b09be4972cf2fa478d1bcdb834b3f6 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 11 Apr 2019 12:51:56 +0900 Subject: [PATCH] lib/iscsi: Make iscsi_shutdown_tgt_node_by_name asynchronous This patch changes spdk_rpc_delete_target_node() to pass rpc_delete_target_node_done() and its context to spdk_iscsi_shutdown_tgt_node_by_name(). iscsi_tgt_node_destruct() is not asynchronized yet and so spdk_iscsi_shutdown_tgt_node_by_name() calls the callback passed from the caller directly for now. The next patch will replace the call. Change-Id: Ide2d9fcc6738e02de19f91249c21ac2d0d37138a Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450605 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu --- lib/iscsi/iscsi_rpc.c | 8 ++------ lib/iscsi/tgt_node.c | 14 ++++++++++---- lib/iscsi/tgt_node.h | 5 ++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/iscsi/iscsi_rpc.c b/lib/iscsi/iscsi_rpc.c index b11e67738..965475e64 100644 --- a/lib/iscsi/iscsi_rpc.c +++ b/lib/iscsi/iscsi_rpc.c @@ -704,12 +704,8 @@ spdk_rpc_delete_target_node(struct spdk_jsonrpc_request *request, ctx->request = request; - if (spdk_iscsi_shutdown_tgt_node_by_name(ctx->req.name)) { - SPDK_ERRLOG("shutdown_tgt_node_by_name failed\n"); - goto invalid; - } - - rpc_delete_target_node_done(ctx, 0); + spdk_iscsi_shutdown_tgt_node_by_name(ctx->req.name, + rpc_delete_target_node_done, ctx); return; invalid: diff --git a/lib/iscsi/tgt_node.c b/lib/iscsi/tgt_node.c index 71cb26cae..c1e9b20ec 100644 --- a/lib/iscsi/tgt_node.c +++ b/lib/iscsi/tgt_node.c @@ -1284,8 +1284,9 @@ spdk_iscsi_shutdown_tgt_nodes(void) pthread_mutex_unlock(&g_spdk_iscsi.mutex); } -int -spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name) +void +spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name, + iscsi_tgt_node_destruct_cb cb_fn, void *cb_arg) { struct spdk_iscsi_tgt_node *target; @@ -1297,11 +1298,16 @@ spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name) iscsi_tgt_node_destruct(target); - return 0; + if (cb_fn) { + cb_fn(cb_arg, 0); + } + return; } pthread_mutex_unlock(&g_spdk_iscsi.mutex); - return -ENOENT; + if (cb_fn) { + cb_fn(cb_arg, -ENOENT); + } } bool diff --git a/lib/iscsi/tgt_node.h b/lib/iscsi/tgt_node.h index bb9732003..414069c1e 100644 --- a/lib/iscsi/tgt_node.h +++ b/lib/iscsi/tgt_node.h @@ -48,6 +48,8 @@ struct spdk_json_write_ctx; #define MAX_TARGET_MAP 256 #define SPDK_TN_TAG_MAX 0x0000ffff +typedef void (*iscsi_tgt_node_destruct_cb)(void *cb_arg, int rc); + struct spdk_iscsi_ig_map { struct spdk_iscsi_init_grp *ig; TAILQ_ENTRY(spdk_iscsi_ig_map) tailq; @@ -94,7 +96,8 @@ struct spdk_iscsi_tgt_node { int spdk_iscsi_parse_tgt_nodes(void); void spdk_iscsi_shutdown_tgt_nodes(void); -int spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name); +void spdk_iscsi_shutdown_tgt_node_by_name(const char *target_name, + iscsi_tgt_node_destruct_cb cb_fn, void *cb_arg); bool spdk_iscsi_tgt_node_is_destructed(struct spdk_iscsi_tgt_node *target); int spdk_iscsi_send_tgts(struct spdk_iscsi_conn *conn, const char *iiqn, const char *iaddr, const char *tiqn, uint8_t *data, int alloc_len,