diff options
Diffstat (limited to 'drivers/scsi/libiscsi.c')
| -rw-r--r-- | drivers/scsi/libiscsi.c | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index d09926e6c8a8..797abf4f5399 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -678,7 +678,8 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,  	struct iscsi_task *task;  	itt_t itt; -	if (session->state == ISCSI_STATE_TERMINATE) +	if (session->state == ISCSI_STATE_TERMINATE || +	    !test_bit(ISCSI_CONN_FLAG_BOUND, &conn->flags))  		return NULL;  	if (opcode == ISCSI_OP_LOGIN || opcode == ISCSI_OP_TEXT) { @@ -1392,8 +1393,8 @@ static bool iscsi_set_conn_failed(struct iscsi_conn *conn)  	if (conn->stop_stage == 0)  		session->state = ISCSI_STATE_FAILED; -	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); -	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); +	set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags); +	set_bit(ISCSI_CONN_FLAG_SUSPEND_RX, &conn->flags);  	return true;  } @@ -1454,7 +1455,7 @@ static int iscsi_xmit_task(struct iscsi_conn *conn, struct iscsi_task *task,  	 * Do this after dropping the extra ref because if this was a requeue  	 * it's removed from that list and cleanup_queued_task would miss it.  	 */ -	if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { +	if (test_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags)) {  		/*  		 * Save the task and ref in case we weren't cleaning up this  		 * task and get woken up again. @@ -1532,7 +1533,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)  	int rc = 0;  	spin_lock_bh(&conn->session->frwd_lock); -	if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { +	if (test_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags)) {  		ISCSI_DBG_SESSION(conn->session, "Tx suspended!\n");  		spin_unlock_bh(&conn->session->frwd_lock);  		return -ENODATA; @@ -1746,7 +1747,7 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)  		goto fault;  	} -	if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) { +	if (test_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags)) {  		reason = FAILURE_SESSION_IN_RECOVERY;  		sc->result = DID_REQUEUE << 16;  		goto fault; @@ -1935,7 +1936,7 @@ static void fail_scsi_tasks(struct iscsi_conn *conn, u64 lun, int error)  void iscsi_suspend_queue(struct iscsi_conn *conn)  {  	spin_lock_bh(&conn->session->frwd_lock); -	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); +	set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);  	spin_unlock_bh(&conn->session->frwd_lock);  }  EXPORT_SYMBOL_GPL(iscsi_suspend_queue); @@ -1953,7 +1954,7 @@ void iscsi_suspend_tx(struct iscsi_conn *conn)  	struct Scsi_Host *shost = conn->session->host;  	struct iscsi_host *ihost = shost_priv(shost); -	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); +	set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);  	if (ihost->workq)  		flush_workqueue(ihost->workq);  } @@ -1961,7 +1962,7 @@ EXPORT_SYMBOL_GPL(iscsi_suspend_tx);  static void iscsi_start_tx(struct iscsi_conn *conn)  { -	clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); +	clear_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);  	iscsi_conn_queue_work(conn);  } @@ -2214,6 +2215,8 @@ void iscsi_conn_unbind(struct iscsi_cls_conn *cls_conn, bool is_active)  	iscsi_suspend_tx(conn);  	spin_lock_bh(&session->frwd_lock); +	clear_bit(ISCSI_CONN_FLAG_BOUND, &conn->flags); +  	if (!is_active) {  		/*  		 * if logout timed out before userspace could even send a PDU @@ -3045,7 +3048,6 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,  	if (!cls_conn)  		return NULL;  	conn = cls_conn->dd_data; -	memset(conn, 0, sizeof(*conn) + dd_size);  	conn->dd_data = cls_conn->dd_data + sizeof(*conn);  	conn->session = session; @@ -3318,6 +3320,8 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,  	spin_lock_bh(&session->frwd_lock);  	if (is_leading)  		session->leadconn = conn; + +	set_bit(ISCSI_CONN_FLAG_BOUND, &conn->flags);  	spin_unlock_bh(&session->frwd_lock);  	/* @@ -3330,8 +3334,8 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,  	/*  	 * Unblock xmitworker(), Login Phase will pass through.  	 */ -	clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx); -	clear_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); +	clear_bit(ISCSI_CONN_FLAG_SUSPEND_RX, &conn->flags); +	clear_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);  	return 0;  }  EXPORT_SYMBOL_GPL(iscsi_conn_bind);  | 
