diff options
author | Andrew Vagin <avagin@openvz.org> | 2015-10-10 01:49:38 +0300 |
---|---|---|
committer | Pavel Emelyanov <xemul@parallels.com> | 2015-10-22 16:13:15 +0300 |
commit | 00acf5228fbb16f1768b8ed040cb901df291f1db (patch) | |
tree | 763665f43c087e974cfe067424a2c91f1dcbfd82 | |
parent | dfef4e05d5b8eb7097c15dc5dce181140b5da406 (diff) |
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 <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
-rw-r--r-- | fsnotify.c | 16 | ||||
-rw-r--r-- | 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); + + /* 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 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 { |