[CRIU] [PATCH v2] show: logic for optionaly files introduced

Kinsbursky Stanislav skinsbursky at openvz.org
Wed Feb 8 07:41:29 EST 2012


v2: removed "opt" check from dump stage fdset initialization.

Some dump files (like UTS and IPC ns files) may not present after dump. But
"show all" call have to take it into account and fail trying to open dump
these files.
"Opt" variable in struct cr_fd_desc_tmpl has been introduced to solve this
problem. If this variable is set, then open failure for such files doesn't
lead to failure of whole "show all" sequence.
Also, added check for file validity of UTS ns file descriptor before
show_utsns() call.

Signed-off-by: Stanislav Kinsbursky <skinsbursky at parallels.com>

---
 crtools.c         |    4 ++++
 include/crtools.h |    1 +
 namespaces.c      |    3 ++-
 3 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/crtools.c b/crtools.c
index 4b93de9..7fe5933 100644
--- a/crtools.c
+++ b/crtools.c
@@ -109,12 +109,14 @@ struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX] = {
 	[CR_FD_UTSNS] = {
 		.fmt	= FMT_FNAME_UTSNS,
 		.magic	= UTSNS_MAGIC,
+		.opt	= 1,
 	},
 
 	/* IPC namespace variables */
 	[CR_FD_IPCNS_VAR] = {
 		.fmt	= FMT_FNAME_IPCNS_VAR,
 		.magic	= IPCNS_VAR_MAGIC,
+		.opt	= 1,
 	},
 };
 
@@ -237,6 +239,8 @@ struct cr_fdset *prep_cr_fdset_for_show(int pid, unsigned long use_mask)
 
 		ret = open(path, O_RDWR, CR_FD_PERM);
 		if (ret < 0) {
+			if (fdset_template[i].opt)
+				continue;
 			pr_perror("Unable to open %s", path);
 			goto err;
 		}
diff --git a/include/crtools.h b/include/crtools.h
index fc8ff6f..686be63 100644
--- a/include/crtools.h
+++ b/include/crtools.h
@@ -60,6 +60,7 @@ struct cr_options {
 struct cr_fd_desc_tmpl {
 	const char	*fmt;			/* format for the name */
 	u32		magic;			/* magic in the header */
+	bool		opt;			/* optional presence flag */
 };
 
 extern struct cr_fd_desc_tmpl fdset_template[CR_FD_MAX];
diff --git a/namespaces.c b/namespaces.c
index 16a3a1e..89e594d 100644
--- a/namespaces.c
+++ b/namespaces.c
@@ -122,7 +122,8 @@ int try_show_namespaces(int ns_pid)
 	if (!fdset)
 		return -1;
 
-	show_utsns(fdset->fds[CR_FD_UTSNS]);
+	if (fdset->fds[CR_FD_UTSNS] != -1)
+		show_utsns(fdset->fds[CR_FD_UTSNS]);
 
 	close_cr_fdset(&fdset);
 	return 0;



More information about the CRIU mailing list