summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
authorFrederic Robra2019-11-06 20:23:47 +0100
committerFrederic Robra2019-11-06 20:23:47 +0100
commitec6c0ce8b1af8d9c36f4ec87cd384365cb2d9012 (patch)
treefd62ba871ee3383a6f139207977f92b103bb198e /src/kernel/net.c
parentadded comments (diff)
downloaddnbd3-ng-ec6c0ce8b1af8d9c36f4ec87cd384365cb2d9012.tar.gz
dnbd3-ng-ec6c0ce8b1af8d9c36f4ec87cd384365cb2d9012.tar.xz
dnbd3-ng-ec6c0ce8b1af8d9c36f4ec87cd384365cb2d9012.zip
removed bug when sending and at the same time socket closes down
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) {