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