chiark / gitweb /
core: move ManagerRunningAs to shared
[elogind.git] / src / core / umount.c
index 488e1e4a4d84941c2887ed64f1cb5922b5334705..83c9de3e8298635d8c2736a67cd71a932dbe9a2b 100644 (file)
 #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);