[PARISC] pdc_stable: More robust sysfs error checking
authorThibaut VARENE <varenet@parisc-linux.org>
Wed, 11 Jan 2006 01:48:01 +0000 (20:48 -0500)
committerKyle McMartin <kyle@duet.int.mcmartin.ca>
Wed, 11 Jan 2006 02:52:36 +0000 (21:52 -0500)
pdc_stable 0.10:
As mentioned on LKML, pdc_stable wasn't checky enough on the return
values of some calls. This patch makes it more robust to errors when
registering objects in sysfs.

Signed-off-by: Thibaut VARENE <varenet@parisc-linux.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
drivers/parisc/pdc_stable.c

index 11750cb..38bdca2 100644 (file)
@@ -56,7 +56,7 @@
 #include <asm/uaccess.h>
 #include <asm/hardware.h>
 
-#define PDCS_VERSION   "0.09"
+#define PDCS_VERSION   "0.10"
 
 #define PDCS_ADDR_PPRI 0x00
 #define PDCS_ADDR_OSID 0x40
@@ -194,7 +194,8 @@ pdcspath_store(struct pdcspath_entry *entry)
                return -EIO;
        }
                
-       entry->ready = 1;
+       /* kobject is already registered */
+       entry->ready = 2;
        
        DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
        
@@ -653,15 +654,21 @@ pdcs_register_pathentries(void)
 {
        unsigned short i;
        struct pdcspath_entry *entry;
+       int err;
        
        for (i = 0; (entry = pdcspath_entries[i]); i++) {
                if (pdcspath_fetch(entry) < 0)
                        continue;
 
-               kobject_set_name(&entry->kobj, "%s", entry->name);
+               if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
+                       return err;
                kobj_set_kset_s(entry, paths_subsys);
-               kobject_register(&entry->kobj);
-
+               if ((err = kobject_register(&entry->kobj)))
+                       return err;
+               
+               /* kobject is now registered */
+               entry->ready = 2;
+               
                if (!entry->dev)
                        continue;
 
@@ -675,14 +682,14 @@ pdcs_register_pathentries(void)
 /**
  * pdcs_unregister_pathentries - Routine called when unregistering the module.
  */
-static inline void __exit
+static inline void
 pdcs_unregister_pathentries(void)
 {
        unsigned short i;
        struct pdcspath_entry *entry;
        
        for (i = 0; (entry = pdcspath_entries[i]); i++)
-               if (entry->ready)
+               if (entry->ready >= 2)
                        kobject_unregister(&entry->kobj);       
 }
 
@@ -704,7 +711,7 @@ pdc_stable_init(void)
 
        /* For now we'll register the pdc subsys within this driver */
        if ((rc = firmware_register(&pdc_subsys)))
-               return rc;
+               goto fail_firmreg;
 
        /* Don't forget the info entry */
        for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
@@ -713,12 +720,25 @@ pdc_stable_init(void)
        
        /* register the paths subsys as a subsystem of pdc subsys */
        kset_set_kset_s(&paths_subsys, pdc_subsys);
-       subsystem_register(&paths_subsys);
+       if ((rc= subsystem_register(&paths_subsys)))
+               goto fail_subsysreg;
 
        /* now we create all "files" for the paths subsys */
-       pdcs_register_pathentries();
+       if ((rc = pdcs_register_pathentries()))
+               goto fail_pdcsreg;
+
+       return rc;
        
-       return 0;
+fail_pdcsreg:
+       pdcs_unregister_pathentries();
+       subsystem_unregister(&paths_subsys);
+       
+fail_subsysreg:
+       firmware_unregister(&pdc_subsys);
+       
+fail_firmreg:
+       printk(KERN_INFO "PDC Stable Storage bailing out\n");
+       return rc;
 }
 
 static void __exit