aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/symlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/sysfs/symlink.c')
-rw-r--r--fs/sysfs/symlink.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index 2f86e0422290..4ce687f0b5d0 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
86 sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK); 86 sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
87 if (!sd) 87 if (!sd)
88 goto out_put; 88 goto out_put;
89
89 sd->s_elem.symlink.target_sd = target_sd; 90 sd->s_elem.symlink.target_sd = target_sd;
91 target_sd = NULL; /* reference is now owned by the symlink */
90 92
91 sysfs_addrm_start(&acxt, parent_sd); 93 sysfs_addrm_start(&acxt, parent_sd);
92 94
@@ -95,11 +97,13 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char
95 sysfs_link_sibling(sd); 97 sysfs_link_sibling(sd);
96 } 98 }
97 99
98 if (sysfs_addrm_finish(&acxt)) 100 if (!sysfs_addrm_finish(&acxt)) {
99 return 0; 101 error = -EEXIST;
102 goto out_put;
103 }
104
105 return 0;
100 106
101 error = -EEXIST;
102 /* fall through */
103 out_put: 107 out_put:
104 sysfs_put(target_sd); 108 sysfs_put(target_sd);
105 sysfs_put(sd); 109 sysfs_put(sd);