diff options
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 27 | 
1 files changed, 22 insertions, 5 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index c1c207c36ca..6a91e6ffbcb 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -162,7 +162,7 @@ static inline const char *get_task_state(struct task_struct *tsk)  static inline void task_state(struct seq_file *m, struct pid_namespace *ns,  				struct pid *pid, struct task_struct *p)  { -	struct user_namespace *user_ns = current_user_ns(); +	struct user_namespace *user_ns = seq_user_ns(m);  	struct group_info *group_info;  	int g;  	struct fdtable *fdt = NULL; @@ -212,7 +212,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,  	group_info = cred->group_info;  	task_unlock(p); -	for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++) +	for (g = 0; g < group_info->ngroups; g++)  		seq_printf(m, "%d ",  			   from_kgid_munged(user_ns, GROUP_AT(group_info, g)));  	put_cred(cred); @@ -220,7 +220,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,  	seq_putc(m, '\n');  } -static void render_sigset_t(struct seq_file *m, const char *header, +void render_sigset_t(struct seq_file *m, const char *header,  				sigset_t *set)  {  	int i; @@ -308,6 +308,10 @@ static void render_cap_t(struct seq_file *m, const char *header,  	seq_putc(m, '\n');  } +/* Remove non-existent capabilities */ +#define NORM_CAPS(v) (v.cap[CAP_TO_INDEX(CAP_LAST_CAP)] &= \ +				CAP_TO_MASK(CAP_LAST_CAP + 1) - 1) +  static inline void task_cap(struct seq_file *m, struct task_struct *p)  {  	const struct cred *cred; @@ -321,12 +325,24 @@ static inline void task_cap(struct seq_file *m, struct task_struct *p)  	cap_bset	= cred->cap_bset;  	rcu_read_unlock(); +	NORM_CAPS(cap_inheritable); +	NORM_CAPS(cap_permitted); +	NORM_CAPS(cap_effective); +	NORM_CAPS(cap_bset); +  	render_cap_t(m, "CapInh:\t", &cap_inheritable);  	render_cap_t(m, "CapPrm:\t", &cap_permitted);  	render_cap_t(m, "CapEff:\t", &cap_effective);  	render_cap_t(m, "CapBnd:\t", &cap_bset);  } +static inline void task_seccomp(struct seq_file *m, struct task_struct *p) +{ +#ifdef CONFIG_SECCOMP +	seq_printf(m, "Seccomp:\t%d\n", p->seccomp.mode); +#endif +} +  static inline void task_context_switch_counts(struct seq_file *m,  						struct task_struct *p)  { @@ -360,6 +376,7 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,  	}  	task_sig(m, task);  	task_cap(m, task); +	task_seccomp(m, task);  	task_cpus_allowed(m, task);  	cpuset_task_status_allowed(m, task);  	task_context_switch_counts(m, task); @@ -438,7 +455,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  			min_flt += sig->min_flt;  			maj_flt += sig->maj_flt; -			thread_group_times(task, &utime, &stime); +			thread_group_cputime_adjusted(task, &utime, &stime);  			gtime += sig->gtime;  		} @@ -454,7 +471,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	if (!whole) {  		min_flt = task->min_flt;  		maj_flt = task->maj_flt; -		task_times(task, &utime, &stime); +		task_cputime_adjusted(task, &utime, &stime);  		gtime = task->gtime;  	}  | 
