You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
2.2 KiB
54 lines
2.2 KiB
From 8d166597076d87aae9d5f98144103386c79d6446 Mon Sep 17 00:00:00 2001 |
|
From: Jan Synacek <jsynacek@redhat.com> |
|
Date: Fri, 31 Mar 2017 09:47:46 +0200 |
|
Subject: [PATCH] namespace: don't fail on masked mounts |
|
|
|
Before this patch, a service file with ReadWriteDirectories=/file... |
|
could fail if the file exists but is not a mountpoint, despite being |
|
listed in /proc/self/mountinfo. It could happen with masked mounts. |
|
|
|
(cherry picked from commit 98df8089bea1b2407c46495b6c2eb76dda46c658) |
|
|
|
Resolves: #1433687 |
|
--- |
|
src/shared/util.c | 23 +++++++++++------------ |
|
1 file changed, 11 insertions(+), 12 deletions(-) |
|
|
|
diff --git a/src/shared/util.c b/src/shared/util.c |
|
index 1070e32c4a..3e13cc1fdb 100644 |
|
--- a/src/shared/util.c |
|
+++ b/src/shared/util.c |
|
@@ -7332,22 +7332,21 @@ int bind_remount_recursive(const char *prefix, bool ro) { |
|
if (r < 0) |
|
return r; |
|
|
|
- /* Try to reuse the original flag set, but |
|
- * don't care for errors, in case of |
|
- * obstructed mounts */ |
|
+ /* Deal with mount points that are obstructed by a |
|
+ * later mount */ |
|
+ r = path_is_mount_point(x, 0); |
|
+ if (r == -ENOENT || r == 0) |
|
+ continue; |
|
+ if (r < 0) |
|
+ return r; |
|
+ |
|
+ /* Try to reuse the original flag set */ |
|
orig_flags = 0; |
|
(void) get_mount_flags(x, &orig_flags); |
|
orig_flags &= ~MS_RDONLY; |
|
|
|
- if (mount(NULL, x, NULL, orig_flags|MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0) { |
|
- |
|
- /* Deal with mount points that are |
|
- * obstructed by a later mount */ |
|
- |
|
- if (errno != ENOENT) |
|
- return -errno; |
|
- } |
|
- |
|
+ if (mount(NULL, x, NULL, orig_flags|MS_BIND|MS_REMOUNT|(ro ? MS_RDONLY : 0), NULL) < 0) |
|
+ return -errno; |
|
} |
|
} |
|
}
|
|
|