summaryrefslogtreecommitdiff
path: root/fs/sysfs/symlink.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-07-18 16:14:45 +0900
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-18 15:49:50 -0700
commita1da4dfe35bc36c3bc9716d995c85b7983c38a76 (patch)
tree6e24647ff074d564d55bfdbf811d413e6d5bfab9 /fs/sysfs/symlink.c
parent2ee97caf0a6602f749ddbfdb1449e383e1212707 (diff)
downloadlinux-3.10-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.gz
linux-3.10-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.bz2
linux-3.10-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.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index 2f86e042229..d056e9695cd 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);