diff options
Diffstat (limited to 'fs/sysfs/symlink.c')
-rw-r--r-- | fs/sysfs/symlink.c | 15 |
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 | ||
160 | out: | 169 | out: |
161 | sysfs_put(sd); | 170 | sysfs_put(sd); |