diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index f606e82a8c6ec..c738c18ccdcd5 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -3813,6 +3813,7 @@ int iscsi_target_tx_thread(void *arg) * connection recovery / failure event can be triggered externally. */ allow_signal(SIGINT); + complete(&conn->kthr_start_comp); while (!kthread_should_stop()) { /* @@ -4041,6 +4042,7 @@ int iscsi_target_rx_thread(void *arg) * connection recovery / failure event can be triggered externally. */ allow_signal(SIGINT); + complete(&conn->kthr_start_comp); /* * Wait for iscsi_post_login_handler() to complete before allowing * incoming iscsi/tcp socket I/O, and/or failing the connection. diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 72d10271bbe18..884db3ddf5771 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c @@ -646,6 +646,7 @@ int iscsit_start_kthreads(struct iscsi_conn *conn) ret = PTR_ERR(conn->tx_thread); goto out_bitmap; } + wait_for_completion(&conn->kthr_start_comp); conn->tx_thread_active = true; conn->rx_thread = kthread_run(iscsi_target_rx_thread, conn, @@ -655,6 +656,7 @@ int iscsit_start_kthreads(struct iscsi_conn *conn) ret = PTR_ERR(conn->rx_thread); goto out_tx; } + wait_for_completion(&conn->kthr_start_comp); conn->rx_thread_active = true; return 0; @@ -1127,6 +1129,7 @@ static struct iscsi_conn *iscsit_alloc_conn(struct iscsi_np *np) init_completion(&conn->rx_half_close_comp); init_completion(&conn->tx_half_close_comp); init_completion(&conn->rx_login_comp); + init_completion(&conn->kthr_start_comp); spin_lock_init(&conn->cmd_lock); spin_lock_init(&conn->conn_usage_lock); spin_lock_init(&conn->immed_queue_lock); diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index 591cd9e4692c1..b3441f2e7c7a5 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -562,6 +562,7 @@ struct iscsi_conn { struct completion conn_logout_comp; struct completion tx_half_close_comp; struct completion rx_half_close_comp; + struct completion kthr_start_comp; /* socket used by this connection */ struct socket *sock; void (*orig_data_ready)(struct sock *);