From 455d055153f09be54b7ecb2067bf83c6eda83911 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Tue, 13 Oct 2020 11:47:49 +0200 Subject: [KERNEL] ported socket time structures to support CentOS 8 kernel 4.18 This patch implements the old time structures to support Linux kernels prior to version 5.1.x. WARNING: This change to the deprecated time structures does not solve the Y2038 issue. Thus, the dnbd3 Linux kernel module can only run under Linux kernels prior to version 5.1.x until the end of year 2037. --- src/kernel/net.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/kernel/net.c b/src/kernel/net.c index f8a3e33..b387c1d 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -181,7 +181,7 @@ static int dnbd3_net_discover(void *data) uint64_t filesize; uint16_t rid; - ktime_t start, end; + ktime_t start = 0, end = 0; unsigned long rtt, best_rtt = 0; unsigned long irqflags; int i, j, isize, best_server, current_server; @@ -192,7 +192,11 @@ static int dnbd3_net_discover(void *data) struct request *last_request = (struct request *)123, *cur_request = (struct request *)456; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) struct __kernel_sock_timeval timeout; +#else + struct timeval timeout; +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,9,0) sockptr_t timeout_ptr; #else @@ -324,8 +328,13 @@ static int dnbd3_net_discover(void *data) sock = NULL; continue; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) sock_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO_NEW, timeout_ptr, sizeof(timeout)); sock_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO_NEW, timeout_ptr, sizeof(timeout)); +#else + sock_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, timeout_ptr, sizeof(timeout)); + sock_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, timeout_ptr, sizeof(timeout)); +#endif sock->sk->sk_allocation = GFP_NOIO; if (dev->alt_servers[i].host.type == HOST_IP4) { @@ -920,7 +929,11 @@ error: int dnbd3_net_connect(dnbd3_device_t *dev) { struct request *req1 = NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) struct __kernel_sock_timeval timeout; +#else + struct timeval timeout; +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,9,0) sockptr_t timeout_ptr; #else @@ -997,8 +1010,13 @@ int dnbd3_net_connect(dnbd3_device_t *dev) goto error; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) sock_setsockopt(dev->sock, SOL_SOCKET, SO_SNDTIMEO_NEW, timeout_ptr, sizeof(timeout)); sock_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO_NEW, timeout_ptr, sizeof(timeout)); +#else + sock_setsockopt(dev->sock, SOL_SOCKET, SO_SNDTIMEO, timeout_ptr, sizeof(timeout)); + sock_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO, timeout_ptr, sizeof(timeout)); +#endif dev->sock->sk->sk_allocation = GFP_NOIO; if (dev->cur_server.host.type == HOST_IP4) { @@ -1116,8 +1134,13 @@ int dnbd3_net_connect(dnbd3_device_t *dev) dnbd3_dev_dbg_host_cur(dev, "on-the-fly server change ...\n"); dev->sock = dev->better_sock; dev->better_sock = NULL; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) sock_setsockopt(dev->sock, SOL_SOCKET, SO_SNDTIMEO_NEW, timeout_ptr, sizeof(timeout)); sock_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO_NEW, timeout_ptr, sizeof(timeout)); +#else + sock_setsockopt(dev->sock, SOL_SOCKET, SO_SNDTIMEO, timeout_ptr, sizeof(timeout)); + sock_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO, timeout_ptr, sizeof(timeout)); +#endif } dev->panic = 0; -- cgit v1.2.3-55-g7522