summaryrefslogtreecommitdiffstats
path: root/src/kernel/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/core.c')
-rw-r--r--src/kernel/core.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/kernel/core.c b/src/kernel/core.c
index 1347bcd..8f02900 100644
--- a/src/kernel/core.c
+++ b/src/kernel/core.c
@@ -168,7 +168,26 @@ static int dnbd3_init_request(struct blk_mq_tag_set *set, struct request *rq, un
}
static enum blk_eh_timer_return dnbd3_xmit_timeout(struct request *req, bool reserved)
{
- printk(KERN_DEBUG "dnbd3: dnbd3_xmit_timeout\n");
+ struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req);
+ struct dnbd3_device *dev = cmd->dnbd3;
+ int i;
+ printk(KERN_WARNING "dnbd3: received timeout\n");
+
+ if (!mutex_trylock(&cmd->lock)) {
+ return BLK_EH_RESET_TIMER;
+ }
+
+ for (i = 0; i < NUMBER_CONNECTIONS; i++) {
+ if (dev->socks[i].sock && dev->socks[i].server) {
+ printk(KERN_INFO "dnbd3: reset request\n");
+ dnbd3_requeue_cmd(cmd);
+ return BLK_EH_DONE;
+ }
+ }
+
+ dev_err_ratelimited(disk_to_dev(dev->disk), "connection timed out\n");
+ cmd->status = BLK_STS_IOERR;
+ blk_mq_complete_request(req);
return BLK_EH_DONE;
}