summaryrefslogtreecommitdiffstats
path: root/fs/sysfs/symlink.c
diff options
context:
space:
mode:
authorTejun Heo2007-07-18 09:14:45 +0200
committerGreg Kroah-Hartman2007-07-19 00:49:50 +0200
commita1da4dfe35bc36c3bc9716d995c85b7983c38a76 (patch)
tree6e24647ff074d564d55bfdbf811d413e6d5bfab9 /fs/sysfs/symlink.c
parentDriver core: check return code of sysfs_create_link() (diff)
downloadkernel-qcow2-linux-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.gz
kernel-qcow2-linux-a1da4dfe35bc36c3bc9716d995c85b7983c38a76.tar.xz
kernel-qcow2-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.c2
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);