Impact: cleanup, fix Clean up sys_shutdown() exit path. Factor out common code. Return correct error code instead of always 0 on failure.
Unified · Split
| @@ -360,6 +360,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 359 unmodified lines | ||
| 360 | 360 | void __user *, arg) |
| 361 | 361 | { |
| 362 | 362 | char buffer[256]; |
| 363 | + int ret = 0; | |
| 363 | 364 | |
| 364 | 365 | /* We only trust the superuser with rebooting the system. */ |
| 365 | 366 | if (!capable(CAP_SYS_BOOT)) |
| @@ -397,7 +398,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 31 unmodified lines | ||
| 397 | 398 | kernel_halt(); |
| 398 | 399 | unlock_kernel(); |
| 399 | 400 | do_exit(0); |
| 400 | − break; | |
| 401 | + panic("cannot halt"); | |
| 401 | 402 | |
| 402 | 403 | case LINUX_REBOOT_CMD_POWER_OFF: |
| 403 | 404 | kernel_power_off(); |
| @@ -417,29 +418,22 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, · 13 unmodified lines | ||
| 417 | 418 | |
| 418 | 419 | #ifdef CONFIG_KEXEC |
| 419 | 420 | case LINUX_REBOOT_CMD_KEXEC: |
| 420 | − { | |
| 421 | − int ret; | |
| 422 | − ret = kernel_kexec(); | |
| 423 | − unlock_kernel(); | |
| 424 | − return ret; | |
| 425 | − } | |
| 421 | + ret = kernel_kexec(); | |
| 422 | + break; | |
| 426 | 423 | #endif |
| 427 | 424 | |
| 428 | 425 | #ifdef CONFIG_HIBERNATION |
| 429 | 426 | case LINUX_REBOOT_CMD_SW_SUSPEND: |
| 430 | − { | |
| 431 | − int ret = hibernate(); | |
| 432 | − unlock_kernel(); | |
| 433 | − return ret; | |
| 434 | − } | |
| 427 | + ret = hibernate(); | |
| 428 | + break; | |
| 435 | 429 | #endif |
| 436 | 430 | |
| 437 | 431 | default: |
| 438 | − unlock_kernel(); | |
| 439 | − return -EINVAL; | |
| 432 | + ret = -EINVAL; | |
| 433 | + break; | |
| 440 | 434 | } |
| 441 | 435 | unlock_kernel(); |
| 442 | − return 0; | |
| 436 | + return ret; | |
| 443 | 437 | } |
| 444 | 438 | |
| 445 | 439 | static void deferred_cad(struct work_struct *dummy) |