From d9fb2011759e10608f9f0e962f85c42ac9637cb6 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Wed, 27 May 2015 15:22:00 +0300 Subject: [PATCH] mount: Add ability to restore ro tmpfs In case if we've dumped read only tmpfs we fail restoring it because it's mounted with ro flags. Lets mount it with rw, restore content and then remount as ro. upd (by xemul@): any fs with restore method likely to need rw permission on restore. Signed-off-by: Cyrill Gorcunov Signed-off-by: Pavel Emelyanov --- mount.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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; }