linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / s390 / cio / blacklist.c
index 12c2d6b..cb8e2e6 100644 (file)
@@ -9,6 +9,7 @@
  *              Arnd Bergmann (arndb@de.ibm.com)
  */
 
+#include <linux/config.h>
 #include <linux/init.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
@@ -223,6 +224,39 @@ is_blacklisted (int ssid, int devno)
 }
 
 #ifdef CONFIG_PROC_FS
+static int
+__s390_redo_validation(struct subchannel_id schid, void *data)
+{
+       int ret;
+       struct subchannel *sch;
+
+       sch = get_subchannel_by_schid(schid);
+       if (sch) {
+               /* Already known. */
+               put_device(&sch->dev);
+               return 0;
+       }
+       ret = css_probe_device(schid);
+       if (ret == -ENXIO)
+               return ret; /* We're through. */
+       if (ret == -ENOMEM)
+               /* Stop validation for now. Bad, but no need for a panic. */
+               return ret;
+       return 0;
+}
+
+/*
+ * Function: s390_redo_validation
+ * Look for no longer blacklisted devices
+ * FIXME: there must be a better way to do this */
+static inline void
+s390_redo_validation (void)
+{
+       CIO_TRACE_EVENT (0, "redoval");
+
+       for_each_subchannel(__s390_redo_validation, NULL);
+}
+
 /*
  * Function: blacklist_parse_proc_parameters
  * parse the stuff which is piped to /proc/cio_ignore
@@ -247,7 +281,7 @@ blacklist_parse_proc_parameters (char *buf)
                return;
        }
 
-       css_schedule_reprobe();
+       s390_redo_validation ();
 }
 
 /* Iterator struct for all devices. */
@@ -380,11 +414,11 @@ cio_ignore_proc_init (void)
        entry = create_proc_entry ("cio_ignore", S_IFREG | S_IRUGO | S_IWUSR,
                                   &proc_root);
        if (!entry)
-               return -ENOENT;
+               return 0;
 
        entry->proc_fops = &cio_ignore_proc_fops;
 
-       return 0;
+       return 1;
 }
 
 __initcall (cio_ignore_proc_init);