Commit 57fbdb15 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull SCSI fix from James Bottomley:
 "A single fix to iscsi for a rare race condition which can cause a
  kernel panic"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: iscsi: Fix race condition between login and sync thread
parents d93a0d43 9e67600e
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -2475,6 +2475,7 @@ static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)
	 */
	mutex_lock(&conn_mutex);
	conn->transport->stop_conn(conn, flag);
	conn->state = ISCSI_CONN_DOWN;
	mutex_unlock(&conn_mutex);

}
@@ -2901,6 +2902,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 +2968,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_DOWN;
	}

	transport->ep_disconnect(ep);
@@ -3727,6 +3736,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 +3977,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,
+1 −0
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ enum iscsi_connection_state {
	ISCSI_CONN_UP = 0,
	ISCSI_CONN_DOWN,
	ISCSI_CONN_FAILED,
	ISCSI_CONN_BOUND,
};

struct iscsi_cls_conn {