[systemd/f18] add missing patches

Lennart Poettering lennart at fedoraproject.org
Sat Aug 11 23:59:54 UTC 2012


commit bff934959d5fd3ac41f55b39841eafc38dff0bb0
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Aug 12 01:59:12 2012 +0200

    add missing patches

 ...cursively-mark-root-as-private-before-piv.patch |   31 +++++++++
 0001-switch-root-remount-to-MS_PRIVATE.patch       |   68 ++++++++++++++++++++
 2 files changed, 99 insertions(+), 0 deletions(-)
---
diff --git a/0001-shutdown-recursively-mark-root-as-private-before-piv.patch b/0001-shutdown-recursively-mark-root-as-private-before-piv.patch
new file mode 100644
index 0000000..702004f
--- /dev/null
+++ b/0001-shutdown-recursively-mark-root-as-private-before-piv.patch
@@ -0,0 +1,31 @@
+From 4bfa638d43c05e8db052cd55818765bb3575a405 Mon Sep 17 00:00:00 2001
+From: Dave Reisner <dreisner at archlinux.org>
+Date: Fri, 10 Aug 2012 11:02:03 -0400
+Subject: [PATCH] shutdown: recursively mark root as private before pivot
+
+Because root is now recursively marked as shared on bootup, we need to
+recursively mark root as private. This prevents a pivot_root failure on
+shutdown:
+
+  Cannot finalize remaining file systems and devices, giving up.
+  pivot failed: Invalid argument
+---
+ src/core/shutdown.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/core/shutdown.c b/src/core/shutdown.c
+index 105a604..0b7cbd8 100644
+--- a/src/core/shutdown.c
++++ b/src/core/shutdown.c
+@@ -109,7 +109,7 @@ static int pivot_to_new_root(void) {
+           It works for pivot_root, but the ref count for the root device
+           is not decreasing :-/
+         */
+-        if (mount(NULL, "/", NULL, MS_PRIVATE, NULL) < 0) {
++        if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0) {
+                 log_error("Failed to make \"/\" private mount %m");
+                 return -errno;
+         }
+-- 
+1.7.11.2
+
diff --git a/0001-switch-root-remount-to-MS_PRIVATE.patch b/0001-switch-root-remount-to-MS_PRIVATE.patch
new file mode 100644
index 0000000..cc48f2a
--- /dev/null
+++ b/0001-switch-root-remount-to-MS_PRIVATE.patch
@@ -0,0 +1,68 @@
+From f47fc35555565c4b161c2e44b357b4dbaf3a997d Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Sun, 12 Aug 2012 01:29:41 +0200
+Subject: [PATCH] switch-root: remount to MS_PRIVATE
+
+The kernel does not allow switching roots if things are mounted
+MS_SHARED. As a work-around, remount things MS_PRIVATE before switching
+roots.
+
+This should be fixed in the kernel for good.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=847418
+---
+ src/core/shutdown.c    | 17 ++++++++---------
+ src/core/switch-root.c |  9 +++++++++
+ 2 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/src/core/shutdown.c b/src/core/shutdown.c
+index 0b7cbd8..c3a4c39 100644
+--- a/src/core/shutdown.c
++++ b/src/core/shutdown.c
+@@ -104,15 +104,14 @@ static int pivot_to_new_root(void) {
+                 return -errno;
+         }
+ 
+-        /*
+-          In case some evil process made "/" MS_SHARED
+-          It works for pivot_root, but the ref count for the root device
+-          is not decreasing :-/
+-        */
+-        if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0) {
+-                log_error("Failed to make \"/\" private mount %m");
+-                return -errno;
+-        }
++        /* Work-around for a kernel bug: for some reason the kernel
++         * refuses switching root if any file systems are mounted
++         * MS_SHARED. Hence remount them MS_PRIVATE here as a
++         * work-around.
++         *
++         * https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
++        if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
++                log_warning("Failed to make \"/\" private mount: %m");
+ 
+         if (pivot_root(".", "oldroot") < 0) {
+                 log_error("pivot failed: %m");
+diff --git a/src/core/switch-root.c b/src/core/switch-root.c
+index 9832a52..efc7d34 100644
+--- a/src/core/switch-root.c
++++ b/src/core/switch-root.c
+@@ -56,6 +56,15 @@ int switch_root(const char *new_root) {
+                 goto fail;
+         }
+ 
++        /* Work-around for a kernel bug: for some reason the kernel
++         * refuses switching root if any file systems are mounted
++         * MS_SHARED. Hence remount them MS_PRIVATE here as a
++         * work-around.
++         *
++         * https://bugzilla.redhat.com/show_bug.cgi?id=847418 */
++        if (mount(NULL, "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0)
++                log_warning("Failed to make \"/\" private mount: %m");
++
+         NULSTR_FOREACH(i, move_mounts) {
+                 char new_mount[PATH_MAX];
+                 struct stat sb;
+-- 
+1.7.11.2
+


More information about the scm-commits mailing list