aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/printk.c
diff options
context:
space:
mode:
authorFrans Pop <elendil@planet.nl>2009-07-06 07:31:48 -0400
committerIngo Molnar <mingo@elte.hu>2009-07-10 10:02:23 -0400
commit1aaad49e856ce41adc07d8ae0c8ef35fc4483245 (patch)
tree0f5b0ef305ad1b2c79132729d44ffbad72a84b84 /kernel/printk.c
parent8259cf4342029aad37660e524178c8858f48b0ab (diff)
printk: Restore previous console_loglevel when re-enabling logging
When logging to console is disabled from userspace using klogctl() and later re-enabled, console_loglevel gets set to the default log level instead to the previous value. This means that if the kernel was booted with 'quiet', the boot is suddenly no longer quiet after logging to console gets re-enabled. Save the current console_loglevel when logging is disabled and restore to that value. If the log level is set to a specific value while disabled, this is interpreted as an implicit re-enabling of the logging. The problem that prompted this patch is described in: http://lkml.org/lkml/2009/6/28/234 There are two variations possible on the patch below: 1) If klogctl(7) is called while logging is not disabled, then set level to default (partially preserving current functionality): case 7: /* Enable logging to console */ - console_loglevel = default_console_loglevel; + if (saved_console_loglevel == -1) + console_loglevel = default_console_loglevel; + else { + console_loglevel = saved_console_loglevel; + saved_console_loglevel = -1; + } 2) If klogctl(8) is called while logging is disabled, then don't enable logging, but remember the requested value for when logging does get enabled again: case 8: /* Set level of messages printed to console */ [...] - console_loglevel = len; + if (saved_console_loglevel == -1) + console_loglevel = len; + else + saved_console_loglevel = len; Yet another option would be to ignore the request. Signed-off-by: Frans Pop <elendil@planet.nl> Cc: cryptsetup@packages.debian.org Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> LKML-Reference: <200907061331.49930.elendil@planet.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/printk.c')
-rw-r--r--kernel/printk.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/printk.c b/kernel/printk.c
index 668df351e6a9..e0daaf57985a 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -67,6 +67,8 @@ int console_printk[4] = {
67 DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */ 67 DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
68}; 68};
69 69
70static int saved_console_loglevel = -1;
71
70/* 72/*
71 * Low level drivers may need that to know if they can schedule in 73 * Low level drivers may need that to know if they can schedule in
72 * their unblank() callback or not. So let's export it. 74 * their unblank() callback or not. So let's export it.
@@ -378,10 +380,15 @@ int do_syslog(int type, char __user *buf, int len)
378 logged_chars = 0; 380 logged_chars = 0;
379 break; 381 break;
380 case 6: /* Disable logging to console */ 382 case 6: /* Disable logging to console */
383 if (saved_console_loglevel == -1)
384 saved_console_loglevel = console_loglevel;
381 console_loglevel = minimum_console_loglevel; 385 console_loglevel = minimum_console_loglevel;
382 break; 386 break;
383 case 7: /* Enable logging to console */ 387 case 7: /* Enable logging to console */
384 console_loglevel = default_console_loglevel; 388 if (saved_console_loglevel != -1) {
389 console_loglevel = saved_console_loglevel;
390 saved_console_loglevel = -1;
391 }
385 break; 392 break;
386 case 8: /* Set level of messages printed to console */ 393 case 8: /* Set level of messages printed to console */
387 error = -EINVAL; 394 error = -EINVAL;
@@ -390,6 +397,8 @@ int do_syslog(int type, char __user *buf, int len)
390 if (len < minimum_console_loglevel) 397 if (len < minimum_console_loglevel)
391 len = minimum_console_loglevel; 398 len = minimum_console_loglevel;
392 console_loglevel = len; 399 console_loglevel = len;
400 /* Implicitly re-enable logging to console */
401 saved_console_loglevel = -1;
393 error = 0; 402 error = 0;
394 break; 403 break;
395 case 9: /* Number of chars in the log buffer */ 404 case 9: /* Number of chars in the log buffer */