From bff934959d5fd3ac41f55b39841eafc38dff0bb0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 12 Aug 2012 01:59:12 +0200 Subject: [PATCH] add missing patches --- ...vely-mark-root-as-private-before-piv.patch | 31 +++++++++ 0001-switch-root-remount-to-MS_PRIVATE.patch | 68 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 0001-shutdown-recursively-mark-root-as-private-before-piv.patch create mode 100644 0001-switch-root-remount-to-MS_PRIVATE.patch 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 +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 +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 +