aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/base.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-02-20 19:58:03 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2010-02-20 19:58:03 -0500
commitaea187c46f7d03ce985e55eb1398d0776a15b928 (patch)
treea2f38121839fec4d91e06f2432478c00fba8df1b /fs/proc/base.c
parentd0708b9739f4d184f74ef69fb15d9c26aecb3f10 (diff)
parent8f9941aeccc318f243ab3fa55aaa17f4c1cb33f9 (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: CacheFiles: Fix a race in cachefiles_delete_object() vs rename vfs: don't call ima_file_check() unconditionally in nfsd_open() fs: inode - remove 8 bytes of padding on 64bits allowing 1 more objects/slab under slub Switch proc/self to nd_set_link() fix LOOKUP_FOLLOW on automount "symlinks"
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r--fs/proc/base.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index e42bbd843ed1..58324c299165 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -2369,16 +2369,30 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
2369{ 2369{
2370 struct pid_namespace *ns = dentry->d_sb->s_fs_info; 2370 struct pid_namespace *ns = dentry->d_sb->s_fs_info;
2371 pid_t tgid = task_tgid_nr_ns(current, ns); 2371 pid_t tgid = task_tgid_nr_ns(current, ns);
2372 char tmp[PROC_NUMBUF]; 2372 char *name = ERR_PTR(-ENOENT);
2373 if (!tgid) 2373 if (tgid) {
2374 return ERR_PTR(-ENOENT); 2374 name = __getname();
2375 sprintf(tmp, "%d", task_tgid_nr_ns(current, ns)); 2375 if (!name)
2376 return ERR_PTR(vfs_follow_link(nd,tmp)); 2376 name = ERR_PTR(-ENOMEM);
2377 else
2378 sprintf(name, "%d", tgid);
2379 }
2380 nd_set_link(nd, name);
2381 return NULL;
2382}
2383
2384static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd,
2385 void *cookie)
2386{
2387 char *s = nd_get_link(nd);
2388 if (!IS_ERR(s))
2389 __putname(s);
2377} 2390}
2378 2391
2379static const struct inode_operations proc_self_inode_operations = { 2392static const struct inode_operations proc_self_inode_operations = {
2380 .readlink = proc_self_readlink, 2393 .readlink = proc_self_readlink,
2381 .follow_link = proc_self_follow_link, 2394 .follow_link = proc_self_follow_link,
2395 .put_link = proc_self_put_link,
2382}; 2396};
2383 2397
2384/* 2398/*