diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-11 12:23:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-11 12:23:32 -0400 |
commit | 5af568cbd55f60b5a1d174f621b273e4f585dc35 (patch) | |
tree | 7cdc1afeb267519133a29ac595df21278c556c8c /fs/proc | |
parent | 062e27ec1b49d12bdb1ecc94d74b5fee5a5775db (diff) | |
parent | 66a362a2aa8ffa72670259fa15e2a77a01cc2217 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
isofs: Fix lseek() to position beyond 4 GB
vfs: remove unused MNT_STRICTATIME
vfs: show unreachable paths in getcwd and proc
vfs: only add " (deleted)" where necessary
vfs: add prepend_path() helper
vfs: __d_path: dont prepend the name of the root dentry
ia64: perfmon: add d_dname method
vfs: add helpers to get root and pwd
cachefiles: use path_get instead of lone dget
fs/sysv/super.c: add support for non-PDP11 v7 filesystems
V7: Adjust sanity checks for some volumes
Add v7 alias
v9fs: fixup for inode_setattr being removed
Manual merge to take Al's version of the fs/sysv/super.c file: it merged
cleanly, but Al had removed an unnecessary header include, so his side
was better.
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/base.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index c806dfb24e08..a1c43e7c8a7b 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 | } |
@@ -1526,7 +1526,7 @@ static int do_proc_readlink(struct path *path, char __user *buffer, int buflen) | |||
1526 | if (!tmp) | 1526 | if (!tmp) |
1527 | return -ENOMEM; | 1527 | return -ENOMEM; |
1528 | 1528 | ||
1529 | pathname = d_path(path, tmp, PAGE_SIZE); | 1529 | pathname = d_path_with_unreachable(path, tmp, PAGE_SIZE); |
1530 | len = PTR_ERR(pathname); | 1530 | len = PTR_ERR(pathname); |
1531 | if (IS_ERR(pathname)) | 1531 | if (IS_ERR(pathname)) |
1532 | goto out; | 1532 | goto out; |