diff options
author | Tejun Heo <htejun@gmail.com> | 2007-06-13 14:45:15 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-11 19:09:04 -0400 |
commit | aecdcedaab49ca40620dc7dd70f67ee7269a66c9 (patch) | |
tree | df1faa0302e6fb428b7ae0a14d443626fd73b121 /fs/sysfs/dir.c | |
parent | 3e5190380ebef77f2b015c9e7a4ca225a3d75021 (diff) |
sysfs: implement kobj_sysfs_assoc_lock
kobj->dentry can go away anytime unless the user controls when the
associated sysfs node is deleted. This patch implements
kobj_sysfs_assoc_lock which protects kobj->dentry. This will be used
to maintain kobj based API when converting sysfs to use sysfs_dirent
tree instead of dentry/kobject.
Note that this lock belongs to kobject/driver-model not sysfs. Once
sysfs is converted to not use kobject in its interface, this can be
removed from sysfs.
This is in preparation of object reference simplification.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r-- | fs/sysfs/dir.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 079122695675..e9fddcc59447 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | DECLARE_RWSEM(sysfs_rename_sem); | 16 | DECLARE_RWSEM(sysfs_rename_sem); |
17 | spinlock_t sysfs_lock = SPIN_LOCK_UNLOCKED; | 17 | spinlock_t sysfs_lock = SPIN_LOCK_UNLOCKED; |
18 | spinlock_t kobj_sysfs_assoc_lock = SPIN_LOCK_UNLOCKED; | ||
18 | 19 | ||
19 | static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED; | 20 | static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED; |
20 | static DEFINE_IDA(sysfs_ino_ida); | 21 | static DEFINE_IDA(sysfs_ino_ida); |
@@ -426,8 +427,13 @@ static void __sysfs_remove_dir(struct dentry *dentry) | |||
426 | 427 | ||
427 | void sysfs_remove_dir(struct kobject * kobj) | 428 | void sysfs_remove_dir(struct kobject * kobj) |
428 | { | 429 | { |
429 | __sysfs_remove_dir(kobj->dentry); | 430 | struct dentry *d = kobj->dentry; |
431 | |||
432 | spin_lock(&kobj_sysfs_assoc_lock); | ||
430 | kobj->dentry = NULL; | 433 | kobj->dentry = NULL; |
434 | spin_unlock(&kobj_sysfs_assoc_lock); | ||
435 | |||
436 | __sysfs_remove_dir(d); | ||
431 | } | 437 | } |
432 | 438 | ||
433 | int sysfs_rename_dir(struct kobject * kobj, struct dentry *new_parent, | 439 | int sysfs_rename_dir(struct kobject * kobj, struct dentry *new_parent, |