1 #include <linux/sched.h> 2 #include <linux/slab.h> 3 #include <linux/pid_namespace.h> 4 #include "internal.h" 5 6 /* 7 * /proc/self: 8 */ 9 static const char *proc_self_get_link(struct dentry *dentry, 10 struct inode *inode, 11 struct delayed_call *done) 12 { 13 struct pid_namespace *ns = inode->i_sb->s_fs_info; 14 pid_t tgid = task_tgid_nr_ns(current, ns); 15 char *name; 16 17 if (!tgid) 18 return ERR_PTR(-ENOENT); 19 /* 11 for max length of signed int in decimal + NULL term */ 20 name = kmalloc(12, dentry ? GFP_KERNEL : GFP_ATOMIC); 21 if (unlikely(!name)) 22 return dentry ? ERR_PTR(-ENOMEM) : ERR_PTR(-ECHILD); 23 sprintf(name, "%d", tgid); 24 set_delayed_call(done, kfree_link, name); 25 return name; 26 } 27 28 static const struct inode_operations proc_self_inode_operations = { 29 .get_link = proc_self_get_link, 30 }; 31 32 static unsigned self_inum; 33 34 int proc_setup_self(struct super_block *s) 35 { 36 struct inode *root_inode = d_inode(s->s_root); 37 struct pid_namespace *ns = s->s_fs_info; 38 struct dentry *self; 39 40 inode_lock(root_inode); 41 self = d_alloc_name(s->s_root, "self"); 42 if (self) { 43 struct inode *inode = new_inode_pseudo(s); 44 if (inode) { 45 inode->i_ino = self_inum; 46 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); 47 inode->i_mode = S_IFLNK | S_IRWXUGO; 48 inode->i_uid = GLOBAL_ROOT_UID; 49 inode->i_gid = GLOBAL_ROOT_GID; 50 inode->i_op = &proc_self_inode_operations; 51 d_add(self, inode); 52 } else { 53 dput(self); 54 self = ERR_PTR(-ENOMEM); 55 } 56 } else { 57 self = ERR_PTR(-ENOMEM); 58 } 59 inode_unlock(root_inode); 60 if (IS_ERR(self)) { 61 pr_err("proc_fill_super: can't allocate /proc/self\n"); 62 return PTR_ERR(self); 63 } 64 ns->proc_self = self; 65 return 0; 66 } 67 68 void __init proc_self_init(void) 69 { 70 proc_alloc_inum(&self_inum); 71 } 72