diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2005-09-23 00:43:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-23 01:17:33 -0400 |
commit | e4c94330e3395ae87451bded2840a25d04f27902 (patch) | |
tree | 860c6a1070492cb2fa8cc5847a366b1841f8c6a5 /kernel/sys.c | |
parent | 0678e5feaab8b359b18858e8532bb6017edb112b (diff) |
[PATCH] reboot: comment and factor the main reboot functions
In the lead up to 2.6.13 I fixed a large number of reboot problems by
making the calling conventions consistent. Despite checking and double
checking my work it appears I missed an obvious one.
This first patch simply refactors the reboot routines so all of the
preparation for various kinds of reboots are in their own functions.
Making it very hard to get the various kinds of reboot out of sync.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index f723522e6986..2fa1ed18123c 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -361,17 +361,35 @@ out_unlock: | |||
361 | return retval; | 361 | return retval; |
362 | } | 362 | } |
363 | 363 | ||
364 | /** | ||
365 | * emergency_restart - reboot the system | ||
366 | * | ||
367 | * Without shutting down any hardware or taking any locks | ||
368 | * reboot the system. This is called when we know we are in | ||
369 | * trouble so this is our best effort to reboot. This is | ||
370 | * safe to call in interrupt context. | ||
371 | */ | ||
364 | void emergency_restart(void) | 372 | void emergency_restart(void) |
365 | { | 373 | { |
366 | machine_emergency_restart(); | 374 | machine_emergency_restart(); |
367 | } | 375 | } |
368 | EXPORT_SYMBOL_GPL(emergency_restart); | 376 | EXPORT_SYMBOL_GPL(emergency_restart); |
369 | 377 | ||
370 | void kernel_restart(char *cmd) | 378 | /** |
379 | * kernel_restart - reboot the system | ||
380 | * | ||
381 | * Shutdown everything and perform a clean reboot. | ||
382 | * This is not safe to call in interrupt context. | ||
383 | */ | ||
384 | void kernel_restart_prepare(char *cmd) | ||
371 | { | 385 | { |
372 | notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); | 386 | notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); |
373 | system_state = SYSTEM_RESTART; | 387 | system_state = SYSTEM_RESTART; |
374 | device_shutdown(); | 388 | device_shutdown(); |
389 | } | ||
390 | void kernel_restart(char *cmd) | ||
391 | { | ||
392 | kernel_restart_prepare(cmd); | ||
375 | if (!cmd) { | 393 | if (!cmd) { |
376 | printk(KERN_EMERG "Restarting system.\n"); | 394 | printk(KERN_EMERG "Restarting system.\n"); |
377 | } else { | 395 | } else { |
@@ -382,6 +400,12 @@ void kernel_restart(char *cmd) | |||
382 | } | 400 | } |
383 | EXPORT_SYMBOL_GPL(kernel_restart); | 401 | EXPORT_SYMBOL_GPL(kernel_restart); |
384 | 402 | ||
403 | /** | ||
404 | * kernel_kexec - reboot the system | ||
405 | * | ||
406 | * Move into place and start executing a preloaded standalone | ||
407 | * executable. If nothing was preloaded return an error. | ||
408 | */ | ||
385 | void kernel_kexec(void) | 409 | void kernel_kexec(void) |
386 | { | 410 | { |
387 | #ifdef CONFIG_KEXEC | 411 | #ifdef CONFIG_KEXEC |
@@ -390,9 +414,7 @@ void kernel_kexec(void) | |||
390 | if (!image) { | 414 | if (!image) { |
391 | return; | 415 | return; |
392 | } | 416 | } |
393 | notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL); | 417 | kernel_restart_prepare(NULL); |
394 | system_state = SYSTEM_RESTART; | ||
395 | device_shutdown(); | ||
396 | printk(KERN_EMERG "Starting new kernel\n"); | 418 | printk(KERN_EMERG "Starting new kernel\n"); |
397 | machine_shutdown(); | 419 | machine_shutdown(); |
398 | machine_kexec(image); | 420 | machine_kexec(image); |
@@ -400,21 +422,39 @@ void kernel_kexec(void) | |||
400 | } | 422 | } |
401 | EXPORT_SYMBOL_GPL(kernel_kexec); | 423 | EXPORT_SYMBOL_GPL(kernel_kexec); |
402 | 424 | ||
403 | void kernel_halt(void) | 425 | /** |
426 | * kernel_halt - halt the system | ||
427 | * | ||
428 | * Shutdown everything and perform a clean system halt. | ||
429 | */ | ||
430 | void kernel_halt_prepare(void) | ||
404 | { | 431 | { |
405 | notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL); | 432 | notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL); |
406 | system_state = SYSTEM_HALT; | 433 | system_state = SYSTEM_HALT; |
407 | device_shutdown(); | 434 | device_shutdown(); |
435 | } | ||
436 | void kernel_halt(void) | ||
437 | { | ||
438 | kernel_halt_prepare(); | ||
408 | printk(KERN_EMERG "System halted.\n"); | 439 | printk(KERN_EMERG "System halted.\n"); |
409 | machine_halt(); | 440 | machine_halt(); |
410 | } | 441 | } |
411 | EXPORT_SYMBOL_GPL(kernel_halt); | 442 | EXPORT_SYMBOL_GPL(kernel_halt); |
412 | 443 | ||
413 | void kernel_power_off(void) | 444 | /** |
445 | * kernel_power_off - power_off the system | ||
446 | * | ||
447 | * Shutdown everything and perform a clean system power_off. | ||
448 | */ | ||
449 | void kernel_power_off_prepare(void) | ||
414 | { | 450 | { |
415 | notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL); | 451 | notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL); |
416 | system_state = SYSTEM_POWER_OFF; | 452 | system_state = SYSTEM_POWER_OFF; |
417 | device_shutdown(); | 453 | device_shutdown(); |
454 | } | ||
455 | void kernel_power_off(void) | ||
456 | { | ||
457 | kernel_power_off_prepare(); | ||
418 | printk(KERN_EMERG "Power down.\n"); | 458 | printk(KERN_EMERG "Power down.\n"); |
419 | machine_power_off(); | 459 | machine_power_off(); |
420 | } | 460 | } |