diff options
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
| -rw-r--r-- | drivers/scsi/iscsi_tcp.c | 30 | 
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 9e2588a6881..a669f2d11c3 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -116,6 +116,7 @@ static inline int iscsi_sw_sk_state_check(struct sock *sk)  	struct iscsi_conn *conn = sk->sk_user_data;  	if ((sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) && +	    (conn->session->state != ISCSI_STATE_LOGGING_OUT) &&  	    !atomic_read(&sk->sk_rmem_alloc)) {  		ISCSI_SW_TCP_DBG(conn, "TCP_CLOSE|TCP_CLOSE_WAIT\n");  		iscsi_conn_failure(conn, ISCSI_ERR_TCP_CONN_CLOSE); @@ -124,7 +125,7 @@ static inline int iscsi_sw_sk_state_check(struct sock *sk)  	return 0;  } -static void iscsi_sw_tcp_data_ready(struct sock *sk, int flag) +static void iscsi_sw_tcp_data_ready(struct sock *sk)  {  	struct iscsi_conn *conn;  	struct iscsi_tcp_conn *tcp_conn; @@ -243,7 +244,7 @@ iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)  	sk->sk_data_ready   = tcp_sw_conn->old_data_ready;  	sk->sk_state_change = tcp_sw_conn->old_state_change;  	sk->sk_write_space  = tcp_sw_conn->old_write_space; -	sk->sk_no_check	 = 0; +	sk->sk_no_check_tx = 0;  	write_unlock_bh(&sk->sk_callback_lock);  } @@ -592,9 +593,9 @@ static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)  	iscsi_sw_tcp_conn_restore_callbacks(conn);  	sock_put(sock->sk); -	spin_lock_bh(&session->lock); +	spin_lock_bh(&session->frwd_lock);  	tcp_sw_conn->sock = NULL; -	spin_unlock_bh(&session->lock); +	spin_unlock_bh(&session->frwd_lock);  	sockfd_put(sock);  } @@ -662,10 +663,10 @@ iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,  	if (err)  		goto free_socket; -	spin_lock_bh(&session->lock); +	spin_lock_bh(&session->frwd_lock);  	/* bind iSCSI connection and socket */  	tcp_sw_conn->sock = sock; -	spin_unlock_bh(&session->lock); +	spin_unlock_bh(&session->frwd_lock);  	/* setup Socket parameters */  	sk = sock->sk; @@ -725,14 +726,14 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,  	switch(param) {  	case ISCSI_PARAM_CONN_PORT:  	case ISCSI_PARAM_CONN_ADDRESS: -		spin_lock_bh(&conn->session->lock); +		spin_lock_bh(&conn->session->frwd_lock);  		if (!tcp_sw_conn || !tcp_sw_conn->sock) { -			spin_unlock_bh(&conn->session->lock); +			spin_unlock_bh(&conn->session->frwd_lock);  			return -ENOTCONN;  		}  		rc = kernel_getpeername(tcp_sw_conn->sock,  					(struct sockaddr *)&addr, &len); -		spin_unlock_bh(&conn->session->lock); +		spin_unlock_bh(&conn->session->frwd_lock);  		if (rc)  			return rc; @@ -758,23 +759,26 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,  	switch (param) {  	case ISCSI_HOST_PARAM_IPADDRESS: -		spin_lock_bh(&session->lock); +		if (!session) +			return -ENOTCONN; + +		spin_lock_bh(&session->frwd_lock);  		conn = session->leadconn;  		if (!conn) { -			spin_unlock_bh(&session->lock); +			spin_unlock_bh(&session->frwd_lock);  			return -ENOTCONN;  		}  		tcp_conn = conn->dd_data;  		tcp_sw_conn = tcp_conn->dd_data;  		if (!tcp_sw_conn->sock) { -			spin_unlock_bh(&session->lock); +			spin_unlock_bh(&session->frwd_lock);  			return -ENOTCONN;  		}  		rc = kernel_getsockname(tcp_sw_conn->sock,  					(struct sockaddr *)&addr, &len); -		spin_unlock_bh(&session->lock); +		spin_unlock_bh(&session->frwd_lock);  		if (rc)  			return rc;  | 
