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

Cyrill Gorcunov gorcunov at openvz.org
Fri May 8 05:43:39 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 ++++++++
 net.c            | 2 ++
 sysctl.c         | 4 ++++
 3 files changed, 14 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/net.c b/net.c
index 034793029eb2..4acb1e5bcdce 100644
--- a/net.c
+++ b/net.c
@@ -104,6 +104,8 @@ static int ipv4_conf_op(char *tgt, int *conf, int op, NetnsEntry **netns)
 		req[ri].name = path[i];
 		req[ri].arg = &conf[i];
 		req[ri].type = CTL_32;
+		req[ri].flags = 0;
+		req[ri].status = 0;
 		ri++;
 	}
 
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