Commit 10921a8f authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

kobject: fix bug where a parent could be deleted before a child device.

parent 96ce7527
...@@ -236,8 +236,6 @@ static void unlink(struct kobject * kobj) ...@@ -236,8 +236,6 @@ static void unlink(struct kobject * kobj)
list_del_init(&kobj->entry); list_del_init(&kobj->entry);
up_write(&kobj->kset->subsys->rwsem); up_write(&kobj->kset->subsys->rwsem);
} }
if (kobj->parent)
kobject_put(kobj->parent);
kobject_put(kobj); kobject_put(kobj);
} }
...@@ -274,9 +272,11 @@ int kobject_add(struct kobject * kobj) ...@@ -274,9 +272,11 @@ int kobject_add(struct kobject * kobj)
kobj->parent = parent; kobj->parent = parent;
error = create_dir(kobj); error = create_dir(kobj);
if (error) if (error) {
unlink(kobj); unlink(kobj);
else { if (parent)
kobject_put(parent);
} else {
/* If this kobj does not belong to a kset, /* If this kobj does not belong to a kset,
try to find a parent that does. */ try to find a parent that does. */
top_kobj = kobj; top_kobj = kobj;
...@@ -452,6 +452,7 @@ void kobject_cleanup(struct kobject * kobj) ...@@ -452,6 +452,7 @@ void kobject_cleanup(struct kobject * kobj)
{ {
struct kobj_type * t = get_ktype(kobj); struct kobj_type * t = get_ktype(kobj);
struct kset * s = kobj->kset; struct kset * s = kobj->kset;
struct kobject * parent = kobj->parent;
pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
if (kobj->k_name != kobj->name) if (kobj->k_name != kobj->name)
...@@ -461,6 +462,8 @@ void kobject_cleanup(struct kobject * kobj) ...@@ -461,6 +462,8 @@ void kobject_cleanup(struct kobject * kobj)
t->release(kobj); t->release(kobj);
if (s) if (s)
kset_put(s); kset_put(s);
if (parent)
kobject_put(parent);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment