diff options
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
| -rw-r--r-- | drivers/infiniband/ulp/isert/ib_isert.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 75404885cf98..92e1e7587af8 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -657,9 +657,13 @@ static int  isert_connect_error(struct rdma_cm_id *cma_id)  {  	struct isert_conn *isert_conn = cma_id->qp->qp_context; +	struct isert_np *isert_np = cma_id->context;  	ib_drain_qp(isert_conn->qp); + +	mutex_lock(&isert_np->mutex);  	list_del_init(&isert_conn->node); +	mutex_unlock(&isert_np->mutex);  	isert_conn->cm_id = NULL;  	isert_put_conn(isert_conn); @@ -2431,6 +2435,7 @@ isert_free_np(struct iscsi_np *np)  {  	struct isert_np *isert_np = np->np_context;  	struct isert_conn *isert_conn, *n; +	LIST_HEAD(drop_conn_list);  	if (isert_np->cm_id)  		rdma_destroy_id(isert_np->cm_id); @@ -2450,7 +2455,7 @@ isert_free_np(struct iscsi_np *np)  					 node) {  			isert_info("cleaning isert_conn %p state (%d)\n",  				   isert_conn, isert_conn->state); -			isert_connect_release(isert_conn); +			list_move_tail(&isert_conn->node, &drop_conn_list);  		}  	} @@ -2461,11 +2466,16 @@ isert_free_np(struct iscsi_np *np)  					 node) {  			isert_info("cleaning isert_conn %p state (%d)\n",  				   isert_conn, isert_conn->state); -			isert_connect_release(isert_conn); +			list_move_tail(&isert_conn->node, &drop_conn_list);  		}  	}  	mutex_unlock(&isert_np->mutex); +	list_for_each_entry_safe(isert_conn, n, &drop_conn_list, node) { +		list_del_init(&isert_conn->node); +		isert_connect_release(isert_conn); +	} +  	np->np_context = NULL;  	kfree(isert_np);  } @@ -2506,8 +2516,8 @@ isert_wait4cmds(struct iscsit_conn *conn)  	isert_info("iscsit_conn %p\n", conn);  	if (conn->sess) { -		target_stop_session(conn->sess->se_sess); -		target_wait_for_sess_cmds(conn->sess->se_sess); +		target_stop_cmd_counter(conn->cmd_cnt); +		target_wait_for_cmds(conn->cmd_cnt);  	}  } @@ -2560,8 +2570,6 @@ static void isert_wait_conn(struct iscsit_conn *conn)  	isert_put_unsol_pending_cmds(conn);  	isert_wait4cmds(conn);  	isert_wait4logout(isert_conn); - -	queue_work(isert_release_wq, &isert_conn->release_work);  }  static void isert_free_conn(struct iscsit_conn *conn)  |