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 c1c207c36cae..6a91e6ffbcbd 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) | |||
| 162 | static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | 162 | static inline void task_state(struct seq_file *m, struct pid_namespace *ns, |
| 163 | struct pid *pid, struct task_struct *p) | 163 | struct pid *pid, struct task_struct *p) |
| 164 | { | 164 | { |
| 165 | struct user_namespace *user_ns = current_user_ns(); | 165 | struct user_namespace *user_ns = seq_user_ns(m); |
| 166 | struct group_info *group_info; | 166 | struct group_info *group_info; |
| 167 | int g; | 167 | int g; |
| 168 | struct fdtable *fdt = NULL; | 168 | struct fdtable *fdt = NULL; |
| @@ -212,7 +212,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
| 212 | group_info = cred->group_info; | 212 | group_info = cred->group_info; |
| 213 | task_unlock(p); | 213 | task_unlock(p); |
| 214 | 214 | ||
| 215 | for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++) | 215 | for (g = 0; g < group_info->ngroups; g++) |
| 216 | seq_printf(m, "%d ", | 216 | seq_printf(m, "%d ", |
| 217 | from_kgid_munged(user_ns, GROUP_AT(group_info, g))); | 217 | from_kgid_munged(user_ns, GROUP_AT(group_info, g))); |
| 218 | put_cred(cred); | 218 | put_cred(cred); |
| @@ -220,7 +220,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
| 220 | seq_putc(m, '\n'); | 220 | seq_putc(m, '\n'); |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | static void render_sigset_t(struct seq_file *m, const char *header, | 223 | void render_sigset_t(struct seq_file *m, const char *header, |
| 224 | sigset_t *set) | 224 | sigset_t *set) |
| 225 | { | 225 | { |
| 226 | int i; | 226 | int i; |
| @@ -308,6 +308,10 @@ static void render_cap_t(struct seq_file *m, const char *header, | |||
| 308 | seq_putc(m, '\n'); | 308 | seq_putc(m, '\n'); |
| 309 | } | 309 | } |
| 310 | 310 | ||
| 311 | /* Remove non-existent capabilities */ | ||
| 312 | #define NORM_CAPS(v) (v.cap[CAP_TO_INDEX(CAP_LAST_CAP)] &= \ | ||
| 313 | CAP_TO_MASK(CAP_LAST_CAP + 1) - 1) | ||
| 314 | |||
| 311 | static inline void task_cap(struct seq_file *m, struct task_struct *p) | 315 | static inline void task_cap(struct seq_file *m, struct task_struct *p) |
| 312 | { | 316 | { |
| 313 | const struct cred *cred; | 317 | const struct cred *cred; |
| @@ -321,12 +325,24 @@ static inline void task_cap(struct seq_file *m, struct task_struct *p) | |||
| 321 | cap_bset = cred->cap_bset; | 325 | cap_bset = cred->cap_bset; |
| 322 | rcu_read_unlock(); | 326 | rcu_read_unlock(); |
| 323 | 327 | ||
| 328 | NORM_CAPS(cap_inheritable); | ||
| 329 | NORM_CAPS(cap_permitted); | ||
| 330 | NORM_CAPS(cap_effective); | ||
| 331 | NORM_CAPS(cap_bset); | ||
| 332 | |||
| 324 | render_cap_t(m, "CapInh:\t", &cap_inheritable); | 333 | render_cap_t(m, "CapInh:\t", &cap_inheritable); |
| 325 | render_cap_t(m, "CapPrm:\t", &cap_permitted); | 334 | render_cap_t(m, "CapPrm:\t", &cap_permitted); |
| 326 | render_cap_t(m, "CapEff:\t", &cap_effective); | 335 | render_cap_t(m, "CapEff:\t", &cap_effective); |
| 327 | render_cap_t(m, "CapBnd:\t", &cap_bset); | 336 | render_cap_t(m, "CapBnd:\t", &cap_bset); |
| 328 | } | 337 | } |
| 329 | 338 | ||
| 339 | static inline void task_seccomp(struct seq_file *m, struct task_struct *p) | ||
| 340 | { | ||
| 341 | #ifdef CONFIG_SECCOMP | ||
| 342 | seq_printf(m, "Seccomp:\t%d\n", p->seccomp.mode); | ||
| 343 | #endif | ||
| 344 | } | ||
| 345 | |||
| 330 | static inline void task_context_switch_counts(struct seq_file *m, | 346 | static inline void task_context_switch_counts(struct seq_file *m, |
| 331 | struct task_struct *p) | 347 | struct task_struct *p) |
| 332 | { | 348 | { |
| @@ -360,6 +376,7 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, | |||
| 360 | } | 376 | } |
| 361 | task_sig(m, task); | 377 | task_sig(m, task); |
| 362 | task_cap(m, task); | 378 | task_cap(m, task); |
| 379 | task_seccomp(m, task); | ||
| 363 | task_cpus_allowed(m, task); | 380 | task_cpus_allowed(m, task); |
| 364 | cpuset_task_status_allowed(m, task); | 381 | cpuset_task_status_allowed(m, task); |
| 365 | task_context_switch_counts(m, task); | 382 | task_context_switch_counts(m, task); |
| @@ -438,7 +455,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
| 438 | 455 | ||
| 439 | min_flt += sig->min_flt; | 456 | min_flt += sig->min_flt; |
| 440 | maj_flt += sig->maj_flt; | 457 | maj_flt += sig->maj_flt; |
| 441 | thread_group_times(task, &utime, &stime); | 458 | thread_group_cputime_adjusted(task, &utime, &stime); |
| 442 | gtime += sig->gtime; | 459 | gtime += sig->gtime; |
| 443 | } | 460 | } |
| 444 | 461 | ||
| @@ -454,7 +471,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, | |||
| 454 | if (!whole) { | 471 | if (!whole) { |
| 455 | min_flt = task->min_flt; | 472 | min_flt = task->min_flt; |
| 456 | maj_flt = task->maj_flt; | 473 | maj_flt = task->maj_flt; |
| 457 | task_times(task, &utime, &stime); | 474 | task_cputime_adjusted(task, &utime, &stime); |
| 458 | gtime = task->gtime; | 475 | gtime = task->gtime; |
| 459 | } | 476 | } |
| 460 | 477 | ||
