History

kernel/sys.c: clean up sys_shutdown exit path

Impact: cleanup, fix Clean up sys_shutdown() exit path. Factor out common code. Return correct error code instead of always 0 on failure.

Andi Kleen committed 17 years ago

Commit 3d26dcf1 parent 4cafbd01 file · +9 −15Browse files

Unified · Split

kernel/sys.c+9−15
@@ -360,6 +360,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 359 unmodified lines
360 void __user *, arg)360 void __user *, arg)
361{361{
362 char buffer[256];362 char buffer[256];
363 int ret = 0;
363 364
364 /* We only trust the superuser with rebooting the system. */365 /* We only trust the superuser with rebooting the system. */
365 if (!capable(CAP_SYS_BOOT))366 if (!capable(CAP_SYS_BOOT))
@@ -397,7 +398,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 31 unmodified lines
397 kernel_halt();398 kernel_halt();
398 unlock_kernel();399 unlock_kernel();
399 do_exit(0);400 do_exit(0);
400 break;401 panic("cannot halt");
401 402
402 case LINUX_REBOOT_CMD_POWER_OFF:403 case LINUX_REBOOT_CMD_POWER_OFF:
403 kernel_power_off();404 kernel_power_off();
@@ -417,29 +418,22 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 13 unmodified lines
417 418
418#ifdef CONFIG_KEXEC419#ifdef CONFIG_KEXEC
419 case LINUX_REBOOT_CMD_KEXEC:420 case LINUX_REBOOT_CMD_KEXEC:
420 {421 ret = kernel_kexec();
421 int ret;422 break;
422 ret = kernel_kexec();
423 unlock_kernel();
424 return ret;
425 }
426#endif423#endif
427 424
428#ifdef CONFIG_HIBERNATION425#ifdef CONFIG_HIBERNATION
429 case LINUX_REBOOT_CMD_SW_SUSPEND:426 case LINUX_REBOOT_CMD_SW_SUSPEND:
430 {427 ret = hibernate();
431 int ret = hibernate();428 break;
432 unlock_kernel();
433 return ret;
434 }
435#endif429#endif
436 430
437 default:431 default:
438 unlock_kernel();432 ret = -EINVAL;
439 return -EINVAL;433 break;
440 }434 }
441 unlock_kernel();435 unlock_kernel();
442 return 0;436 return ret;
443}437}
444 438
445static void deferred_cad(struct work_struct *dummy)439static void deferred_cad(struct work_struct *dummy)