[PATCH 12/15] EDAC: fix usage of kobject_init(), kobject_put()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



- Remove calls to kobject_init().  These are unnecessary because
  kobject_register() calls kobject_init().

- Remove extra calls to kobject_put().  When we call
  kobject_unregister(), this releases our reference to the kobject.
  The extra calls to kobject_put() may cause the reference count to
  drop to 0 while a kobject is still in use.

Signed-Off-By: David S. Peterson <[email protected]> <[email protected]>
---

Index: linux-2.6.16-rc5-edac/drivers/edac/edac_mc.c
===================================================================
--- linux-2.6.16-rc5-edac.orig/drivers/edac/edac_mc.c	2006-02-27 17:06:37.000000000 -0800
+++ linux-2.6.16-rc5-edac/drivers/edac/edac_mc.c	2006-02-27 17:07:06.000000000 -0800
@@ -261,8 +261,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;
 
@@ -295,9 +293,6 @@ static void edac_sysfs_memctrl_teardown(
 	/* 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);
 }
@@ -562,8 +557,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;
 
@@ -586,7 +579,6 @@ static void edac_sysfs_pci_teardown(void
 	debugf0("%s()\n", __func__);
 
 	kobject_unregister(&edac_pci_kobj);
-	kobject_put(&edac_pci_kobj);
 }
 
 /* EDAC sysfs CSROW data structures and methods */
@@ -793,7 +785,6 @@ static int edac_create_csrow_object(stru
 
 	/* generate ..../edac/mc/mc<id>/csrow<index>   */
 
-	kobject_init(&csrow->kobj);
 	csrow->kobj.parent = edac_mci_kobj;
 	csrow->kobj.ktype = &ktype_csrow;
 
@@ -1061,7 +1052,6 @@ static int edac_create_sysfs_mci_device(
 	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);
@@ -1080,10 +1070,8 @@ static int edac_create_sysfs_mci_device(
 	/* 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
@@ -1096,7 +1084,7 @@ static int edac_create_sysfs_mci_device(
 		if (csrow->nr_pages > 0) {
 			err = edac_create_csrow_object(edac_mci_kobj,csrow,i);
 			if (err)
-				goto fail;
+				goto fail1;
 		}
 	}
 
@@ -1107,16 +1095,14 @@ static int edac_create_sysfs_mci_device(
 
 
 	/* 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;
 }
@@ -1132,16 +1118,13 @@ static void edac_remove_sysfs_mci_device
 
 	/* 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);
 }
 
 /* END OF sysfs data and methods */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux