Lines Matching +full:lock +full:- +full:latency +full:- +full:ns

1 // SPDX-License-Identifier: GPL-2.0
9 * 1999, Al Viro. Rewritten. Now it covers the whole per-process part.
11 * we allocate and fill in-core inodes upon lookup. They don't even
18 * 17-Jan-2005
25 * Embedded Linux Lab - 10LE Instituto Nokia de Tecnologia - INdT
35 * 21-Feb-2005
36 * Embedded Linux Lab - 10LE Instituto Nokia de Tecnologia - INdT
40 * 10-Mar-2005
41 * 10LE Instituto Nokia de Tecnologia - INdT:
62 #include <linux/generic-radix-tree.h>
95 #include <linux/posix-timers.h>
129 .len = sizeof(NAME) - 1, \
174 int result = -ENOENT; in get_task_root()
177 if (task->fs) { in get_task_root()
178 get_fs_root(task->fs, root); in get_task_root()
188 int result = -ENOENT; in proc_cwd_link()
192 if (task->fs) { in proc_cwd_link()
193 get_fs_pwd(task->fs, path); in proc_cwd_link()
205 int result = -ENOENT; in proc_root_link()
230 return -ENOMEM; in get_mm_proctitle()
242 len -= pos; in get_mm_proctitle()
245 len -= copy_to_user(buf, page+pos, len); in get_mm_proctitle()
247 len = -EFAULT; in get_mm_proctitle()
263 if (!mm->env_end) in get_mm_cmdline()
266 spin_lock(&mm->arg_lock); in get_mm_cmdline()
267 arg_start = mm->arg_start; in get_mm_cmdline()
268 arg_end = mm->arg_end; in get_mm_cmdline()
269 env_start = mm->env_start; in get_mm_cmdline()
270 env_end = mm->env_end; in get_mm_cmdline()
271 spin_unlock(&mm->arg_lock); in get_mm_cmdline()
283 len = env_end - arg_start; in get_mm_cmdline()
289 if (count > len - pos) in get_mm_cmdline()
290 count = len - pos; in get_mm_cmdline()
301 if (access_remote_vm(mm, arg_end-1, &c, 1, FOLL_ANON) == 1 && c) in get_mm_cmdline()
305 * For the non-setproctitle() case we limit things strictly in get_mm_cmdline()
311 if (count > arg_end - pos) in get_mm_cmdline()
312 count = arg_end - pos; in get_mm_cmdline()
316 return -ENOMEM; in get_mm_cmdline()
326 got -= copy_to_user(buf, page, got); in get_mm_cmdline()
329 len = -EFAULT; in get_mm_cmdline()
335 count -= got; in get_mm_cmdline()
367 return -ESRCH; in proc_pid_cmdline_read()
382 * Provides a wchan file via kallsyms in a proper one-value-per-file format.
385 static int proc_pid_wchan(struct seq_file *m, struct pid_namespace *ns, in proc_pid_wchan() argument
406 int err = down_read_killable(&task->signal->exec_update_lock); in lock_trace()
410 up_read(&task->signal->exec_update_lock); in lock_trace()
411 return -EPERM; in lock_trace()
418 up_read(&task->signal->exec_update_lock); in unlock_trace()
425 static int proc_pid_stack(struct seq_file *m, struct pid_namespace *ns, in proc_pid_stack() argument
442 if (!file_ns_capable(m->file, &init_user_ns, CAP_SYS_ADMIN)) in proc_pid_stack()
443 return -EACCES; in proc_pid_stack()
448 return -ENOMEM; in proc_pid_stack()
473 static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, in proc_pid_schedstat() argument
480 (unsigned long long)task->se.sum_exec_runtime, in proc_pid_schedstat()
481 (unsigned long long)task->sched_info.run_delay, in proc_pid_schedstat()
482 task->sched_info.pcount); in proc_pid_schedstat()
492 struct inode *inode = m->private; in lstats_show_proc()
496 return -ESRCH; in lstats_show_proc()
497 seq_puts(m, "Latency Top version : v0.1\n"); in lstats_show_proc()
499 struct latency_record *lr = &task->latency_record[i]; in lstats_show_proc()
500 if (lr->backtrace[0]) { in lstats_show_proc()
503 lr->count, lr->time, lr->max); in lstats_show_proc()
505 unsigned long bt = lr->backtrace[q]; in lstats_show_proc()
530 return -ESRCH; in lstats_write()
547 static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns, in proc_oom_score() argument
593 static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns, in proc_pid_limits() argument
603 memcpy(rlim, task->signal->rlim, sizeof(struct rlimit) * RLIM_NLIMITS); in proc_pid_limits()
616 seq_printf(m, "%-25s %-20s ", in proc_pid_limits()
619 seq_printf(m, "%-25s %-20lu ", in proc_pid_limits()
623 seq_printf(m, "%-20s ", "unlimited"); in proc_pid_limits()
625 seq_printf(m, "%-20lu ", rlim[i].rlim_max); in proc_pid_limits()
628 seq_printf(m, "%-10s\n", lnames[i].unit); in proc_pid_limits()
637 static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns, in proc_pid_syscall() argument
692 if (attr->ia_valid & ATTR_MODE) in proc_setattr()
693 return -EPERM; in proc_setattr()
717 if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE) in has_pid_permissions()
720 if (fs_info->hide_pid < hide_pid_min) in has_pid_permissions()
722 if (in_group_p(fs_info->pid_gid)) in has_pid_permissions()
731 struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); in proc_pid_permission()
737 return -ESRCH; in proc_pid_permission()
742 if (fs_info->hide_pid == HIDEPID_INVISIBLE) { in proc_pid_permission()
749 return -ENOENT; in proc_pid_permission()
752 return -EPERM; in proc_pid_permission()
765 struct inode *inode = m->private; in proc_single_show()
766 struct pid_namespace *ns = proc_pid_ns(inode->i_sb); in proc_single_show() local
773 return -ESRCH; in proc_single_show()
775 ret = PROC_I(inode)->op.proc_show(m, ns, pid, task); in proc_single_show()
797 struct mm_struct *mm = ERR_PTR(-ESRCH); in proc_mem_open()
821 file->private_data = mm; in __mem_open()
829 /* OK to pass negative loff_t, we can catch out-of-range */ in mem_open()
830 file->f_mode |= FMODE_UNSIGNED_OFFSET; in mem_open()
838 struct mm_struct *mm = file->private_data; in mem_rw()
849 return -ENOMEM; in mem_rw()
861 copied = -EFAULT; in mem_rw()
868 copied = -EIO; in mem_rw()
873 copied = -EFAULT; in mem_rw()
880 count -= this_len; in mem_rw()
906 file->f_pos = offset; in mem_lseek()
909 file->f_pos += offset; in mem_lseek()
912 return -EINVAL; in mem_lseek()
915 return file->f_pos; in mem_lseek()
920 struct mm_struct *mm = file->private_data; in mem_release()
945 struct mm_struct *mm = file->private_data; in environ_read()
949 if (!mm || !mm->env_end) in environ_read()
954 return -ENOMEM; in environ_read()
960 spin_lock(&mm->arg_lock); in environ_read()
961 env_start = mm->env_start; in environ_read()
962 env_end = mm->env_end; in environ_read()
963 spin_unlock(&mm->arg_lock); in environ_read()
969 if (src >= (env_end - env_start)) in environ_read()
972 this_len = env_end - (env_start + src); in environ_read()
985 ret = -EFAULT; in environ_read()
992 count -= retval; in environ_read()
1017 struct mm_struct *mm = file->private_data; in auxv_read()
1024 } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ in auxv_read()
1025 return simple_read_from_buffer(buf, count, ppos, mm->saved_auxv, in auxv_read()
1026 nwords * sizeof(mm->saved_auxv[0])); in auxv_read()
1045 return -ESRCH; in oom_adj_read()
1046 if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX) in oom_adj_read()
1049 oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / in oom_adj_read()
1066 return -ESRCH; in __set_oom_adj()
1070 if (oom_adj < task->signal->oom_score_adj && in __set_oom_adj()
1072 err = -EACCES; in __set_oom_adj()
1080 current->comm, task_pid_nr(current), task_pid_nr(task), in __set_oom_adj()
1083 if ((short)oom_adj < task->signal->oom_score_adj_min && in __set_oom_adj()
1085 err = -EACCES; in __set_oom_adj()
1095 if (!task->vfork_done) { in __set_oom_adj()
1099 if (test_bit(MMF_MULTIPROCESS, &p->mm->flags)) { in __set_oom_adj()
1100 mm = p->mm; in __set_oom_adj()
1107 task->signal->oom_score_adj = oom_adj; in __set_oom_adj()
1109 task->signal->oom_score_adj_min = (short)oom_adj; in __set_oom_adj()
1121 if (p->flags & PF_KTHREAD || is_global_init(p)) in __set_oom_adj()
1125 if (!p->vfork_done && process_shares_mm(p, mm)) { in __set_oom_adj()
1126 p->signal->oom_score_adj = oom_adj; in __set_oom_adj()
1128 p->signal->oom_score_adj_min = (short)oom_adj; in __set_oom_adj()
1159 if (count > sizeof(buffer) - 1) in oom_adj_write()
1160 count = sizeof(buffer) - 1; in oom_adj_write()
1162 err = -EFAULT; in oom_adj_write()
1171 err = -EINVAL; in oom_adj_write()
1182 oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE; in oom_adj_write()
1204 return -ESRCH; in oom_score_adj_read()
1205 oom_score_adj = task->signal->oom_score_adj; in oom_score_adj_read()
1219 if (count > sizeof(buffer) - 1) in oom_score_adj_write()
1220 count = sizeof(buffer) - 1; in oom_score_adj_write()
1222 err = -EFAULT; in oom_score_adj_write()
1231 err = -EINVAL; in oom_score_adj_write()
1257 return -ESRCH; in proc_loginuid_read()
1259 from_kuid(file->f_cred->user_ns, in proc_loginuid_read()
1274 if (current->flags & PF_KTHREAD) in proc_loginuid_write()
1275 return -EPERM; in proc_loginuid_write()
1280 return -EPERM; in proc_loginuid_write()
1286 return -EINVAL; in proc_loginuid_write()
1297 kloginuid = make_kuid(file->f_cred->user_ns, loginuid); in proc_loginuid_write()
1299 return -EINVAL; in proc_loginuid_write()
1323 return -ESRCH; in proc_sessionid_read()
1346 return -ESRCH; in proc_fault_inject_read()
1347 make_it_fail = task->make_it_fail; in proc_fault_inject_read()
1364 return -EPERM; in proc_fault_inject_write()
1366 if (count > sizeof(buffer) - 1) in proc_fault_inject_write()
1367 count = sizeof(buffer) - 1; in proc_fault_inject_write()
1369 return -EFAULT; in proc_fault_inject_write()
1374 return -EINVAL; in proc_fault_inject_write()
1378 return -ESRCH; in proc_fault_inject_write()
1379 task->make_it_fail = make_it_fail; in proc_fault_inject_write()
1404 return -ESRCH; in proc_fail_nth_write()
1405 task->fail_nth = n; in proc_fail_nth_write()
1420 return -ESRCH; in proc_fail_nth_read()
1421 len = snprintf(numbuf, sizeof(numbuf), "%u\n", task->fail_nth); in proc_fail_nth_read()
1435 * Print out various scheduling related per-task fields:
1439 struct inode *inode = m->private; in sched_show()
1440 struct pid_namespace *ns = proc_pid_ns(inode->i_sb); in sched_show() local
1445 return -ESRCH; in sched_show()
1446 proc_sched_show_task(p, ns, m); in sched_show()
1462 return -ESRCH; in sched_write()
1491 struct inode *inode = m->private; in sched_autogroup_show()
1496 return -ESRCH; in sched_autogroup_show()
1515 if (count > sizeof(buffer) - 1) in sched_autogroup_write()
1516 count = sizeof(buffer) - 1; in sched_autogroup_write()
1518 return -EFAULT; in sched_autogroup_write()
1526 return -ESRCH; in sched_autogroup_write()
1543 struct seq_file *m = filp->private_data; in sched_autogroup_open()
1545 m->private = inode; in sched_autogroup_open()
1565 p = get_proc_task(file_inode(m->file)); in timens_offsets_show()
1567 return -ESRCH; in timens_offsets_show()
1586 return -EINVAL; in timens_offsets_write()
1594 ret = -EINVAL; in timens_offsets_write()
1611 &off->val.tv_sec, &off->val.tv_nsec); in timens_offsets_write()
1612 if (err != 3 || off->val.tv_nsec >= NSEC_PER_SEC) in timens_offsets_write()
1615 clock[sizeof(clock) - 1] = 0; in timens_offsets_write()
1618 off->clockid = CLOCK_MONOTONIC; in timens_offsets_write()
1621 off->clockid = CLOCK_BOOTTIME; in timens_offsets_write()
1628 count = next_line - kbuf; in timens_offsets_write()
1633 ret = -ESRCH; in timens_offsets_write()
1668 const size_t maxlen = sizeof(buffer) - 1; in comm_write()
1672 return -EFAULT; in comm_write()
1676 return -ESRCH; in comm_write()
1683 count = -EINVAL; in comm_write()
1692 struct inode *inode = m->private; in comm_show()
1697 return -ESRCH; in comm_show()
1727 return -ENOENT; in proc_exe_link()
1731 *exe_path = exe_file->f_path; in proc_exe_link()
1732 path_get(&exe_file->f_path); in proc_exe_link()
1736 return -ENOENT; in proc_exe_link()
1744 int error = -EACCES; in proc_pid_get_link()
1747 return ERR_PTR(-ECHILD); in proc_pid_get_link()
1753 error = PROC_I(inode)->op.proc_get_link(dentry, &path); in proc_pid_get_link()
1769 return -ENOMEM; in do_proc_readlink()
1775 len = tmp + PAGE_SIZE - 1 - pathname; in do_proc_readlink()
1780 len = -EFAULT; in do_proc_readlink()
1788 int error = -EACCES; in proc_pid_readlink()
1796 error = PROC_I(inode)->op.proc_get_link(dentry, &path); in proc_pid_readlink()
1825 if (unlikely(task->flags & PF_KTHREAD)) { in task_dump_owner()
1834 uid = cred->euid; in task_dump_owner()
1835 gid = cred->egid; in task_dump_owner()
1849 mm = task->mm; in task_dump_owner()
1850 /* Make non-dumpable tasks owned by some root */ in task_dump_owner()
1853 struct user_namespace *user_ns = mm->user_ns; in task_dump_owner()
1875 struct pid *pid = ei->pid; in proc_pid_evict_inode()
1877 if (S_ISDIR(ei->vfs_inode.i_mode)) { in proc_pid_evict_inode()
1878 spin_lock(&pid->lock); in proc_pid_evict_inode()
1879 hlist_del_init_rcu(&ei->sibling_inodes); in proc_pid_evict_inode()
1880 spin_unlock(&pid->lock); in proc_pid_evict_inode()
1901 inode->i_mode = mode; in proc_pid_make_inode()
1902 inode->i_ino = get_next_ino(); in proc_pid_make_inode()
1903 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); in proc_pid_make_inode()
1904 inode->i_op = &proc_def_inode_operations; in proc_pid_make_inode()
1914 ei->pid = pid; in proc_pid_make_inode()
1916 spin_lock(&pid->lock); in proc_pid_make_inode()
1917 hlist_add_head_rcu(&ei->sibling_inodes, &pid->inodes); in proc_pid_make_inode()
1918 spin_unlock(&pid->lock); in proc_pid_make_inode()
1921 task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid); in proc_pid_make_inode()
1935 struct inode *inode = d_inode(path->dentry); in pid_getattr()
1936 struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); in pid_getattr()
1941 stat->uid = GLOBAL_ROOT_UID; in pid_getattr()
1942 stat->gid = GLOBAL_ROOT_GID; in pid_getattr()
1952 return -ENOENT; in pid_getattr()
1954 task_dump_owner(task, inode->i_mode, &stat->uid, &stat->gid); in pid_getattr()
1967 task_dump_owner(task, inode->i_mode, &inode->i_uid, &inode->i_gid); in pid_update_inode()
1969 inode->i_mode &= ~(S_ISUID | S_ISGID); in pid_update_inode()
1984 return -ECHILD; in pid_revalidate()
1999 return !proc_pid(inode)->tasks[PIDTYPE_PID].first; in proc_inode_is_dead()
2035 struct dentry *child, *dir = file->f_path.dentry; in proc_fill_cache()
2060 ino = inode->i_ino; in proc_fill_cache()
2061 type = inode->i_mode >> 12; in proc_fill_cache()
2068 * dname_to_vma_addr - maps a dentry name into two unsigned longs
2074 const char *str = dentry->d_name.name; in dname_to_vma_addr()
2078 if (str[0] == '0' && str[1] != '-') in dname_to_vma_addr()
2079 return -EINVAL; in dname_to_vma_addr()
2082 return -EINVAL; in dname_to_vma_addr()
2084 return -EINVAL; in dname_to_vma_addr()
2087 if (*str != '-') in dname_to_vma_addr()
2088 return -EINVAL; in dname_to_vma_addr()
2092 return -EINVAL; in dname_to_vma_addr()
2095 return -EINVAL; in dname_to_vma_addr()
2097 return -EINVAL; in dname_to_vma_addr()
2101 return -EINVAL; in dname_to_vma_addr()
2119 return -ECHILD; in map_files_d_revalidate()
2142 task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid); in map_files_d_revalidate()
2168 rc = -ENOENT; in map_files_get_link()
2186 rc = -ENOENT; in map_files_get_link()
2188 if (vma && vma->vm_file) { in map_files_get_link()
2189 *path = vma->vm_file->f_path; in map_files_get_link()
2218 return ERR_PTR(-EPERM); in proc_map_files_get_link()
2240 inode = proc_pid_make_inode(dentry->d_sb, task, S_IFLNK | in proc_map_files_instantiate()
2244 return ERR_PTR(-ENOENT); in proc_map_files_instantiate()
2247 ei->op.proc_get_link = map_files_get_link; in proc_map_files_instantiate()
2249 inode->i_op = &proc_map_files_link_inode_operations; in proc_map_files_instantiate()
2250 inode->i_size = 64; in proc_map_files_instantiate()
2265 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2270 result = ERR_PTR(-EACCES); in proc_map_files_lookup()
2274 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2282 result = ERR_PTR(-EINTR); in proc_map_files_lookup()
2286 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2291 if (vma->vm_file) in proc_map_files_lookup()
2293 (void *)(unsigned long)vma->vm_file->f_mode); in proc_map_files_lookup()
2324 ret = -ENOENT; in proc_map_files_readdir()
2329 ret = -EACCES; in proc_map_files_readdir()
2359 for (vma = mm->mmap, pos = 2; vma; vma = vma->vm_next) { in proc_map_files_readdir()
2360 if (!vma->vm_file) in proc_map_files_readdir()
2362 if (++pos <= ctx->pos) in proc_map_files_readdir()
2367 ret = -ENOMEM; in proc_map_files_readdir()
2373 p->start = vma->vm_start; in proc_map_files_readdir()
2374 p->end = vma->vm_end; in proc_map_files_readdir()
2375 p->mode = vma->vm_file->f_mode; in proc_map_files_readdir()
2381 char buf[4 * sizeof(long) + 2]; /* max: %lx-%lx\0 */ in proc_map_files_readdir()
2385 len = snprintf(buf, sizeof(buf), "%lx-%lx", p->start, p->end); in proc_map_files_readdir()
2390 (void *)(unsigned long)p->mode)) in proc_map_files_readdir()
2392 ctx->pos++; in proc_map_files_readdir()
2413 struct pid_namespace *ns; member
2419 struct timers_private *tp = m->private; in timers_start()
2421 tp->task = get_pid_task(tp->pid, PIDTYPE_PID); in timers_start()
2422 if (!tp->task) in timers_start()
2423 return ERR_PTR(-ESRCH); in timers_start()
2425 tp->sighand = lock_task_sighand(tp->task, &tp->flags); in timers_start()
2426 if (!tp->sighand) in timers_start()
2427 return ERR_PTR(-ESRCH); in timers_start()
2429 return seq_list_start(&tp->task->signal->posix_timers, *pos); in timers_start()
2434 struct timers_private *tp = m->private; in timers_next()
2435 return seq_list_next(v, &tp->task->signal->posix_timers, pos); in timers_next()
2440 struct timers_private *tp = m->private; in timers_stop()
2442 if (tp->sighand) { in timers_stop()
2443 unlock_task_sighand(tp->task, &tp->flags); in timers_stop()
2444 tp->sighand = NULL; in timers_stop()
2447 if (tp->task) { in timers_stop()
2448 put_task_struct(tp->task); in timers_stop()
2449 tp->task = NULL; in timers_stop()
2456 struct timers_private *tp = m->private; in show_timer()
2465 notify = timer->it_sigev_notify; in show_timer()
2467 seq_printf(m, "ID: %d\n", timer->it_id); in show_timer()
2469 timer->sigq->info.si_signo, in show_timer()
2470 timer->sigq->info.si_value.sival_ptr); in show_timer()
2474 pid_nr_ns(timer->it_pid, tp->ns)); in show_timer()
2475 seq_printf(m, "ClockID: %d\n", timer->it_clock); in show_timer()
2494 return -ENOMEM; in proc_timers_open()
2496 tp->pid = proc_pid(inode); in proc_timers_open()
2497 tp->ns = proc_pid_ns(inode->i_sb); in proc_timers_open()
2523 return -ESRCH; in timerslack_ns_write()
2527 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { in timerslack_ns_write()
2529 count = -EPERM; in timerslack_ns_write()
2543 p->timer_slack_ns = p->default_timer_slack_ns; in timerslack_ns_write()
2545 p->timer_slack_ns = slack_ns; in timerslack_ns_write()
2556 struct inode *inode = m->private; in timerslack_ns_show()
2562 return -ESRCH; in timerslack_ns_show()
2566 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { in timerslack_ns_show()
2568 err = -EPERM; in timerslack_ns_show()
2579 seq_printf(m, "%llu\n", p->timer_slack_ns); in timerslack_ns_show()
2608 inode = proc_pid_make_inode(dentry->d_sb, task, p->mode); in proc_pident_instantiate()
2610 return ERR_PTR(-ENOENT); in proc_pident_instantiate()
2613 if (S_ISDIR(inode->i_mode)) in proc_pident_instantiate()
2615 if (p->iop) in proc_pident_instantiate()
2616 inode->i_op = p->iop; in proc_pident_instantiate()
2617 if (p->fop) in proc_pident_instantiate()
2618 inode->i_fop = p->fop; in proc_pident_instantiate()
2619 ei->op = p->op; in proc_pident_instantiate()
2631 struct dentry *res = ERR_PTR(-ENOENT); in proc_pident_lookup()
2641 if (p->len != dentry->d_name.len) in proc_pident_lookup()
2643 if (!memcmp(dentry->d_name.name, p->name, p->len)) { in proc_pident_lookup()
2660 return -ENOENT; in proc_pident_readdir()
2665 if (ctx->pos >= nents + 2) in proc_pident_readdir()
2668 for (p = ents + (ctx->pos - 2); p < ents + nents; p++) { in proc_pident_readdir()
2669 if (!proc_fill_cache(file, ctx, p->name, p->len, in proc_pident_readdir()
2672 ctx->pos++; in proc_pident_readdir()
2682 file->private_data = NULL; in proc_pid_attr_open()
2696 return -ESRCH; in proc_pid_attr_read()
2698 length = security_getprocattr(task, PROC_I(inode)->op.lsm, in proc_pid_attr_read()
2699 (char*)file->f_path.dentry->d_name.name, in proc_pid_attr_read()
2717 if (file->private_data != current->mm) in proc_pid_attr_write()
2718 return -EPERM; in proc_pid_attr_write()
2724 return -ESRCH; in proc_pid_attr_write()
2729 return -EACCES; in proc_pid_attr_write()
2734 return -EBUSY; in proc_pid_attr_write()
2743 return -EINVAL; in proc_pid_attr_write()
2752 rv = mutex_lock_interruptible(&current->signal->cred_guard_mutex); in proc_pid_attr_write()
2756 rv = security_setprocattr(PROC_I(inode)->op.lsm, in proc_pid_attr_write()
2757 file->f_path.dentry->d_name.name, page, in proc_pid_attr_write()
2759 mutex_unlock(&current->signal->cred_guard_mutex); in proc_pid_attr_write()
2875 return -ESRCH; in proc_coredump_filter_read()
2881 ((mm->flags & MMF_DUMP_FILTER_MASK) >> in proc_coredump_filter_read()
2908 ret = -ESRCH; in proc_coredump_filter_write()
2920 set_bit(i + MMF_DUMP_FILTER_SHIFT, &mm->flags); in proc_coredump_filter_write()
2922 clear_bit(i + MMF_DUMP_FILTER_SHIFT, &mm->flags); in proc_coredump_filter_write()
2944 struct task_io_accounting acct = task->ioac; in do_io_accounting()
2948 result = down_read_killable(&task->signal->exec_update_lock); in do_io_accounting()
2953 result = -EACCES; in do_io_accounting()
2960 task_io_accounting_add(&acct, &task->signal->ioac); in do_io_accounting()
2962 task_io_accounting_add(&acct, &t->ioac); in do_io_accounting()
2984 up_read(&task->signal->exec_update_lock); in do_io_accounting()
2988 static int proc_tid_io_accounting(struct seq_file *m, struct pid_namespace *ns, in proc_tid_io_accounting() argument
2994 static int proc_tgid_io_accounting(struct seq_file *m, struct pid_namespace *ns, in proc_tgid_io_accounting() argument
3005 struct user_namespace *ns = NULL; in proc_id_map_open() local
3008 int ret = -EINVAL; in proc_id_map_open()
3013 ns = get_user_ns(task_cred_xxx(task, user_ns)); in proc_id_map_open()
3017 if (!ns) in proc_id_map_open()
3024 seq = file->private_data; in proc_id_map_open()
3025 seq->private = ns; in proc_id_map_open()
3029 put_user_ns(ns); in proc_id_map_open()
3036 struct seq_file *seq = file->private_data; in proc_id_map_release()
3037 struct user_namespace *ns = seq->private; in proc_id_map_release() local
3038 put_user_ns(ns); in proc_id_map_release()
3083 struct user_namespace *ns = NULL; in proc_setgroups_open() local
3087 ret = -ESRCH; in proc_setgroups_open()
3091 ns = get_user_ns(task_cred_xxx(task, user_ns)); in proc_setgroups_open()
3095 if (!ns) in proc_setgroups_open()
3098 if (file->f_mode & FMODE_WRITE) { in proc_setgroups_open()
3099 ret = -EACCES; in proc_setgroups_open()
3100 if (!ns_capable(ns, CAP_SYS_ADMIN)) in proc_setgroups_open()
3104 ret = single_open(file, &proc_setgroups_show, ns); in proc_setgroups_open()
3110 put_user_ns(ns); in proc_setgroups_open()
3117 struct seq_file *seq = file->private_data; in proc_setgroups_release()
3118 struct user_namespace *ns = seq->private; in proc_setgroups_release() local
3120 put_user_ns(ns); in proc_setgroups_release()
3133 static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns, in proc_pid_personality() argument
3138 seq_printf(m, "%08x\n", task->personality); in proc_pid_personality()
3145 static int proc_pid_patch_state(struct seq_file *m, struct pid_namespace *ns, in proc_pid_patch_state() argument
3148 seq_printf(m, "%d\n", task->patch_state); in proc_pid_patch_state()
3154 static int proc_stack_depth(struct seq_file *m, struct pid_namespace *ns, in proc_stack_depth() argument
3157 unsigned long prev_depth = THREAD_SIZE - in proc_stack_depth()
3158 (task->prev_lowest_stack & (THREAD_SIZE - 1)); in proc_stack_depth()
3159 unsigned long depth = THREAD_SIZE - in proc_stack_depth()
3160 (task->lowest_stack & (THREAD_SIZE - 1)); in proc_stack_depth()
3179 DIR("ns", S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
3234 REG("latency", S_IRUGO, proc_lstats_operations),
3253 REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
3254 REG("fail-nth", 0644, proc_fail_nth_operations),
3300 if (file->f_op != &proc_tgid_base_operations) in tgid_pidfd_to_pid()
3301 return ERR_PTR(-EBADF); in tgid_pidfd_to_pid()
3321 * proc_flush_pid - Remove dcache entries for @pid from the /proc dcache.
3341 proc_invalidate_siblings_dcache(&pid->inodes, &pid->lock); in proc_flush_pid()
3349 inode = proc_pid_make_inode(dentry->d_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); in proc_pid_instantiate()
3351 return ERR_PTR(-ENOENT); in proc_pid_instantiate()
3353 inode->i_op = &proc_tgid_base_inode_operations; in proc_pid_instantiate()
3354 inode->i_fop = &proc_tgid_base_operations; in proc_pid_instantiate()
3355 inode->i_flags|=S_IMMUTABLE; in proc_pid_instantiate()
3369 struct pid_namespace *ns; in proc_pid_lookup() local
3370 struct dentry *result = ERR_PTR(-ENOENT); in proc_pid_lookup()
3372 tgid = name_to_int(&dentry->d_name); in proc_pid_lookup()
3376 fs_info = proc_sb_info(dentry->d_sb); in proc_pid_lookup()
3377 ns = fs_info->pid_ns; in proc_pid_lookup()
3379 task = find_task_by_pid_ns(tgid, ns); in proc_pid_lookup()
3387 if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE) { in proc_pid_lookup()
3407 static struct tgid_iter next_tgid(struct pid_namespace *ns, struct tgid_iter iter) in next_tgid() argument
3416 pid = find_ge_pid(iter.tgid, ns); in next_tgid()
3418 iter.tgid = pid_nr_ns(pid, ns); in next_tgid()
3432 /* for the /proc/ directory itself, after non-process stuff has been done */
3436 struct proc_fs_info *fs_info = proc_sb_info(file_inode(file)->i_sb); in proc_pid_readdir()
3437 struct pid_namespace *ns = proc_pid_ns(file_inode(file)->i_sb); in proc_pid_readdir() local
3438 loff_t pos = ctx->pos; in proc_pid_readdir()
3443 if (pos == TGID_OFFSET - 2) { in proc_pid_readdir()
3444 struct inode *inode = d_inode(fs_info->proc_self); in proc_pid_readdir()
3445 if (!dir_emit(ctx, "self", 4, inode->i_ino, DT_LNK)) in proc_pid_readdir()
3447 ctx->pos = pos = pos + 1; in proc_pid_readdir()
3449 if (pos == TGID_OFFSET - 1) { in proc_pid_readdir()
3450 struct inode *inode = d_inode(fs_info->proc_thread_self); in proc_pid_readdir()
3451 if (!dir_emit(ctx, "thread-self", 11, inode->i_ino, DT_LNK)) in proc_pid_readdir()
3453 ctx->pos = pos = pos + 1; in proc_pid_readdir()
3455 iter.tgid = pos - TGID_OFFSET; in proc_pid_readdir()
3457 for (iter = next_tgid(ns, iter); in proc_pid_readdir()
3459 iter.tgid += 1, iter = next_tgid(ns, iter)) { in proc_pid_readdir()
3468 ctx->pos = iter.tgid + TGID_OFFSET; in proc_pid_readdir()
3475 ctx->pos = PID_MAX_LIMIT + TGID_OFFSET; in proc_pid_readdir()
3499 return -ESRCH; in proc_tid_comm_permission()
3524 DIR("ns", S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
3577 REG("latency", S_IRUGO, proc_lstats_operations),
3596 REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
3597 REG("fail-nth", 0644, proc_fail_nth_operations),
3648 inode = proc_pid_make_inode(dentry->d_sb, task, S_IFDIR | S_IRUGO | S_IXUGO); in proc_task_instantiate()
3650 return ERR_PTR(-ENOENT); in proc_task_instantiate()
3652 inode->i_op = &proc_tid_base_inode_operations; in proc_task_instantiate()
3653 inode->i_fop = &proc_tid_base_operations; in proc_task_instantiate()
3654 inode->i_flags |= S_IMMUTABLE; in proc_task_instantiate()
3669 struct pid_namespace *ns; in proc_task_lookup() local
3670 struct dentry *result = ERR_PTR(-ENOENT); in proc_task_lookup()
3675 tid = name_to_int(&dentry->d_name); in proc_task_lookup()
3679 fs_info = proc_sb_info(dentry->d_sb); in proc_task_lookup()
3680 ns = fs_info->pid_ns; in proc_task_lookup()
3682 task = find_task_by_pid_ns(tid, ns); in proc_task_lookup()
3713 struct pid_namespace *ns) in first_tid() argument
3728 pos = find_task_by_pid_ns(tid, ns); in first_tid()
3740 pos = task = task->group_leader; in first_tid()
3742 if (!nr--) in first_tid()
3782 struct pid_namespace *ns; in proc_task_readdir() local
3786 return -ENOENT; in proc_task_readdir()
3794 ns = proc_pid_ns(inode->i_sb); in proc_task_readdir()
3795 tid = (int)file->f_version; in proc_task_readdir()
3796 file->f_version = 0; in proc_task_readdir()
3797 for (task = first_tid(proc_pid(inode), tid, ctx->pos - 2, ns); in proc_task_readdir()
3799 task = next_tid(task), ctx->pos++) { in proc_task_readdir()
3802 tid = task_pid_nr_ns(task, ns); in proc_task_readdir()
3808 file->f_version = (u64)tid; in proc_task_readdir()
3821 struct inode *inode = d_inode(path->dentry); in proc_task_getattr()
3826 stat->nlink += get_nr_threads(p); in proc_task_getattr()