diff options
Diffstat (limited to 'drivers/scsi/scsi_transport_iscsi.c')
| -rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 28 | 
1 files changed, 26 insertions, 2 deletions
| diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 91074fd97f64..441f0152193f 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -2474,9 +2474,22 @@ static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)  	 * it works.  	 */  	mutex_lock(&conn_mutex); +	switch (flag) { +	case STOP_CONN_RECOVER: +		conn->state = ISCSI_CONN_FAILED; +		break; +	case STOP_CONN_TERM: +		conn->state = ISCSI_CONN_DOWN; +		break; +	default: +		iscsi_cls_conn_printk(KERN_ERR, conn, +				      "invalid stop flag %d\n", flag); +		goto unlock; +	} +  	conn->transport->stop_conn(conn, flag); +unlock:  	mutex_unlock(&conn_mutex); -  }  static void stop_conn_work_fn(struct work_struct *work) @@ -2901,6 +2914,13 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)  	default:  		err = transport->set_param(conn, ev->u.set_param.param,  					   data, ev->u.set_param.len); +		if ((conn->state == ISCSI_CONN_BOUND) || +			(conn->state == ISCSI_CONN_UP)) { +			err = transport->set_param(conn, ev->u.set_param.param, +					data, ev->u.set_param.len); +		} else { +			return -ENOTCONN; +		}  	}  	return err; @@ -2960,6 +2980,7 @@ static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,  		mutex_lock(&conn->ep_mutex);  		conn->ep = NULL;  		mutex_unlock(&conn->ep_mutex); +		conn->state = ISCSI_CONN_FAILED;  	}  	transport->ep_disconnect(ep); @@ -3727,6 +3748,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)  		ev->r.retcode =	transport->bind_conn(session, conn,  						ev->u.b_conn.transport_eph,  						ev->u.b_conn.is_leading); +		if (!ev->r.retcode) +			conn->state = ISCSI_CONN_BOUND;  		mutex_unlock(&conn_mutex);  		if (ev->r.retcode || !transport->ep_connect) @@ -3966,7 +3989,8 @@ iscsi_conn_attr(local_ipaddr, ISCSI_PARAM_LOCAL_IPADDR);  static const char *const connection_state_names[] = {  	[ISCSI_CONN_UP] = "up",  	[ISCSI_CONN_DOWN] = "down", -	[ISCSI_CONN_FAILED] = "failed" +	[ISCSI_CONN_FAILED] = "failed", +	[ISCSI_CONN_BOUND] = "bound"  };  static ssize_t show_conn_state(struct device *dev, | 
