Commit 695295ae authored by Andrei Vagin's avatar Andrei Vagin

fsnotify: don't save mnt_id if a mount namepsace isn't dumped

Processes can be restored in another mntns, so mnt_id will be
useless in this case. If mntns isn't dumped, we have to dump a path
to a mount point.

Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 6f8f85ff
...@@ -180,9 +180,10 @@ static char *alloc_openable(unsigned int s_dev, unsigned long i_ino, FhEntry *f_ ...@@ -180,9 +180,10 @@ static char *alloc_openable(unsigned int s_dev, unsigned long i_ino, FhEntry *f_
path = xstrdup(buf); path = xstrdup(buf);
if (path == NULL) if (path == NULL)
goto err; goto err;
if (root_ns_mask & CLONE_NEWNS) {
f_handle->has_mnt_id = true; f_handle->has_mnt_id = true;
f_handle->mnt_id = m->mnt_id; f_handle->mnt_id = m->mnt_id;
}
return path; return path;
} }
} else } else
...@@ -425,6 +426,8 @@ static int dump_fanotify_entry(union fdinfo_entries *e, void *arg) ...@@ -425,6 +426,8 @@ static int dump_fanotify_entry(union fdinfo_entries *e, void *arg)
pr_err("Can't find mnt_id 0x%x\n", fme->me->mnt_id); pr_err("Can't find mnt_id 0x%x\n", fme->me->mnt_id);
goto out; goto out;
} }
if (!(root_ns_mask & CLONE_NEWNS))
fme->me->path = m->mountpoint + 1;
fme->s_dev = m->s_dev; fme->s_dev = m->s_dev;
pr_info("mark: s_dev %#08x mnt_id %#08x mask %#08x\n", pr_info("mark: s_dev %#08x mnt_id %#08x mask %#08x\n",
...@@ -621,18 +624,24 @@ static int restore_one_fanotify(int fd, struct fsnotify_mark_info *mark) ...@@ -621,18 +624,24 @@ static int restore_one_fanotify(int fd, struct fsnotify_mark_info *mark)
if (fme->type == MARK_TYPE__MOUNT) { if (fme->type == MARK_TYPE__MOUNT) {
struct mount_info *m; struct mount_info *m;
int mntns_root; int mntns_root;
char *p = fme->me->path;
struct ns_id *nsid = NULL;
if (root_ns_mask & CLONE_NEWNS) {
m = lookup_mnt_id(fme->me->mnt_id); m = lookup_mnt_id(fme->me->mnt_id);
if (!m) { if (!m) {
pr_err("Can't find mount mnt_id 0x%x\n", fme->me->mnt_id); pr_err("Can't find mount mnt_id 0x%x\n", fme->me->mnt_id);
return -1; return -1;
} }
nsid = m->nsid;
p = m->ns_mountpoint;
}
mntns_root = mntns_get_root_fd(m->nsid); mntns_root = mntns_get_root_fd(nsid);
target = openat(mntns_root, m->ns_mountpoint, O_PATH); target = openat(mntns_root, p, O_PATH);
if (target == -1) { if (target == -1) {
pr_perror("Unable to open %s", m->ns_mountpoint); pr_perror("Unable to open %s", p);
goto err; goto err;
} }
......
...@@ -33,6 +33,7 @@ message fanotify_inode_mark_entry { ...@@ -33,6 +33,7 @@ message fanotify_inode_mark_entry {
message fanotify_mount_mark_entry { message fanotify_mount_mark_entry {
required uint32 mnt_id = 1; required uint32 mnt_id = 1;
optional string path = 2;
} }
message fanotify_mark_entry { message fanotify_mark_entry {
......
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