Commit f3accc08 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

umount: don't try to remount bind mounts ro during shutdown

parent 2a796654
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
typedef struct MountPoint { typedef struct MountPoint {
char *path; char *path;
dev_t devnum; dev_t devnum;
bool skip_ro;
LIST_FIELDS (struct MountPoint, mount_point); LIST_FIELDS (struct MountPoint, mount_point);
} MountPoint; } MountPoint;
...@@ -71,6 +72,8 @@ static int mount_points_list_get(MountPoint **head) { ...@@ -71,6 +72,8 @@ static int mount_points_list_get(MountPoint **head) {
for (i = 1;; i++) { for (i = 1;; i++) {
int k; int k;
MountPoint *m; MountPoint *m;
char *root;
bool skip_ro;
path = p = NULL; path = p = NULL;
...@@ -78,7 +81,7 @@ static int mount_points_list_get(MountPoint **head) { ...@@ -78,7 +81,7 @@ static int mount_points_list_get(MountPoint **head) {
"%*s " /* (1) mount id */ "%*s " /* (1) mount id */
"%*s " /* (2) parent id */ "%*s " /* (2) parent id */
"%*s " /* (3) major:minor */ "%*s " /* (3) major:minor */
"%*s " /* (4) root */ "%ms " /* (4) root */
"%ms " /* (5) mount point */ "%ms " /* (5) mount point */
"%*s" /* (6) mount options */ "%*s" /* (6) mount options */
"%*[^-]" /* (7) optional fields */ "%*[^-]" /* (7) optional fields */
...@@ -87,7 +90,8 @@ static int mount_points_list_get(MountPoint **head) { ...@@ -87,7 +90,8 @@ static int mount_points_list_get(MountPoint **head) {
"%*s" /* (10) mount source */ "%*s" /* (10) mount source */
"%*s" /* (11) mount options 2 */ "%*s" /* (11) mount options 2 */
"%*[^\n]", /* some rubbish at the end */ "%*[^\n]", /* some rubbish at the end */
&path)) != 1) { &root,
&path)) != 2) {
if (k == EOF) if (k == EOF)
break; break;
...@@ -97,6 +101,13 @@ static int mount_points_list_get(MountPoint **head) { ...@@ -97,6 +101,13 @@ static int mount_points_list_get(MountPoint **head) {
continue; continue;
} }
/* If we encounter a bind mount, don't try to remount
* the source dir too early */
if (!streq(root, "/"))
skip_ro = true;
free(root);
p = cunescape(path); p = cunescape(path);
free(path); free(path);
...@@ -117,6 +128,7 @@ static int mount_points_list_get(MountPoint **head) { ...@@ -117,6 +128,7 @@ static int mount_points_list_get(MountPoint **head) {
} }
m->path = p; m->path = p;
m->skip_ro = skip_ro;
LIST_PREPEND(MountPoint, mount_point, *head, m); LIST_PREPEND(MountPoint, mount_point, *head, m);
} }
...@@ -428,6 +440,11 @@ static int mount_points_list_remount_read_only(MountPoint **head, bool *changed) ...@@ -428,6 +440,11 @@ static int mount_points_list_remount_read_only(MountPoint **head, bool *changed)
LIST_FOREACH_SAFE(mount_point, m, n, *head) { LIST_FOREACH_SAFE(mount_point, m, n, *head) {
if (m->skip_ro) {
n_failed++;
continue;
}
/* Trying to remount read-only */ /* 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_MGC_VAL|MS_REMOUNT|MS_RDONLY, NULL) == 0) {
if (changed) if (changed)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment