diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index c806dfb24e08..4cf5abf77ddf 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -149,18 +149,13 @@ static unsigned int pid_entry_count_dirs(const struct pid_entry *entries, | |||
| 149 | return count; | 149 | return count; |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | static int get_fs_path(struct task_struct *task, struct path *path, bool root) | 152 | static int get_task_root(struct task_struct *task, struct path *root) |
| 153 | { | 153 | { |
| 154 | struct fs_struct *fs; | ||
| 155 | int result = -ENOENT; | 154 | int result = -ENOENT; |
| 156 | 155 | ||
| 157 | task_lock(task); | 156 | task_lock(task); |
| 158 | fs = task->fs; | 157 | if (task->fs) { |
| 159 | if (fs) { | 158 | get_fs_root(task->fs, root); |
| 160 | read_lock(&fs->lock); | ||
| 161 | *path = root ? fs->root : fs->pwd; | ||
| 162 | path_get(path); | ||
| 163 | read_unlock(&fs->lock); | ||
| 164 | result = 0; | 159 | result = 0; |
| 165 | } | 160 | } |
| 166 | task_unlock(task); | 161 | task_unlock(task); |
| @@ -173,7 +168,12 @@ static int proc_cwd_link(struct inode *inode, struct path *path) | |||
| 173 | int result = -ENOENT; | 168 | int result = -ENOENT; |
| 174 | 169 | ||
| 175 | if (task) { | 170 | if (task) { |
| 176 | result = get_fs_path(task, path, 0); | 171 | task_lock(task); |
| 172 | if (task->fs) { | ||
| 173 | get_fs_pwd(task->fs, path); | ||
| 174 | result = 0; | ||
| 175 | } | ||
| 176 | task_unlock(task); | ||
| 177 | put_task_struct(task); | 177 | put_task_struct(task); |
| 178 | } | 178 | } |
| 179 | return result; | 179 | return result; |
| @@ -185,7 +185,7 @@ static int proc_root_link(struct inode *inode, struct path *path) | |||
| 185 | int result = -ENOENT; | 185 | int result = -ENOENT; |
| 186 | 186 | ||
| 187 | if (task) { | 187 | if (task) { |
| 188 | result = get_fs_path(task, path, 1); | 188 | result = get_task_root(task, path); |
| 189 | put_task_struct(task); | 189 | put_task_struct(task); |
| 190 | } | 190 | } |
| 191 | return result; | 191 | return result; |
| @@ -597,7 +597,7 @@ static int mounts_open_common(struct inode *inode, struct file *file, | |||
| 597 | get_mnt_ns(ns); | 597 | get_mnt_ns(ns); |
| 598 | } | 598 | } |
| 599 | rcu_read_unlock(); | 599 | rcu_read_unlock(); |
| 600 | if (ns && get_fs_path(task, &root, 1) == 0) | 600 | if (ns && get_task_root(task, &root) == 0) |
| 601 | ret = 0; | 601 | ret = 0; |
| 602 | put_task_struct(task); | 602 | put_task_struct(task); |
| 603 | } | 603 | } |
