diff --git a/mount.c b/mount.c index 6dc48ebcd..be00daf68 100644 --- a/mount.c +++ b/mount.c @@ -1841,20 +1841,22 @@ skip_parent: return 0; } -#define MS_CHANGE_TYPE_MASK \ - (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE) - static int do_new_mount(struct mount_info *mi) { + unsigned long mflags = MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE; char *src; struct fstype *tp = mi->fstype; + bool remount_ro = (tp->restore && mi->flags & MS_RDONLY); src = resolve_source(mi); if (!src) return -1; + if (remount_ro) + mflags |= MS_RDONLY; + if (mount(src, mi->mountpoint, tp->name, - mi->flags & ~MS_CHANGE_TYPE_MASK, mi->options) < 0) { + mi->flags & ~mflags, mi->options) < 0) { pr_perror("Can't mount at %s", mi->mountpoint); return -1; } @@ -1869,6 +1871,9 @@ static int do_new_mount(struct mount_info *mi) if (tp->restore && tp->restore(mi)) return -1; + if (remount_ro) + return mount(NULL, mi->mountpoint, tp->name, + MS_REMOUNT | MS_RDONLY, NULL); return 0; }