summaryrefslogtreecommitdiffstats
path: root/src/kernel/mq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/mq.c')
-rw-r--r--src/kernel/mq.c46
1 files changed, 36 insertions, 10 deletions
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 <linux/wait.h>
#include <linux/blk-mq.h>
+#include <linux/delay.h>
/**
* 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;
}
}