There have been many reports of init failing to reboot and/or failing to halt
authorEric Andersen <andersen@codepoet.org>
Thu, 24 Apr 2003 11:41:28 +0000 (11:41 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 24 Apr 2003 11:41:28 +0000 (11:41 -0000)
commit2c1de61023d384fd0a365405925940c3528cb75a
tree5839e97767864319de033cec3448767e0e43d016
parentafc01cd48544d4e0e7575a8518e575dd499e297c
There have been many reports of init failing to reboot and/or failing to halt
over the years.  Well I finally took the time to track this down.  It turns out
that inside linux/kernel/sys.c the kernel will call
    machine_halt();
    do_exit(0);
when halting, or will call
    machine_power_off();
    do_exit(0);

during a reboot.  Unlike sysv init, we call reboot from within the init
process, so if the call to machine_halt() or machine_power_off() returns,                                       the call to do_exit(0) will cause the kernel to panic.  Which is a very
bad thing to happen.

So I just added this little patch to fork and call the reboot
syscall from within the forked child process, thereby neatly
avoiding the problem.

But IMHO, both calls to do_exit(0) within linux/kernel/sys.c
are bugs and should be fixed.

 -Erik
init/init.c