summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index a837702..801c15c 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -81,10 +81,9 @@ static void dnbd3_timer(struct timer_list *arg)
}
/* start after 2 seconds */
- if (dev->timer_count % TIMER_INTERVAL_PROBE_NORMAL == 2) {
+ if (!busy && dev->timer_count % TIMER_INTERVAL_PROBE_NORMAL == 2) {
queue_work(dnbd3_wq, &dev->discovery_worker);
}
-
dev->timer_count++;
dev->timer.expires = jiffies + HZ;
add_timer(&dev->timer);
@@ -108,11 +107,9 @@ static void dnbd3_receive_worker(struct work_struct *work)
result = dnbd3_receive_cmd(sock, &reply);
if (result == -EAGAIN) {
continue;
-
} else if (result <= 0) {
error_sock(sock, "connection to server lost %d", result);
goto error;
-
}
switch (reply.cmd) {
@@ -162,6 +159,10 @@ static void dnbd3_receive_worker(struct work_struct *work)
error:
if (result == 0) {
info_sock(sock, "result is 0, socket seems to be down");
+ /* be sure nobody is sending on the socket */
+ while (unlikely(sock->pending)) {
+ msleep(50);
+ }
dnbd3_sock_release(sock);
break;
} else if (result < 0) {