Reboot busybox style via procd
authorMichel Stam <m.stam@fugro.nl>
Thu, 2 Oct 2014 11:56:21 +0000 (11:56 +0000)
committerJohn Crispin <blogic@openwrt.org>
Thu, 2 Oct 2014 17:19:41 +0000 (19:19 +0200)
It has been observed that, very rarely, the system does not reboot
when procd enters the shutdown state. Busybox seems to have an
obscure fix in its shutdown, where the parent (procd) process
is put in an infinite loop, and a special child is executed to
execute reboot(). This may very well be the cause.

Signed-off-by: Michel Stam <m.stam@fugro.nl>
state.c

diff --git a/state.c b/state.c
index b9416341440d873b999dadbda8e6b43a0b9a3477..c3d2303329f87ae5204619ba150e07770209b538 100644 (file)
--- a/state.c
+++ b/state.c
@@ -86,7 +86,20 @@ static void state_enter(void)
                sync();
                sleep(1);
                LOG("- reboot -\n");
-               reboot(reboot_event);
+
+               /* Allow time for last message to reach serial console, etc */
+               sleep(1);
+
+               /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS)
+                * in linux/kernel/sys.c, which can cause the machine to panic when
+                * the init process exits... */
+               if (!vfork( )) { /* child */
+                       reboot(reboot_event);
+                       _exit(EXIT_SUCCESS);
+               }
+
+               while (1)
+                       sleep(1);
                break;
 
        default: