diff options
author | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-06-25 08:49:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 13:01:25 -0400 |
commit | f6ec29a42d7ac3b309a9cef179b686d23986ab98 (patch) | |
tree | 5150d4f403833ac18b468bd0e0e0a9a7cdd9f4be /include | |
parent | 0e4648141af02331f21aabcd34940c70f09a2d04 (diff) |
[PATCH] pacct: avoidance to refer the last thread as a representation of the process
When pacct facility generate an 'ac_flag' field in accounting record, it
refers a task_struct of the thread which died last in the process. But any
other task_structs are ignored.
Therefore, pacct facility drops ASU flag even if root-privilege operations are
used by any other threads except the last one. In addition, AFORK flag is
always set when the thread of group-leader didn't die last, although this
process has called execve() after fork().
We have a same matter in ac_exitcode. The recorded ac_exitcode is an exit
code of the last thread in the process. There is a possibility this exitcode
is not the group leader's one.
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/acct.h | 8 | ||||
-rw-r--r-- | include/linux/sched.h | 2 |
2 files changed, 6 insertions, 4 deletions
diff --git a/include/linux/acct.h b/include/linux/acct.h index 5bca9b3ef2d7..e86bae7324d2 100644 --- a/include/linux/acct.h +++ b/include/linux/acct.h | |||
@@ -122,16 +122,16 @@ struct super_block; | |||
122 | extern void acct_auto_close_mnt(struct vfsmount *m); | 122 | extern void acct_auto_close_mnt(struct vfsmount *m); |
123 | extern void acct_auto_close(struct super_block *sb); | 123 | extern void acct_auto_close(struct super_block *sb); |
124 | extern void acct_init_pacct(struct pacct_struct *pacct); | 124 | extern void acct_init_pacct(struct pacct_struct *pacct); |
125 | extern void acct_collect(); | 125 | extern void acct_collect(long exitcode, int group_dead); |
126 | extern void acct_process(long exitcode); | 126 | extern void acct_process(void); |
127 | extern void acct_update_integrals(struct task_struct *tsk); | 127 | extern void acct_update_integrals(struct task_struct *tsk); |
128 | extern void acct_clear_integrals(struct task_struct *tsk); | 128 | extern void acct_clear_integrals(struct task_struct *tsk); |
129 | #else | 129 | #else |
130 | #define acct_auto_close_mnt(x) do { } while (0) | 130 | #define acct_auto_close_mnt(x) do { } while (0) |
131 | #define acct_auto_close(x) do { } while (0) | 131 | #define acct_auto_close(x) do { } while (0) |
132 | #define acct_init_pacct(x) do { } while (0) | 132 | #define acct_init_pacct(x) do { } while (0) |
133 | #define acct_collect() do { } while (0) | 133 | #define acct_collect(x,y) do { } while (0) |
134 | #define acct_process(x) do { } while (0) | 134 | #define acct_process() do { } while (0) |
135 | #define acct_update_integrals(x) do { } while (0) | 135 | #define acct_update_integrals(x) do { } while (0) |
136 | #define acct_clear_integrals(task) do { } while (0) | 136 | #define acct_clear_integrals(task) do { } while (0) |
137 | #endif | 137 | #endif |
diff --git a/include/linux/sched.h b/include/linux/sched.h index abada7c1d5e4..d8429dc250f0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -359,6 +359,8 @@ struct sighand_struct { | |||
359 | }; | 359 | }; |
360 | 360 | ||
361 | struct pacct_struct { | 361 | struct pacct_struct { |
362 | int ac_flag; | ||
363 | long ac_exitcode; | ||
362 | unsigned long ac_mem; | 364 | unsigned long ac_mem; |
363 | }; | 365 | }; |
364 | 366 | ||