Blob Blame History Raw
From 5643067ce662e5ca1730f36e209f17eaf6818f90 Mon Sep 17 00:00:00 2001
From: Liu Hua <weldonliu@tencent.com>
Date: Fri, 5 Nov 2021 17:08:51 +0800
Subject: [PATCH 050/120] seize: restore cgroup freezer to right state

The new freezer_state is a complete equivalent of old freezer_thawed
except for the initial value. If old freezer_thawed was not initialized
it was 0 and in freezer_restore_state were threated as if we need to
freeze cgroup "back", thus before this patch if criu dump failed before
freezing dumpee, criu always freeze dumpee in cr_dump_finish which is
wrong. Switching to freezer_state initialized with FREEZER_ERROR fixes
the problem.

v2: improve description, rename to origin_freezer_state

Signed-off-by: Liu Hua <weldonliu@tencent.com>
---
 criu/seize.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/criu/seize.c b/criu/seize.c
index 95bf9ef0c..58564ca74 100644
--- a/criu/seize.c
+++ b/criu/seize.c
@@ -131,11 +131,11 @@ static enum freezer_state get_freezer_state(int fd)
 	return get_freezer_v1_state(fd);
 }
 
-static bool freezer_thawed;
+static enum freezer_state origin_freezer_state = FREEZER_ERROR;
 
 const char *get_real_freezer_state(void)
 {
-	return freezer_thawed ? thawed : frozen;
+	return origin_freezer_state == THAWED ? thawed : frozen;
 }
 
 static int freezer_write_state(int fd, enum freezer_state new_state)
@@ -192,7 +192,7 @@ static int freezer_restore_state(void)
 	int fd;
 	int ret;
 
-	if (!opts.freeze_cgroup || freezer_thawed)
+	if (!opts.freeze_cgroup || origin_freezer_state != FROZEN)
 		return 0;
 
 	fd = freezer_open();
@@ -481,9 +481,10 @@ static int freeze_processes(void)
 		close(fd);
 		return -1;
 	}
-	if (state == THAWED) {
-		freezer_thawed = true;
 
+	origin_freezer_state = state == FREEZING ? FROZEN : state;
+
+	if (state == THAWED) {
 		if (freezer_write_state(fd, FROZEN)) {
 			close(fd);
 			return -1;
@@ -534,7 +535,7 @@ static int freeze_processes(void)
 	}
 
 err:
-	if (exit_code == 0 || freezer_thawed)
+	if (exit_code == 0 || origin_freezer_state == THAWED)
 		exit_code = freezer_write_state(fd, THAWED);
 
 	if (close(fd)) {
-- 
2.34.1