On Fri, 26 Aug 2005, Christoph Hellwig wrote:

> On Thu, Aug 11, 2005 at 07:37:17PM +0200, Christoph Hellwig wrote:
> > On Tue, Aug 09, 2005 at 11:10:03PM +0200, Christoph Hellwig wrote:
> > > Currently snsc_event for Altix systems sends SIGPWR to init (and abuses
> > > tasklist_lock..) while the sbus drivers call execve for /sbin/shutdown
> > > (which is also ugly, it should at least use call_usermodehelper)
> > > With normal sysvinit both will end up the same, but I suspect the
> > > shutdown variant, maybe with a sysctl to chose the exact path to call
> > > would be cleaner.  What do you guys think about adding a common function
> > > to do this.  Could you test such a patch for me?
> >
> > Okay, here's such a patch, I've also switched the SN and the two sbus
> > drivers over.
>
> ping?

Hi Christoph,

Got your patch and built it into a kernel...  Ran into other
(unrelated) difficulties booting said kernel...  I'll see if I
can get that sorted out today and test drive it.

>From inspection I don't see any problem with the patch.

Thanks - Greg

>
> >
> > Signed-off-by: Christoph Hellwig <[EMAIL PROTECTED]>
> >
> > Index: linux-2.6/drivers/char/snsc_event.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/char/snsc_event.c        2005-08-11 
> > 16:45:55.000000000 +0200
> > +++ linux-2.6/drivers/char/snsc_event.c     2005-08-11 19:03:59.000000000 
> > +0200
> > @@ -195,24 +195,7 @@
> >     severity = scdrv_event_severity(code);
> >
> >     if ((code & EV_CLASS_MASK) == EV_CLASS_PWRD_NOTIFY) {
> > -           struct task_struct *p;
> > -
> > -           /* give a SIGPWR signal to init proc */
> > -
> > -           /* first find init's task */
> > -           read_lock(&tasklist_lock);
> > -           for_each_process(p) {
> > -                   if (p->pid == 1)
> > -                           break;
> > -           }
> > -           if (p) { /* we found init's task */
> > -                   printk(KERN_EMERG "Power off indication received. 
> > Initiating power fail sequence...\n");
> > -                   force_sig(SIGPWR, p);
> > -           } else { /* failed to find init's task - just give message(s) */
> > -                   printk(KERN_WARNING "Failed to find init proc to handle 
> > power off!\n");
> > -                   printk("%s|$(0x%x)%s\n", severity, esp_code, desc);
> > -           }
> > -           read_unlock(&tasklist_lock);
> > +           envctrl_do_shutdown();
> >     } else {
> >             /* print to system log */
> >             printk("%s|$(0x%x)%s\n", severity, esp_code, desc);
> > Index: linux-2.6/drivers/sbus/char/bbc_envctrl.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/sbus/char/bbc_envctrl.c  2005-08-11 
> > 16:45:59.000000000 +0200
> > +++ linux-2.6/drivers/sbus/char/bbc_envctrl.c       2005-08-11 
> > 19:01:44.000000000 +0200
> > @@ -4,13 +4,12 @@
> >   * Copyright (C) 2001 David S. Miller (davem@redhat.com)
> >   */
> >
> > -#define __KERNEL_SYSCALLS__
> > -
> >  #include <linux/kernel.h>
> >  #include <linux/kthread.h>
> >  #include <linux/sched.h>
> >  #include <linux/slab.h>
> >  #include <linux/delay.h>
> > +#include <linux/envctrl.h>
> >  #include <asm/oplib.h>
> >  #include <asm/ebus.h>
> >  static int errno;
> > @@ -176,8 +175,6 @@
> >  static void do_envctrl_shutdown(struct bbc_cpu_temperature *tp)
> >  {
> >     static int shutting_down = 0;
> > -   static char *envp[] = { "HOME=/", "TERM=linux", 
> > "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
> > -   char *argv[] = { "/sbin/shutdown", "-h", "now", NULL };
> >     char *type = "???";
> >     s8 val = -1;
> >
> > @@ -201,8 +198,8 @@
> >     printk(KERN_CRIT "kenvctrld: Shutting down the system now.\n");
> >
> >     shutting_down = 1;
> > -   if (execve("/sbin/shutdown", argv, envp) < 0)
> > -           printk(KERN_CRIT "envctrl: shutdown execution failed\n");
> > +
> > +   envctrl_do_shutdown();
> >  }
> >
> >  #define WARN_INTERVAL      (30 * HZ)
> > Index: linux-2.6/drivers/sbus/char/envctrl.c
> > ===================================================================
> > --- linux-2.6.orig/drivers/sbus/char/envctrl.c      2005-08-11 
> > 16:45:59.000000000 +0200
> > +++ linux-2.6/drivers/sbus/char/envctrl.c   2005-08-11 19:01:57.000000000 
> > +0200
> > @@ -19,8 +19,6 @@
> >   *              Daniele Bellucci <[EMAIL PROTECTED]>
> >   */
> >
> > -#define __KERNEL_SYSCALLS__
> > -
> >  #include <linux/config.h>
> >  #include <linux/module.h>
> >  #include <linux/sched.h>
> > @@ -33,6 +31,7 @@
> >  #include <linux/mm.h>
> >  #include <linux/slab.h>
> >  #include <linux/kernel.h>
> > +#include <linux/envctrl.h>
> >
> >  #include <asm/ebus.h>
> >  #include <asm/uaccess.h>
> > @@ -975,25 +974,6 @@
> >     return NULL;
> >  }
> >
> > -static void envctrl_do_shutdown(void)
> > -{
> > -   static int inprog = 0;
> > -   static char *envp[] = {
> > -           "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", 
> > NULL };
> > -   char *argv[] = {
> > -           "/sbin/shutdown", "-h", "now", NULL };
> > -
> > -   if (inprog != 0)
> > -           return;
> > -
> > -   inprog = 1;
> > -   printk(KERN_CRIT "kenvctrld: WARNING: Shutting down the system now.\n");
> > -   if (0 > execve("/sbin/shutdown", argv, envp)) {
> > -           printk(KERN_CRIT "kenvctrld: WARNING: system shutdown 
> > failed!\n");
> > -           inprog = 0;  /* unlikely to succeed, but we could try again */
> > -   }
> > -}
> > -
> >  static struct task_struct *kenvctrld_task;
> >
> >  static int kenvctrld(void *__unused)
> > Index: linux-2.6/include/linux/envctrl.h
> > ===================================================================
> > --- /dev/null       1970-01-01 00:00:00.000000000 +0000
> > +++ linux-2.6/include/linux/envctrl.h       2005-08-11 18:58:41.000000000 
> > +0200
> > @@ -0,0 +1,6 @@
> > +#ifndef _LINUX_ENVCTRL_H
> > +#define _LINUX_ENVCTRL_H
> > +
> > +extern int envctrl_do_shutdown(void);
> > +
> > +#endif /* _LINUX_ENVCTRL_H */
> > Index: linux-2.6/kernel/Makefile
> > ===================================================================
> > --- linux-2.6.orig/kernel/Makefile  2005-08-11 16:46:07.000000000 +0200
> > +++ linux-2.6/kernel/Makefile       2005-08-11 18:57:57.000000000 +0200
> > @@ -7,7 +7,7 @@
> >         sysctl.o capability.o ptrace.o timer.o user.o \
> >         signal.o sys.o kmod.o workqueue.o pid.o \
> >         rcupdate.o intermodule.o extable.o params.o posix-timers.o \
> > -       kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o
> > +       kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o envctrl.o
> >
> >  obj-$(CONFIG_FUTEX) += futex.o
> >  obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
> > Index: linux-2.6/kernel/envctrl.c
> > ===================================================================
> > --- /dev/null       1970-01-01 00:00:00.000000000 +0000
> > +++ linux-2.6/kernel/envctrl.c      2005-08-11 19:04:19.000000000 +0200
> > @@ -0,0 +1,46 @@
> > +/*
> > + * Copyright (C) 2001 David S. Miller.
> > + * Copyright (C) 2005 Christoph Hellwig.
> > + * Released under GPL v2.
> > + *
> > + * Common code to shutdown the system when overheating.
> > + */
> > +
> > +#include <linux/envctrl.h>
> > +#include <linux/kernel.h>
> > +#include <linux/kmod.h>
> > +
> > +static char *envp[] = {
> > +   "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL
> > +};
> > +
> > +static char *argv[] = {
> > +   "/sbin/shutdown", "-h", "now", NULL
> > +};
> > +
> > +/*
> > + * envctrl_do_shutdown  -  shut the system down when overheating
> > + *
> > + * Common routine to be called from all enviromental monitoring
> > + * drivers when a fatal overheating is detected.
> > + *
> > + * Returns 0 if /sbin/shutdown has been called sucessfully, 1 if
> > + * this routine has been called already but the kernel is still
> > + * running or a negative error value if executing the shutdown
> > + * command failed.
> > + */
> > +int envctrl_do_shutdown(void)
> > +{
> > +   static int shutting_down = 0;
> > +   int error;
> > +
> > +   if (shutting_down)
> > +           return 1;
> > +   shutting_down = 1;
> > +
> > +   printk(KERN_CRIT "envctrl: WARNING: Shutting down the system now.\n");
> > +   error = call_usermodehelper("/sbin/shutdown", argv, envp, 0);
> > +   if (error)
> > +           printk(KERN_CRIT "envctrl: WARNING: system shutdown failed!\n");
> > +   return error;
> > +}
> ---end quoted text---
>


--
Greg Howard, MTS - Core Platform SW     MS 10-1-061
SGI - Silicon Graphics Inc.             2750 Blue Water Road
[EMAIL PROTECTED]                         Eagan, MN  55121

+----------------------------------------------------------+
  "Who am I to smudge the palette of conventional wisdom?"
                                        - John Brocato
+----------------------------------------------------------+
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to