X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fumount.c;h=83c9de3e8298635d8c2736a67cd71a932dbe9a2b;hb=6aa220e019f9dffd96590b06b68f937985204109;hp=488e1e4a4d84941c2887ed64f1cb5922b5334705;hpb=146de8175e11c877908f20f8ed1b5a3805455c0a;p=elogind.git diff --git a/src/core/umount.c b/src/core/umount.c index 488e1e4a4..83c9de3e8 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -32,12 +32,13 @@ #include "list.h" #include "mount-setup.h" #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; @@ -72,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; @@ -81,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 */ @@ -90,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; @@ -101,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); @@ -131,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); } @@ -448,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; @@ -562,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; @@ -586,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);