[CRIU] [PATCH 22/39] mount: save mount tree for each namespace
Andrey Vagin
avagin at openvz.org
Mon Apr 21 07:23:32 PDT 2014
We are going to support nested mount namespaces and each NS has own
tree. The mount tree is used for checking that a file is reachable.
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
include/mount.h | 4 ++--
include/namespaces.h | 5 +++++
mount.c | 8 +++++---
namespaces.c | 2 +-
4 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/include/mount.h b/include/mount.h
index 86836ea..1d51910 100644
--- a/include/mount.h
+++ b/include/mount.h
@@ -10,7 +10,8 @@ extern int collect_mount_info(pid_t pid);
extern struct fstype *find_fstype_by_name(char *fst);
struct cr_fdset;
-extern int dump_mnt_ns(int pid, int ns_id);
+struct ns_id;
+extern int dump_mnt_ns(struct ns_id *ns);
extern int prepare_mnt_ns(int pid);
extern int pivot_root(const char *new_root, const char *put_old);
@@ -24,7 +25,6 @@ extern struct ns_desc mnt_ns_desc;
extern dev_t phys_stat_resolve_dev(dev_t st_dev, const char *path);
extern bool phys_stat_dev_match(dev_t st_dev, dev_t phys_dev, const char *path);
-struct ns_id;
extern int restore_task_mnt_ns(struct ns_id *nsid, pid_t pid);
extern int fini_mnt_ns(void);
diff --git a/include/namespaces.h b/include/namespaces.h
index fcbe17c..55cf37a 100644
--- a/include/namespaces.h
+++ b/include/namespaces.h
@@ -16,6 +16,11 @@ struct ns_id {
struct ns_desc *nd;
struct ns_id *next;
futex_t created; /* boolean */
+ union {
+ struct {
+ struct mount_info *mntinfo_tree;
+ } mnt;
+ };
};
extern struct ns_id *ns_ids;
diff --git a/mount.c b/mount.c
index f06dd89..e424808 100644
--- a/mount.c
+++ b/mount.c
@@ -827,10 +827,12 @@ static int dump_one_mountpoint(struct mount_info *pm, int fd)
return 0;
}
-int dump_mnt_ns(int ns_pid, int ns_id)
+int dump_mnt_ns(struct ns_id *ns)
{
struct mount_info *pm;
int img_fd, ret = -1;
+ int ns_pid = ns->pid;
+ int ns_id = ns->id;
img_fd = open_image(CR_FD_MNTS, O_DUMP, ns_id);
if (img_fd < 0)
@@ -845,7 +847,8 @@ int dump_mnt_ns(int ns_pid, int ns_id)
goto err;
}
- if (mnt_build_tree(pm) == NULL)
+ ns->mnt.mntinfo_tree = mnt_build_tree(pm);
+ if (ns->mnt.mntinfo_tree == NULL)
goto err;
if (validate_mounts(pm, true))
@@ -859,7 +862,6 @@ int dump_mnt_ns(int ns_pid, int ns_id)
if (dump_one_mountpoint(pm, img_fd))
goto err;
- xfree(pm);
pm = n;
} while (pm);
diff --git a/namespaces.c b/namespaces.c
index 190628b..8324fe3 100644
--- a/namespaces.c
+++ b/namespaces.c
@@ -461,7 +461,7 @@ int dump_mnt_namespaces(void)
pr_info("Dump MNT namespace (mountpoints) %d via %d\n",
ns->id, ns->pid);
- ret = dump_mnt_ns(ns->pid, ns->id);
+ ret = dump_mnt_ns(ns);
if (ret)
break;
}
--
1.8.5.3
More information about the CRIU
mailing list