Commit 246367e4 authored by Tycho Andersen's avatar Tycho Andersen Committed by Pavel Emelyanov

add walk_all flag to walk_namespaces

In the rest of this series we need to walk all the namespaces to autodetect
which mounts are master/shared/private bind mounts, so we need the information
from criu's namespace in the case when the namespaces are not the same.
Signed-off-by: 's avatarTycho Andersen <tycho.andersen@canonical.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f72f3824
...@@ -54,7 +54,7 @@ extern unsigned long root_ns_mask; ...@@ -54,7 +54,7 @@ extern unsigned long root_ns_mask;
extern const struct fdtype_ops nsfile_dump_ops; extern const struct fdtype_ops nsfile_dump_ops;
extern struct collect_image_info nsfile_cinfo; extern struct collect_image_info nsfile_cinfo;
extern int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void *oarg); extern int walk_namespaces(struct ns_desc *nd, bool walk_all, int (*cb)(struct ns_id *, void *), void *oarg);
extern int collect_namespaces(bool for_dump); extern int collect_namespaces(bool for_dump);
extern int collect_mnt_namespaces(bool for_dump); extern int collect_mnt_namespaces(bool for_dump);
extern int dump_mnt_namespaces(void); extern int dump_mnt_namespaces(void);
......
...@@ -2372,7 +2372,7 @@ int collect_mnt_namespaces(bool for_dump) ...@@ -2372,7 +2372,7 @@ int collect_mnt_namespaces(bool for_dump)
arg.for_dump = for_dump; arg.for_dump = for_dump;
arg.need_to_validate = false; arg.need_to_validate = false;
ret = walk_namespaces(&mnt_ns_desc, collect_mntns, &arg); ret = walk_namespaces(&mnt_ns_desc, false, collect_mntns, &need_to_validate);
if (ret) if (ret)
goto err; goto err;
......
...@@ -201,9 +201,14 @@ struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd) ...@@ -201,9 +201,14 @@ struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd)
* tasks may live in it. Sometimes (CLONE_SUBNS) there can * tasks may live in it. Sometimes (CLONE_SUBNS) there can
* be more than one namespace of that type. For this case * be more than one namespace of that type. For this case
* we dump all namespace's info and recreate them on restore. * we dump all namespace's info and recreate them on restore.
*
* In some cases (e.g. for external mount autodetection), we want to walk all
* the namespaces, regardless of who it is attached to. Passing walk_all=true
* forces the function to walk all the namespaces, regardless of who they
* belong to.
*/ */
int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void *oarg) int walk_namespaces(struct ns_desc *nd, bool walk_all, int (*cb)(struct ns_id *, void *), void *oarg)
{ {
int ret = 0; int ret = 0;
struct ns_id *ns; struct ns_id *ns;
...@@ -212,7 +217,7 @@ int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void ...@@ -212,7 +217,7 @@ int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void
if (ns->nd != nd) if (ns->nd != nd)
continue; continue;
if (ns->pid == getpid()) { if (ns->pid == getpid() && !walk_all) {
if (root_ns_mask & nd->cflag) if (root_ns_mask & nd->cflag)
continue; continue;
...@@ -597,7 +602,7 @@ int collect_user_namespaces(bool for_dump) ...@@ -597,7 +602,7 @@ int collect_user_namespaces(bool for_dump)
if (!(root_ns_mask & CLONE_NEWUSER)) if (!(root_ns_mask & CLONE_NEWUSER))
return 0; return 0;
return walk_namespaces(&net_ns_desc, collect_user_ns, NULL); return walk_namespaces(&net_ns_desc, false, collect_user_ns, NULL);
} }
static int check_user_ns(int pid) static int check_user_ns(int pid)
......
...@@ -716,7 +716,7 @@ static int collect_net_ns(struct ns_id *ns, void *oarg) ...@@ -716,7 +716,7 @@ static int collect_net_ns(struct ns_id *ns, void *oarg)
int collect_net_namespaces(bool for_dump) int collect_net_namespaces(bool for_dump)
{ {
return walk_namespaces(&net_ns_desc, collect_net_ns, return walk_namespaces(&net_ns_desc, false, collect_net_ns,
(void *)(for_dump ? 1UL : 0)); (void *)(for_dump ? 1UL : 0));
} }
......
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