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.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/kernel/mq.c b/src/kernel/mq.c
index 0a99817..946e395 100644
--- a/src/kernel/mq.c
+++ b/src/kernel/mq.c
@@ -36,6 +36,7 @@ static void dnbd3_busy_iter(struct request *req, void *priv, bool arg2)
*is_busy = true;
}
+
/**
* dnbd3_is_mq_busy - check if mq is busy
* @dev: the device
@@ -98,7 +99,8 @@ void dnbd3_end_cmd(struct dnbd3_cmd *cmd, blk_status_t error)
static bool dnbd3_is_any_sock_alive(struct dnbd3_cmd *cmd) {
int i;
for (i = 0; i < NUMBER_CONNECTIONS; i++) {
- if (dnbd3_is_sock_alive(cmd->dnbd3->socks[i])) {
+ if (dnbd3_is_sock_alive(cmd->dnbd3->socks[i]) &&
+ !cmd->dnbd3->socks->panic) {
return true;
}
}
@@ -122,16 +124,16 @@ static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index)
if (!(sock->server && sock->sock && !sock->panic)) {
- warn_dev(dev, "attempted send on invalid socket %d", index);
+// warn_dev(dev, "attempted send on invalid socket %d", index);
// msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000);
- if (dnbd3_is_any_sock_alive(cmd)) {
- info_dev(dev, "reset request to new socket");
+ if (dev->connected) {
+// info_dev(dev, "reset request to new socket");
dnbd3_requeue_cmd(cmd);
ret = 0;
goto out;
} else {
- error_dev(dev, "ending request, no socket found");
+ error_dev(dev, "ending request, device not connected");
dnbd3_end_cmd(cmd, BLK_STS_IOERR);
ret = -EIO;
goto out;
@@ -218,22 +220,24 @@ static enum blk_eh_timer_return dnbd3_xmit_timeout(struct request *req,
{
struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req);
struct dnbd3_device *dev = cmd->dnbd3;
- warn_dev(dev, "received timeout");
+ warn_dev(dev, "request timed out");
if (!mutex_trylock(&cmd->lock)) {
return BLK_EH_RESET_TIMER;
}
- if (dnbd3_is_any_sock_alive(cmd)) {
+ if (dev->connected) {
info_dev(dev, "reset request to new socket");
dnbd3_requeue_cmd(cmd);
+ mutex_unlock(&cmd->lock);
return BLK_EH_DONE;
}
- dev_err_ratelimited(disk_to_dev(dev->disk), "connection timed out\n");
+ error_dev(dev, "connection timed out");
cmd->status = BLK_STS_IOERR;
// blk_mq_complete_request(req);
dnbd3_end_cmd(cmd, BLK_STS_TIMEOUT);
+ mutex_unlock(&cmd->lock);
return BLK_EH_DONE;
}