diff options
author | Tejun Heo <htejun@gmail.com> | 2007-07-18 16:14:45 +0900 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-18 15:49:50 -0700 |
commit | a1da4dfe35bc36c3bc9716d995c85b7983c38a76 (patch) | |
tree | 6e24647ff074d564d55bfdbf811d413e6d5bfab9 /fs/sysfs/symlink.c | |
parent | 2ee97caf0a6602f749ddbfdb1449e383e1212707 (diff) | |
download | linux-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.gz linux-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.bz2 linux-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.zip |
sysfs: kill an extra put in sysfs_create_link() failure path
There is a subtle bug in sysfs_create_link() failure path. When
symlink creation fails because there's already a node with the same
name, the target sysfs_dirent is put twice - once by failure path of
sysfs_create_link() and once more when the symlink is released.
Fix it by making only the symlink node responsible for putting
target_sd.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Gabriel C <nix.or.die@googlemail.com>
Cc: Miles Lane <miles.lane@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/sysfs/symlink.c')
-rw-r--r-- | fs/sysfs/symlink.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c index 2f86e0422290..d056e9695cd6 100644 --- a/fs/sysfs/symlink.c +++ b/fs/sysfs/symlink.c @@ -86,7 +86,9 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK); if (!sd) goto out_put; + sd->s_elem.symlink.target_sd = target_sd; + target_sd = NULL; /* reference is now owned by the symlink */ sysfs_addrm_start(&acxt, parent_sd); |