aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-09-11 22:29:06 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-26 18:30:22 -0400
commit4b30ee58ee64c64f59fd876e4afa6ed82caef3a4 (patch)
tree52d26225aec86ae39ed559882a30bec10fdb2031 /fs/sysfs
parente34ff4906199d2ebd248ae897ae34f52bea151c9 (diff)
sysfs: remove ktype->namespace() invocations in symlink code
There's no reason for sysfs to be calling ktype->namespace(). It is backwards, obfuscates what's going on and unnecessarily tangles two separate layers. There are two places where symlink code calls ktype->namespace(). * sysfs_do_create_link_sd() calls it to find out the namespace tag of the target directory. Unless symlinking races with cross-namespace renaming, this equals @target_sd->s_ns. * sysfs_rename_link() uses it to find out the new namespace to rename to and the new namespace can be different from the existing one. The function is renamed to sysfs_rename_link_ns() with an explicit @ns argument and the ktype->namespace() invocation is shifted to the device layer. While this patch replaces ktype->namespace() invocation with the recorded result in @target_sd, this shouldn't result in any behvior difference. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Eric W. Biederman <ebiederm@xmission.com> Cc: Kay Sievers <kay@vrfy.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs/sysfs')
-rw-r--r--fs/sysfs/symlink.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index 2dd4507d9edd..12d58ada3e6d 100644
--- a/fs/sysfs/symlink.c
+++ b/fs/sysfs/symlink.c
@@ -52,7 +52,7 @@ static int sysfs_do_create_link_sd(struct sysfs_dirent *parent_sd,
52 52
53 ns_type = sysfs_ns_type(parent_sd); 53 ns_type = sysfs_ns_type(parent_sd);
54 if (ns_type) 54 if (ns_type)
55 sd->s_ns = target->ktype->namespace(target); 55 sd->s_ns = target_sd->s_ns;
56 sd->s_symlink.target_sd = target_sd; 56 sd->s_symlink.target_sd = target_sd;
57 target_sd = NULL; /* reference is now owned by the symlink */ 57 target_sd = NULL; /* reference is now owned by the symlink */
58 58
@@ -181,19 +181,20 @@ void sysfs_remove_link(struct kobject *kobj, const char *name)
181EXPORT_SYMBOL_GPL(sysfs_remove_link); 181EXPORT_SYMBOL_GPL(sysfs_remove_link);
182 182
183/** 183/**
184 * sysfs_rename_link - rename symlink in object's directory. 184 * sysfs_rename_link_ns - rename symlink in object's directory.
185 * @kobj: object we're acting for. 185 * @kobj: object we're acting for.
186 * @targ: object we're pointing to. 186 * @targ: object we're pointing to.
187 * @old: previous name of the symlink. 187 * @old: previous name of the symlink.
188 * @new: new name of the symlink. 188 * @new: new name of the symlink.
189 * @new_ns: new namespace of the symlink.
189 * 190 *
190 * A helper function for the common rename symlink idiom. 191 * A helper function for the common rename symlink idiom.
191 */ 192 */
192int sysfs_rename_link(struct kobject *kobj, struct kobject *targ, 193int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *targ,
193 const char *old, const char *new) 194 const char *old, const char *new, const void *new_ns)
194{ 195{
195 struct sysfs_dirent *parent_sd, *sd = NULL; 196 struct sysfs_dirent *parent_sd, *sd = NULL;
196 const void *old_ns = NULL, *new_ns = NULL; 197 const void *old_ns = NULL;
197 int result; 198 int result;
198 199
199 if (!kobj) 200 if (!kobj)
@@ -215,16 +216,13 @@ int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
215 if (sd->s_symlink.target_sd->s_dir.kobj != targ) 216 if (sd->s_symlink.target_sd->s_dir.kobj != targ)
216 goto out; 217 goto out;
217 218
218 if (sysfs_ns_type(parent_sd))
219 new_ns = targ->ktype->namespace(targ);
220
221 result = sysfs_rename(sd, parent_sd, new_ns, new); 219 result = sysfs_rename(sd, parent_sd, new_ns, new);
222 220
223out: 221out:
224 sysfs_put(sd); 222 sysfs_put(sd);
225 return result; 223 return result;
226} 224}
227EXPORT_SYMBOL_GPL(sysfs_rename_link); 225EXPORT_SYMBOL_GPL(sysfs_rename_link_ns);
228 226
229static int sysfs_get_target_path(struct sysfs_dirent *parent_sd, 227static int sysfs_get_target_path(struct sysfs_dirent *parent_sd,
230 struct sysfs_dirent *target_sd, char *path) 228 struct sysfs_dirent *target_sd, char *path)