The patch titled replace cad_pid by a struct pid has been added to the -mm tree. Its filename is replace-cad_pid-by-a-struct-pid.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: replace cad_pid by a struct pid From: Cedric Le Goater <clg@xxxxxxxxxx> There are a few places in the kernel where the init task is signaled. The ctrl+alt+del sequence is one them. It kills a task, usually init, using a cached pid (cad_pid). This patch replaces the pid_t by a struct pid to avoid pid wrap around problem. The struct pid is initialized at boot time in init() and can be modified through systctl with /proc/sys/kernel/cad_pid [ I haven't found any distro using it ? ] It also introduces a small helper routine kill_cad_pid() which is used where it seemed ok to use cad_pid instead of pid 1. Signed-off-by: Cedric Le Goater <clg@xxxxxxxxxx> Cc: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> Cc: Martin Schwidefsky <schwidefsky@xxxxxxxxxx> Cc: Paul Mackerras <paulus@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/mips/sgi-ip22/ip22-reset.c | 2 - arch/mips/sgi-ip32/ip32-reset.c | 2 - arch/powerpc/platforms/iseries/mf.c | 2 - drivers/char/nwbutton.c | 2 - drivers/char/snsc_event.c | 2 - drivers/parisc/power.c | 2 - drivers/s390/s390mach.c | 2 - include/linux/sched.h | 7 ++++++ init/main.c | 2 + kernel/sys.c | 5 +--- kernel/sysctl.c | 30 +++++++++++++++++++++++--- 11 files changed, 45 insertions(+), 13 deletions(-) diff -puN arch/mips/sgi-ip22/ip22-reset.c~replace-cad_pid-by-a-struct-pid arch/mips/sgi-ip22/ip22-reset.c --- a/arch/mips/sgi-ip22/ip22-reset.c~replace-cad_pid-by-a-struct-pid +++ a/arch/mips/sgi-ip22/ip22-reset.c @@ -123,7 +123,7 @@ static inline void power_button(void) if (machine_state & MACHINE_PANICED) return; - if ((machine_state & MACHINE_SHUTTING_DOWN) || kill_proc(1,SIGINT,1)) { + if ((machine_state & MACHINE_SHUTTING_DOWN) || kill_cad_pid(SIGINT, 1)) { /* No init process or button pressed twice. */ sgi_machine_power_off(); } diff -puN arch/mips/sgi-ip32/ip32-reset.c~replace-cad_pid-by-a-struct-pid arch/mips/sgi-ip32/ip32-reset.c --- a/arch/mips/sgi-ip32/ip32-reset.c~replace-cad_pid-by-a-struct-pid +++ a/arch/mips/sgi-ip32/ip32-reset.c @@ -120,7 +120,7 @@ static inline void ip32_power_button(voi if (has_panicked) return; - if (shuting_down || kill_proc(1, SIGINT, 1)) { + if (shuting_down || kill_cad_pid(SIGINT, 1)) { /* No init process or button pressed twice. */ ip32_machine_power_off(); } diff -puN arch/powerpc/platforms/iseries/mf.c~replace-cad_pid-by-a-struct-pid arch/powerpc/platforms/iseries/mf.c --- a/arch/powerpc/platforms/iseries/mf.c~replace-cad_pid-by-a-struct-pid +++ a/arch/powerpc/platforms/iseries/mf.c @@ -357,7 +357,7 @@ static int dma_and_signal_ce_msg(char *c */ static int shutdown(void) { - int rc = kill_proc(1, SIGINT, 1); + int rc = kill_cad_pid(SIGINT, 1); if (rc) { printk(KERN_ALERT "mf.c: SIGINT to init failed (%d), " diff -puN drivers/char/nwbutton.c~replace-cad_pid-by-a-struct-pid drivers/char/nwbutton.c --- a/drivers/char/nwbutton.c~replace-cad_pid-by-a-struct-pid +++ a/drivers/char/nwbutton.c @@ -128,7 +128,7 @@ static void button_sequence_finished (un { #ifdef CONFIG_NWBUTTON_REBOOT /* Reboot using button is enabled */ if (button_press_count == reboot_count) { - kill_proc (1, SIGINT, 1); /* Ask init to reboot us */ + kill_cad_pid(SIGINT, 1); /* Ask init to reboot us */ } #endif /* CONFIG_NWBUTTON_REBOOT */ button_consume_callbacks (button_press_count); diff -puN drivers/char/snsc_event.c~replace-cad_pid-by-a-struct-pid drivers/char/snsc_event.c --- a/drivers/char/snsc_event.c~replace-cad_pid-by-a-struct-pid +++ a/drivers/char/snsc_event.c @@ -220,7 +220,7 @@ scdrv_dispatch_event(char *event, int le " Sending SIGPWR to init...\n"); /* give a SIGPWR signal to init proc */ - kill_proc(1, SIGPWR, 0); + kill_cad_pid(SIGPWR, 0); } else { /* print to system log */ printk("%s|$(0x%x)%s\n", severity, esp_code, desc); diff -puN drivers/parisc/power.c~replace-cad_pid-by-a-struct-pid drivers/parisc/power.c --- a/drivers/parisc/power.c~replace-cad_pid-by-a-struct-pid +++ a/drivers/parisc/power.c @@ -85,7 +85,7 @@ static void deferred_poweroff(void *dummy) { extern int cad_pid; /* from kernel/sys.c */ - if (kill_proc(cad_pid, SIGINT, 1)) { + if (kill_cad_pid(SIGINT, 1)) { /* just in case killing init process failed */ machine_power_off(); } diff -puN drivers/s390/s390mach.c~replace-cad_pid-by-a-struct-pid drivers/s390/s390mach.c --- a/drivers/s390/s390mach.c~replace-cad_pid-by-a-struct-pid +++ a/drivers/s390/s390mach.c @@ -208,7 +208,7 @@ s390_handle_mcck(void) */ __ctl_clear_bit(14, 24); /* Disable WARNING MCH */ if (xchg(&mchchk_wng_posted, 1) == 0) - kill_proc(1, SIGPWR, 1); + kill_cad_pid(SIGPWR, 1); } #endif diff -puN include/linux/sched.h~replace-cad_pid-by-a-struct-pid include/linux/sched.h --- a/include/linux/sched.h~replace-cad_pid-by-a-struct-pid +++ a/include/linux/sched.h @@ -1092,6 +1092,8 @@ static inline int is_init(struct task_st return tsk->pid == 1; } +extern struct pid* cad_pid; + extern void free_task(struct task_struct *tsk); #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) @@ -1319,6 +1321,11 @@ extern int send_group_sigqueue(int, stru extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); +static inline int kill_cad_pid(int sig, int priv) +{ + return kill_pid(cad_pid, sig, priv); +} + /* These can be the second arg to send_sig_info/send_group_sig_info. */ #define SEND_SIG_NOINFO ((struct siginfo *) 0) #define SEND_SIG_PRIV ((struct siginfo *) 1) diff -puN init/main.c~replace-cad_pid-by-a-struct-pid init/main.c --- a/init/main.c~replace-cad_pid-by-a-struct-pid +++ a/init/main.c @@ -726,6 +726,8 @@ static int init(void * unused) */ child_reaper = current; + cad_pid = task_pid(current); + smp_prepare_cpus(max_cpus); do_pre_smp_initcalls(); diff -puN kernel/sys.c~replace-cad_pid-by-a-struct-pid kernel/sys.c --- a/kernel/sys.c~replace-cad_pid-by-a-struct-pid +++ a/kernel/sys.c @@ -92,7 +92,7 @@ EXPORT_SYMBOL(fs_overflowgid); */ int C_A_D = 1; -int cad_pid = 1; +struct pid* cad_pid = NULL; /* * Notifier list for kernel code which wants to be called @@ -773,10 +773,9 @@ void ctrl_alt_del(void) if (C_A_D) schedule_work(&cad_work); else - kill_proc(cad_pid, SIGINT, 1); + kill_cad_pid(SIGINT, 1); } - /* * Unprivileged users may change the real gid to the effective gid * or vice versa. (BSD-style) diff -puN kernel/sysctl.c~replace-cad_pid-by-a-struct-pid kernel/sysctl.c --- a/kernel/sysctl.c~replace-cad_pid-by-a-struct-pid +++ a/kernel/sysctl.c @@ -65,7 +65,6 @@ extern int sysrq_enabled; extern int core_uses_pid; extern int suid_dumpable; extern char core_pattern[]; -extern int cad_pid; extern int pid_max; extern int min_free_kbytes; extern int printk_ratelimit_jiffies; @@ -141,6 +140,9 @@ static int parse_table(int __user *, int static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos); +static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, + void __user *buffer, size_t *lenp, loff_t *ppos); + static ctl_table root_table[]; static struct ctl_table_header root_table_header = { root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) }; @@ -547,10 +549,10 @@ static ctl_table kern_table[] = { { .ctl_name = KERN_CADPID, .procname = "cad_pid", - .data = &cad_pid, + .data = NULL, .maxlen = sizeof (int), .mode = 0600, - .proc_handler = &proc_dointvec, + .proc_handler = &proc_do_cad_pid, }, { .ctl_name = KERN_MAX_THREADS, @@ -2441,6 +2443,28 @@ proc_minmax: } #endif +static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + struct pid *new_pid; + pid_t tmp; + int r; + + tmp = pid_nr(cad_pid); + + r = __do_proc_dointvec(&tmp, table, write, filp, buffer, + lenp, ppos, NULL, NULL); + if (r || !write) + return r; + + new_pid = find_get_pid(tmp); + if (!new_pid) + return -ESRCH; + + put_pid(xchg(&cad_pid, new_pid)); + return 0; +} + #else /* CONFIG_PROC_FS */ int proc_dostring(ctl_table *table, int write, struct file *filp, _ Patches currently in -mm which might be from clg@xxxxxxxxxx are kthread-drivers-base-firmware_classc.patch pidspace-is_init.patch pids-coding-style-use-struct-pidmap.patch move-pidmap-to-pspaceh.patch move-pidmap-to-pspaceh-fix.patch define-struct-pspace.patch update-mq_notify-to-use-a-struct-pid.patch s390-update-fs3270-to-use-a-struct-pid.patch namespaces-utsname-switch-to-using-uts-namespaces.patch namespaces-utsname-implement-clone_newuts-flag-fix.patch ipc-namespace-core.patch ipc-namespace-utils.patch replace-cad_pid-by-a-struct-pid.patch statistics-replace-inode-ugeneric_ip-with-i_private.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html