mount: dump a file system only if a mount point isn't overmounted

Submitted by Andrei Vagin on May 5, 2016, 7:12 p.m.

Details

Message ID 1462475534-9650-1-git-send-email-avagin@openvz.org
State Rejected
Series "mount: dump a file system only if a mount point isn't overmounted"
Headers show

Commit Message

Andrei Vagin May 5, 2016, 7:12 p.m.
From: Andrew Vagin <avagin@virtuozzo.com>

Something else may be mounted into the same folder and in this case
we can't get access to the required file system.

$ cat /proc/61693/root/etc/redhat-release
Fedora release 23 (Twenty Three)

$ cat /proc/61692/mountinfo  | grep '\s/tmp'
234 199 0:57 / /tmp rw shared:97 master:76 - tmpfs tmpfs rw,size=131072k,nr_inodes=32768
235 234 0:57 /systemd-private-dd74de99e1104383aa7cd6e27d3d0b8a-httpd.service-uFqNHk/tmp /tmp rw,relatime shared:98 master:76 - tmpfs tmpfs rw,size=131072k,nr_inodes=32768

Signed-off-by: Andrew Vagin <avagin@virtuozzo.com>
---
 criu/mount.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/criu/mount.c b/criu/mount.c
index 431341e..19e8a11 100644
--- a/criu/mount.c
+++ b/criu/mount.c
@@ -1875,6 +1875,8 @@  uns:
 static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
 {
 	MntEntry me = MNT_ENTRY__INIT;
+	bool overmounted = false;
+	struct mount_info *c;
 
 	pr_info("\t%d: %x:%s @ %s\n", pm->mnt_id, pm->s_dev,
 			pm->root, pm->mountpoint);
@@ -1884,8 +1886,12 @@  static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
 	if (me.fstype == FSTYPE__AUTO)
 		me.fsname = pm->fstype->name;
 
+	list_for_each_entry(c, &pm->children, siblings)
+		if (strcmp(pm->mountpoint, c->mountpoint) == 0)
+			overmounted = true;
+
 	if (pm->parent && !pm->dumped && !pm->need_plugin && !pm->external &&
-	    pm->fstype->dump && fsroot_mounted(pm)) {
+	    pm->fstype->dump && fsroot_mounted(pm) && !overmounted) {
 		struct mount_info *t;
 
 		if (pm->fstype->dump(pm))

Comments

Pavel Emelianov May 6, 2016, 12:19 p.m.
On 05/05/2016 10:12 PM, Andrey Vagin wrote:
> From: Andrew Vagin <avagin@virtuozzo.com>
> 
> Something else may be mounted into the same folder and in this case
> we can't get access to the required file system.
> 
> $ cat /proc/61693/root/etc/redhat-release
> Fedora release 23 (Twenty Three)
> 
> $ cat /proc/61692/mountinfo  | grep '\s/tmp'
> 234 199 0:57 / /tmp rw shared:97 master:76 - tmpfs tmpfs rw,size=131072k,nr_inodes=32768
> 235 234 0:57 /systemd-private-dd74de99e1104383aa7cd6e27d3d0b8a-httpd.service-uFqNHk/tmp /tmp rw,relatime shared:98 master:76 - tmpfs tmpfs rw,size=131072k,nr_inodes=32768
> 
> Signed-off-by: Andrew Vagin <avagin@virtuozzo.com>
> ---
>  criu/mount.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/criu/mount.c b/criu/mount.c
> index 431341e..19e8a11 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -1875,6 +1875,8 @@ uns:
>  static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
>  {
>  	MntEntry me = MNT_ENTRY__INIT;
> +	bool overmounted = false;
> +	struct mount_info *c;
>  
>  	pr_info("\t%d: %x:%s @ %s\n", pm->mnt_id, pm->s_dev,
>  			pm->root, pm->mountpoint);
> @@ -1884,8 +1886,12 @@ static int dump_one_mountpoint(struct mount_info *pm, struct cr_img *img)
>  	if (me.fstype == FSTYPE__AUTO)
>  		me.fsname = pm->fstype->name;
>  
> +	list_for_each_entry(c, &pm->children, siblings)
> +		if (strcmp(pm->mountpoint, c->mountpoint) == 0)
> +			overmounted = true;
> +
>  	if (pm->parent && !pm->dumped && !pm->need_plugin && !pm->external &&
> -	    pm->fstype->dump && fsroot_mounted(pm)) {
> +	    pm->fstype->dump && fsroot_mounted(pm) && !overmounted) {

We may end up with a filesystem that has all mountpoints dumped, but it not dumped itself.

>  		struct mount_info *t;
>  
>  		if (pm->fstype->dump(pm))
>