Commit e6537f3d authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Andrei Vagin

fsnotify: open_handle -- Handle multiple mounts with same s_dev

When inotify is laying on uovermounted fs we should walk over
all mountpoints with same s_dev to find openable path.

Note on restore the path is usually already allocated during
dump stage so get_mark_path won't call for open_handle(), in
turn on dump stage the positive return from open_handle()
will cause fsnotify engine to find openable path, thus there
is kind of double work to be optimized in future.

For example we got a container where systemd-udevd inside
opens inotify for /dev/X entry then overmount ./dev path
with slave option and in result irmap engine on predump
can't figure out where the inotify is sitting causing
migrtion to abort.
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent d541bc79
...@@ -196,6 +196,7 @@ err: ...@@ -196,6 +196,7 @@ err:
static int open_handle(unsigned int s_dev, unsigned long i_ino, static int open_handle(unsigned int s_dev, unsigned long i_ino,
FhEntry *f_handle) FhEntry *f_handle)
{ {
struct mount_info *m;
int mntfd, fd = -1; int mntfd, fd = -1;
fh_t handle; fh_t handle;
...@@ -204,19 +205,23 @@ static int open_handle(unsigned int s_dev, unsigned long i_ino, ...@@ -204,19 +205,23 @@ static int open_handle(unsigned int s_dev, unsigned long i_ino,
pr_debug("Opening fhandle %x:%Lx...\n", pr_debug("Opening fhandle %x:%Lx...\n",
s_dev, (unsigned long long)handle.__handle[0]); s_dev, (unsigned long long)handle.__handle[0]);
mntfd = open_mount(s_dev); for (m = mntinfo; m; m = m->next) {
if (m->s_dev != s_dev || !mnt_is_dir(m))
continue;
mntfd = __open_mountpoint(m, -1);
if (mntfd < 0) { if (mntfd < 0) {
pr_err("Mount root for %#08x not found\n", s_dev); pr_err("Can't open mount for s_dev %x, continue\n", s_dev);
goto out; continue;
} }
fd = userns_call(open_by_handle, UNS_FDOUT, &handle, sizeof(handle), mntfd); fd = userns_call(open_by_handle, UNS_FDOUT, &handle, sizeof(handle), mntfd);
if (fd < 0) { if (fd >= 0) {
pr_perror("Can't open file handle for %#08x:%#016lx", close(mntfd);
s_dev, i_ino); goto out;
} }
close(mntfd); close(mntfd);
}
out: out:
return fd; return fd;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment