- kobjects-drop-child-parent-ref-at-unregistration.patch removed from -mm tree

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

 



The patch titled
     Kobjects: drop child->parent ref at unregistration
has been removed from the -mm tree.  Its filename was
     kobjects-drop-child-parent-ref-at-unregistration.patch

This patch was dropped because an updated version will be merged

------------------------------------------------------
Subject: Kobjects: drop child->parent ref at unregistration
From: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>

This patch (as1015) reverts changes that were made to the driver core about
four years ago.  The intent back then was to avoid certain kinds of invalid
memory accesses by leaving kernel objects allocated as long as any of their
children were still allocated.  The original and correct approach was to
wait only as long as any children were still _registered_; that's what this
patch reinstates.

This fixes a problem in the SCSI core made visible by the class_device to
regular device conversion: A reference loop (scsi_device holds reference to
request_queue, which is the child of a gendisk, which is the child of the
scsi_device) prevents the data structures from being released, even though
they are deregistered okay.

It's possible that this change will cause a few bugs to surface, things
that have been hidden for several years.  They can be fixed easily enough
by having the child device take an explicit reference to the parent
whenever needed.

Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
Cc: Greg KH <greg@xxxxxxxxx>
Cc: Kay Sievers <kay.sievers@xxxxxxxx>
Cc: Tejun Heo <htejun@xxxxxxxxx>
Cc: Cornelia Huck <cornelia.huck@xxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 lib/kobject.c |    7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff -puN lib/kobject.c~kobjects-drop-child-parent-ref-at-unregistration lib/kobject.c
--- a/lib/kobject.c~kobjects-drop-child-parent-ref-at-unregistration
+++ a/lib/kobject.c
@@ -206,12 +206,16 @@ void kobject_init(struct kobject * kobj)
 
 static void unlink(struct kobject * kobj)
 {
+	struct kobject *parent = kobj->parent;
+
 	if (kobj->kset) {
 		spin_lock(&kobj->kset->list_lock);
 		list_del_init(&kobj->entry);
 		spin_unlock(&kobj->kset->list_lock);
 	}
+	kobj->parent = NULL;
 	kobject_put(kobj);
+	kobject_put(parent);
 }
 
 /**
@@ -262,7 +266,6 @@ int kobject_add(struct kobject * kobj)
 	if (error) {
 		/* unlink does the kobject_put() for us */
 		unlink(kobj);
-		kobject_put(parent);
 
 		/* be noisy on error issues */
 		if (error == -EEXIST)
@@ -516,7 +519,6 @@ void kobject_cleanup(struct kobject * ko
 {
 	struct kobj_type * t = get_ktype(kobj);
 	struct kset * s = kobj->kset;
-	struct kobject * parent = kobj->parent;
 	const char *name = kobj->k_name;
 
 	pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
@@ -533,7 +535,6 @@ void kobject_cleanup(struct kobject * ko
 	}
 	if (s)
 		kset_put(s);
-	kobject_put(parent);
 }
 
 static void kobject_release(struct kref *kref)
_

Patches currently in -mm which might be from stern@xxxxxxxxxxxxxxxxxxx are

git-acpi.patch
kobjects-drop-child-parent-ref-at-unregistration.patch
ohci-hcdcohci_irq-locking-fix.patch
scsi-early-detection-of-medium-not-present-updated.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux