Kobject: drop child->parent ref at unregistration
[linux-2.6-microblaze.git] / lib / kobject.c
index 1015f74..493e991 100644 (file)
@@ -149,12 +149,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);
 }
 
 /**
@@ -208,7 +212,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)
@@ -590,7 +593,6 @@ static void kobject_cleanup(struct kobject *kobj)
 {
        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' (%p): %s\n",
@@ -604,7 +606,6 @@ static void kobject_cleanup(struct kobject *kobj)
        }
        if (s)
                kset_put(s);
-       kobject_put(parent);
 }
 
 static void kobject_release(struct kref *kref)