[systemd-devel] [PATCH] core/main.c: do_switch_root(): do not remove the old root if not in initrd

harald at redhat.com harald at redhat.com
Wed May 16 05:22:43 PDT 2012


From: Harald Hoyer <harald at redhat.com>

Only recursively remove the old root, if we have been in an
initrd/initramfs.
---
 src/core/main.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/core/main.c b/src/core/main.c
index 1fd11d5..9084463 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1180,6 +1180,7 @@ static int do_switch_root(const char *switch_root) {
         int i;
         int cfd = -1;
         struct stat switch_root_stat, sb;
+        bool remove_old_root;
 
         if (path_equal(switch_root, "/"))
                 return 0;
@@ -1190,6 +1191,8 @@ static int do_switch_root(const char *switch_root) {
                 goto fail;
         }
 
+        remove_old_root = in_initrd();
+
         for (i = 0; umounts[i] != NULL; i++) {
                 char newmount[PATH_MAX];
 
@@ -1215,7 +1218,8 @@ static int do_switch_root(const char *switch_root) {
                 goto fail;
         }
 
-        cfd = open("/", O_RDONLY);
+        if (remove_old_root)
+                cfd = open("/", O_RDONLY);
 
         if (mount(switch_root, "/", NULL, MS_MOVE, NULL) < 0) {
                 r = -errno;
-- 
1.7.10.1



More information about the systemd-devel mailing list