Re: Magic SysRq +# in 2.4.9-ac/2.4.10-pre12

From: Randy.Dunlap (rddunlap@osdlab.org)
Date: Wed Sep 19 2001 - 13:02:33 EST


Alan Cox wrote:
>
> > Anyway, in looking at SysRq loglevel handling in
> > 2.4.9-ac (and 2.4.10-pre12), I see that it has been modified
> > quite a bit. Looks extensible, which can be good.
> > However, looking over it gave me several nagging questions
> > and problems.
> >
> > If someone (Crutcher ?) wants to patch it, that's fine.
> > If I patched it, I would just add a
> > next_loglevel = -1;
> > at the beginning of __handle_sysrq_nolock() and then
> > let the loglevel handler(s) set next_loglevel.
> > If next_loglevel != -1 at the end of __handle_sysrq_nolock(),
> > set console_loglevel to next_loglevel.
>
> Send me a patch and cc Linus/Crutcher

Here's a patch to fix SysRq handling of console_loglevel.

Please apply to 2.4.10-pre12 and to 2.4.9-ac12.

Thanks,
~Randy

--- linux/drivers/char/sysrq.c.org Mon Sep 17 10:15:48 2001
+++ linux/drivers/char/sysrq.c Wed Sep 19 10:15:12 2001
@@ -39,6 +39,8 @@
 /* Whether we react on sysrq keys or just ignore them */
 int sysrq_enabled = 1;
 
+static int entry_loglevel, next_loglevel;
+
 /* Machine specific power off function */
 void (*sysrq_power_off)(void);
 
@@ -47,13 +49,13 @@
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         int i;
         i = key - '0';
- console_loglevel = 7;
         printk("%d\n", i);
- console_loglevel = i;
-}
+ next_loglevel = i;
+}
+
 static struct sysrq_key_op sysrq_loglevel_op = {
         handler: sysrq_handle_loglevel,
- help_msg: "loglevel0-8",
+ help_msg: "loglevel0-9",
         action_msg: "Loglevel set to ",
 };
 
@@ -66,6 +68,7 @@
                 do_SAK(tty);
         reset_vc(fg_console);
 }
+
 static struct sysrq_key_op sysrq_SAK_op = {
         handler: sysrq_handle_SAK,
         help_msg: "saK",
@@ -137,9 +140,6 @@
 /* do_emergency_sync helper function */
 static void go_sync(struct super_block *sb, int remount_flag)
 {
- int orig_loglevel;
- orig_loglevel = console_loglevel;
- console_loglevel = 7;
         printk(KERN_INFO "%sing device %s ... ",
                remount_flag ? "Remount" : "Sync",
                kdevname(sb->s_dev));
@@ -178,7 +178,6 @@
                 fsync_dev(sb->s_dev);
                 printk("OK\n");
         }
- console_loglevel = orig_loglevel;
 }
 /*
  * Emergency Sync or Unmount. We cannot do it directly, so we set a special
@@ -192,7 +191,6 @@
 void do_emergency_sync(void) {
         struct super_block *sb;
         int remount_flag;
- int orig_loglevel;
 
         lock_kernel();
         remount_flag = (emergency_sync_scheduled == EMERG_REMOUNT);
@@ -211,11 +209,7 @@
                         go_sync(sb, remount_flag);
 
         unlock_kernel();
-
- orig_loglevel = console_loglevel;
- console_loglevel = 7;
         printk(KERN_INFO "Done.\n");
- console_loglevel = orig_loglevel;
 }
 
 static void sysrq_handle_sync(int key, struct pt_regs *pt_regs,
@@ -223,6 +217,7 @@
         emergency_sync_scheduled = EMERG_SYNC;
         wakeup_bdflush(0);
 }
+
 static struct sysrq_key_op sysrq_sync_op = {
         handler: sysrq_handle_sync,
         help_msg: "Sync",
@@ -250,6 +245,7 @@
         if (pt_regs)
                 show_regs(pt_regs);
 }
+
 static struct sysrq_key_op sysrq_showregs_op = {
         handler: sysrq_handle_showregs,
         help_msg: "showPc",
@@ -261,6 +257,7 @@
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         show_state();
 }
+
 static struct sysrq_key_op sysrq_showstate_op = {
         handler: sysrq_handle_showstate,
         help_msg: "showTasks",
@@ -272,6 +269,7 @@
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         show_mem();
 }
+
 static struct sysrq_key_op sysrq_showmem_op = {
         handler: sysrq_handle_showmem,
         help_msg: "showMem",
@@ -303,8 +301,9 @@
 static void sysrq_handle_term(int key, struct pt_regs *pt_regs,
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         send_sig_all(SIGTERM, 0);
- console_loglevel = 8;
+ next_loglevel = 8;
 }
+
 static struct sysrq_key_op sysrq_term_op = {
         handler: sysrq_handle_term,
         help_msg: "tErm",
@@ -314,8 +313,9 @@
 static void sysrq_handle_kill(int key, struct pt_regs *pt_regs,
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         send_sig_all(SIGKILL, 0);
- console_loglevel = 8;
+ next_loglevel = 8;
 }
+
 static struct sysrq_key_op sysrq_kill_op = {
         handler: sysrq_handle_kill,
         help_msg: "kIll",
@@ -325,8 +325,9 @@
 static void sysrq_handle_killall(int key, struct pt_regs *pt_regs,
                 struct kbd_struct *kbd, struct tty_struct *tty) {
         send_sig_all(SIGKILL, 1);
- console_loglevel = 8;
+ next_loglevel = 8;
 }
+
 static struct sysrq_key_op sysrq_killall_op = {
         handler: sysrq_handle_killall,
         help_msg: "killalL",
@@ -381,7 +382,7 @@
 /* v */ NULL,
 /* w */ NULL,
 /* x */ NULL,
-/* w */ NULL,
+/* y */ NULL,
 /* z */ NULL
 };
 
@@ -434,6 +435,7 @@
 
 void handle_sysrq(int key, struct pt_regs *pt_regs,
                   struct kbd_struct *kbd, struct tty_struct *tty) {
+
         if (!sysrq_enabled)
                 return;
 
@@ -451,13 +453,13 @@
 void __handle_sysrq_nolock(int key, struct pt_regs *pt_regs,
                   struct kbd_struct *kbd, struct tty_struct *tty) {
         struct sysrq_key_op *op_p;
- int orig_log_level;
         int i, j;
         
         if (!sysrq_enabled)
                 return;
 
- orig_log_level = console_loglevel;
+ entry_loglevel = console_loglevel;
+ next_loglevel = -1;
         console_loglevel = 7;
         printk(KERN_INFO "SysRq : ");
 
@@ -476,7 +478,7 @@
                 }
                 printk ("\n");
         }
- console_loglevel = orig_log_level;
+ console_loglevel = (next_loglevel == -1) ? entry_loglevel : next_loglevel;
 }
 
 EXPORT_SYMBOL(handle_sysrq);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Sep 23 2001 - 21:00:31 EST