diff options
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r-- | src/kernel/net.c | 9 |
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) { |