linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Subject: [PATCH] kobject: fix the race between kobject_del and get_device_parent
@ 2014-10-15  6:42 Weng Meiling
  2014-10-16  1:56 ` Weng Meiling
  0 siblings, 1 reply; 13+ messages in thread
From: Weng Meiling @ 2014-10-15  6:42 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org
  Cc: Greg KH, tj, Jens Axboe, Xiang Rui, Li Zefan, Huang Qiang,
	Zhao Hongjiang

When the last child kobject was deleted, it's parent kobject will be deleted,
when removing the parent kobject if the parent kobject's sd has been set NULL
and still not been removed from it's kset's list, at the same time another one
trigger an device adding event, the function get_parent_device() will get the
parent object from the kset's list for kobject_add(), but this time parent
kobject's sd has been NULL. This race will make the sysfs_create_dir() return
ENOENT, the new kobject will be failed to added into sysfs and trigger BUG()
when creating attribute group under the new device's directory. So move the
kobject removal from kset's list before kobj->sd=NULL.

The race situation:

path0(remove parent kobj, e.g:/sys/devices/virtual/block/)   path1(register a new device)

kobject_del(){                                               get_device_parent(){
...                                                          ...
sysfs_remove_dir(kobj);  //kobj->sd=NULL                     spin_lock(&dev->class->p->glue_dirs.list_lock);
...                                                  <===    list_for_each_entry(k, &dev->class->p->glue_dirs.list, entry)
kobj_kset_leave(kobj);   //remove kobj from kset list        ...
}                                                           }


We had triggered the bug, the detail message link:
https://lkml.org/lkml/2014/10/13/40

Signed-off-by: Weng Meiling <wengmeiling.weng@huawei.com>
---
 lib/kobject.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/kobject.c b/lib/kobject.c
index 58751bb..af2b7bb 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -560,12 +560,13 @@ void kobject_del(struct kobject *kobj)
 	if (!kobj)
 		return;

+	kobj_kset_leave(kobj);
+
 	sd = kobj->sd;
 	sysfs_remove_dir(kobj);
 	sysfs_put(sd);

 	kobj->state_in_sysfs = 0;
-	kobj_kset_leave(kobj);
 	kobject_put(kobj->parent);
 	kobj->parent = NULL;
 }
-- 
1.8.2.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2014-11-05  5:14 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-15  6:42 Subject: [PATCH] kobject: fix the race between kobject_del and get_device_parent Weng Meiling
2014-10-16  1:56 ` Weng Meiling
2014-10-16  7:07   ` Frans Klaver
2014-10-16  7:23     ` Weng Meiling
2014-10-16  9:13       ` Greg KH
2014-10-22  8:07         ` Weng Meiling
2014-11-04 19:15           ` Tejun Heo
2014-11-05  2:01             ` Yijing Wang
2014-11-05  3:13               ` Tejun Heo
2014-11-05  3:27                 ` Yijing Wang
2014-11-05  3:29                   ` Tejun Heo
2014-11-05  3:52                     ` Greg KH
2014-11-05  5:14                       ` Yijing Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).