[SCSI] lpfc 8.2.8 : Add support for PCI-EEH permanent disabling
[safe/jmp/linux-2.6] / drivers / scsi / scsi_transport_iscsi.c
index 9fd5c6d..cbaae48 100644 (file)
@@ -34,7 +34,7 @@
 #define ISCSI_CONN_ATTRS 13
 #define ISCSI_HOST_ATTRS 4
 
-#define ISCSI_TRANSPORT_VERSION "2.0-869"
+#define ISCSI_TRANSPORT_VERSION "2.0-870"
 
 struct iscsi_internal {
        int daemon_pid;
@@ -170,7 +170,7 @@ iscsi_create_endpoint(int dd_size)
        int err;
 
        for (id = 1; id < ISCSI_MAX_EPID; id++) {
-               dev = class_find_device(&iscsi_endpoint_class, &id,
+               dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
                                        iscsi_match_epid);
                if (!dev)
                        break;
@@ -219,14 +219,21 @@ EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint);
 
 struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
 {
+       struct iscsi_endpoint *ep;
        struct device *dev;
 
-       dev = class_find_device(&iscsi_endpoint_class, &handle,
+       dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
                                iscsi_match_epid);
        if (!dev)
                return NULL;
 
-       return iscsi_dev_to_endpoint(dev);
+       ep = iscsi_dev_to_endpoint(dev);
+       /*
+        * we can drop this now because the interface will prevent
+        * removals and lookups from racing.
+        */
+       put_device(dev);
+       return ep;
 }
 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint);
 
@@ -240,8 +247,8 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
        atomic_set(&ihost->nr_scans, 0);
        mutex_init(&ihost->mutex);
 
-       snprintf(ihost->scan_workq_name, KOBJ_NAME_LEN, "iscsi_scan_%d",
-               shost->host_no);
+       snprintf(ihost->scan_workq_name, sizeof(ihost->scan_workq_name),
+                "iscsi_scan_%d", shost->host_no);
        ihost->scan_workq = create_singlethread_workqueue(
                                                ihost->scan_workq_name);
        if (!ihost->scan_workq)
@@ -367,10 +374,10 @@ int iscsi_session_chkready(struct iscsi_cls_session *session)
                err = 0;
                break;
        case ISCSI_SESSION_FAILED:
-               err = DID_IMM_RETRY << 16;
+               err = DID_TRANSPORT_DISRUPTED << 16;
                break;
        case ISCSI_SESSION_FREE:
-               err = DID_NO_CONNECT << 16;
+               err = DID_TRANSPORT_FAILFAST << 16;
                break;
        default:
                err = DID_NO_CONNECT << 16;
@@ -1354,7 +1361,7 @@ iscsi_tgt_dscvr(struct iscsi_transport *transport,
                return -EINVAL;
 
        shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
-       if (IS_ERR(shost)) {
+       if (!shost) {
                printk(KERN_ERR "target discovery could not find host no %u\n",
                       ev->u.tgt_dscvr.host_no);
                return -ENODEV;
@@ -1380,7 +1387,7 @@ iscsi_set_host_param(struct iscsi_transport *transport,
                return -ENOSYS;
 
        shost = scsi_host_lookup(ev->u.set_host_param.host_no);
-       if (IS_ERR(shost)) {
+       if (!shost) {
                printk(KERN_ERR "set_host_param could not find host no %u\n",
                       ev->u.set_host_param.host_no);
                return -ENODEV;
@@ -1422,8 +1429,10 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                break;
        case ISCSI_UEVENT_CREATE_BOUND_SESSION:
                ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle);
-               if (!ep)
-                       return -EINVAL;
+               if (!ep) {
+                       err = -EINVAL;
+                       break;
+               }
 
                err = iscsi_if_create_session(priv, ep, ev,
                                        ev->u.c_bound_session.initial_cmdsn,