diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-04-26 23:45:53 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-08-07 14:40:07 -0400 |
commit | cdd37e23092c3c6fbbb2e611f8c3d18e676bf28f (patch) | |
tree | 943436b3c2410d4b80c147bf08e507082b9ae387 /kernel | |
parent | ed44724b79d8e03a40665436019cf22baba80d30 (diff) |
separate namespace-independent parts of filling acct_t
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/acct.c | 98 |
1 files changed, 51 insertions, 47 deletions
diff --git a/kernel/acct.c b/kernel/acct.c index 8082d9875d6b..efa891beeaa3 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
@@ -448,42 +448,20 @@ static u32 encode_float(u64 value) | |||
448 | * do_exit() or when switching to a different output file. | 448 | * do_exit() or when switching to a different output file. |
449 | */ | 449 | */ |
450 | 450 | ||
451 | /* | 451 | static void fill_ac(acct_t *ac) |
452 | * do_acct_process does all actual work. Caller holds the reference to file. | ||
453 | */ | ||
454 | static void do_acct_process(struct bsd_acct_struct *acct, | ||
455 | struct pid_namespace *ns, struct file *file) | ||
456 | { | 452 | { |
457 | struct pacct_struct *pacct = ¤t->signal->pacct; | 453 | struct pacct_struct *pacct = ¤t->signal->pacct; |
458 | acct_t ac; | ||
459 | unsigned long flim; | ||
460 | u64 elapsed, run_time; | 454 | u64 elapsed, run_time; |
461 | struct tty_struct *tty; | 455 | struct tty_struct *tty; |
462 | const struct cred *orig_cred; | ||
463 | |||
464 | /* | ||
465 | * Accounting records are not subject to resource limits. | ||
466 | */ | ||
467 | flim = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | ||
468 | current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; | ||
469 | /* Perform file operations on behalf of whoever enabled accounting */ | ||
470 | orig_cred = override_creds(file->f_cred); | ||
471 | |||
472 | /* | ||
473 | * First check to see if there is enough free_space to continue | ||
474 | * the process accounting system. | ||
475 | */ | ||
476 | if (!check_free_space(acct, file)) | ||
477 | goto out; | ||
478 | 456 | ||
479 | /* | 457 | /* |
480 | * Fill the accounting struct with the needed info as recorded | 458 | * Fill the accounting struct with the needed info as recorded |
481 | * by the different kernel functions. | 459 | * by the different kernel functions. |
482 | */ | 460 | */ |
483 | memset(&ac, 0, sizeof(acct_t)); | 461 | memset(ac, 0, sizeof(acct_t)); |
484 | 462 | ||
485 | ac.ac_version = ACCT_VERSION | ACCT_BYTEORDER; | 463 | ac->ac_version = ACCT_VERSION | ACCT_BYTEORDER; |
486 | strlcpy(ac.ac_comm, current->comm, sizeof(ac.ac_comm)); | 464 | strlcpy(ac->ac_comm, current->comm, sizeof(ac->ac_comm)); |
487 | 465 | ||
488 | /* calculate run_time in nsec*/ | 466 | /* calculate run_time in nsec*/ |
489 | run_time = ktime_get_ns(); | 467 | run_time = ktime_get_ns(); |
@@ -491,27 +469,66 @@ static void do_acct_process(struct bsd_acct_struct *acct, | |||
491 | /* convert nsec -> AHZ */ | 469 | /* convert nsec -> AHZ */ |
492 | elapsed = nsec_to_AHZ(run_time); | 470 | elapsed = nsec_to_AHZ(run_time); |
493 | #if ACCT_VERSION==3 | 471 | #if ACCT_VERSION==3 |
494 | ac.ac_etime = encode_float(elapsed); | 472 | ac->ac_etime = encode_float(elapsed); |
495 | #else | 473 | #else |
496 | ac.ac_etime = encode_comp_t(elapsed < (unsigned long) -1l ? | 474 | ac->ac_etime = encode_comp_t(elapsed < (unsigned long) -1l ? |
497 | (unsigned long) elapsed : (unsigned long) -1l); | 475 | (unsigned long) elapsed : (unsigned long) -1l); |
498 | #endif | 476 | #endif |
499 | #if ACCT_VERSION==1 || ACCT_VERSION==2 | 477 | #if ACCT_VERSION==1 || ACCT_VERSION==2 |
500 | { | 478 | { |
501 | /* new enlarged etime field */ | 479 | /* new enlarged etime field */ |
502 | comp2_t etime = encode_comp2_t(elapsed); | 480 | comp2_t etime = encode_comp2_t(elapsed); |
503 | ac.ac_etime_hi = etime >> 16; | 481 | ac->ac_etime_hi = etime >> 16; |
504 | ac.ac_etime_lo = (u16) etime; | 482 | ac->ac_etime_lo = (u16) etime; |
505 | } | 483 | } |
506 | #endif | 484 | #endif |
507 | do_div(elapsed, AHZ); | 485 | do_div(elapsed, AHZ); |
508 | ac.ac_btime = get_seconds() - elapsed; | 486 | ac->ac_btime = get_seconds() - elapsed; |
487 | #if ACCT_VERSION==2 | ||
488 | ac->ac_ahz = AHZ; | ||
489 | #endif | ||
490 | |||
491 | spin_lock_irq(¤t->sighand->siglock); | ||
492 | tty = current->signal->tty; /* Safe as we hold the siglock */ | ||
493 | ac->ac_tty = tty ? old_encode_dev(tty_devnum(tty)) : 0; | ||
494 | ac->ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime))); | ||
495 | ac->ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime))); | ||
496 | ac->ac_flag = pacct->ac_flag; | ||
497 | ac->ac_mem = encode_comp_t(pacct->ac_mem); | ||
498 | ac->ac_minflt = encode_comp_t(pacct->ac_minflt); | ||
499 | ac->ac_majflt = encode_comp_t(pacct->ac_majflt); | ||
500 | ac->ac_exitcode = pacct->ac_exitcode; | ||
501 | spin_unlock_irq(¤t->sighand->siglock); | ||
502 | } | ||
503 | /* | ||
504 | * do_acct_process does all actual work. Caller holds the reference to file. | ||
505 | */ | ||
506 | static void do_acct_process(struct bsd_acct_struct *acct, | ||
507 | struct pid_namespace *ns, struct file *file) | ||
508 | { | ||
509 | acct_t ac; | ||
510 | unsigned long flim; | ||
511 | const struct cred *orig_cred; | ||
512 | |||
513 | /* | ||
514 | * Accounting records are not subject to resource limits. | ||
515 | */ | ||
516 | flim = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | ||
517 | current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; | ||
518 | /* Perform file operations on behalf of whoever enabled accounting */ | ||
519 | orig_cred = override_creds(file->f_cred); | ||
520 | |||
521 | /* | ||
522 | * First check to see if there is enough free_space to continue | ||
523 | * the process accounting system. | ||
524 | */ | ||
525 | if (!check_free_space(acct, file)) | ||
526 | goto out; | ||
527 | |||
528 | fill_ac(&ac); | ||
509 | /* we really need to bite the bullet and change layout */ | 529 | /* we really need to bite the bullet and change layout */ |
510 | ac.ac_uid = from_kuid_munged(file->f_cred->user_ns, orig_cred->uid); | 530 | ac.ac_uid = from_kuid_munged(file->f_cred->user_ns, orig_cred->uid); |
511 | ac.ac_gid = from_kgid_munged(file->f_cred->user_ns, orig_cred->gid); | 531 | ac.ac_gid = from_kgid_munged(file->f_cred->user_ns, orig_cred->gid); |
512 | #if ACCT_VERSION==2 | ||
513 | ac.ac_ahz = AHZ; | ||
514 | #endif | ||
515 | #if ACCT_VERSION==1 || ACCT_VERSION==2 | 532 | #if ACCT_VERSION==1 || ACCT_VERSION==2 |
516 | /* backward-compatible 16 bit fields */ | 533 | /* backward-compatible 16 bit fields */ |
517 | ac.ac_uid16 = ac.ac_uid; | 534 | ac.ac_uid16 = ac.ac_uid; |
@@ -523,19 +540,6 @@ static void do_acct_process(struct bsd_acct_struct *acct, | |||
523 | ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns); | 540 | ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns); |
524 | rcu_read_unlock(); | 541 | rcu_read_unlock(); |
525 | #endif | 542 | #endif |
526 | |||
527 | spin_lock_irq(¤t->sighand->siglock); | ||
528 | tty = current->signal->tty; /* Safe as we hold the siglock */ | ||
529 | ac.ac_tty = tty ? old_encode_dev(tty_devnum(tty)) : 0; | ||
530 | ac.ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime))); | ||
531 | ac.ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime))); | ||
532 | ac.ac_flag = pacct->ac_flag; | ||
533 | ac.ac_mem = encode_comp_t(pacct->ac_mem); | ||
534 | ac.ac_minflt = encode_comp_t(pacct->ac_minflt); | ||
535 | ac.ac_majflt = encode_comp_t(pacct->ac_majflt); | ||
536 | ac.ac_exitcode = pacct->ac_exitcode; | ||
537 | spin_unlock_irq(¤t->sighand->siglock); | ||
538 | |||
539 | /* | 543 | /* |
540 | * Get freeze protection. If the fs is frozen, just skip the write | 544 | * Get freeze protection. If the fs is frozen, just skip the write |
541 | * as we could deadlock the system otherwise. | 545 | * as we could deadlock the system otherwise. |