]> err.no Git - linux-2.6/blobdiff - drivers/edac/edac_mc.c
[PATCH] EDAC: kobject_init/kobject_put fixes
[linux-2.6] / drivers / edac / edac_mc.c
index eac09cc86aac31cd8eec718d84b15e0cb3bd02be..e6ecc7da38a5cb0fa9921de062b8cc10fac996d8 100644 (file)
@@ -278,8 +278,6 @@ static int edac_sysfs_memctrl_setup(void)
        if (!err) {
                /* Init the MC's kobject */
                memset(&edac_memctrl_kobj, 0, sizeof (edac_memctrl_kobj));
-               kobject_init(&edac_memctrl_kobj);
-
                edac_memctrl_kobj.parent = &edac_class.kset.kobj;
                edac_memctrl_kobj.ktype = &ktype_memctrl;
 
@@ -314,9 +312,6 @@ static void edac_sysfs_memctrl_teardown(void)
        /* Unregister the MC's kobject */
        kobject_unregister(&edac_memctrl_kobj);
 
-       /* release the master edac mc kobject */
-       kobject_put(&edac_memctrl_kobj);
-
        /* Unregister the 'edac' object */
        sysdev_class_unregister(&edac_class);
 #endif  /* DISABLE_EDAC_SYSFS */
@@ -594,8 +589,6 @@ static int edac_sysfs_pci_setup(void)
        debugf1("%s()\n", __func__);
 
        memset(&edac_pci_kobj, 0, sizeof(edac_pci_kobj));
-
-       kobject_init(&edac_pci_kobj);
        edac_pci_kobj.parent = &edac_class.kset.kobj;
        edac_pci_kobj.ktype = &ktype_edac_pci;
 
@@ -619,7 +612,6 @@ static void edac_sysfs_pci_teardown(void)
        debugf0("%s()\n", __func__);
 
        kobject_unregister(&edac_pci_kobj);
-       kobject_put(&edac_pci_kobj);
 #endif
 }
 
@@ -829,7 +821,6 @@ static int edac_create_csrow_object(struct kobject *edac_mci_kobj,
 
        /* generate ..../edac/mc/mc<id>/csrow<index>   */
 
-       kobject_init(&csrow->kobj);
        csrow->kobj.parent = edac_mci_kobj;
        csrow->kobj.ktype = &ktype_csrow;
 
@@ -1104,7 +1095,6 @@ static int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
        debugf0("%s() idx=%d\n", __func__, mci->mc_idx);
 
        memset(edac_mci_kobj, 0, sizeof(*edac_mci_kobj));
-       kobject_init(edac_mci_kobj);
 
        /* set the name of the mc<id> object */
        err = kobject_set_name(edac_mci_kobj,"mc%d",mci->mc_idx);
@@ -1123,10 +1113,8 @@ static int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
        /* create a symlink for the device */
        err = sysfs_create_link(edac_mci_kobj, &mci->pdev->dev.kobj,
                                EDAC_DEVICE_SYMLINK);
-       if (err) {
-               kobject_unregister(edac_mci_kobj);
-               return err;
-       }
+       if (err)
+               goto fail0;
 
        /* Make directories for each CSROW object
         * under the mc<id> kobject
@@ -1139,7 +1127,7 @@ static int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
                if (csrow->nr_pages > 0) {
                        err = edac_create_csrow_object(edac_mci_kobj,csrow,i);
                        if (err)
-                               goto fail;
+                               goto fail1;
                }
        }
 
@@ -1150,16 +1138,14 @@ static int edac_create_sysfs_mci_device(struct mem_ctl_info *mci)
 
 
        /* CSROW error: backout what has already been registered,  */
-fail:
+fail1:
        for ( i--; i >= 0; i--) {
-               if (csrow->nr_pages > 0) {
+               if (csrow->nr_pages > 0)
                        kobject_unregister(&mci->csrows[i].kobj);
-                       kobject_put(&mci->csrows[i].kobj);
-               }
        }
 
+fail0:
        kobject_unregister(edac_mci_kobj);
-       kobject_put(edac_mci_kobj);
 
        return err;
 }
