[CRIU] [PATCH 2/2] fsnotify: save mnt_id with path

Andrey Vagin avagin at openvz.org
Fri Oct 9 15:49:38 PDT 2015


From: Andrew Vagin <avagin at openvz.org>

Otherwise it's impossible to understand from which namespace
this path should be opened.

Signed-off-by: Andrew Vagin <avagin at openvz.org>
---
 fsnotify.c        | 16 +++++++++++++---
 protobuf/fh.proto |  1 +
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/fsnotify.c b/fsnotify.c
index 8083395..931e767 100644
--- a/fsnotify.c
+++ b/fsnotify.c
@@ -169,6 +169,9 @@ int check_open_handle(unsigned int s_dev, unsigned long i_ino,
 			if (path == NULL)
 				goto err;
 
+			f_handle->has_mnt_id = true;
+			f_handle->mnt_id = mi->mnt_id;
+
 			goto out;
 		}
 
@@ -426,12 +429,19 @@ static char *get_mark_path(const char *who, struct file_remap *remap,
 		*target = openat(mntns_root, remap->rpath, O_PATH);
 	} else if (f_handle->path) {
 		int  mntns_root;
+		char *path = ".";
+		uint32_t mnt_id = f_handle->has_mnt_id ? f_handle->mnt_id : -1;
+
 
 		/* irmap cache is collected in the root namespaces. */
-		mntns_root = mntns_get_root_by_mnt_id(-1);
+		mntns_root = mntns_get_root_by_mnt_id(mnt_id);
+
+		/* change "/foo" into "foo" and "/" into "." */
+		if (f_handle->path[1] != '\0')
+			path = f_handle->path + 1;
 
-		pr_debug("\t\tRestore with path hint %s\n", f_handle->path);
-		*target = openat(mntns_root, f_handle->path, O_PATH);
+		pr_debug("\t\tRestore with path hint %d:%s\n", mnt_id, path);
+		*target = openat(mntns_root, path, O_PATH);
 	} else
 		*target = open_handle(s_dev, i_ino, f_handle);
 
diff --git a/protobuf/fh.proto b/protobuf/fh.proto
index c100c31..eb73d66 100644
--- a/protobuf/fh.proto
+++ b/protobuf/fh.proto
@@ -9,6 +9,7 @@ message fh_entry {
 	/* The minimum is fh_n_handle repetitions */
 	repeated uint64		handle	= 3;
 	optional string		path	= 4;
+	optional uint32		mnt_id	= 5;
 }
 
 message irmap_cache_entry {
-- 
2.4.3



More information about the CRIU mailing list