Lines Matching +full:sig +full:- +full:dir

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:
61 #include <linux/generic-radix-tree.h>
95 #include <linux/posix-timers.h>
141 return -EINVAL; in early_proc_mem_force_override()
165 .len = sizeof(NAME) - 1, \
172 #define DIR(NAME, MODE, iops, fops) \ macro
210 int result = -ENOENT; in get_task_root()
213 if (task->fs) { in get_task_root()
214 get_fs_root(task->fs, root); in get_task_root()
224 int result = -ENOENT; in proc_cwd_link()
228 if (task->fs) { in proc_cwd_link()
229 get_fs_pwd(task->fs, path); in proc_cwd_link()
241 int result = -ENOENT; in proc_root_link()
266 return -ENOMEM; in get_mm_proctitle()
278 len -= pos; in get_mm_proctitle()
281 len -= copy_to_user(buf, page+pos, len); in get_mm_proctitle()
283 len = -EFAULT; in get_mm_proctitle()
299 if (!mm->env_end) in get_mm_cmdline()
302 spin_lock(&mm->arg_lock); in get_mm_cmdline()
303 arg_start = mm->arg_start; in get_mm_cmdline()
304 arg_end = mm->arg_end; in get_mm_cmdline()
305 env_start = mm->env_start; in get_mm_cmdline()
306 env_end = mm->env_end; in get_mm_cmdline()
307 spin_unlock(&mm->arg_lock); in get_mm_cmdline()
319 len = env_end - arg_start; in get_mm_cmdline()
325 if (count > len - pos) in get_mm_cmdline()
326 count = len - pos; in get_mm_cmdline()
337 if (access_remote_vm(mm, arg_end-1, &c, 1, FOLL_ANON) == 1 && c) in get_mm_cmdline()
341 * For the non-setproctitle() case we limit things strictly in get_mm_cmdline()
347 if (count > arg_end - pos) in get_mm_cmdline()
348 count = arg_end - pos; in get_mm_cmdline()
352 return -ENOMEM; in get_mm_cmdline()
362 got -= copy_to_user(buf, page, got); in get_mm_cmdline()
365 len = -EFAULT; in get_mm_cmdline()
371 count -= got; in get_mm_cmdline()
403 return -ESRCH; in proc_pid_cmdline_read()
418 * Provides a wchan file via kallsyms in a proper one-value-per-file format.
444 int err = down_read_killable(&task->signal->exec_update_lock); in lock_trace()
448 up_read(&task->signal->exec_update_lock); in lock_trace()
449 return -EPERM; in lock_trace()
456 up_read(&task->signal->exec_update_lock); in unlock_trace()
480 if (!file_ns_capable(m->file, &init_user_ns, CAP_SYS_ADMIN)) in proc_pid_stack()
481 return -EACCES; in proc_pid_stack()
486 return -ENOMEM; in proc_pid_stack()
518 (unsigned long long)task->se.sum_exec_runtime, in proc_pid_schedstat()
519 (unsigned long long)task->sched_info.run_delay, in proc_pid_schedstat()
520 task->sched_info.pcount); in proc_pid_schedstat()
530 struct inode *inode = m->private; in lstats_show_proc()
534 return -ESRCH; in lstats_show_proc()
537 struct latency_record *lr = &task->latency_record[i]; in lstats_show_proc()
538 if (lr->backtrace[0]) { in lstats_show_proc()
541 lr->count, lr->time, lr->max); in lstats_show_proc()
543 unsigned long bt = lr->backtrace[q]; in lstats_show_proc()
568 return -ESRCH; in lstats_write()
641 memcpy(rlim, task->signal->rlim, sizeof(struct rlimit) * RLIM_NLIMITS); in proc_pid_limits()
654 seq_printf(m, "%-25s %-20s ", in proc_pid_limits()
657 seq_printf(m, "%-25s %-20lu ", in proc_pid_limits()
661 seq_printf(m, "%-20s ", "unlimited"); in proc_pid_limits()
663 seq_printf(m, "%-20lu ", rlim[i].rlim_max); in proc_pid_limits()
666 seq_printf(m, "%-10s\n", lnames[i].unit); in proc_pid_limits()
730 if (attr->ia_valid & ATTR_MODE) in proc_setattr()
731 return -EPERM; in proc_setattr()
754 if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE) in has_pid_permissions()
757 if (fs_info->hide_pid < hide_pid_min) in has_pid_permissions()
759 if (in_group_p(fs_info->pid_gid)) in has_pid_permissions()
768 struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); in proc_pid_permission()
774 return -ESRCH; in proc_pid_permission()
779 if (fs_info->hide_pid == HIDEPID_INVISIBLE) { in proc_pid_permission()
786 return -ENOENT; in proc_pid_permission()
789 return -EPERM; in proc_pid_permission()
802 struct inode *inode = m->private; in proc_single_show()
803 struct pid_namespace *ns = proc_pid_ns(inode->i_sb); in proc_single_show()
810 return -ESRCH; in proc_single_show()
812 ret = PROC_I(inode)->op.proc_show(m, ns, pid, task); in proc_single_show()
833 * - Returns NULL if the task has no mm (PF_KTHREAD or PF_EXITING)
834 * - Returns mm_struct* on success
835 * - Returns error code on failure
843 return ERR_PTR(-ESRCH); in proc_mem_open()
849 return mm == ERR_PTR(-ESRCH) ? NULL : mm; in proc_mem_open()
864 return mm ? PTR_ERR(mm) : -ESRCH; in __mem_open()
866 file->private_data = mm; in __mem_open()
872 if (WARN_ON_ONCE(!(file->f_op->fop_flags & FOP_UNSIGNED_OFFSET))) in mem_open()
873 return -EINVAL; in mem_open()
888 ptrace_active = READ_ONCE(task->ptrace) && in proc_mem_foll_force()
889 READ_ONCE(task->mm) == mm && in proc_mem_foll_force()
890 READ_ONCE(task->parent) == current; in proc_mem_foll_force()
902 struct mm_struct *mm = file->private_data; in mem_rw()
913 return -ENOMEM; in mem_rw()
927 copied = -EFAULT; in mem_rw()
934 copied = -EIO; in mem_rw()
939 copied = -EFAULT; in mem_rw()
946 count -= this_len; in mem_rw()
972 file->f_pos = offset; in mem_lseek()
975 file->f_pos += offset; in mem_lseek()
978 return -EINVAL; in mem_lseek()
981 return file->f_pos; in mem_lseek()
986 struct mm_struct *mm = file->private_data; in mem_release()
1012 struct mm_struct *mm = file->private_data; in environ_read()
1016 if (!mm || !mm->env_end) in environ_read()
1021 return -ENOMEM; in environ_read()
1027 spin_lock(&mm->arg_lock); in environ_read()
1028 env_start = mm->env_start; in environ_read()
1029 env_end = mm->env_end; in environ_read()
1030 spin_unlock(&mm->arg_lock); in environ_read()
1036 if (src >= (env_end - env_start)) in environ_read()
1039 this_len = env_end - (env_start + src); in environ_read()
1052 ret = -EFAULT; in environ_read()
1059 count -= retval; in environ_read()
1084 struct mm_struct *mm = file->private_data; in auxv_read()
1091 } while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ in auxv_read()
1092 return simple_read_from_buffer(buf, count, ppos, mm->saved_auxv, in auxv_read()
1093 nwords * sizeof(mm->saved_auxv[0])); in auxv_read()
1112 return -ESRCH; in oom_adj_read()
1113 if (task->signal->oom_score_adj == OOM_SCORE_ADJ_MAX) in oom_adj_read()
1116 oom_adj = (task->signal->oom_score_adj * -OOM_DISABLE) / in oom_adj_read()
1133 return -ESRCH; in __set_oom_adj()
1137 if (oom_adj < task->signal->oom_score_adj && in __set_oom_adj()
1139 err = -EACCES; in __set_oom_adj()
1147 current->comm, task_pid_nr(current), task_pid_nr(task), in __set_oom_adj()
1150 if ((short)oom_adj < task->signal->oom_score_adj_min && in __set_oom_adj()
1152 err = -EACCES; in __set_oom_adj()
1162 if (!task->vfork_done) { in __set_oom_adj()
1166 if (mm_flags_test(MMF_MULTIPROCESS, p->mm)) { in __set_oom_adj()
1167 mm = p->mm; in __set_oom_adj()
1174 task->signal->oom_score_adj = oom_adj; in __set_oom_adj()
1176 task->signal->oom_score_adj_min = (short)oom_adj; in __set_oom_adj()
1188 if (p->flags & PF_KTHREAD || is_global_init(p)) in __set_oom_adj()
1192 if (!p->vfork_done && process_shares_mm(p, mm)) { in __set_oom_adj()
1193 p->signal->oom_score_adj = oom_adj; in __set_oom_adj()
1195 p->signal->oom_score_adj_min = (short)oom_adj; in __set_oom_adj()
1225 if (count > sizeof(buffer) - 1) in oom_adj_write()
1226 count = sizeof(buffer) - 1; in oom_adj_write()
1228 err = -EFAULT; in oom_adj_write()
1237 err = -EINVAL; in oom_adj_write()
1248 oom_adj = (oom_adj * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE; in oom_adj_write()
1270 return -ESRCH; in oom_score_adj_read()
1271 oom_score_adj = task->signal->oom_score_adj; in oom_score_adj_read()
1284 if (count > sizeof(buffer) - 1) in oom_score_adj_write()
1285 count = sizeof(buffer) - 1; in oom_score_adj_write()
1287 err = -EFAULT; in oom_score_adj_write()
1296 err = -EINVAL; in oom_score_adj_write()
1322 return -ESRCH; in proc_loginuid_read()
1324 from_kuid(file->f_cred->user_ns, in proc_loginuid_read()
1339 if (current->flags & PF_KTHREAD) in proc_loginuid_write()
1340 return -EPERM; in proc_loginuid_write()
1345 return -EPERM; in proc_loginuid_write()
1351 return -EINVAL; in proc_loginuid_write()
1362 kloginuid = make_kuid(file->f_cred->user_ns, loginuid); in proc_loginuid_write()
1364 return -EINVAL; in proc_loginuid_write()
1388 return -ESRCH; in proc_sessionid_read()
1411 return -ESRCH; in proc_fault_inject_read()
1412 make_it_fail = task->make_it_fail; in proc_fault_inject_read()
1429 return -EPERM; in proc_fault_inject_write()
1431 if (count > sizeof(buffer) - 1) in proc_fault_inject_write()
1432 count = sizeof(buffer) - 1; in proc_fault_inject_write()
1434 return -EFAULT; in proc_fault_inject_write()
1439 return -EINVAL; in proc_fault_inject_write()
1443 return -ESRCH; in proc_fault_inject_write()
1444 task->make_it_fail = make_it_fail; in proc_fault_inject_write()
1469 return -ESRCH; in proc_fail_nth_write()
1470 task->fail_nth = n; in proc_fail_nth_write()
1485 return -ESRCH; in proc_fail_nth_read()
1486 len = snprintf(numbuf, sizeof(numbuf), "%u\n", task->fail_nth); in proc_fail_nth_read()
1499 * Print out various scheduling related per-task fields:
1503 struct inode *inode = m->private; in sched_show()
1504 struct pid_namespace *ns = proc_pid_ns(inode->i_sb); in sched_show()
1509 return -ESRCH; in sched_show()
1526 return -ESRCH; in sched_write()
1553 struct inode *inode = m->private; in sched_autogroup_show()
1558 return -ESRCH; in sched_autogroup_show()
1576 if (count > sizeof(buffer) - 1) in sched_autogroup_write()
1577 count = sizeof(buffer) - 1; in sched_autogroup_write()
1579 return -EFAULT; in sched_autogroup_write()
1587 return -ESRCH; in sched_autogroup_write()
1604 struct seq_file *m = filp->private_data; in sched_autogroup_open()
1606 m->private = inode; in sched_autogroup_open()
1626 p = get_proc_task(file_inode(m->file)); in timens_offsets_show()
1628 return -ESRCH; in timens_offsets_show()
1647 return -EINVAL; in timens_offsets_write()
1655 ret = -EINVAL; in timens_offsets_write()
1672 &off->val.tv_sec, &off->val.tv_nsec); in timens_offsets_write()
1673 if (err != 3 || off->val.tv_nsec >= NSEC_PER_SEC) in timens_offsets_write()
1676 clock[sizeof(clock) - 1] = 0; in timens_offsets_write()
1679 off->clockid = CLOCK_MONOTONIC; in timens_offsets_write()
1682 off->clockid = CLOCK_BOOTTIME; in timens_offsets_write()
1689 count = next_line - kbuf; in timens_offsets_write()
1694 ret = -ESRCH; in timens_offsets_write()
1729 const size_t maxlen = sizeof(buffer) - 1; in comm_write()
1732 return -EFAULT; in comm_write()
1736 return -ESRCH; in comm_write()
1743 count = -EINVAL; in comm_write()
1752 struct inode *inode = m->private; in comm_show()
1757 return -ESRCH; in comm_show()
1787 return -ENOENT; in proc_exe_link()
1791 *exe_path = exe_file->f_path; in proc_exe_link()
1792 path_get(&exe_file->f_path); in proc_exe_link()
1796 return -ENOENT; in proc_exe_link()
1804 int error = -EACCES; in proc_pid_get_link()
1807 return ERR_PTR(-ECHILD); in proc_pid_get_link()
1813 error = PROC_I(inode)->op.proc_get_link(dentry, &path); in proc_pid_get_link()
1829 return -ENOMEM; in do_proc_readlink()
1835 len = tmp + PATH_MAX - 1 - pathname; in do_proc_readlink()
1840 len = -EFAULT; in do_proc_readlink()
1848 int error = -EACCES; in proc_pid_readlink()
1856 error = PROC_I(inode)->op.proc_get_link(dentry, &path); in proc_pid_readlink()
1885 if (unlikely(task->flags & PF_KTHREAD)) { in task_dump_owner()
1894 uid = cred->euid; in task_dump_owner()
1895 gid = cred->egid; in task_dump_owner()
1909 mm = task->mm; in task_dump_owner()
1910 /* Make non-dumpable tasks owned by some root */ in task_dump_owner()
1913 struct user_namespace *user_ns = mm->user_ns; in task_dump_owner()
1935 struct pid *pid = ei->pid; in proc_pid_evict_inode()
1937 if (S_ISDIR(ei->vfs_inode.i_mode)) { in proc_pid_evict_inode()
1938 spin_lock(&pid->lock); in proc_pid_evict_inode()
1939 hlist_del_init_rcu(&ei->sibling_inodes); in proc_pid_evict_inode()
1940 spin_unlock(&pid->lock); in proc_pid_evict_inode()
1959 inode->i_mode = mode; in proc_pid_make_inode()
1960 inode->i_ino = get_next_ino(); in proc_pid_make_inode()
1962 inode->i_op = &proc_def_inode_operations; in proc_pid_make_inode()
1972 ei->pid = pid; in proc_pid_make_inode()
1974 task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid); in proc_pid_make_inode()
1986 * Generating an inode and adding it into @pid->inodes, so that task will
1989 * This helper is used for creating dir-type entries under '/proc' and
2010 pid = ei->pid; in proc_pid_make_base_inode()
2011 spin_lock(&pid->lock); in proc_pid_make_base_inode()
2012 hlist_add_head_rcu(&ei->sibling_inodes, &pid->inodes); in proc_pid_make_base_inode()
2013 spin_unlock(&pid->lock); in proc_pid_make_base_inode()
2021 struct inode *inode = d_inode(path->dentry); in pid_getattr()
2022 struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); in pid_getattr()
2027 stat->uid = GLOBAL_ROOT_UID; in pid_getattr()
2028 stat->gid = GLOBAL_ROOT_GID; in pid_getattr()
2038 return -ENOENT; in pid_getattr()
2040 task_dump_owner(task, inode->i_mode, &stat->uid, &stat->gid); in pid_getattr()
2053 task_dump_owner(task, inode->i_mode, &inode->i_uid, &inode->i_gid); in pid_update_inode()
2055 inode->i_mode &= ~(S_ISUID | S_ISGID); in pid_update_inode()
2064 static int pid_revalidate(struct inode *dir, const struct qstr *name, in pid_revalidate() argument
2088 return !proc_pid(inode)->tasks[PIDTYPE_PID].first; in proc_inode_is_dead()
2124 struct dentry *child, *dir = file->f_path.dentry; in proc_fill_cache() local
2130 child = try_lookup_noperm(&qname, dir); in proc_fill_cache()
2133 child = d_alloc_parallel(dir, &qname, &wq); in proc_fill_cache()
2149 ino = inode->i_ino; in proc_fill_cache()
2150 type = inode->i_mode >> 12; in proc_fill_cache()
2157 * dname_to_vma_addr - maps a dentry name into two unsigned longs
2163 const char *str = dentry->d_name.name; in dname_to_vma_addr()
2167 if (str[0] == '0' && str[1] != '-') in dname_to_vma_addr()
2168 return -EINVAL; in dname_to_vma_addr()
2171 return -EINVAL; in dname_to_vma_addr()
2173 return -EINVAL; in dname_to_vma_addr()
2176 if (*str != '-') in dname_to_vma_addr()
2177 return -EINVAL; in dname_to_vma_addr()
2181 return -EINVAL; in dname_to_vma_addr()
2184 return -EINVAL; in dname_to_vma_addr()
2186 return -EINVAL; in dname_to_vma_addr()
2190 return -EINVAL; in dname_to_vma_addr()
2198 static int map_files_d_revalidate(struct inode *dir, const struct qstr *name, in map_files_d_revalidate() argument
2209 return -ECHILD; in map_files_d_revalidate()
2232 task_dump_owner(task, 0, &inode->i_uid, &inode->i_gid); in map_files_d_revalidate()
2258 rc = -ENOENT; in map_files_get_link()
2276 rc = -ENOENT; in map_files_get_link()
2278 if (vma && vma->vm_file) { in map_files_get_link()
2279 *path = *file_user_path(vma->vm_file); in map_files_get_link()
2308 return ERR_PTR(-EPERM); in proc_map_files_get_link()
2330 inode = proc_pid_make_inode(dentry->d_sb, task, S_IFLNK | in proc_map_files_instantiate()
2334 return ERR_PTR(-ENOENT); in proc_map_files_instantiate()
2337 ei->op.proc_get_link = map_files_get_link; in proc_map_files_instantiate()
2339 inode->i_op = &proc_map_files_link_inode_operations; in proc_map_files_instantiate()
2340 inode->i_size = 64; in proc_map_files_instantiate()
2346 static struct dentry *proc_map_files_lookup(struct inode *dir, in proc_map_files_lookup() argument
2355 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2356 task = get_proc_task(dir); in proc_map_files_lookup()
2360 result = ERR_PTR(-EACCES); in proc_map_files_lookup()
2364 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2372 result = ERR_PTR(-EINTR); in proc_map_files_lookup()
2376 result = ERR_PTR(-ENOENT); in proc_map_files_lookup()
2381 if (vma->vm_file) in proc_map_files_lookup()
2383 (void *)(unsigned long)vma->vm_file->f_mode); in proc_map_files_lookup()
2415 ret = -ENOENT; in proc_map_files_readdir()
2420 ret = -EACCES; in proc_map_files_readdir()
2453 if (!vma->vm_file) in proc_map_files_readdir()
2455 if (++pos <= ctx->pos) in proc_map_files_readdir()
2460 ret = -ENOMEM; in proc_map_files_readdir()
2466 p->start = vma->vm_start; in proc_map_files_readdir()
2467 p->end = vma->vm_end; in proc_map_files_readdir()
2468 p->mode = vma->vm_file->f_mode; in proc_map_files_readdir()
2474 char buf[4 * sizeof(long) + 2]; /* max: %lx-%lx\0 */ in proc_map_files_readdir()
2478 len = snprintf(buf, sizeof(buf), "%lx-%lx", p->start, p->end); in proc_map_files_readdir()
2483 (void *)(unsigned long)p->mode)) in proc_map_files_readdir()
2485 ctx->pos++; in proc_map_files_readdir()
2510 struct timers_private *tp = m->private; in timers_start()
2512 tp->task = get_pid_task(tp->pid, PIDTYPE_PID); in timers_start()
2513 if (!tp->task) in timers_start()
2514 return ERR_PTR(-ESRCH); in timers_start()
2517 return seq_hlist_start_rcu(&tp->task->signal->posix_timers, *pos); in timers_start()
2522 struct timers_private *tp = m->private; in timers_next()
2524 return seq_hlist_next_rcu(v, &tp->task->signal->posix_timers, pos); in timers_next()
2529 struct timers_private *tp = m->private; in timers_stop()
2531 if (tp->task) { in timers_stop()
2532 put_task_struct(tp->task); in timers_stop()
2533 tp->task = NULL; in timers_stop()
2547 struct timers_private *tp = m->private; in show_timer()
2548 int notify = timer->it_sigev_notify; in show_timer()
2550 guard(spinlock_irq)(&timer->it_lock); in show_timer()
2554 seq_printf(m, "ID: %d\n", timer->it_id); in show_timer()
2555 seq_printf(m, "signal: %d/%px\n", timer->sigq.info.si_signo, in show_timer()
2556 timer->sigq.info.si_value.sival_ptr); in show_timer()
2559 pid_nr_ns(timer->it_pid, tp->ns)); in show_timer()
2560 seq_printf(m, "ClockID: %d\n", timer->it_clock); in show_timer()
2579 return -ENOMEM; in proc_timers_open()
2581 tp->pid = proc_pid(inode); in proc_timers_open()
2582 tp->ns = proc_pid_ns(inode->i_sb); in proc_timers_open()
2608 return -ESRCH; in timerslack_ns_write()
2612 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { in timerslack_ns_write()
2614 count = -EPERM; in timerslack_ns_write()
2630 slack_ns = p->default_timer_slack_ns; in timerslack_ns_write()
2631 p->timer_slack_ns = slack_ns; in timerslack_ns_write()
2642 struct inode *inode = m->private; in timerslack_ns_show()
2648 return -ESRCH; in timerslack_ns_show()
2652 if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { in timerslack_ns_show()
2654 err = -EPERM; in timerslack_ns_show()
2665 seq_printf(m, "%llu\n", p->timer_slack_ns); in timerslack_ns_show()
2694 inode = proc_pid_make_inode(dentry->d_sb, task, p->mode); in proc_pident_instantiate()
2696 return ERR_PTR(-ENOENT); in proc_pident_instantiate()
2699 if (S_ISDIR(inode->i_mode)) in proc_pident_instantiate()
2701 if (p->iop) in proc_pident_instantiate()
2702 inode->i_op = p->iop; in proc_pident_instantiate()
2703 if (p->fop) in proc_pident_instantiate()
2704 inode->i_fop = p->fop; in proc_pident_instantiate()
2705 ei->op = p->op; in proc_pident_instantiate()
2710 static struct dentry *proc_pident_lookup(struct inode *dir, in proc_pident_lookup() argument
2715 struct task_struct *task = get_proc_task(dir); in proc_pident_lookup()
2716 struct dentry *res = ERR_PTR(-ENOENT); in proc_pident_lookup()
2726 if (p->len != dentry->d_name.len) in proc_pident_lookup()
2728 if (!memcmp(dentry->d_name.name, p->name, p->len)) { in proc_pident_lookup()
2745 return -ENOENT; in proc_pident_readdir()
2750 if (ctx->pos >= nents + 2) in proc_pident_readdir()
2753 for (p = ents + (ctx->pos - 2); p < ents + nents; p++) { in proc_pident_readdir()
2754 if (!proc_fill_cache(file, ctx, p->name, p->len, in proc_pident_readdir()
2757 ctx->pos++; in proc_pident_readdir()
2767 file->private_data = NULL; in proc_pid_attr_open()
2781 return -ESRCH; in proc_pid_attr_read()
2783 length = security_getprocattr(task, PROC_I(inode)->op.lsmid, in proc_pid_attr_read()
2784 file->f_path.dentry->d_name.name, in proc_pid_attr_read()
2802 if (file->private_data != current->mm) in proc_pid_attr_write()
2803 return -EPERM; in proc_pid_attr_write()
2809 return -ESRCH; in proc_pid_attr_write()
2814 return -EACCES; in proc_pid_attr_write()
2819 return -EBUSY; in proc_pid_attr_write()
2828 return -EINVAL; in proc_pid_attr_write()
2837 rv = mutex_lock_interruptible(&current->signal->cred_guard_mutex); in proc_pid_attr_write()
2841 rv = security_setprocattr(PROC_I(inode)->op.lsmid, in proc_pid_attr_write()
2842 file->f_path.dentry->d_name.name, page, in proc_pid_attr_write()
2844 mutex_unlock(&current->signal->cred_guard_mutex); in proc_pid_attr_write()
2874 static struct dentry *proc_##LSM##_attr_dir_lookup(struct inode *dir, \
2877 return proc_pident_lookup(dir, dentry, \
2912 DIR("smack", 0555,
2916 DIR("apparmor", 0555,
2933 static struct dentry *proc_attr_dir_lookup(struct inode *dir, in proc_attr_dir_lookup() argument
2936 return proc_pident_lookup(dir, dentry, in proc_attr_dir_lookup()
2960 return -ESRCH; in proc_coredump_filter_read()
2995 ret = -ESRCH; in proc_coredump_filter_write()
3034 result = down_read_killable(&task->signal->exec_update_lock); in do_io_accounting()
3039 result = -EACCES; in do_io_accounting()
3044 struct signal_struct *sig = task->signal; in do_io_accounting() local
3052 flags = read_seqbegin_or_lock_irqsave(&sig->stats_lock, &seq); in do_io_accounting()
3054 acct = sig->ioac; in do_io_accounting()
3055 __for_each_thread(sig, t) in do_io_accounting()
3056 task_io_accounting_add(&acct, &t->ioac); in do_io_accounting()
3058 } while (need_seqretry(&sig->stats_lock, seq)); in do_io_accounting()
3059 done_seqretry_irqrestore(&sig->stats_lock, seq, flags); in do_io_accounting()
3062 acct = task->ioac; in do_io_accounting()
3083 up_read(&task->signal->exec_update_lock); in do_io_accounting()
3107 int ret = -EINVAL; in proc_id_map_open()
3123 seq = file->private_data; in proc_id_map_open()
3124 seq->private = ns; in proc_id_map_open()
3135 struct seq_file *seq = file->private_data; in proc_id_map_release()
3136 struct user_namespace *ns = seq->private; in proc_id_map_release()
3186 ret = -ESRCH; in proc_setgroups_open()
3197 if (file->f_mode & FMODE_WRITE) { in proc_setgroups_open()
3198 ret = -EACCES; in proc_setgroups_open()
3216 struct seq_file *seq = file->private_data; in proc_setgroups_release()
3217 struct user_namespace *ns = seq->private; in proc_setgroups_release()
3237 seq_printf(m, "%08x\n", task->personality); in proc_pid_personality()
3247 seq_printf(m, "%d\n", task->patch_state); in proc_pid_patch_state()
3260 seq_printf(m, "%lu\n", mm->ksm_merging_pages); in proc_pid_ksm_merging_pages()
3274 seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items); in proc_pid_ksm_stat()
3276 seq_printf(m, "ksm_merging_pages %lu\n", mm->ksm_merging_pages); in proc_pid_ksm_stat()
3299 unsigned long prev_depth = THREAD_SIZE - in proc_stack_depth()
3300 (task->prev_lowest_stack & (THREAD_SIZE - 1)); in proc_stack_depth()
3301 unsigned long depth = THREAD_SIZE - in proc_stack_depth()
3302 (task->lowest_stack & (THREAD_SIZE - 1)); in proc_stack_depth()
3317 DIR("task", S_IRUGO|S_IXUGO, proc_task_inode_operations, proc_task_operations),
3318 DIR("fd", S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations),
3319 DIR("map_files", S_IRUSR|S_IXUSR, proc_map_files_inode_operations, proc_map_files_operations),
3320 DIR("fdinfo", S_IRUGO|S_IXUGO, proc_fdinfo_inode_operations, proc_fdinfo_operations),
3321 DIR("ns", S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
3323 DIR("net", S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
3362 DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
3393 REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
3394 REG("fail-nth", 0644, proc_fail_nth_operations),
3444 if (file->f_op != &proc_tgid_base_operations) in tgid_pidfd_to_pid()
3445 return ERR_PTR(-EBADF); in tgid_pidfd_to_pid()
3450 static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int … in proc_tgid_base_lookup() argument
3452 return proc_pident_lookup(dir, dentry, in proc_tgid_base_lookup()
3465 * proc_flush_pid - Remove dcache entries for @pid from the /proc dcache.
3485 proc_invalidate_siblings_dcache(&pid->inodes, &pid->lock); in proc_flush_pid()
3493 inode = proc_pid_make_base_inode(dentry->d_sb, task, in proc_pid_instantiate()
3496 return ERR_PTR(-ENOENT); in proc_pid_instantiate()
3498 inode->i_op = &proc_tgid_base_inode_operations; in proc_pid_instantiate()
3499 inode->i_fop = &proc_tgid_base_operations; in proc_pid_instantiate()
3500 inode->i_flags|=S_IMMUTABLE; in proc_pid_instantiate()
3514 struct dentry *result = ERR_PTR(-ENOENT); in proc_pid_lookup()
3516 tgid = name_to_int(&dentry->d_name); in proc_pid_lookup()
3520 fs_info = proc_sb_info(dentry->d_sb); in proc_pid_lookup()
3521 ns = fs_info->pid_ns; in proc_pid_lookup()
3531 if (fs_info->hide_pid == HIDEPID_NOT_PTRACEABLE) { in proc_pid_lookup()
3576 /* for the /proc/ directory itself, after non-process stuff has been done */
3580 struct proc_fs_info *fs_info = proc_sb_info(file_inode(file)->i_sb); in proc_pid_readdir()
3581 struct pid_namespace *ns = proc_pid_ns(file_inode(file)->i_sb); in proc_pid_readdir()
3582 loff_t pos = ctx->pos; in proc_pid_readdir()
3587 if (pos == TGID_OFFSET - 2) { in proc_pid_readdir()
3588 struct inode *inode = d_inode(fs_info->proc_self); in proc_pid_readdir()
3589 if (!dir_emit(ctx, "self", 4, inode->i_ino, DT_LNK)) in proc_pid_readdir()
3591 ctx->pos = pos = pos + 1; in proc_pid_readdir()
3593 if (pos == TGID_OFFSET - 1) { in proc_pid_readdir()
3594 struct inode *inode = d_inode(fs_info->proc_thread_self); in proc_pid_readdir()
3595 if (!dir_emit(ctx, "thread-self", 11, inode->i_ino, DT_LNK)) in proc_pid_readdir()
3597 ctx->pos = pos = pos + 1; in proc_pid_readdir()
3599 iter.tgid = pos - TGID_OFFSET; in proc_pid_readdir()
3612 ctx->pos = iter.tgid + TGID_OFFSET; in proc_pid_readdir()
3619 ctx->pos = PID_MAX_LIMIT + TGID_OFFSET; in proc_pid_readdir()
3643 return -ESRCH; in proc_tid_comm_permission()
3667 DIR("fd", S_IRUSR|S_IXUSR, proc_fd_inode_operations, proc_fd_operations),
3668 DIR("fdinfo", S_IRUGO|S_IXUGO, proc_fdinfo_inode_operations, proc_fdinfo_operations),
3669 DIR("ns", S_IRUSR|S_IXUGO, proc_ns_dir_inode_operations, proc_ns_dir_operations),
3671 DIR("net", S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
3708 DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
3739 REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations),
3740 REG("fail-nth", 0644, proc_fail_nth_operations),
3772 static struct dentry *proc_tid_base_lookup(struct inode *dir, struct dentry *dentry, unsigned int f… in proc_tid_base_lookup() argument
3774 return proc_pident_lookup(dir, dentry, in proc_tid_base_lookup()
3795 inode = proc_pid_make_base_inode(dentry->d_sb, task, in proc_task_instantiate()
3798 return ERR_PTR(-ENOENT); in proc_task_instantiate()
3800 inode->i_op = &proc_tid_base_inode_operations; in proc_task_instantiate()
3801 inode->i_fop = &proc_tid_base_operations; in proc_task_instantiate()
3802 inode->i_flags |= S_IMMUTABLE; in proc_task_instantiate()
3810 static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry, unsigned int flag… in proc_task_lookup() argument
3813 struct task_struct *leader = get_proc_task(dir); in proc_task_lookup()
3817 struct dentry *result = ERR_PTR(-ENOENT); in proc_task_lookup()
3822 tid = name_to_int(&dentry->d_name); in proc_task_lookup()
3826 fs_info = proc_sb_info(dentry->d_sb); in proc_task_lookup()
3827 ns = fs_info->pid_ns; in proc_task_lookup()
3888 if (!nr--) in first_tid()
3930 return -ENOENT; in proc_task_readdir()
3938 ns = proc_pid_ns(inode->i_sb); in proc_task_readdir()
3939 tid = (int)(intptr_t)file->private_data; in proc_task_readdir()
3940 file->private_data = NULL; in proc_task_readdir()
3941 for (task = first_tid(proc_pid(inode), tid, ctx->pos - 2, ns); in proc_task_readdir()
3943 task = next_tid(task), ctx->pos++) { in proc_task_readdir()
3955 file->private_data = (void *)(intptr_t)tid; in proc_task_readdir()
3968 struct inode *inode = d_inode(path->dentry); in proc_task_getattr()
3973 stat->nlink += get_nr_threads(p); in proc_task_getattr()
3981 * proc_task_readdir() set @file->private_data to a positive integer
3989 u64 cookie = (u64)(intptr_t)file->private_data; in proc_dir_llseek()
3994 file->private_data = (void *)(intptr_t)cookie; /* serialized by f_pos_lock */ in proc_dir_llseek()