From 10921a8f1305b8ec97794941db78b825db5839bc Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 10 Dec 2003 17:49:24 -0800 Subject: [PATCH] kobject: fix bug where a parent could be deleted before a child device. --- lib/kobject.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/kobject.c b/lib/kobject.c index ff65c0f2c98fc..51787be155526 100644 --- a/lib/kobject.c +++ b/lib/kobject.c @@ -236,8 +236,6 @@ static void unlink(struct kobject * kobj) list_del_init(&kobj->entry); up_write(&kobj->kset->subsys->rwsem); } - if (kobj->parent) - kobject_put(kobj->parent); kobject_put(kobj); } @@ -274,9 +272,11 @@ int kobject_add(struct kobject * kobj) kobj->parent = parent; error = create_dir(kobj); - if (error) + if (error) { unlink(kobj); - else { + if (parent) + kobject_put(parent); + } else { /* If this kobj does not belong to a kset, try to find a parent that does. */ top_kobj = kobj; @@ -452,6 +452,7 @@ void kobject_cleanup(struct kobject * kobj) { struct kobj_type * t = get_ktype(kobj); struct kset * s = kobj->kset; + struct kobject * parent = kobj->parent; pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); if (kobj->k_name != kobj->name) @@ -461,6 +462,8 @@ void kobject_cleanup(struct kobject * kobj) t->release(kobj); if (s) kset_put(s); + if (parent) + kobject_put(parent); } /** -- 2.53.0