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.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index 942f239a2132..b6ebdaa00f37 100644
--- a/fs/sysfs/symlink.c
+++ b/fs/sysfs/symlink.c
@@ -58,6 +58,8 @@ static int sysfs_do_create_link(struct kobject *kobj, struct kobject *target,
58 if (!sd) 58 if (!sd)
59 goto out_put; 59 goto out_put;
60 60
61 if (sysfs_ns_type(parent_sd))
62 sd->s_ns = target->ktype->namespace(target);
61 sd->s_symlink.target_sd = target_sd; 63 sd->s_symlink.target_sd = target_sd;
62 target_sd = NULL; /* reference is now owned by the symlink */ 64 target_sd = NULL; /* reference is now owned by the symlink */
63 65
@@ -121,7 +123,7 @@ void sysfs_remove_link(struct kobject * kobj, const char * name)
121 else 123 else
122 parent_sd = kobj->sd; 124 parent_sd = kobj->sd;
123 125
124 sysfs_hash_and_remove(parent_sd, name); 126 sysfs_hash_and_remove(parent_sd, NULL, name);
125} 127}
126 128
127/** 129/**
@@ -137,6 +139,7 @@ int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
137 const char *old, const char *new) 139 const char *old, const char *new)
138{ 140{
139 struct sysfs_dirent *parent_sd, *sd = NULL; 141 struct sysfs_dirent *parent_sd, *sd = NULL;
142 const void *old_ns = NULL, *new_ns = NULL;
140 int result; 143 int result;
141 144
142 if (!kobj) 145 if (!kobj)
@@ -144,8 +147,11 @@ int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
144 else 147 else
145 parent_sd = kobj->sd; 148 parent_sd = kobj->sd;
146 149
150 if (targ->sd)
151 old_ns = targ->sd->s_ns;
152
147 result = -ENOENT; 153 result = -ENOENT;
148 sd = sysfs_get_dirent(parent_sd, old); 154 sd = sysfs_get_dirent(parent_sd, old_ns, old);
149 if (!sd) 155 if (!sd)
150 goto out; 156 goto out;
151 157
@@ -155,7 +161,10 @@ int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
155 if (sd->s_symlink.target_sd->s_dir.kobj != targ) 161 if (sd->s_symlink.target_sd->s_dir.kobj != targ)
156 goto out; 162 goto out;
157 163
158 result = sysfs_rename(sd, parent_sd, new); 164 if (sysfs_ns_type(parent_sd))
165 new_ns = targ->ktype->namespace(targ);
166
167 result = sysfs_rename(sd, parent_sd, new_ns, new);
159 168
160out: 169out:
161 sysfs_put(sd); 170 sysfs_put(sd);