[CRIU] [PATCH] mnt: relax constraints on fuse mounts

Tycho Andersen tycho.andersen at canonical.com
Wed Apr 8 11:13:33 PDT 2015


1. If a fuse connection is present, but there are no fuse mounts of that type
   in the mount namespace, don't refuse to dump.
2. If there are mounts of that type in the container but they are external,
   we're going to bind them anyway, so there's no fuse-specific things that
   need to be done, so it is safe to dump.

Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
---
 mount.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 42 insertions(+), 1 deletion(-)

diff --git a/mount.c b/mount.c
index 71c39bf..700c303 100644
--- a/mount.c
+++ b/mount.c
@@ -1024,6 +1024,47 @@ out:
 	return ret;
 }
 
+static int fusectl_dump(struct mount_info *pm)
+{
+	int fd, ret = -1;
+	struct dirent *de;
+	DIR *fdir = NULL;
+
+	fd = open_mountpoint(pm);
+	if (fd < 0)
+		return -1;
+
+	fdir = fdopendir(fd);
+	if (fdir == NULL) {
+		close(fd);
+		return -1;
+	}
+
+	while ((de = readdir(fdir))) {
+		int id;
+		struct mount_info *it;
+
+		if (dir_dots(de))
+			continue;
+
+		if (sscanf(de->d_name, "%d", &id) != 1) {
+			pr_err("wrong number of items scanned in fusectl dump\n");
+			goto out;
+		}
+
+		for (it = mntinfo; it; it = it->next) {
+			if (id == minor(it->s_dev) && !it->external) {
+				pr_err("%s is a fuse mount but not external\n", it->mountpoint);
+				goto out;
+			}
+		}
+	}
+
+	ret = 0;
+out:
+	closedir(fdir);
+	return ret;
+}
 
 static int dump_empty_fs(struct mount_info *pm)
 {
@@ -1102,7 +1143,7 @@ static struct fstype fstypes[] = {
 		.code = FSTYPE__SECURITYFS,
 	}, {
 		.name = "fusectl",
-		.dump = dump_empty_fs,
+		.dump = fusectl_dump,
 		.code = FSTYPE__FUSECTL,
 	}, {
 		.name = "debugfs",
-- 
2.1.0



More information about the CRIU mailing list