diff options
Diffstat (limited to 'src/kernel/mq.c')
-rw-r--r-- | src/kernel/mq.c | 20 |
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; } |