aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorKaiGai Kohei <kaigai@ak.jp.nec.com>2006-06-25 08:49:25 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-25 13:01:25 -0400
commitf6ec29a42d7ac3b309a9cef179b686d23986ab98 (patch)
tree5150d4f403833ac18b468bd0e0e0a9a7cdd9f4be /include/linux
parent0e4648141af02331f21aabcd34940c70f09a2d04 (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/linux')
-rw-r--r--include/linux/acct.h8
-rw-r--r--include/linux/sched.h2
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;
122extern void acct_auto_close_mnt(struct vfsmount *m); 122extern void acct_auto_close_mnt(struct vfsmount *m);
123extern void acct_auto_close(struct super_block *sb); 123extern void acct_auto_close(struct super_block *sb);
124extern void acct_init_pacct(struct pacct_struct *pacct); 124extern void acct_init_pacct(struct pacct_struct *pacct);
125extern void acct_collect(); 125extern void acct_collect(long exitcode, int group_dead);
126extern void acct_process(long exitcode); 126extern void acct_process(void);
127extern void acct_update_integrals(struct task_struct *tsk); 127extern void acct_update_integrals(struct task_struct *tsk);
128extern void acct_clear_integrals(struct task_struct *tsk); 128extern 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
361struct pacct_struct { 361struct pacct_struct {
362 int ac_flag;
363 long ac_exitcode;
362 unsigned long ac_mem; 364 unsigned long ac_mem;
363}; 365};
364 366