4 * Copyright (C) 1991, 1992 Linus Torvalds
6 * proc base directory handling functions
8 * 1999, Al Viro. Rewritten. Now it covers the whole per-process part.
9 * Instead of using magical inumbers to determine the kind of object
10 * we allocate and fill in-core inodes upon lookup. They don't even
11 * go into icache. We cache the reference to task_struct upon lookup too.
12 * Eventually it should become a filesystem in its own. We don't use the
13 * rest of procfs anymore.
16 #include <asm/uaccess.h>
18 #include <linux/config.h>
19 #include <linux/errno.h>
20 #include <linux/sched.h>
21 #include <linux/proc_fs.h>
22 #include <linux/stat.h>
23 #include <linux/init.h>
24 #include <linux/file.h>
25 #include <linux/string.h>
26 #include <linux/seq_file.h>
27 #include <linux/namespace.h>
30 * For hysterical raisins we keep the same inumbers as in the old procfs.
31 * Feel free to change the macro below - just keep the range distinct from
32 * inumbers of the rest of procfs (currently those are in 0x0000--0xffff).
33 * As soon as we'll get a separate superblock we will be able to forget
34 * about magical ranges too.
37 #define fake_ino(pid,ino) (((pid)<<16)|(ino))
39 int proc_pid_stat(struct task_struct*,char*);
40 int proc_pid_status(struct task_struct*,char*);
41 int proc_pid_statm(struct task_struct*,char*);
42 int proc_pid_cpu(struct task_struct*,char*);
44 static int proc_fd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
46 if (inode->u.proc_i.file) {
47 *mnt = mntget(inode->u.proc_i.file->f_vfsmnt);
48 *dentry = dget(inode->u.proc_i.file->f_dentry);
54 static int proc_exe_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
56 struct mm_struct * mm;
57 struct vm_area_struct * vma;
59 struct task_struct *task = inode->u.proc_i.task;
64 atomic_inc(&mm->mm_users);
68 down_read(&mm->mmap_sem);
71 if ((vma->vm_flags & VM_EXECUTABLE) &&
73 *mnt = mntget(vma->vm_file->f_vfsmnt);
74 *dentry = dget(vma->vm_file->f_dentry);
80 up_read(&mm->mmap_sem);
86 static int proc_cwd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
90 task_lock(inode->u.proc_i.task);
91 fs = inode->u.proc_i.task->fs;
93 atomic_inc(&fs->count);
94 task_unlock(inode->u.proc_i.task);
97 *mnt = mntget(fs->pwdmnt);
98 *dentry = dget(fs->pwd);
99 read_unlock(&fs->lock);
106 static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
108 struct fs_struct *fs;
109 int result = -ENOENT;
110 task_lock(inode->u.proc_i.task);
111 fs = inode->u.proc_i.task->fs;
113 atomic_inc(&fs->count);
114 task_unlock(inode->u.proc_i.task);
116 read_lock(&fs->lock);
117 *mnt = mntget(fs->rootmnt);
118 *dentry = dget(fs->root);
119 read_unlock(&fs->lock);
126 #define MAY_PTRACE(task) \
127 (task == current || \
128 (task->p_pptr == current && \
129 (task->ptrace & PT_PTRACED) && task->state == TASK_STOPPED))
131 static int may_ptrace_attach(struct task_struct *task)
137 if (((current->uid != task->euid) ||
138 (current->uid != task->suid) ||
139 (current->uid != task->uid) ||
140 (current->gid != task->egid) ||
141 (current->gid != task->sgid) ||
142 (!cap_issubset(task->cap_permitted, current->cap_permitted)) ||
143 (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
146 if (!is_dumpable(task) && !capable(CAP_SYS_PTRACE))
156 static int proc_pid_environ(struct task_struct *task, char * buffer)
158 struct mm_struct *mm;
161 if (!may_ptrace_attach(task))
167 atomic_inc(&mm->mm_users);
169 if (mm && mm->env_start && mm->env_start < mm->env_end) {
170 unsigned long len = mm->env_end - mm->env_start;
173 res = access_process_vm(task, mm->env_start, buffer, len, 0);
174 if (res >= 0 && !may_ptrace_attach(task))
182 static int proc_pid_cmdline(struct task_struct *task, char * buffer)
184 struct mm_struct *mm;
190 atomic_inc(&mm->mm_users);
195 if (mm && mm->arg_start && mm->arg_start < mm->arg_end) {
196 unsigned long len = mm->arg_end - mm->arg_start;
199 res = access_process_vm(task, mm->arg_start, buffer, len, 0);
200 /* If the nul at the end of args has been overwritten, then
201 assume application is using setproctitle(3). */
202 if (res > 0 && buffer[res - 1] != '\0') {
203 len = strnlen(buffer, res);
207 if (mm->env_start < mm->env_end && res <= PAGE_SIZE) {
208 len = mm->env_end - mm->env_start;
209 if (len > PAGE_SIZE - res)
210 len = PAGE_SIZE - res;
211 res += access_process_vm(task, mm->env_start, buffer+res, len, 0);
212 res = strnlen(buffer, res);
222 /************************************************************************/
223 /* Here the fs part begins */
224 /************************************************************************/
226 /* permission checks */
228 static int proc_check_root(struct inode *inode)
230 struct dentry *de, *base, *root;
231 struct vfsmount *our_vfsmnt, *vfsmnt, *mnt;
234 if (proc_root_link(inode, &root, &vfsmnt)) /* Ewww... */
236 read_lock(¤t->fs->lock);
237 our_vfsmnt = mntget(current->fs->rootmnt);
238 base = dget(current->fs->root);
239 read_unlock(¤t->fs->lock);
241 spin_lock(&dcache_lock);
245 while (vfsmnt != our_vfsmnt) {
246 if (vfsmnt == vfsmnt->mnt_parent)
248 de = vfsmnt->mnt_mountpoint;
249 vfsmnt = vfsmnt->mnt_parent;
252 if (!is_subdir(de, base))
254 spin_unlock(&dcache_lock);
263 spin_unlock(&dcache_lock);
268 static int proc_permission(struct inode *inode, int mask)
270 if (vfs_permission(inode, mask) != 0)
272 return proc_check_root(inode);
275 extern struct seq_operations proc_pid_maps_op;
276 static int maps_open(struct inode *inode, struct file *file)
278 struct task_struct *task = inode->u.proc_i.task;
279 int ret = seq_open(file, &proc_pid_maps_op);
281 struct seq_file *m = file->private_data;
287 static struct file_operations proc_maps_operations = {
291 .release = seq_release,
294 extern struct seq_operations mounts_op;
295 static int mounts_open(struct inode *inode, struct file *file)
297 struct task_struct *task = inode->u.proc_i.task;
298 int ret = seq_open(file, &mounts_op);
301 struct seq_file *m = file->private_data;
302 struct namespace *namespace;
304 namespace = task->namespace;
306 get_namespace(namespace);
310 m->private = namespace;
312 seq_release(inode, file);
319 static int mounts_release(struct inode *inode, struct file *file)
321 struct seq_file *m = file->private_data;
322 struct namespace *namespace = m->private;
323 put_namespace(namespace);
324 return seq_release(inode, file);
327 static struct file_operations proc_mounts_operations = {
331 release: mounts_release,
334 #define PROC_BLOCK_SIZE (3*1024) /* 4K page size but our output routines use some slack for overruns */
336 static ssize_t proc_info_read(struct file * file, char * buf,
337 size_t count, loff_t *ppos)
339 struct inode * inode = file->f_dentry->d_inode;
343 struct task_struct *task = inode->u.proc_i.task;
346 if (count > PROC_BLOCK_SIZE)
347 count = PROC_BLOCK_SIZE;
348 if (!(page = __get_free_page(GFP_KERNEL)))
351 length = inode->u.proc_i.op.proc_read(task, (char*)page);
357 /* Static 4kB (or whatever) block capacity */
358 if (pos < 0 || pos >= length) {
362 if (count > length - pos)
363 count = length - pos;
365 copy_to_user(buf, (char *) page + pos, count);
371 static struct file_operations proc_info_file_operations = {
372 read: proc_info_read,
375 static int mem_open(struct inode* inode, struct file* file)
377 file->private_data = (void*)((long)current->self_exec_id);
381 static ssize_t mem_read(struct file * file, char * buf,
382 size_t count, loff_t *ppos)
384 struct task_struct *task = file->f_dentry->d_inode->u.proc_i.task;
386 unsigned long src = *ppos;
388 struct mm_struct *mm;
390 if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
393 page = (char *)__get_free_page(GFP_USER);
400 atomic_inc(&mm->mm_users);
407 if (file->private_data != (void*)((long)current->self_exec_id) ) {
414 int this_len, retval;
416 this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
417 retval = access_process_vm(task, src, page, this_len, 0);
418 if (!retval || !MAY_PTRACE(task) || !may_ptrace_attach(task)) {
423 if (copy_to_user(buf, page, retval)) {
436 free_page((unsigned long) page);
440 #define mem_write NULL
443 /* This is a security hazard */
444 static ssize_t mem_write(struct file * file, const char * buf,
445 size_t count, loff_t *ppos)
449 struct task_struct *task = file->f_dentry->d_inode->u.proc_i.task;
450 unsigned long dst = *ppos;
452 if (!MAY_PTRACE(task) || !may_ptrace_attach(task))
455 page = (char *)__get_free_page(GFP_USER);
460 int this_len, retval;
462 this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
463 if (copy_from_user(page, buf, this_len)) {
467 retval = access_process_vm(task, dst, page, this_len, 1);
479 free_page((unsigned long) page);
484 static loff_t mem_lseek(struct file * file, loff_t offset, int orig)
488 file->f_pos = offset;
491 file->f_pos += offset;
496 force_successful_syscall_return();
500 static struct file_operations proc_mem_operations = {
507 static struct inode_operations proc_mem_inode_operations = {
508 permission: proc_permission,
511 static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
513 struct inode *inode = dentry->d_inode;
516 /* We don't need a base pointer in the /proc filesystem */
519 if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE))
521 error = proc_check_root(inode);
525 error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
526 nd->last_type = LAST_BIND;
531 static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
532 char * buffer, int buflen)
534 struct inode * inode;
535 char * tmp = (char*)__get_free_page(GFP_KERNEL), *path;
541 inode = dentry->d_inode;
542 path = d_path(dentry, mnt, tmp, PAGE_SIZE);
544 free_page((unsigned long)tmp);
545 return PTR_ERR(path);
547 len = tmp + PAGE_SIZE - 1 - path;
551 copy_to_user(buffer, path, buflen);
552 free_page((unsigned long)tmp);
556 static int proc_pid_readlink(struct dentry * dentry, char * buffer, int buflen)
559 struct inode *inode = dentry->d_inode;
561 struct vfsmount *mnt = NULL;
563 if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE))
565 error = proc_check_root(inode);
569 error = inode->u.proc_i.op.proc_get_link(inode, &de, &mnt);
573 error = do_proc_readlink(de, mnt, buffer, buflen);
580 static struct inode_operations proc_pid_link_inode_operations = {
581 readlink: proc_pid_readlink,
582 follow_link: proc_pid_follow_link
592 enum pid_directory_inos {
607 PROC_PID_FD_DIR = 0x8000, /* 0x8000-0xffff */
610 #define E(type,name,mode) {(type),sizeof(name)-1,(name),(mode)}
611 static struct pid_entry base_stuff[] = {
612 E(PROC_PID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR),
613 E(PROC_PID_ENVIRON, "environ", S_IFREG|S_IRUSR),
614 E(PROC_PID_STATUS, "status", S_IFREG|S_IRUGO),
615 E(PROC_PID_CMDLINE, "cmdline", S_IFREG|S_IRUGO),
616 E(PROC_PID_STAT, "stat", S_IFREG|S_IRUGO),
617 E(PROC_PID_STATM, "statm", S_IFREG|S_IRUGO),
619 E(PROC_PID_CPU, "cpu", S_IFREG|S_IRUGO),
621 E(PROC_PID_MAPS, "maps", S_IFREG|S_IRUGO),
622 E(PROC_PID_MEM, "mem", S_IFREG|S_IRUSR|S_IWUSR),
623 E(PROC_PID_CWD, "cwd", S_IFLNK|S_IRWXUGO),
624 E(PROC_PID_ROOT, "root", S_IFLNK|S_IRWXUGO),
625 E(PROC_PID_EXE, "exe", S_IFLNK|S_IRWXUGO),
626 E(PROC_PID_MOUNTS, "mounts", S_IFREG|S_IRUGO),
633 static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir)
635 struct inode *inode = filp->f_dentry->d_inode;
636 struct task_struct *p = inode->u.proc_i.task;
637 unsigned int fd, pid, ino;
640 struct files_struct * files;
648 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
652 ino = fake_ino(pid, PROC_PID_INO);
653 if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
660 atomic_inc(&files->count);
664 read_lock(&files->file_lock);
665 for (fd = filp->f_pos-2;
667 fd++, filp->f_pos++) {
670 if (!fcheck_files(files, fd))
672 read_unlock(&files->file_lock);
678 buf[j] = '0' + (i % 10);
682 ino = fake_ino(pid, PROC_PID_FD_DIR + fd);
683 if (filldir(dirent, buf+j, NUMBUF-j, fd+2, ino, DT_LNK) < 0) {
684 read_lock(&files->file_lock);
687 read_lock(&files->file_lock);
689 read_unlock(&files->file_lock);
690 put_files_struct(files);
696 static int proc_base_readdir(struct file * filp,
697 void * dirent, filldir_t filldir)
701 struct inode *inode = filp->f_dentry->d_inode;
704 pid = inode->u.proc_i.task->pid;
710 if (filldir(dirent, ".", 1, i, inode->i_ino, DT_DIR) < 0)
716 if (filldir(dirent, "..", 2, i, PROC_ROOT_INO, DT_DIR) < 0)
723 if (i>=sizeof(base_stuff)/sizeof(base_stuff[0]))
727 if (filldir(dirent, p->name, p->len, filp->f_pos,
728 fake_ino(pid, p->type), p->mode >> 12) < 0)
737 /* building an inode */
739 static int task_dumpable(struct task_struct *task)
742 struct mm_struct *mm;
747 dumpable = mm->dumpable;
753 static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task, int ino)
755 struct inode * inode;
757 /* We need a new inode */
759 inode = new_inode(sb);
765 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
766 inode->i_ino = fake_ino(task->pid, ino);
772 * grab the reference to task.
774 get_task_struct(task);
775 inode->u.proc_i.task = task;
778 if (ino == PROC_PID_INO || task_dumpable(task)) {
779 inode->i_uid = task->euid;
780 inode->i_gid = task->egid;
787 inode->u.generic_ip = NULL;
794 static int pid_fd_revalidate(struct dentry * dentry, int flags)
800 * Exceptional case: normally we are not allowed to unhash a busy
801 * directory. In this case, however, we can do it - no aliasing problems
802 * due to the way we treat inodes.
804 static int pid_base_revalidate(struct dentry * dentry, int flags)
806 if (dentry->d_inode->u.proc_i.task->pid)
812 static int pid_delete_dentry(struct dentry * dentry)
817 static struct dentry_operations pid_fd_dentry_operations =
819 d_revalidate: pid_fd_revalidate,
820 d_delete: pid_delete_dentry,
823 static struct dentry_operations pid_dentry_operations =
825 d_delete: pid_delete_dentry,
828 static struct dentry_operations pid_base_dentry_operations =
830 d_revalidate: pid_base_revalidate,
831 d_delete: pid_delete_dentry,
835 #define MAX_MULBY10 ((~0U-9)/10)
837 static struct dentry *proc_lookupfd(struct inode * dir, struct dentry * dentry)
840 struct task_struct *task = dir->u.proc_i.task;
842 struct files_struct * files;
848 len = dentry->d_name.len;
849 name = dentry->d_name.name;
850 if (len > 1 && *name == '0') goto out;
856 if (fd >= MAX_MULBY10)
862 inode = proc_pid_make_inode(dir->i_sb, task, PROC_PID_FD_DIR+fd);
868 atomic_inc(&files->count);
872 read_lock(&files->file_lock);
873 file = inode->u.proc_i.file = fcheck_files(files, fd);
877 read_unlock(&files->file_lock);
878 put_files_struct(files);
879 inode->i_op = &proc_pid_link_inode_operations;
881 inode->i_mode = S_IFLNK;
882 inode->u.proc_i.op.proc_get_link = proc_fd_link;
883 if (file->f_mode & 1)
884 inode->i_mode |= S_IRUSR | S_IXUSR;
885 if (file->f_mode & 2)
886 inode->i_mode |= S_IWUSR | S_IXUSR;
887 dentry->d_op = &pid_fd_dentry_operations;
888 d_add(dentry, inode);
892 read_unlock(&files->file_lock);
893 put_files_struct(files);
897 return ERR_PTR(-ENOENT);
900 static struct file_operations proc_fd_operations = {
901 read: generic_read_dir,
902 readdir: proc_readfd,
906 * proc directories can do almost nothing..
908 static struct inode_operations proc_fd_inode_operations = {
909 lookup: proc_lookupfd,
910 permission: proc_permission,
913 static struct dentry *proc_base_lookup(struct inode *dir, struct dentry *dentry)
917 struct task_struct *task = dir->u.proc_i.task;
923 for (p = base_stuff; p->name; p++) {
924 if (p->len != dentry->d_name.len)
926 if (!memcmp(dentry->d_name.name, p->name, p->len))
933 inode = proc_pid_make_inode(dir->i_sb, task, p->type);
937 inode->i_mode = p->mode;
939 * Yes, it does not scale. And it should not. Don't add
940 * new entries into /proc/<pid>/ without very good reasons.
945 inode->i_op = &proc_fd_inode_operations;
946 inode->i_fop = &proc_fd_operations;
949 inode->i_op = &proc_pid_link_inode_operations;
950 inode->u.proc_i.op.proc_get_link = proc_exe_link;
953 inode->i_op = &proc_pid_link_inode_operations;
954 inode->u.proc_i.op.proc_get_link = proc_cwd_link;
957 inode->i_op = &proc_pid_link_inode_operations;
958 inode->u.proc_i.op.proc_get_link = proc_root_link;
960 case PROC_PID_ENVIRON:
961 inode->i_fop = &proc_info_file_operations;
962 inode->u.proc_i.op.proc_read = proc_pid_environ;
964 case PROC_PID_STATUS:
965 inode->i_fop = &proc_info_file_operations;
966 inode->u.proc_i.op.proc_read = proc_pid_status;
969 inode->i_fop = &proc_info_file_operations;
970 inode->u.proc_i.op.proc_read = proc_pid_stat;
972 case PROC_PID_CMDLINE:
973 inode->i_fop = &proc_info_file_operations;
974 inode->u.proc_i.op.proc_read = proc_pid_cmdline;
977 inode->i_fop = &proc_info_file_operations;
978 inode->u.proc_i.op.proc_read = proc_pid_statm;
981 inode->i_fop = &proc_maps_operations;
985 inode->i_fop = &proc_info_file_operations;
986 inode->u.proc_i.op.proc_read = proc_pid_cpu;
990 inode->i_op = &proc_mem_inode_operations;
991 inode->i_fop = &proc_mem_operations;
993 case PROC_PID_MOUNTS:
994 inode->i_fop = &proc_mounts_operations;
997 printk("procfs: impossible type (%d)",p->type);
999 return ERR_PTR(-EINVAL);
1001 dentry->d_op = &pid_dentry_operations;
1002 d_add(dentry, inode);
1006 return ERR_PTR(error);
1009 static struct file_operations proc_base_operations = {
1010 read: generic_read_dir,
1011 readdir: proc_base_readdir,
1014 static struct inode_operations proc_base_inode_operations = {
1015 lookup: proc_base_lookup,
1021 static int proc_self_readlink(struct dentry *dentry, char *buffer, int buflen)
1024 sprintf(tmp, "%d", current->pid);
1025 return vfs_readlink(dentry,buffer,buflen,tmp);
1028 static int proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
1031 sprintf(tmp, "%d", current->pid);
1032 return vfs_follow_link(nd,tmp);
1035 static struct inode_operations proc_self_inode_operations = {
1036 readlink: proc_self_readlink,
1037 follow_link: proc_self_follow_link,
1040 struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry)
1042 unsigned int pid, c;
1043 struct task_struct *task;
1045 struct inode *inode;
1049 name = dentry->d_name.name;
1050 len = dentry->d_name.len;
1051 if (len == 4 && !memcmp(name, "self", 4)) {
1052 inode = new_inode(dir->i_sb);
1054 return ERR_PTR(-ENOMEM);
1055 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
1056 inode->i_ino = fake_ino(0, PROC_PID_INO);
1057 inode->u.proc_i.file = NULL;
1058 inode->u.proc_i.task = NULL;
1059 inode->i_mode = S_IFLNK|S_IRWXUGO;
1060 inode->i_uid = inode->i_gid = 0;
1062 inode->i_op = &proc_self_inode_operations;
1063 d_add(dentry, inode);
1071 if (pid >= MAX_MULBY10)
1079 read_lock(&tasklist_lock);
1080 task = find_task_by_pid(pid);
1082 get_task_struct(task);
1083 read_unlock(&tasklist_lock);
1087 inode = proc_pid_make_inode(dir->i_sb, task, PROC_PID_INO);
1089 free_task_struct(task);
1093 inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
1094 inode->i_op = &proc_base_inode_operations;
1095 inode->i_fop = &proc_base_operations;
1097 inode->i_flags|=S_IMMUTABLE;
1099 dentry->d_op = &pid_base_dentry_operations;
1100 d_add(dentry, inode);
1103 return ERR_PTR(-ENOENT);
1106 void proc_pid_delete_inode(struct inode *inode)
1108 if (inode->u.proc_i.file)
1109 fput(inode->u.proc_i.file);
1110 if (inode->u.proc_i.task)
1111 free_task_struct(inode->u.proc_i.task);
1114 #define PROC_NUMBUF 10
1115 #define PROC_MAXPIDS 20
1118 * Get a few pid's to return for filldir - we need to hold the
1119 * tasklist lock while doing this, and we must release it before
1120 * we actually do the filldir itself, so we use a temp buffer..
1122 static int get_pid_list(int index, unsigned int *pids)
1124 struct task_struct *p;
1128 read_lock(&tasklist_lock);
1135 pids[nr_pids] = pid;
1137 if (nr_pids >= PROC_MAXPIDS)
1140 read_unlock(&tasklist_lock);
1144 int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
1146 unsigned int pid_array[PROC_MAXPIDS];
1147 char buf[PROC_NUMBUF];
1148 unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY;
1149 unsigned int nr_pids, i;
1152 ino_t ino = fake_ino(0,PROC_PID_INO);
1153 if (filldir(dirent, "self", 4, filp->f_pos, ino, DT_LNK) < 0)
1159 nr_pids = get_pid_list(nr, pid_array);
1161 for (i = 0; i < nr_pids; i++) {
1162 int pid = pid_array[i];
1163 ino_t ino = fake_ino(pid,PROC_PID_INO);
1164 unsigned long j = PROC_NUMBUF;
1166 do buf[--j] = '0' + (pid % 10); while (pid/=10);
1168 if (filldir(dirent, buf+j, PROC_NUMBUF-j, filp->f_pos, ino, DT_DIR) < 0)