X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fcio%2Fblacklist.c;fp=drivers%2Fs390%2Fcio%2Fblacklist.c;h=cb8e2e672b68664680dddf99832ec9940d980f66;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=12c2d6b746e697b5e017d6414f2281a509aae1ff;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 12c2d6b74..cb8e2e672 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c @@ -9,6 +9,7 @@ * Arnd Bergmann (arndb@de.ibm.com) */ +#include #include #include #include @@ -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);