mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
restore: add mount id-s in the ns_ids list (v4)
Currently ns_ids list is filled only on dump. Soon we'll need this list for mount namespaces on restore, e.g. to know which tasks share the namespaces. v2: merge the patch "namespace: add a function to search an ns_id item by id" into this one. v3: add prefix rst_ to add_ns_id v4: look up namespace by two values -- type AND ID Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
0989d3fdf9
commit
eac462922c
@@ -42,6 +42,9 @@ extern int switch_ns(int pid, struct ns_desc *nd, int *rst);
|
||||
extern int restore_ns(int rst, struct ns_desc *nd);
|
||||
|
||||
extern int dump_task_ns_ids(struct pstree_item *);
|
||||
extern int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd);
|
||||
extern struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd);
|
||||
|
||||
extern int gen_predump_ns_mask(void);
|
||||
|
||||
#endif /* __CR_NS_H__ */
|
||||
|
39
namespaces.c
39
namespaces.c
@@ -117,6 +117,34 @@ struct ns_id *ns_ids = NULL;
|
||||
static unsigned int ns_next_id = 1;
|
||||
unsigned long current_ns_mask = 0;
|
||||
|
||||
int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd)
|
||||
{
|
||||
struct ns_id *nsid;
|
||||
|
||||
for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
|
||||
if (nsid->id == id) {
|
||||
if (pid_rst_prio(pid, nsid->pid))
|
||||
nsid->pid = pid;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
nsid = shmalloc(sizeof(struct ns_id));
|
||||
if (nsid == NULL)
|
||||
return -1;
|
||||
|
||||
nsid->nd = nd;
|
||||
nsid->id = id;
|
||||
nsid->pid = pid;
|
||||
|
||||
nsid->next = ns_ids;
|
||||
ns_ids = nsid;
|
||||
|
||||
pr_info("Add namespace %d pid %d\n", nsid->id, nsid->pid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd)
|
||||
{
|
||||
struct ns_id *nsid;
|
||||
@@ -128,6 +156,17 @@ static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd)
|
||||
{
|
||||
struct ns_id *nsid;
|
||||
|
||||
for (nsid = ns_ids; nsid != NULL; nsid = nsid->next)
|
||||
if (nsid->id == id && nsid->nd == nd)
|
||||
return nsid;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd)
|
||||
{
|
||||
unsigned int id;
|
||||
|
5
pstree.c
5
pstree.c
@@ -9,6 +9,7 @@
|
||||
#include "namespaces.h"
|
||||
#include "files.h"
|
||||
#include "tty.h"
|
||||
#include "mount.h"
|
||||
#include "asm/dump.h"
|
||||
|
||||
#include "protobuf.h"
|
||||
@@ -413,6 +414,10 @@ static int read_pstree_image(void)
|
||||
if (ret != 1)
|
||||
goto err;
|
||||
|
||||
if (pi->ids->has_mnt_ns_id) {
|
||||
if (rst_add_ns_id(pi->ids->mnt_ns_id, pi->pid.virt, &mnt_ns_desc))
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
err:
|
||||
close(ps_fd);
|
||||
|
Reference in New Issue
Block a user