[2/2,RH7] netlink: add an option to set sk->err from userspace

Submitted by Andrey Zhadchenko on Oct. 29, 2020, 9:36 a.m.

Details

Message ID 1603964161-492231-2-git-send-email-andrey.zhadchenko@virtuozzo.com
State New
Series "Series without cover letter"
Headers show

Commit Message

Andrey Zhadchenko Oct. 29, 2020, 9:36 a.m.
Sometimes during dump criu can encounter sockets with overflown kernel buffer,
which results in ENOBUFS error during next read. We need an reliable way
to restore sk->sk_err.

https://jira.sw.ru/browse/PSBM-120976
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com>
---
 include/uapi/linux/netlink.h | 1 +
 net/netlink/af_netlink.c     | 8 ++++++++
 2 files changed, 9 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
index 3756be5..62f8b4b 100644
--- a/include/uapi/linux/netlink.h
+++ b/include/uapi/linux/netlink.h
@@ -115,6 +115,7 @@  struct nlmsgerr {
 #define NETLINK_CAP_ACK		10
 
 #define NETLINK_REPAIR2		127
+#define NETLINK_SETERR		128
 
 struct nl_pktinfo {
 	__u32	group;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index dff6e5f..214d8d9 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1540,6 +1540,14 @@  static int netlink_setsockopt(struct socket *sock, int level, int optname,
 			nlk->flags &= ~NETLINK_F_REPAIR;
 		err = 0;
 		break;
+	case NETLINK_SETERR:
+		err = -ENOPROTOOPT;
+		if (nlk->flags & NETLINK_F_REPAIR && val < MAX_ERRNO) {
+			sk->sk_err = val;
+			sk->sk_error_report(sk);
+			err = 0;
+		}
+		break;
 	case NETLINK_PKTINFO:
 		if (val)
 			nlk->flags |= NETLINK_F_RECV_PKTINFO;