2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-31 06:15:24 +00:00

pstree: make equal_pid handle sid comparison between nested pidnses

If process belonging to some session is in different pidns than leader
of these session, it will have zeroes on all aditional levels in sid,
so though levels for these process and leader does not match - sids do.

v2: change to static inline function as there is no more pr_err
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
This commit is contained in:
Pavel Tikhomirov
2017-05-29 18:21:03 +03:00
committed by Andrei Vagin
parent 6e979f6867
commit f10251e66c

View File

@@ -46,21 +46,27 @@ struct pid {
} ns[1]; /* Must be at the end of struct pid */
};
#define equal_pid(a, b) \
({ \
int ___i, ___ret = true; \
if (a->level == b->level) { \
for (___i = 0; ___i < a->level; ___i++) \
if (a->ns[___i].virt != b->ns[___i].virt) { \
___ret = false; \
___i = a->level; /* break */ \
} \
} else { \
pr_err("Wrong pid nesting level\n"); \
___ret = false; \
} \
___ret; \
})
static inline bool equal_pid(struct pid *a, struct pid *b)
{
struct pid *t;
int i;
if (a->level > b->level) {
t = a;
a = b;
b = t;
}
for(i = 0; i < b->level; i++) {
if (i < a->level) {
if (a->ns[i].virt != b->ns[i].virt)
return false;
} else if (b->ns[i].virt != 0)
return false;
}
return true;
}
static inline pid_t last_level_pid(struct pid *pid)
{