summaryrefslogtreecommitdiffstats
path: root/libmount/src/context_mount.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmount/src/context_mount.c')
-rw-r--r--libmount/src/context_mount.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index 79322c061..139fb5a28 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -998,7 +998,13 @@ int mnt_context_do_mount(struct libmnt_context *cxt)
#ifdef USE_LIBMOUNT_SUPPORT_MTAB
if (mnt_context_get_status(cxt)
&& !mnt_context_is_fake(cxt)
- && !cxt->helper) {
+ && !cxt->helper
+ && mnt_context_mtab_writable(cxt)) {
+
+ int is_rdonly = -1;
+
+ DBG(CXT, ul_debugobj(cxt, "checking for RDONLY mismatch"));
+
/*
* Mounted by mount(2), do some post-mount checks
*
@@ -1007,11 +1013,13 @@ int mnt_context_do_mount(struct libmnt_context *cxt)
* avoid 'ro' in mtab and 'rw' in /proc/mounts.
*/
if ((cxt->mountflags & MS_BIND)
- && (cxt->mountflags & MS_RDONLY)
- && !mnt_is_readonly(mnt_context_get_target(cxt)))
+ && (cxt->mountflags & MS_RDONLY)) {
- mnt_context_set_mflags(cxt,
- cxt->mountflags & ~MS_RDONLY);
+ if (is_rdonly < 0)
+ is_rdonly = mnt_is_readonly(mnt_context_get_target(cxt));
+ if (!is_rdonly)
+ mnt_context_set_mflags(cxt, cxt->mountflags & ~MS_RDONLY);
+ }
/* Kernel can silently add MS_RDONLY flag when mounting file
@@ -1019,11 +1027,13 @@ int mnt_context_do_mount(struct libmnt_context *cxt)
* 'ro' in /proc/mounts and 'rw' in mtab.
*/
if (!(cxt->mountflags & (MS_RDONLY | MS_MOVE))
- && !mnt_context_propagation_only(cxt)
- && mnt_is_readonly(mnt_context_get_target(cxt)))
+ && !mnt_context_propagation_only(cxt)) {
- mnt_context_set_mflags(cxt,
- cxt->mountflags | MS_RDONLY);
+ if (is_rdonly < 0)
+ is_rdonly = mnt_is_readonly(mnt_context_get_target(cxt));
+ if (is_rdonly)
+ mnt_context_set_mflags(cxt, cxt->mountflags | MS_RDONLY);
+ }
}
#endif