diff options
Diffstat (limited to 'kernel/sys.c')
| -rw-r--r-- | kernel/sys.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index 9968c5fb55b9..585d6cd10040 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
| @@ -8,7 +8,6 @@ | |||
| 8 | #include <linux/mm.h> | 8 | #include <linux/mm.h> |
| 9 | #include <linux/utsname.h> | 9 | #include <linux/utsname.h> |
| 10 | #include <linux/mman.h> | 10 | #include <linux/mman.h> |
| 11 | #include <linux/smp_lock.h> | ||
| 12 | #include <linux/notifier.h> | 11 | #include <linux/notifier.h> |
| 13 | #include <linux/reboot.h> | 12 | #include <linux/reboot.h> |
| 14 | #include <linux/prctl.h> | 13 | #include <linux/prctl.h> |
| @@ -349,6 +348,9 @@ void kernel_power_off(void) | |||
| 349 | machine_power_off(); | 348 | machine_power_off(); |
| 350 | } | 349 | } |
| 351 | EXPORT_SYMBOL_GPL(kernel_power_off); | 350 | EXPORT_SYMBOL_GPL(kernel_power_off); |
| 351 | |||
| 352 | static DEFINE_MUTEX(reboot_mutex); | ||
| 353 | |||
| 352 | /* | 354 | /* |
| 353 | * Reboot system call: for obvious reasons only root may call it, | 355 | * Reboot system call: for obvious reasons only root may call it, |
| 354 | * and even root needs to set up some magic numbers in the registers | 356 | * and even root needs to set up some magic numbers in the registers |
| @@ -381,7 +383,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, | |||
| 381 | if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off) | 383 | if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off) |
| 382 | cmd = LINUX_REBOOT_CMD_HALT; | 384 | cmd = LINUX_REBOOT_CMD_HALT; |
| 383 | 385 | ||
| 384 | lock_kernel(); | 386 | mutex_lock(&reboot_mutex); |
| 385 | switch (cmd) { | 387 | switch (cmd) { |
| 386 | case LINUX_REBOOT_CMD_RESTART: | 388 | case LINUX_REBOOT_CMD_RESTART: |
| 387 | kernel_restart(NULL); | 389 | kernel_restart(NULL); |
| @@ -397,20 +399,18 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, | |||
| 397 | 399 | ||
| 398 | case LINUX_REBOOT_CMD_HALT: | 400 | case LINUX_REBOOT_CMD_HALT: |
| 399 | kernel_halt(); | 401 | kernel_halt(); |
| 400 | unlock_kernel(); | ||
| 401 | do_exit(0); | 402 | do_exit(0); |
| 402 | panic("cannot halt"); | 403 | panic("cannot halt"); |
| 403 | 404 | ||
| 404 | case LINUX_REBOOT_CMD_POWER_OFF: | 405 | case LINUX_REBOOT_CMD_POWER_OFF: |
| 405 | kernel_power_off(); | 406 | kernel_power_off(); |
| 406 | unlock_kernel(); | ||
| 407 | do_exit(0); | 407 | do_exit(0); |
| 408 | break; | 408 | break; |
| 409 | 409 | ||
| 410 | case LINUX_REBOOT_CMD_RESTART2: | 410 | case LINUX_REBOOT_CMD_RESTART2: |
| 411 | if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) { | 411 | if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) { |
| 412 | unlock_kernel(); | 412 | ret = -EFAULT; |
| 413 | return -EFAULT; | 413 | break; |
| 414 | } | 414 | } |
| 415 | buffer[sizeof(buffer) - 1] = '\0'; | 415 | buffer[sizeof(buffer) - 1] = '\0'; |
| 416 | 416 | ||
| @@ -433,7 +433,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, | |||
| 433 | ret = -EINVAL; | 433 | ret = -EINVAL; |
| 434 | break; | 434 | break; |
| 435 | } | 435 | } |
| 436 | unlock_kernel(); | 436 | mutex_unlock(&reboot_mutex); |
| 437 | return ret; | 437 | return ret; |
| 438 | } | 438 | } |
| 439 | 439 | ||
