|
@@ -67,45 +67,10 @@ static struct iscsi_login *iscsi_login_init_conn(struct iscsi_conn *conn)
|
|
|
goto out_req_buf;
|
|
|
}
|
|
|
|
|
|
- conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL);
|
|
|
- if (!conn->conn_ops) {
|
|
|
- pr_err("Unable to allocate memory for"
|
|
|
- " struct iscsi_conn_ops.\n");
|
|
|
- goto out_rsp_buf;
|
|
|
- }
|
|
|
-
|
|
|
- init_waitqueue_head(&conn->queues_wq);
|
|
|
- INIT_LIST_HEAD(&conn->conn_list);
|
|
|
- INIT_LIST_HEAD(&conn->conn_cmd_list);
|
|
|
- INIT_LIST_HEAD(&conn->immed_queue_list);
|
|
|
- INIT_LIST_HEAD(&conn->response_queue_list);
|
|
|
- init_completion(&conn->conn_post_wait_comp);
|
|
|
- init_completion(&conn->conn_wait_comp);
|
|
|
- init_completion(&conn->conn_wait_rcfr_comp);
|
|
|
- init_completion(&conn->conn_waiting_on_uc_comp);
|
|
|
- init_completion(&conn->conn_logout_comp);
|
|
|
- init_completion(&conn->rx_half_close_comp);
|
|
|
- init_completion(&conn->tx_half_close_comp);
|
|
|
- init_completion(&conn->rx_login_comp);
|
|
|
- spin_lock_init(&conn->cmd_lock);
|
|
|
- spin_lock_init(&conn->conn_usage_lock);
|
|
|
- spin_lock_init(&conn->immed_queue_lock);
|
|
|
- spin_lock_init(&conn->nopin_timer_lock);
|
|
|
- spin_lock_init(&conn->response_queue_lock);
|
|
|
- spin_lock_init(&conn->state_lock);
|
|
|
-
|
|
|
- if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) {
|
|
|
- pr_err("Unable to allocate conn->conn_cpumask\n");
|
|
|
- goto out_conn_ops;
|
|
|
- }
|
|
|
conn->conn_login = login;
|
|
|
|
|
|
return login;
|
|
|
|
|
|
-out_conn_ops:
|
|
|
- kfree(conn->conn_ops);
|
|
|
-out_rsp_buf:
|
|
|
- kfree(login->rsp_buf);
|
|
|
out_req_buf:
|
|
|
kfree(login->req_buf);
|
|
|
out_login:
|
|
@@ -1147,6 +1112,75 @@ iscsit_conn_set_transport(struct iscsi_conn *conn, struct iscsit_transport *t)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static struct iscsi_conn *iscsit_alloc_conn(struct iscsi_np *np)
|
|
|
+{
|
|
|
+ struct iscsi_conn *conn;
|
|
|
+
|
|
|
+ conn = kzalloc(sizeof(struct iscsi_conn), GFP_KERNEL);
|
|
|
+ if (!conn) {
|
|
|
+ pr_err("Could not allocate memory for new connection\n");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ pr_debug("Moving to TARG_CONN_STATE_FREE.\n");
|
|
|
+ conn->conn_state = TARG_CONN_STATE_FREE;
|
|
|
+
|
|
|
+ init_waitqueue_head(&conn->queues_wq);
|
|
|
+ INIT_LIST_HEAD(&conn->conn_list);
|
|
|
+ INIT_LIST_HEAD(&conn->conn_cmd_list);
|
|
|
+ INIT_LIST_HEAD(&conn->immed_queue_list);
|
|
|
+ INIT_LIST_HEAD(&conn->response_queue_list);
|
|
|
+ init_completion(&conn->conn_post_wait_comp);
|
|
|
+ init_completion(&conn->conn_wait_comp);
|
|
|
+ init_completion(&conn->conn_wait_rcfr_comp);
|
|
|
+ init_completion(&conn->conn_waiting_on_uc_comp);
|
|
|
+ init_completion(&conn->conn_logout_comp);
|
|
|
+ init_completion(&conn->rx_half_close_comp);
|
|
|
+ init_completion(&conn->tx_half_close_comp);
|
|
|
+ init_completion(&conn->rx_login_comp);
|
|
|
+ spin_lock_init(&conn->cmd_lock);
|
|
|
+ spin_lock_init(&conn->conn_usage_lock);
|
|
|
+ spin_lock_init(&conn->immed_queue_lock);
|
|
|
+ spin_lock_init(&conn->nopin_timer_lock);
|
|
|
+ spin_lock_init(&conn->response_queue_lock);
|
|
|
+ spin_lock_init(&conn->state_lock);
|
|
|
+
|
|
|
+ timer_setup(&conn->nopin_response_timer,
|
|
|
+ iscsit_handle_nopin_response_timeout, 0);
|
|
|
+ timer_setup(&conn->nopin_timer, iscsit_handle_nopin_timeout, 0);
|
|
|
+
|
|
|
+ if (iscsit_conn_set_transport(conn, np->np_transport) < 0)
|
|
|
+ goto free_conn;
|
|
|
+
|
|
|
+ conn->conn_ops = kzalloc(sizeof(struct iscsi_conn_ops), GFP_KERNEL);
|
|
|
+ if (!conn->conn_ops) {
|
|
|
+ pr_err("Unable to allocate memory for struct iscsi_conn_ops.\n");
|
|
|
+ goto put_transport;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!zalloc_cpumask_var(&conn->conn_cpumask, GFP_KERNEL)) {
|
|
|
+ pr_err("Unable to allocate conn->conn_cpumask\n");
|
|
|
+ goto free_mask;
|
|
|
+ }
|
|
|
+
|
|
|
+ return conn;
|
|
|
+
|
|
|
+free_mask:
|
|
|
+ free_cpumask_var(conn->conn_cpumask);
|
|
|
+put_transport:
|
|
|
+ iscsit_put_transport(conn->conn_transport);
|
|
|
+free_conn:
|
|
|
+ kfree(conn);
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+void iscsit_free_conn(struct iscsi_conn *conn)
|
|
|
+{
|
|
|
+ free_cpumask_var(conn->conn_cpumask);
|
|
|
+ kfree(conn->conn_ops);
|
|
|
+ iscsit_put_transport(conn->conn_transport);
|
|
|
+ kfree(conn);
|
|
|
+}
|
|
|
+
|
|
|
void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
|
|
struct iscsi_np *np, bool zero_tsih, bool new_sess)
|
|
|
{
|
|
@@ -1196,10 +1230,6 @@ old_sess_out:
|
|
|
crypto_free_ahash(tfm);
|
|
|
}
|
|
|
|
|
|
- free_cpumask_var(conn->conn_cpumask);
|
|
|
-
|
|
|
- kfree(conn->conn_ops);
|
|
|
-
|
|
|
if (conn->param_list) {
|
|
|
iscsi_release_param_list(conn->param_list);
|
|
|
conn->param_list = NULL;
|
|
@@ -1217,8 +1247,7 @@ old_sess_out:
|
|
|
if (conn->conn_transport->iscsit_free_conn)
|
|
|
conn->conn_transport->iscsit_free_conn(conn);
|
|
|
|
|
|
- iscsit_put_transport(conn->conn_transport);
|
|
|
- kfree(conn);
|
|
|
+ iscsit_free_conn(conn);
|
|
|
}
|
|
|
|
|
|
static int __iscsi_target_login_thread(struct iscsi_np *np)
|
|
@@ -1248,31 +1277,16 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
|
|
|
}
|
|
|
spin_unlock_bh(&np->np_thread_lock);
|
|
|
|
|
|
- conn = kzalloc(sizeof(struct iscsi_conn), GFP_KERNEL);
|
|
|
+ conn = iscsit_alloc_conn(np);
|
|
|
if (!conn) {
|
|
|
- pr_err("Could not allocate memory for"
|
|
|
- " new connection\n");
|
|
|
/* Get another socket */
|
|
|
return 1;
|
|
|
}
|
|
|
- pr_debug("Moving to TARG_CONN_STATE_FREE.\n");
|
|
|
- conn->conn_state = TARG_CONN_STATE_FREE;
|
|
|
-
|
|
|
- timer_setup(&conn->nopin_response_timer,
|
|
|
- iscsit_handle_nopin_response_timeout, 0);
|
|
|
- timer_setup(&conn->nopin_timer, iscsit_handle_nopin_timeout, 0);
|
|
|
-
|
|
|
- if (iscsit_conn_set_transport(conn, np->np_transport) < 0) {
|
|
|
- kfree(conn);
|
|
|
- return 1;
|
|
|
- }
|
|
|
|
|
|
rc = np->np_transport->iscsit_accept_np(np, conn);
|
|
|
if (rc == -ENOSYS) {
|
|
|
complete(&np->np_restart_comp);
|
|
|
- iscsit_put_transport(conn->conn_transport);
|
|
|
- kfree(conn);
|
|
|
- conn = NULL;
|
|
|
+ iscsit_free_conn(conn);
|
|
|
goto exit;
|
|
|
} else if (rc < 0) {
|
|
|
spin_lock_bh(&np->np_thread_lock);
|
|
@@ -1280,17 +1294,13 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
|
|
|
np->np_thread_state = ISCSI_NP_THREAD_ACTIVE;
|
|
|
spin_unlock_bh(&np->np_thread_lock);
|
|
|
complete(&np->np_restart_comp);
|
|
|
- iscsit_put_transport(conn->conn_transport);
|
|
|
- kfree(conn);
|
|
|
- conn = NULL;
|
|
|
+ iscsit_free_conn(conn);
|
|
|
/* Get another socket */
|
|
|
return 1;
|
|
|
}
|
|
|
spin_unlock_bh(&np->np_thread_lock);
|
|
|
- iscsit_put_transport(conn->conn_transport);
|
|
|
- kfree(conn);
|
|
|
- conn = NULL;
|
|
|
- goto out;
|
|
|
+ iscsit_free_conn(conn);
|
|
|
+ return 1;
|
|
|
}
|
|
|
/*
|
|
|
* Perform the remaining iSCSI connection initialization items..
|
|
@@ -1440,7 +1450,6 @@ old_sess_out:
|
|
|
tpg_np = NULL;
|
|
|
}
|
|
|
|
|
|
-out:
|
|
|
return 1;
|
|
|
|
|
|
exit:
|