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.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index cb4e76c..67f9c74 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -75,14 +75,11 @@ static void dnbd3_timer(struct timer_list *arg)
}
}
- if (!busy) {
- /* start after 4 seconds */
- if (dev->timer_count % TIMER_INTERVAL_PROBE_NORMAL == 4) {
- queue_work(dnbd3_wq, &dev->discovery_worker);
- }
-
-
+ /* start after 2 seconds */
+ if (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);
@@ -185,7 +182,9 @@ static void dnbd3_keepalive_worker(struct work_struct *work)
sock = container_of(work, struct dnbd3_sock, keepalive_worker);
if (sock->server != NULL && !sock->panic) {
debug_sock(sock, "starting keepalive worker");
+ mutex_lock(&sock->tx_lock);
dnbd3_send_request_cmd(sock, CMD_KEEPALIVE);
+ mutex_unlock(&sock->tx_lock);
}
}
@@ -237,6 +236,7 @@ static int dnbd3_panic_connect(struct dnbd3_device *dev)
{
struct dnbd3_server *working = NULL;
int i;
+ debug_dev(dev, "panic connect");
for (i = 0; i < NUMBER_CONNECTIONS; i++) {
if (dnbd3_is_sock_alive(dev->socks[i])) {
working = dev->socks[i].server;
@@ -273,7 +273,7 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) {
int i, j, fallback;
struct dnbd3_server *plan[NUMBER_CONNECTIONS];
struct dnbd3_server **servers = dnbd3_sort_server(dev);
-//TODO don't connect to anyting bader then rtt unknown
+
if (servers && servers[0]->host.type != 0) {
plan[0] = servers[0];
fallback = 0;
@@ -300,6 +300,8 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) {
i, plan[i]->avg_rtt);
}
kfree(servers);
+ //TODO connection plan sortieren
+
for (i = 0; i < NUMBER_CONNECTIONS; i++) {
if (plan[i] != dev->socks[i].server) {
if (dnbd3_is_sock_alive(dev->socks[i])) {
@@ -677,13 +679,13 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock,
result = -EIO;
goto error;
}
- mutex_unlock(&sock->tx_lock);
sock->panic = false;
if (!sock->sock) {
error_sock(sock, "socket is not connected");
server->failures++;
+ mutex_unlock(&sock->tx_lock);
result = -EIO;
goto error;
}
@@ -691,15 +693,17 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock,
result = dnbd3_send_request_cmd(sock, CMD_SELECT_IMAGE);
if (result <= 0) {
-
error_sock(sock, "connection to image %s failed", dev->imgname);
+ mutex_unlock(&sock->tx_lock);
result = -EIO;
goto error;
}
+
result = dnbd3_receive_cmd(sock, &reply);
if (result <= 0) {
error_sock(sock, "receive cmd to image %s failed",
dev->imgname);
+ mutex_unlock(&sock->tx_lock);
result = -EIO;
goto error;
}
@@ -707,6 +711,7 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock,
|| reply.size < 4) {
error_sock(sock, "receive select image wrong header %s",
dev->imgname);
+ mutex_unlock(&sock->tx_lock);
result = -EIO;
goto error;
}
@@ -714,6 +719,7 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock,
if (result <= 0) {
error_sock(sock, "receive cmd select image %s failed",
dev->imgname);
+ mutex_unlock(&sock->tx_lock);
result = -EIO;
goto error;
}
@@ -730,6 +736,7 @@ static int dnbd3_socket_connect(struct dnbd3_sock *sock,
if (dnbd3_send_request_cmd(sock, CMD_GET_SERVERS) <= 0) {
error_sock(sock, "failed to get servers in discovery");
}
+ mutex_unlock(&sock->tx_lock);
return 0;
error:
@@ -770,6 +777,7 @@ static int dnbd3_socket_disconnect(struct dnbd3_sock *sock)
*/
if (sock->sock) {
kernel_sock_shutdown(sock->sock, SHUT_RDWR);
+ dndb3_reque_busy_requests(sock);
}
mutex_unlock(&sock->tx_lock);
mutex_destroy(&sock->tx_lock);