teknoraver / rpms / systemd

Forked from rpms/systemd 5 months ago
Clone

Blame 0001-umount-always-remount-read-only-before-unmounting-in.patch

Lennart Poettering 46f254
From 93bd157722c76b47d80742f290373c1ce2865070 Mon Sep 17 00:00:00 2001
Lennart Poettering 46f254
From: Lennart Poettering <lennart@poettering.net>
Lennart Poettering 46f254
Date: Fri, 16 Nov 2012 18:36:28 +0100
Lennart Poettering 46f254
Subject: [PATCH] umount: always remount read-only before unmounting in final
Lennart Poettering 46f254
 shutdown loop
Lennart Poettering 46f254
Lennart Poettering 46f254
---
Lennart Poettering 46f254
 src/core/umount.c | 57 ++++++++++++++++++++++++++-----------------------------
Lennart Poettering 46f254
 1 file changed, 27 insertions(+), 30 deletions(-)
Lennart Poettering 46f254
Lennart Poettering 46f254
diff --git a/src/core/umount.c b/src/core/umount.c
Lennart Poettering 46f254
index 83c9de3..e794057 100644
Lennart Poettering 46f254
--- a/src/core/umount.c
Lennart Poettering 46f254
+++ b/src/core/umount.c
Lennart Poettering 46f254
@@ -407,6 +407,33 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
Lennart Poettering 46f254
         assert(head);
Lennart Poettering 46f254
 
Lennart Poettering 46f254
         LIST_FOREACH_SAFE(mount_point, m, n, *head) {
Lennart Poettering 46f254
+
Lennart Poettering 46f254
+                /* If we are in a container, don't attempt to
Lennart Poettering 46f254
+                   read-only mount anything as that brings no real
Lennart Poettering 46f254
+                   benefits, but might confuse the host, as we remount
Lennart Poettering 46f254
+                   the superblock here, not the bind mound. */
Lennart Poettering 46f254
+                if (detect_container(NULL) <= 0)  {
Lennart Poettering 46f254
+                        /* We always try to remount directories
Lennart Poettering 46f254
+                         * read-only first, before we go on and umount
Lennart Poettering 46f254
+                         * them.
Lennart Poettering 46f254
+                         *
Lennart Poettering 46f254
+                         * Mount points can be stacked. If a mount
Lennart Poettering 46f254
+                         * point is stacked below / or /usr, we
Lennart Poettering 46f254
+                         * cannnot umount or remount it directly,
Lennart Poettering 46f254
+                         * since there is no way to refer to the
Lennart Poettering 46f254
+                         * underlying mount. There's nothing we can do
Lennart Poettering 46f254
+                         * about it for the general case, but we can
Lennart Poettering 46f254
+                         * do something about it if it is aliased
Lennart Poettering 46f254
+                         * somehwere else via a bind mount. If we
Lennart Poettering 46f254
+                         * explicitly remount the super block of that
Lennart Poettering 46f254
+                         * alias read-only we hence should be
Lennart Poettering 46f254
+                         * relatively safe regarding keeping the fs we
Lennart Poettering 46f254
+                         * can otherwise not see dirty. */
Lennart Poettering 46f254
+                        mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, NULL);
Lennart Poettering 46f254
+                }
Lennart Poettering 46f254
+
Lennart Poettering 46f254
+                /* Skip / and /usr since we cannot unmount that
Lennart Poettering 46f254
+                 * anyway, since we are running from it */
Lennart Poettering 46f254
                 if (path_equal(m->path, "/")
Lennart Poettering 46f254
 #ifndef HAVE_SPLIT_USR
Lennart Poettering 46f254
                     || path_equal(m->path, "/usr")
Lennart Poettering 46f254
@@ -432,29 +459,6 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
Lennart Poettering 46f254
         return n_failed;
Lennart Poettering 46f254
 }
Lennart Poettering 46f254
 
Lennart Poettering 46f254
-static int mount_points_list_remount_read_only(MountPoint **head, bool *changed) {
Lennart Poettering 46f254
-        MountPoint *m, *n;
Lennart Poettering 46f254
-        int n_failed = 0;
Lennart Poettering 46f254
-
Lennart Poettering 46f254
-        assert(head);
Lennart Poettering 46f254
-
Lennart Poettering 46f254
-        LIST_FOREACH_SAFE(mount_point, m, n, *head) {
Lennart Poettering 46f254
-
Lennart Poettering 46f254
-                /* Trying to remount read-only */
Lennart Poettering 46f254
-                if (mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, NULL) == 0) {
Lennart Poettering 46f254
-                        if (changed)
Lennart Poettering 46f254
-                                *changed = true;
Lennart Poettering 46f254
-
Lennart Poettering 46f254
-                        mount_point_free(head, m);
Lennart Poettering 46f254
-                } else {
Lennart Poettering 46f254
-                        log_warning("Could not remount as read-only %s: %m", m->path);
Lennart Poettering 46f254
-                        n_failed++;
Lennart Poettering 46f254
-                }
Lennart Poettering 46f254
-        }
Lennart Poettering 46f254
-
Lennart Poettering 46f254
-        return n_failed;
Lennart Poettering 46f254
-}
Lennart Poettering 46f254
-
Lennart Poettering 46f254
 static int swap_points_list_off(MountPoint **head, bool *changed) {
Lennart Poettering 46f254
         MountPoint *m, *n;
Lennart Poettering 46f254
         int n_failed = 0;
Lennart Poettering 46f254
@@ -571,13 +575,6 @@ int umount_all(bool *changed) {
Lennart Poettering 46f254
         if (r <= 0)
Lennart Poettering 46f254
                 goto end;
Lennart Poettering 46f254
 
Lennart Poettering 46f254
-        /* If we are in a container, don't attempt to read-only mount
Lennart Poettering 46f254
-           anything as that brings no real benefits, but might confuse
Lennart Poettering 46f254
-           the host, as we remount the superblock here, not the bind
Lennart Poettering 46f254
-           mound. */
Lennart Poettering 46f254
-        if (detect_container(NULL) <= 0)
Lennart Poettering 46f254
-                r = mount_points_list_remount_read_only(&mp_list_head, changed);
Lennart Poettering 46f254
-
Lennart Poettering 46f254
   end:
Lennart Poettering 46f254
         mount_points_list_free(&mp_list_head);
Lennart Poettering 46f254
 
Lennart Poettering 46f254
-- 
Lennart Poettering 46f254
1.7.12.1
Lennart Poettering 46f254