@@ -1177,16 +1163,13 @@ static void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
 
        /* remove all csrow kobjects */
        for (i = 0; i < mci->nr_csrows; i++) {
-               if (mci->csrows[i].nr_pages > 0)  {
+               if (mci->csrows[i].nr_pages > 0)
                        kobject_unregister(&mci->csrows[i].kobj);
-                       kobject_put(&mci->csrows[i].kobj);
-               }
        }
 
        sysfs_remove_link(&mci->edac_mci_kobj, EDAC_DEVICE_SYMLINK);
 
        kobject_unregister(&mci->edac_mci_kobj);
-       kobject_put(&mci->edac_mci_kobj);
 #endif  /* DISABLE_EDAC_SYSFS */
 }
 
@@ -1451,6 +1434,24 @@ static int add_mc_to_global_list (struct mem_ctl_info *mci)
 }
 
 
+static void complete_mc_list_del (struct rcu_head *head)
+{
+       struct mem_ctl_info *mci;
+
+       mci = container_of(head, struct mem_ctl_info, rcu);
+       INIT_LIST_HEAD(&mci->link);
+       complete(&mci->complete);
+}
+
+
+static void del_mc_from_global_list (struct mem_ctl_info *mci)
+{
+       list_del_rcu(&mci->link);
+       init_completion(&mci->complete);
+       call_rcu(&mci->rcu, complete_mc_list_del);
+       wait_for_completion(&mci->complete);
+}
+
 
 EXPORT_SYMBOL(edac_mc_add_mc);
 
@@ -1466,8 +1467,6 @@ EXPORT_SYMBOL(edac_mc_add_mc);
 /* FIXME - should a warning be printed if no error detection? correction? */
 int edac_mc_add_mc(struct mem_ctl_info *mci)
 {
-       int rc = 1;
-
        debugf0("%s()\n", __func__);
 #ifdef CONFIG_EDAC_DEBUG
        if (edac_debug_level >= 3)
@@ -1487,7 +1486,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
        down(&mem_ctls_mutex);
 
        if (add_mc_to_global_list(mci))
-               goto finish;
+               goto fail0;
 
        /* set load time so that error rate can be tracked */
        mci->start_time = jiffies;
@@ -1495,39 +1494,24 @@ int edac_mc_add_mc(struct mem_ctl_info *mci)
         if (edac_create_sysfs_mci_device(mci)) {
                 edac_mc_printk(mci, KERN_WARNING,
                        "failed to create sysfs device\n");
-               /* FIXME - should there be an error code and unwind? */
-                goto finish;
+                goto fail1;
         }
 
        /* Report action taken */
        edac_mc_printk(mci, KERN_INFO, "Giving out device to %s %s: PCI %s\n",
                mci->mod_name, mci->ctl_name, pci_name(mci->pdev));
 
-       rc = 0;
-
-finish:
        up(&mem_ctls_mutex);
-       return rc;
-}
-
-
+       return 0;
 
-static void complete_mc_list_del (struct rcu_head *head)
-{
-       struct mem_ctl_info *mci;
+fail1:
+       del_mc_from_global_list(mci);
 
-       mci = container_of(head, struct mem_ctl_info, rcu);
-       INIT_LIST_HEAD(&mci->link);
-       complete(&mci->complete);
+fail0:
+       up(&mem_ctls_mutex);
+       return 1;
 }
 
-static void del_mc_from_global_list (struct mem_ctl_info *mci)
-{
-       list_del_rcu(&mci->link);
-       init_completion(&mci->complete);
-       call_rcu(&mci->rcu, complete_mc_list_del);
-       wait_for_completion(&mci->complete);
-}
 
 EXPORT_SYMBOL(edac_mc_del_mc);