[Devel] [PATCH rh7] ve/net: hide handler for netlink NETLINK_REPAIR command unless CRIU restore
Konstantin Khorenko
khorenko at virtuozzo.com
Mon May 7 19:20:58 MSK 2018
The following patch to be applied to old kernels using ReadyKernel.
It makes updated "ip" working even if a Node was not rebooted.
Idea of the patch is taken from:
08dc16449a39 ("net: Change number of netlink repair")
Mainstream has NETLINK_EXT_ACK 11, which is used by fresh
iproute utils. We don't want these utils switch the socket
in repair mode.
https://jira.sw.ru/browse/PSBM-83415
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Distributives (for example Ubuntu 18.04, RHEL7) include now those
"fresh" version of "ip" utility which hangs on unpatched kernel.
Idea of the patch: we handle netlink command number 11
(NETLINK_REPAIR in VZ kernel / NETLINK_EXT_ACK in mainstream)
only in case we detect CRIU restore stage, otherwise we claim
kernel does not support it and "ip" is happy with that.
https://jira.sw.ru/browse/PSBM-84191
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
---
include/uapi/linux/netlink.h | 3 +++
net/netlink/af_netlink.c | 8 ++++++++
2 files changed, 11 insertions(+)
diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
index 56ddadf14e0e..a5e6e5c4c238 100644
--- a/include/uapi/linux/netlink.h
+++ b/include/uapi/linux/netlink.h
@@ -111,7 +111,10 @@ struct nlmsgerr {
#define NETLINK_LISTEN_ALL_NSID 8
#define NETLINK_LIST_MEMBERSHIPS 9
#define NETLINK_CAP_ACK 10
+
+/* intersects with mainstream NETLINK_EXT_ACK */
#define NETLINK_REPAIR 11
+#define NETLINK_REPAIR2 127
struct nl_pktinfo {
__u32 group;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index d5afa0322990..5560a2736ba4 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -2196,6 +2196,14 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
switch (optname) {
case NETLINK_REPAIR:
+ /* Hide the command handler unless "criu" process
+ * resumes a Container
+ */
+ if (likely(!get_exec_env()->is_pseudosuper ||
+ strcmp(current->comm, "criu")))
+ return -ENOPROTOOPT;
+ /* fall through */
+ case NETLINK_REPAIR2:
if (val)
nlk->flags |= NETLINK_F_REPAIR;
else
--
2.15.1
More information about the Devel
mailing list