Commit 87d68fca authored by Pavel Emelyanov's avatar Pavel Emelyanov

mnt: Use ns walking helper

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent a36917d4
...@@ -2078,52 +2078,36 @@ int mntns_get_root_by_mnt_id(int mnt_id) ...@@ -2078,52 +2078,36 @@ int mntns_get_root_by_mnt_id(int mnt_id)
return mntns_get_root_fd(mntns); return mntns_get_root_fd(mntns);
} }
int collect_mnt_namespaces(void) static int collect_mntns(struct ns_id *ns, void *oarg)
{ {
struct mount_info *pms; struct mount_info *pms;
struct ns_id *ns;
int ret = -1;
for (ns = ns_ids; ns; ns = ns->next) { pms = collect_mntinfo(ns);
if (!(ns->nd->cflag & CLONE_NEWNS)) if (!pms)
continue; return -1;
if (ns->pid == getpid()) { if (ns->pid != getpid())
/* *(int *)oarg = 1;
* Collect criu's mounts only if the target
* task does NOT live in mount namespaces to
* make smart paths resolution work.
*
* Otherwise, the necessary list of mounts
* will be collected below.
*/
if ((root_ns_mask & CLONE_NEWNS))
continue;
mntinfo = collect_mntinfo(ns); mntinfo_add_list(pms);
if (mntinfo == NULL) return 0;
goto err; }
/*
* Mount namespaces are dumped only if the root task lives in
* its own mntns, so we can stop enumeration of namespaces.
* We are not going to dump this tree, so we skip validation.
*/
goto out;
}
pr_info("Dump MNT namespace (mountpoints) %d via %d\n", ns->id, ns->pid); int collect_mnt_namespaces(void)
pms = collect_mntinfo(ns); {
if (pms == NULL) int need_to_validate = 0, ret;
goto err;
ret = walk_namespaces(&mnt_ns_desc, collect_mntns, &need_to_validate);
if (ret)
goto err;
mntinfo_add_list(pms); if (need_to_validate) {
if (collect_shared(mntinfo))
goto err;
if (validate_mounts(mntinfo, true))
goto err;
} }
if (collect_shared(mntinfo))
goto err;
if (validate_mounts(mntinfo, true))
goto err;
out:
ret = 0; ret = 0;
err: err:
return ret; return ret;
......
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