These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / scsi / scsi_transport_iscsi.c
index 67d43e3..e4b3d8f 100644 (file)
@@ -204,6 +204,8 @@ iscsi_create_endpoint(int dd_size)
                                        iscsi_match_epid);
                if (!dev)
                        break;
+               else
+                       put_device(dev);
        }
        if (id == ISCSI_MAX_EPID) {
                printk(KERN_ERR "Too many connections. Max supported %u\n",
@@ -2040,6 +2042,7 @@ iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
        session->transport = transport;
        session->creator = -1;
        session->recovery_tmo = 120;
+       session->recovery_tmo_sysfs_override = false;
        session->state = ISCSI_SESSION_FREE;
        INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
        INIT_LIST_HEAD(&session->sess_list);
@@ -2784,7 +2787,8 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
        switch (ev->u.set_param.param) {
        case ISCSI_PARAM_SESS_RECOVERY_TMO:
                sscanf(data, "%d", &value);
-               session->recovery_tmo = value;
+               if (!session->recovery_tmo_sysfs_override)
+                       session->recovery_tmo = value;
                break;
        default:
                err = transport->set_param(conn, ev->u.set_param.param,
@@ -3035,7 +3039,7 @@ iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)
 
        shost = scsi_host_lookup(ev->u.get_chap.host_no);
        if (!shost) {
-               printk(KERN_ERR "%s: failed. Cound not find host no %u\n",
+               printk(KERN_ERR "%s: failed. Could not find host no %u\n",
                       __func__, ev->u.get_chap.host_no);
                return -ENODEV;
        }
@@ -4047,13 +4051,15 @@ store_priv_session_##field(struct device *dev,                          \
        if ((session->state == ISCSI_SESSION_FREE) ||                   \
            (session->state == ISCSI_SESSION_FAILED))                   \
                return -EBUSY;                                          \
-       if (strncmp(buf, "off", 3) == 0)                                \
+       if (strncmp(buf, "off", 3) == 0) {                              \
                session->field = -1;                                    \
-       else {                                                          \
+               session->field##_sysfs_override = true;                 \
+       } else {                                                        \
                val = simple_strtoul(buf, &cp, 0);                      \
                if (*cp != '\0' && *cp != '\n')                         \
                        return -EINVAL;                                 \
                session->field = val;                                   \
+               session->field##_sysfs_override = true;                 \
        }                                                               \
        return count;                                                   \
 }
@@ -4064,6 +4070,7 @@ store_priv_session_##field(struct device *dev,                            \
 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR,           \
                        show_priv_session_##field,                      \
                        store_priv_session_##field)
+
 iscsi_priv_session_rw_attr(recovery_tmo, "%d");
 
 static struct attribute *iscsi_session_attrs[] = {