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.
Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
---
criu/include/pid.h | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/criu/include/pid.h b/criu/include/pid.h
index 72f3636..b25621a 100644
--- a/criu/include/pid.h
+++ b/criu/include/pid.h
@@ -46,20 +46,26 @@ 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; \
+#define equal_pid(a, b) \
+({ \
+ int ___i, ___ret = true; \
+ struct pid *___a = a, *___b = b; \
+ if (a->level > b->level) { \
+ ___a = b; \
+ ___b = a; \
+ } \
+ for (___i = 0; ___i < ___b->level; ___i++) \
+ if (___i < ___a->level) { \
+ if (___a->ns[___i].virt != ___b->ns[___i].virt) { \
+ ___ret = false; \
+ ___i = ___b->level; /* break */ \
+ } \
+ } \
+ else if (___b->ns[___i].virt != 0) { \
+ ___ret = false; \
+ ___i = ___b->level; /* break */ \
+ } \
+ ___ret; \
})
static inline pid_t last_level_pid(struct pid *pid)
--
2.9.3