I compared upstart's halt/poweroff implementation to sysvinit's, and there are a few differences which might be relevant. After #define translation, the halt/poweroff bit in sysvinit does:
reboot(RB_ENABLE_CAD);
kill(1, SIGTSTP);
if (do_poweroff)
reboot(RB_POWER_OFF);
reboot(RB_HALT);
The fallthrough appears to be deliberate; RB_ENABLE_CAD seems at least useful; and is it possible that the kernel's getting stuck before poweroff because init hasn't been SIGTSTPed?
I compared upstart's halt/poweroff implementation to sysvinit's, and there are a few differences which might be relevant. After #define translation, the halt/poweroff bit in sysvinit does:
reboot( RB_ENABLE_ CAD); RB_POWER_ OFF);
kill(1, SIGTSTP);
if (do_poweroff)
reboot(
reboot(RB_HALT);
The fallthrough appears to be deliberate; RB_ENABLE_CAD seems at least useful; and is it possible that the kernel's getting stuck before poweroff because init hasn't been SIGTSTPed?