summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
authorSimon Rettberg2013-12-20 16:03:12 +0100
committerSimon Rettberg2013-12-20 16:03:12 +0100
commit32ca216b49b2417a102457ce54bdd9bb76d6f02d (patch)
tree04ade6d7c11b3fd5c28ef0ed446c7e76703b6366 /src/kernel/net.c
parent[SERVER] Fix possible deadlock through printf usage in signal handler (diff)
downloaddnbd3-32ca216b49b2417a102457ce54bdd9bb76d6f02d.tar.gz
dnbd3-32ca216b49b2417a102457ce54bdd9bb76d6f02d.tar.xz
dnbd3-32ca216b49b2417a102457ce54bdd9bb76d6f02d.zip
[KERNEL] Improved read timeout handling
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 3db8da2..9b0de11 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -911,8 +911,9 @@ int dnbd3_net_receive(void *data)
unsigned long irqflags;
sigset_t blocked, oldset;
uint16_t rid;
+ unsigned long int recv_timeout = jiffies;
- int count, remaining, ret, recv_timeout = 0;
+ int count, remaining, ret;
init_msghdr(msg);
set_user_nice(current, -20);
@@ -925,8 +926,9 @@ int dnbd3_net_receive(void *data)
ret = kernel_recvmsg(dev->sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags);
if (ret == -EAGAIN)
{
- if ((recv_timeout += SOCKET_TIMEOUT_CLIENT_DATA) > SOCKET_KEEPALIVE_TIMEOUT)
- error_dev("ERROR: Receive timeout reached.");
+ if (jiffies < recv_timeout) recv_timeout = jiffies; // Handle overflow
+ if ((jiffies - recv_timeout) / HZ > SOCKET_KEEPALIVE_TIMEOUT)
+ error_dev_va("ERROR: Receive timeout reached (%d of %d secs).", (int)((jiffies - recv_timeout) / HZ), (int)SOCKET_KEEPALIVE_TIMEOUT);
continue;
}
if (ret <= 0)
@@ -941,7 +943,8 @@ int dnbd3_net_receive(void *data)
if (dnbd3_reply.cmd == 0)
error_dev("ERROR: Command was 0 (Receive).");
- recv_timeout = 0;
+ // Update timeout
+ recv_timeout = jiffies;
// what to do?
switch (dnbd3_reply.cmd)