[CRIU] [PATCH] fsnotify: Use longest mount point for inotify watchee
Pavel Emelyanov
xemul at parallels.com
Mon Oct 12 01:06:32 PDT 2015
On 10/10/2015 11:07 AM, Cyrill Gorcunov wrote:
> In debian-8 container we faced the problem -- systemd
> creates nested mount namespaces and inotify watchee
> are resolved into a path which is inaccessbile on
> restore (because we're operating in task's mount
> namespace). So here is a dirty hack for now -- choose
> the widest mount point as a reference. The proper
> fix requires kernel patching.
How about Andrey's patch that saved mnt-id for an inotify?
> https://jira.sw.ru/browse/PSBM-39957
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>
> Guys, I'm looking forward to patch the kernel because
> lack of @mnt_id in kernel output still beat us: we can't
> be sure the longest mount point will always be enough
> and need a precise knowing where watchee has been opened
> at. But the patch unblocks our tests so I would love
> having it merged for this sake.
>
> fsnotify.c | 10 +++++++++-
> include/mount.h | 1 +
> mount.c | 19 +++++++++++++++++++
> 3 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/fsnotify.c b/fsnotify.c
> index 76d73980d854..381626b43cb2 100644
> --- a/fsnotify.c
> +++ b/fsnotify.c
> @@ -118,7 +118,15 @@ static int open_handle(unsigned int s_dev, unsigned long i_ino,
> pr_debug("Opening fhandle %x:%Lx...\n",
> s_dev, (unsigned long long)handle.__handle[0]);
>
> - mntfd = open_mount(s_dev);
> + /*
> + * FIXME: That's a dirty hack: we lookup for a mount
> + * with longest path which get opened on the
> + * restore. Such trick works for containers
> + * we're working on now but proper fix seems
> + * to be adding @mnt_id into the procfs output
> + * via kernel patching.
> + */
> + mntfd = open_mount_widest(s_dev);
> if (mntfd < 0) {
> pr_err("Mount root for 0x%08x not found\n", s_dev);
> goto out;
> diff --git a/include/mount.h b/include/mount.h
> index b56aafd4d569..38f6388136ae 100644
> --- a/include/mount.h
> +++ b/include/mount.h
> @@ -94,6 +94,7 @@ extern int mntns_get_root_fd(struct ns_id *ns);
> extern int mntns_get_root_by_mnt_id(int mnt_id);
> extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
>
> +extern int open_mount_widest(unsigned int s_dev);
> extern int open_mount(unsigned int s_dev);
> extern struct fstype *find_fstype_by_name(char *fst);
> extern bool add_fsname_auto(const char *names);
> diff --git a/mount.c b/mount.c
> index 8936eda59db5..8e1a90f2a567 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -1043,6 +1043,25 @@ err:
> return -1;
> }
>
> +int open_mount_widest(unsigned int s_dev)
> +{
> + struct mount_info *m, *t = NULL;
> + int rlen = -1;
> +
> + for (m = mntinfo; m; m = m->next) {
> + int len = strlen(m->root);
> + if (m->s_dev != s_dev)
> + continue;
> + if (rlen > 0 && rlen < len)
> + continue;
> + t = m, rlen = len;
> + }
> +
> + if (!t)
> + return -ENOENT;
> + return __open_mountpoint(t, -1);
> +}
> +
> int open_mount(unsigned int s_dev)
> {
> struct mount_info *m;
>
More information about the CRIU
mailing list