[CRIU] [PATCH 01/13] crtools: close all desriptors only for the root task

Andrey Vagin avagin at openvz.org
Tue Mar 11 08:18:17 PDT 2014


For all other tasks only unsed service descriptors will be closed.

This change allows to have file descriptors, which may be used for
restoring namespaces. All non-server descriptors must be closed before
restoring files.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 cr-restore.c        | 11 ++++++-----
 include/servicefd.h |  1 +
 util.c              | 13 +++++++++++++
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index ab8fa77..84aaccc 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -1238,6 +1238,9 @@ static int restore_task_with_children(void *_arg)
 		if (restore_finish_stage(CR_STATE_RESTORE_NS) < 0)
 			exit(1);
 
+		if (close_old_fds(current))
+			exit(1);
+
 		if (collect_mount_info(getpid()))
 			exit(1);
 
@@ -1272,11 +1275,9 @@ static int restore_task_with_children(void *_arg)
 	if (prepare_mappings(pid))
 		exit(1);
 
-	if (!(ca->clone_flags & CLONE_FILES)) {
-		ret = close_old_fds(current);
-		if (ret)
-			exit(1);
-	}
+	if ((!(ca->clone_flags & CLONE_FILES)) &&
+	    current->parent && current->parent->rst->fdt)
+		close_old_servie_fd(current->parent->rst->fdt->nr);
 
 	if (create_children_and_session())
 		exit(1);
diff --git a/include/servicefd.h b/include/servicefd.h
index 2a2542c..f855fe8 100644
--- a/include/servicefd.h
+++ b/include/servicefd.h
@@ -25,6 +25,7 @@ extern int get_service_fd(enum sfd_type type);
 extern int reserve_service_fd(enum sfd_type type);
 extern int install_service_fd(enum sfd_type type, int fd);
 extern int close_service_fd(enum sfd_type type);
+extern void close_old_servie_fd(int nr);
 extern bool is_service_fd(int fd, enum sfd_type type);
 extern bool is_any_service_fd(int fd);
 
diff --git a/util.c b/util.c
index 4304a91..66d72a2 100644
--- a/util.c
+++ b/util.c
@@ -341,6 +341,19 @@ int close_service_fd(enum sfd_type type)
 	return 0;
 }
 
+/* Close all unused service descriptors on a depth of nr. */
+void close_old_servie_fd(int nr)
+{
+	int level, i;
+	for (level = 0; level < nr; level++) {
+		if (level == service_fd_id)
+			continue;
+		for (i = SERVICE_FD_MIN + 1; i < SERVICE_FD_MAX; i++) {
+			close(__get_service_fd(i, level));
+		}
+	}
+}
+
 int clone_service_fd(int id)
 {
 	int ret = -1, i;
-- 
1.8.5.3



More information about the CRIU mailing list