aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-08-11 12:23:32 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-08-11 12:23:32 -0400
commit5af568cbd55f60b5a1d174f621b273e4f585dc35 (patch)
tree7cdc1afeb267519133a29ac595df21278c556c8c /fs/proc
parent062e27ec1b49d12bdb1ecc94d74b5fee5a5775db (diff)
parent66a362a2aa8ffa72670259fa15e2a77a01cc2217 (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.c24
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
152static int get_fs_path(struct task_struct *task, struct path *path, bool root) 152static 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;