e4c9072
From 9c8108a4d3a837c51a29f28229a06d97654eaeb6 Mon Sep 17 00:00:00 2001
e4c9072
From: Chris Leech <cleech@redhat.com>
e4c9072
Date: Tue, 16 Jun 2015 16:07:13 -0700
e4c9072
Subject: iSCSI: let session recovery_tmo sysfs writes persist across recovery
e4c9072
e4c9072
The iSCSI session recovery_tmo setting is writeable in sysfs, but it's
e4c9072
also set every time a connection is established when parameters are set
e4c9072
from iscsid over netlink.  That results in the timeout being reset to
e4c9072
the default value after every recovery.
e4c9072
e4c9072
The DM multipath tools want to use the sysfs interface to lower the
e4c9072
default timeout when there are multiple paths to fail over.  It has
e4c9072
caused confusion that we have a writeable sysfs value that seem to keep
e4c9072
resetting itself.
e4c9072
e4c9072
This patch adds an in-kernel flag that gets set once a sysfs write
e4c9072
occurs, and then ignores netlink parameter setting once it's been
e4c9072
modified via the sysfs interface.  My thinking here is that the sysfs
e4c9072
interface is much simpler for external tools to influence the session
e4c9072
timeout, but if we're going to allow it to be modified directly we
e4c9072
should ensure that setting is maintained.
e4c9072
e4c9072
Signed-off-by: Chris Leech <cleech@redhat.com>
e4c9072
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
e4c9072
Signed-off-by: James Bottomley <JBottomley@Odin.com>
e4c9072
e4c9072
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
e4c9072
index 55647aa..4c25539 100644
e4c9072
--- a/drivers/scsi/scsi_transport_iscsi.c
e4c9072
+++ b/drivers/scsi/scsi_transport_iscsi.c
e4c9072
@@ -2042,6 +2042,7 @@ iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
e4c9072
 	session->transport = transport;
e4c9072
 	session->creator = -1;
e4c9072
 	session->recovery_tmo = 120;
e4c9072
+	session->recovery_tmo_sysfs_override = false;
e4c9072
 	session->state = ISCSI_SESSION_FREE;
e4c9072
 	INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
e4c9072
 	INIT_LIST_HEAD(&session->sess_list);
e4c9072
@@ -2786,7 +2787,8 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
e4c9072
 	switch (ev->u.set_param.param) {
e4c9072
 	case ISCSI_PARAM_SESS_RECOVERY_TMO:
e4c9072
 		sscanf(data, "%d", &value);
e4c9072
-		session->recovery_tmo = value;
e4c9072
+		if (!session->recovery_tmo_sysfs_override)
e4c9072
+			session->recovery_tmo = value;
e4c9072
 		break;
e4c9072
 	default:
e4c9072
 		err = transport->set_param(conn, ev->u.set_param.param,
e4c9072
@@ -4049,13 +4051,15 @@ store_priv_session_##field(struct device *dev,				\
e4c9072
 	if ((session->state == ISCSI_SESSION_FREE) ||			\
e4c9072
 	    (session->state == ISCSI_SESSION_FAILED))			\
e4c9072
 		return -EBUSY;						\
e4c9072
-	if (strncmp(buf, "off", 3) == 0)				\
e4c9072
+	if (strncmp(buf, "off", 3) == 0) {				\
e4c9072
 		session->field = -1;					\
e4c9072
-	else {								\
e4c9072
+		session->field##_sysfs_override = true;			\
e4c9072
+	} else {							\
e4c9072
 		val = simple_strtoul(buf, &cp, 0);			\
e4c9072
 		if (*cp != '\0' && *cp != '\n')				\
e4c9072
 			return -EINVAL;					\
e4c9072
 		session->field = val;					\
e4c9072
+		session->field##_sysfs_override = true;			\
e4c9072
 	}								\
e4c9072
 	return count;							\
e4c9072
 }
e4c9072
@@ -4066,6 +4070,7 @@ store_priv_session_##field(struct device *dev,				\
e4c9072
 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR,		\
e4c9072
 			show_priv_session_##field,			\
e4c9072
 			store_priv_session_##field)
e4c9072
+
e4c9072
 iscsi_priv_session_rw_attr(recovery_tmo, "%d");
e4c9072
 
e4c9072
 static struct attribute *iscsi_session_attrs[] = {
e4c9072
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
e4c9072
index 2555ee5..6183d20 100644
e4c9072
--- a/include/scsi/scsi_transport_iscsi.h
e4c9072
+++ b/include/scsi/scsi_transport_iscsi.h
e4c9072
@@ -241,6 +241,7 @@ struct iscsi_cls_session {
e4c9072
 
e4c9072
 	/* recovery fields */
e4c9072
 	int recovery_tmo;
e4c9072
+	bool recovery_tmo_sysfs_override;
e4c9072
 	struct delayed_work recovery_work;
e4c9072
 
e4c9072
 	unsigned int target_id;
e4c9072
-- 
e4c9072
cgit v0.10.2
e4c9072