X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fumount.c;h=83c9de3e8298635d8c2736a67cd71a932dbe9a2b;hb=67445f4e22ad924394acdd4fd49e6f238244a5ca;hp=71ad4b623d9ddcff8ef430cd72c5b4e7eea33a17;hpb=9eb977db5b89b44f254ab40c1876a76b7d7ea2d0;p=elogind.git diff --git a/src/core/umount.c b/src/core/umount.c index 71ad4b623..83c9de3e8 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -34,11 +34,11 @@ #include "umount.h" #include "path-util.h" #include "util.h" +#include "virt.h" typedef struct MountPoint { char *path; dev_t devnum; - bool skip_ro; LIST_FIELDS (struct MountPoint, mount_point); } MountPoint; @@ -73,8 +73,6 @@ static int mount_points_list_get(MountPoint **head) { for (i = 1;; i++) { int k; MountPoint *m; - char *root; - bool skip_ro; path = p = NULL; @@ -82,7 +80,7 @@ static int mount_points_list_get(MountPoint **head) { "%*s " /* (1) mount id */ "%*s " /* (2) parent id */ "%*s " /* (3) major:minor */ - "%ms " /* (4) root */ + "%*s " /* (4) root */ "%ms " /* (5) mount point */ "%*s" /* (6) mount options */ "%*[^-]" /* (7) optional fields */ @@ -91,8 +89,7 @@ static int mount_points_list_get(MountPoint **head) { "%*s" /* (10) mount source */ "%*s" /* (11) mount options 2 */ "%*[^\n]", /* some rubbish at the end */ - &root, - &path)) != 2) { + &path)) != 1) { if (k == EOF) break; @@ -102,11 +99,6 @@ static int mount_points_list_get(MountPoint **head) { continue; } - /* If we encounter a bind mount, don't try to remount - * the source dir too early */ - skip_ro = !streq(root, "/"); - free(root); - p = cunescape(path); free(path); @@ -132,7 +124,6 @@ static int mount_points_list_get(MountPoint **head) { } m->path = p; - m->skip_ro = skip_ro; LIST_PREPEND(MountPoint, mount_point, *head, m); } @@ -449,13 +440,8 @@ static int mount_points_list_remount_read_only(MountPoint **head, bool *changed) LIST_FOREACH_SAFE(mount_point, m, n, *head) { - if (m->skip_ro) { - n_failed++; - continue; - } - /* Trying to remount read-only */ - if (mount(NULL, m->path, NULL, MS_MGC_VAL|MS_REMOUNT|MS_RDONLY, NULL) == 0) { + if (mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, NULL) == 0) { if (changed) *changed = true; @@ -563,11 +549,9 @@ static int dm_points_list_detach(MountPoint **head, bool *changed) { int umount_all(bool *changed) { int r; bool umount_changed; - LIST_HEAD(MountPoint, mp_list_head); LIST_HEAD_INIT(MountPoint, mp_list_head); - r = mount_points_list_get(&mp_list_head); if (r < 0) goto end; @@ -587,7 +571,12 @@ int umount_all(bool *changed) { if (r <= 0) goto end; - r = mount_points_list_remount_read_only(&mp_list_head, changed); + /* If we are in a container, don't attempt to read-only mount + anything as that brings no real benefits, but might confuse + the host, as we remount the superblock here, not the bind + mound. */ + if (detect_container(NULL) <= 0) + r = mount_points_list_remount_read_only(&mp_list_head, changed); end: mount_points_list_free(&mp_list_head);