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.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 2d0b6ad..5478e95 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -208,6 +208,10 @@ int dnbd3_send_request(struct dnbd3_sock *sock, struct request *req,
result = kernel_sendmsg(sock->sock, &msg, iov, iov_num, lng);
if (result != lng) {
error_sock(sock, "connection to server lost");
+ if (cmd) {
+ blk_mq_requeue_request(req, true);
+ }
+ sock->panic = true;
sock->server->failures++;
goto error;
}
@@ -823,7 +827,7 @@ static void dnbd3_adjust_connections(struct dnbd3_device *dev) {
uint64_t best_rtt = RTT_UNREACHABLE;
struct dnbd3_server *server, *existing_server;
- /* connect empty sockets */
+ /* connect empty sockets */ //TODO check if panic worker connects at the same time, than we would have a problem
sock_alive = 0;
for (i = 0; i < NUMBER_CONNECTIONS; i++) {
if (!dnbd3_is_sock_alive(dev->socks[i])) {
@@ -1094,6 +1098,7 @@ static void dnbd3_merge_new_server(struct dnbd3_device *dev,
// existing_server->failures = 0; // reset failure count
return;
} else if (free_server) {
+ //TODO disconnect the server if it is connected
free_server->host = new_server->host;
} else if (failed_server) {
failed_server->host = new_server->host;
@@ -1357,6 +1362,13 @@ error:
return result;
}
+static void dnbd3_clear_req(struct request *req, void *data, bool reserved)
+{
+ struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req);
+
+ cmd->status = BLK_STS_IOERR;
+ blk_mq_complete_request(req);
+}
/**
* dnbd3_socket_disconnect - disconnect a socket or server
@@ -1406,7 +1418,6 @@ static int dnbd3_socket_disconnect(struct dnbd3_sock *sock)
}
mutex_unlock(&sock->tx_lock);
mutex_destroy(&sock->tx_lock);
- blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive - 1);
cancel_work_sync(&sock->receive_worker);
@@ -1414,6 +1425,17 @@ static int dnbd3_socket_disconnect(struct dnbd3_sock *sock)
sock_release(sock->sock);
sock->sock = NULL;
}
+ debug_sock(sock, "update nr hw queues to %d", sock_alive -1);
+// blk_mq_quiesce_queue(dev->disk->queue);
+// debug_sock(sock, "busy iter");
+// blk_mq_tagset_busy_iter(&dev->tag_set, dnbd3_clear_req, NULL);
+// debug_sock(sock, "update");
+ //TODO can we just stop the failed queue?
+ blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive - 1);
+// debug_sock(sock, "unquisco");
+// blk_mq_unquiesce_queue(dev->disk->queue);
+// debug_sock(sock, "donee");
+
sock->server = NULL;
sock->panic = false;
return 0;