[CRIU] [PATCH 1/2] fsnotify: don't save mnt_id if a mount namepsace isn't dumped

Andrei Vagin avagin at openvz.org
Thu Apr 27 17:59:30 PDT 2017


From: Andrei Vagin <avagin at virtuozzo.com>

Processes can be restored in another mntns, so mnt_id will be
useless in this case. If mntns isn't dumped, we have to dump a path
to a mount point.

Cc: Cyrill Gorcunov <gorcunov at openvz.org>
Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
 criu/fsnotify.c       | 31 ++++++++++++++++++++-----------
 images/fsnotify.proto |  1 +
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/criu/fsnotify.c b/criu/fsnotify.c
index 65833ca..a127218 100644
--- a/criu/fsnotify.c
+++ b/criu/fsnotify.c
@@ -180,9 +180,10 @@ static char *alloc_openable(unsigned int s_dev, unsigned long i_ino, FhEntry *f_
 				path = xstrdup(buf);
 				if (path == NULL)
 					goto err;
-
-				f_handle->has_mnt_id = true;
-				f_handle->mnt_id = m->mnt_id;
+				if (root_ns_mask & CLONE_NEWNS) {
+					f_handle->has_mnt_id = true;
+					f_handle->mnt_id = m->mnt_id;
+				}
 				return path;
 			}
 		} else
@@ -425,6 +426,8 @@ static int dump_fanotify_entry(union fdinfo_entries *e, void *arg)
 			pr_err("Can't find mnt_id 0x%x\n", fme->me->mnt_id);
 			goto out;
 		}
+		if (!(root_ns_mask & CLONE_NEWNS))
+			fme->me->path = m->mountpoint + 1;
 		fme->s_dev = m->s_dev;
 
 		pr_info("mark: s_dev %#08x mnt_id  %#08x mask %#08x\n",
@@ -621,18 +624,24 @@ static int restore_one_fanotify(int fd, struct fsnotify_mark_info *mark)
 	if (fme->type == MARK_TYPE__MOUNT) {
 		struct mount_info *m;
 		int mntns_root;
-
-		m = lookup_mnt_id(fme->me->mnt_id);
-		if (!m) {
-			pr_err("Can't find mount mnt_id 0x%x\n", fme->me->mnt_id);
-			return -1;
+		char *p = fme->me->path;
+		struct ns_id *nsid = NULL;
+
+		if (root_ns_mask & CLONE_NEWNS) {
+			m = lookup_mnt_id(fme->me->mnt_id);
+			if (!m) {
+				pr_err("Can't find mount mnt_id 0x%x\n", fme->me->mnt_id);
+				return -1;
+			}
+			nsid = m->nsid;
+			p = m->ns_mountpoint;
 		}
 
-		mntns_root = mntns_get_root_fd(m->nsid);
+		mntns_root = mntns_get_root_fd(nsid);
 
-		target = openat(mntns_root, m->ns_mountpoint, O_PATH);
+		target = openat(mntns_root, p, O_PATH);
 		if (target == -1) {
-			pr_perror("Unable to open %s", m->ns_mountpoint);
+			pr_perror("Unable to open %s", p);
 			goto err;
 		}
 
diff --git a/images/fsnotify.proto b/images/fsnotify.proto
index 1f73d9b..399a449 100644
--- a/images/fsnotify.proto
+++ b/images/fsnotify.proto
@@ -33,6 +33,7 @@ message fanotify_inode_mark_entry {
 
 message fanotify_mount_mark_entry {
 	required uint32		mnt_id		= 1;
+	optional string		path		= 2;
 }
 
 message fanotify_mark_entry {
-- 
2.9.3



More information about the CRIU mailing list