diff options
author | Tejun Heo <htejun@gmail.com> | 2007-06-13 14:45:17 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-11 19:09:07 -0400 |
commit | 7f7cfffe60ed6271c4028ec79ae1c297b44bcb14 (patch) | |
tree | b2d0f1228f9b6cc0cc262cd1be6d950ec4816291 /fs/sysfs/dir.c | |
parent | 42b37df6abb42ae021e15bf865b43f3629c7f3ab (diff) |
sysfs: fix parent refcounting during rename and move
Parent reference wasn't properly transferred during rename and move.
Fix it.
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 | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index a63d12e4be56..a26e3db89432 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -497,6 +497,9 @@ int sysfs_rename_dir(struct kobject * kobj, struct dentry *new_parent, | |||
497 | d_move(kobj->dentry, new_dentry); | 497 | d_move(kobj->dentry, new_dentry); |
498 | 498 | ||
499 | list_del_init(&sd->s_sibling); | 499 | list_del_init(&sd->s_sibling); |
500 | sysfs_get(parent_sd); | ||
501 | sysfs_put(sd->s_parent); | ||
502 | sd->s_parent = parent_sd; | ||
500 | list_add(&sd->s_sibling, &parent_sd->s_children); | 503 | list_add(&sd->s_sibling, &parent_sd->s_children); |
501 | 504 | ||
502 | error = 0; | 505 | error = 0; |
@@ -550,6 +553,9 @@ again: | |||
550 | 553 | ||
551 | /* Remove from old parent's list and insert into new parent's list. */ | 554 | /* Remove from old parent's list and insert into new parent's list. */ |
552 | list_del_init(&sd->s_sibling); | 555 | list_del_init(&sd->s_sibling); |
556 | sysfs_get(new_parent_sd); | ||
557 | sysfs_put(sd->s_parent); | ||
558 | sd->s_parent = new_parent_sd; | ||
553 | list_add(&sd->s_sibling, &new_parent_sd->s_children); | 559 | list_add(&sd->s_sibling, &new_parent_sd->s_children); |
554 | 560 | ||
555 | out: | 561 | out: |