From 6a3d9860253eb74817d98192156378e1edff618c Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Fri, 8 Nov 2019 13:33:30 +0100 Subject: if connection is lost while connected modul now waits for new connection --- src/kernel/mq.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) (limited to 'src/kernel/mq.c') diff --git a/src/kernel/mq.c b/src/kernel/mq.c index 5b480de..f859c0f 100644 --- a/src/kernel/mq.c +++ b/src/kernel/mq.c @@ -23,6 +23,7 @@ #include #include +#include /** * dnbd3_busy_iter - iterator to set a bit for busy reqeust @@ -81,10 +82,18 @@ static void dnbd3_busy_iter_requeue(struct request *req, void *priv, bool arg) { struct dnbd3_sock *sock = priv; struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req); + if (&cmd->dnbd3->socks[cmd->index] != sock) { + return; + } if (!mutex_trylock(&cmd->lock)) { /* request is in sending, so we will not requeue */ return; } + if (!cmd->dnbd3->connected) { + dnbd3_end_cmd(cmd, BLK_STS_IOERR); + mutex_unlock(&cmd->lock); + return; + } debug_sock(sock, "requeue busy request %p", req); dnbd3_requeue_cmd(cmd); mutex_unlock(&cmd->lock); @@ -100,7 +109,21 @@ void dndb3_reque_busy_requests(struct dnbd3_sock *sock) blk_mq_tagset_busy_iter(set,(busy_tag_iter_fn *) dnbd3_busy_iter_requeue, sock); } - +static void dnbd3_wait_for_sockets(struct dnbd3_cmd * cmd) { + int i; + bool wait = true; + while (wait && cmd->dnbd3->connected) { + for (i = 0; i < cmd->dnbd3->number_connections; i++) { + if (dnbd3_is_sock_alive(cmd->dnbd3->socks[cmd->index])) { + wait = false; + } + if (wait && cmd->dnbd3->connected) { + debug("no socket alive sleeping"); + msleep(100); + } + } + } +} /** * dnbd3_requeue_cmd - requeue a command once @@ -109,7 +132,9 @@ void dndb3_reque_busy_requests(struct dnbd3_sock *sock) void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd) { struct request *req = blk_mq_rq_from_pdu(cmd); - if (!cmd->requed && blk_queued_rq(req)) { + dnbd3_wait_for_sockets(cmd); + + if (!cmd->requed/* && blk_queued_rq(req)*/) { cmd->requed = true; blk_mq_requeue_request(req, true); } @@ -127,6 +152,11 @@ void dnbd3_end_cmd(struct dnbd3_cmd *cmd, blk_status_t error) } +void dnbd3_end_all_rq(struct dnbd3_device *dev) +{ + struct request_queue *q = dev->disk->queue; +} + /** * dnbd3_handle_cmd - handles a mq command * @cmd: the cmd to send @@ -143,20 +173,16 @@ static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index) // blk_rq_pos(req), blk_rq_bytes(req), index); - if (!dnbd3_is_sock_alive(*sock)) { -// warn_dev(dev, "attempted send on invalid socket %d", index); -// msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000); + if (!dev->socks || !dnbd3_is_sock_alive(*sock)) { if (dev->connected) { -// info_dev(dev, "reset request to new socket"); + info_dev(dev, "reset request to new socket"); dnbd3_requeue_cmd(cmd); - ret = 0; - goto out; + return 0; } else { error_dev(dev, "ending request device not connected"); dnbd3_end_cmd(cmd, BLK_STS_IOERR); - ret = -EIO; - goto out; + return -EIO; } } -- cgit v1.2.3-55-g7522