From 00acf5228fbb16f1768b8ed040cb901df291f1db Mon Sep 17 00:00:00 2001 From: Andrew Vagin Date: Sat, 10 Oct 2015 01:49:38 +0300 Subject: [PATCH] fsnotify: save mnt_id with path Otherwise it's impossible to understand from which namespace this path should be opened. Signed-off-by: Andrew Vagin Signed-off-by: Pavel Emelyanov --- fsnotify.c | 16 +++++++++++++--- protobuf/fh.proto | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fsnotify.c b/fsnotify.c index a7f7acf13..b8f9c227d 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->path, 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); - pr_debug("\t\tRestore with path hint %s\n", f_handle->path); - *target = openat(mntns_root, f_handle->path, O_PATH); + /* change "/foo" into "foo" and "/" into "." */ + if (f_handle->path[1] != '\0') + path = f_handle->path + 1; + + 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 c100c315d..eb73d66cf 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 {