]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Don't panic guest when exiting from custom rootfs
authorSasha Levin <levinsasha928@gmail.com>
Tue, 20 Dec 2011 10:23:20 +0000 (12:23 +0200)
committerPekka Enberg <penberg@kernel.org>
Wed, 21 Dec 2011 20:28:16 +0000 (22:28 +0200)
We currently panic guest when exiting from custom rootfs since at that point
we terminate init, and the guest kernel doesn't quite like that.

Instead, we do a graceful shutdown when init is done (either when 'lkvm
sandbox' command or '/bin/sh' is finished).

Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/guest/init_stage2.c

index 6489fee18cac703baddbba592366a378a70b31de..7b96436a79162bd4037a77f1be4f8f0be5c6fda3 100644 (file)
@@ -7,6 +7,7 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <errno.h>
+#include <linux/reboot.h>
 
 static int run_process(char *filename)
 {
@@ -26,6 +27,9 @@ static int run_process_sandbox(char *filename)
 
 int main(int argc, char *argv[])
 {
+       pid_t child;
+       int status;
+
        /* get session leader */
        setsid();
 
@@ -34,12 +38,20 @@ int main(int argc, char *argv[])
 
        puts("Starting '/bin/sh'...");
 
-       if (access("/virt/sandbox.sh", R_OK) == 0)
-               run_process_sandbox("/bin/sh");
-       else
-               run_process("/bin/sh");
-
-       printf("Init failed: %s\n", strerror(errno));
+       child = fork();
+       if (child < 0) {
+               printf("Fatal: fork() failed with %d\n", child);
+               return 0;
+       } else if (child == 0) {
+               if (access("/virt/sandbox.sh", R_OK) == 0)
+                       run_process_sandbox("/bin/sh");
+               else
+                       run_process("/bin/sh");
+       } else {
+               wait(&status);
+       }
+
+       reboot(LINUX_REBOOT_CMD_RESTART);
 
        return 0;
 }