[CRIU] [PATCH 1/2] sysctl: Make CTL_READ nonfatal

Cyrill Gorcunov gorcunov at openvz.org
Tue May 5 13:14:25 PDT 2015


Some entries might be missing and that
should not cause CRIU to stop dumping
when we know the entries are safe to unuse.

Thus introduce two fields in the request
@flags and @status which will carry the
options and results.

Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 include/sysctl.h | 8 ++++++++
 sysctl.c         | 4 ++++
 2 files changed, 12 insertions(+)

diff --git a/include/sysctl.h b/include/sysctl.h
index 3d7b182e862f..249ff07a4e83 100644
--- a/include/sysctl.h
+++ b/include/sysctl.h
@@ -5,6 +5,8 @@ struct sysctl_req {
 	char	*name;
 	void	*arg;
 	int	type;
+	short	flags;
+	short	status;
 };
 
 extern int sysctl_op(struct sysctl_req *req, size_t nr_req, int op);
@@ -30,4 +32,10 @@ enum {
 #define CTL_LEN(t)	((t) >> CTL_SHIFT)
 #define CTL_TYPE(t)	((t) & ((1 << CTL_SHIFT) - 1))
 
+/*
+ * Some entries might be missing mark them as optional.
+ */
+#define CTL_FLAGS_OPTIONAL	1
+#define CTL_STATUS_ENOENT	1
+
 #endif /* __CR_SYSCTL_H__ */
diff --git a/sysctl.c b/sysctl.c
index 5c3a01f25ac8..f2320f0bf908 100644
--- a/sysctl.c
+++ b/sysctl.c
@@ -137,6 +137,10 @@ static int __sysctl_op(int dir, struct sysctl_req *req, int op)
 
 	fd = openat(dir, req->name, flags);
 	if (fd < 0) {
+		if (errno == ENOENT && (req->flags & CTL_FLAGS_OPTIONAL)) {
+			req->status |= CTL_STATUS_ENOENT;
+			return 0;
+		}
 		pr_perror("Can't open sysctl %s", req->name);
 		return -1;
 	}
-- 
2.1.0



More information about the CRIU mailing list