aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sys.c
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-07-30 18:14:15 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-07-30 18:14:15 -0400
commita670fcb43f01a67ef56176afc76e5d43d128b25c (patch)
tree09c9411c78a33ff980e9ea871bc7686e7589abbf /kernel/sys.c
parent327309e899662b482c58cf25f574513d38b5788c (diff)
parentb0825488a642cadcf39709961dde61440cb0731c (diff)
/spare/repo/netdev-2.6 branch 'master'
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c111
1 files changed, 69 insertions, 42 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index 9a24374c23bc..000e81ad2c1d 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -361,6 +361,66 @@ out_unlock:
361 return retval; 361 return retval;
362} 362}
363 363
364void emergency_restart(void)
365{
366 machine_emergency_restart();
367}
368EXPORT_SYMBOL_GPL(emergency_restart);
369
370void kernel_restart(char *cmd)
371{
372 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
373 system_state = SYSTEM_RESTART;
374 device_shutdown();
375 if (!cmd) {
376 printk(KERN_EMERG "Restarting system.\n");
377 } else {
378 printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
379 }
380 printk(".\n");
381 machine_restart(cmd);
382}
383EXPORT_SYMBOL_GPL(kernel_restart);
384
385void kernel_kexec(void)
386{
387#ifdef CONFIG_KEXEC
388 struct kimage *image;
389 image = xchg(&kexec_image, 0);
390 if (!image) {
391 return;
392 }
393 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
394 system_state = SYSTEM_RESTART;
395 device_shutdown();
396 printk(KERN_EMERG "Starting new kernel\n");
397 machine_shutdown();
398 machine_kexec(image);
399#endif
400}
401EXPORT_SYMBOL_GPL(kernel_kexec);
402
403void kernel_halt(void)
404{
405 notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);
406 system_state = SYSTEM_HALT;
407 device_suspend(PMSG_SUSPEND);
408 device_shutdown();
409 printk(KERN_EMERG "System halted.\n");
410 machine_halt();
411}
412EXPORT_SYMBOL_GPL(kernel_halt);
413
414void kernel_power_off(void)
415{
416 notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL);
417 system_state = SYSTEM_POWER_OFF;
418 device_suspend(PMSG_SUSPEND);
419 device_shutdown();
420 printk(KERN_EMERG "Power down.\n");
421 machine_power_off();
422}
423EXPORT_SYMBOL_GPL(kernel_power_off);
364 424
365/* 425/*
366 * Reboot system call: for obvious reasons only root may call it, 426 * Reboot system call: for obvious reasons only root may call it,
@@ -389,11 +449,7 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user
389 lock_kernel(); 449 lock_kernel();
390 switch (cmd) { 450 switch (cmd) {
391 case LINUX_REBOOT_CMD_RESTART: 451 case LINUX_REBOOT_CMD_RESTART:
392 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL); 452 kernel_restart(NULL);
393 system_state = SYSTEM_RESTART;
394 device_shutdown();
395 printk(KERN_EMERG "Restarting system.\n");
396 machine_restart(NULL);
397 break; 453 break;
398 454
399 case LINUX_REBOOT_CMD_CAD_ON: 455 case LINUX_REBOOT_CMD_CAD_ON:
@@ -405,23 +461,13 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user
405 break; 461 break;
406 462
407 case LINUX_REBOOT_CMD_HALT: 463 case LINUX_REBOOT_CMD_HALT:
408 notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL); 464 kernel_halt();
409 system_state = SYSTEM_HALT;
410 device_suspend(PMSG_SUSPEND);
411 device_shutdown();
412 printk(KERN_EMERG "System halted.\n");
413 machine_halt();
414 unlock_kernel(); 465 unlock_kernel();
415 do_exit(0); 466 do_exit(0);
416 break; 467 break;
417 468
418 case LINUX_REBOOT_CMD_POWER_OFF: 469 case LINUX_REBOOT_CMD_POWER_OFF:
419 notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL); 470 kernel_power_off();
420 system_state = SYSTEM_POWER_OFF;
421 device_suspend(PMSG_SUSPEND);
422 device_shutdown();
423 printk(KERN_EMERG "Power down.\n");
424 machine_power_off();
425 unlock_kernel(); 471 unlock_kernel();
426 do_exit(0); 472 do_exit(0);
427 break; 473 break;
@@ -433,32 +479,14 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user
433 } 479 }
434 buffer[sizeof(buffer) - 1] = '\0'; 480 buffer[sizeof(buffer) - 1] = '\0';
435 481
436 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, buffer); 482 kernel_restart(buffer);
437 system_state = SYSTEM_RESTART;
438 device_suspend(PMSG_FREEZE);
439 device_shutdown();
440 printk(KERN_EMERG "Restarting system with command '%s'.\n", buffer);
441 machine_restart(buffer);
442 break; 483 break;
443 484
444#ifdef CONFIG_KEXEC
445 case LINUX_REBOOT_CMD_KEXEC: 485 case LINUX_REBOOT_CMD_KEXEC:
446 { 486 kernel_kexec();
447 struct kimage *image; 487 unlock_kernel();
448 image = xchg(&kexec_image, 0); 488 return -EINVAL;
449 if (!image) { 489
450 unlock_kernel();
451 return -EINVAL;
452 }
453 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
454 system_state = SYSTEM_RESTART;
455 device_shutdown();
456 printk(KERN_EMERG "Starting new kernel\n");
457 machine_shutdown();
458 machine_kexec(image);
459 break;
460 }
461#endif
462#ifdef CONFIG_SOFTWARE_SUSPEND 490#ifdef CONFIG_SOFTWARE_SUSPEND
463 case LINUX_REBOOT_CMD_SW_SUSPEND: 491 case LINUX_REBOOT_CMD_SW_SUSPEND:
464 { 492 {
@@ -478,8 +506,7 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user
478 506
479static void deferred_cad(void *dummy) 507static void deferred_cad(void *dummy)
480{ 508{
481 notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL); 509 kernel_restart(NULL);
482 machine_restart(NULL);
483} 510}
484 511
485/* 512/*