summaryrefslogtreecommitdiffstats
path: root/src/kernel/core.c
diff options
context:
space:
mode:
authorFrederic Robra2019-08-23 12:09:03 +0200
committerFrederic Robra2019-08-23 12:09:03 +0200
commitf6c99126c9df1cae6a8d9b51998760a5896f4e9d (patch)
tree7cb2032c6e2960eed328dcff9903ae41886a18c8 /src/kernel/core.c
parentchanged strategy to connect to diffrent sockets (diff)
downloaddnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.tar.gz
dnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.tar.xz
dnbd3-ng-f6c99126c9df1cae6a8d9b51998760a5896f4e9d.zip
moved mq part to new file
fixed various bugs
Diffstat (limited to 'src/kernel/core.c')
-rw-r--r--src/kernel/core.c163
1 files changed, 9 insertions, 154 deletions
diff --git a/src/kernel/core.c b/src/kernel/core.c
index 6f0dab4..19f4bac 100644
--- a/src/kernel/core.c
+++ b/src/kernel/core.c
@@ -51,6 +51,7 @@
#include "sysfs.h"
#include "clientconfig.h"
#include "net.h"
+#include "mq.h"
@@ -63,159 +64,6 @@ static struct dnbd3_device *device;
int major;
/**
- * dnbd3_requeue_cmd - requeue a command once
- * @cmd: the command to requeue
- */
-static void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd)
-{
- struct request *req = blk_mq_rq_from_pdu(cmd);
- if (!cmd->requed) {
- cmd->requed = true;
- blk_mq_requeue_request(req, true);
- } else {
- blk_mq_end_request(req, BLK_STS_IOERR);
- }
-}
-
-/**
- * dnbd3_handle_cmd - handles a mq command
- * @cmd: the cmd to send
- * @index: the index of the queue
- */
-static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index)
-{
- struct request *req = blk_mq_rq_from_pdu(cmd);
- struct dnbd3_device *dev = cmd->dnbd3;
- struct dnbd3_sock *sock = &dev->socks[index];
- int ret = -1;
-
-// debug_dev(dev, "handle request at position %lu, size %d, index %d",
-// blk_rq_pos(req), blk_rq_bytes(req), index);
-
-
- if (!(sock->server && sock->sock && !sock->panic)) {
-// warn_dev(dev, "attempted send on invalid socket %d", index);
- msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000);
-
- dnbd3_requeue_cmd(cmd);
- ret = 0;
- goto out;
- }
-
- cmd->status = BLK_STS_OK;
-
- mutex_lock(&sock->tx_lock);
- if (unlikely(!sock->sock)) {
- mutex_unlock(&sock->tx_lock);
- warn_sock(sock, "not connected");
- return -EIO;
- }
-
- blk_mq_start_request(req);
- if (unlikely(sock->pending && sock->pending != req)) {
- dnbd3_requeue_cmd(cmd);
- ret = 0;
- goto out;
- }
-
- ret = dnbd3_send_request(sock, blk_mq_rq_from_pdu(cmd), cmd);
- if (ret == -EAGAIN) {
- dev_err_ratelimited(disk_to_dev(dev->disk), "request send failed, requeueing\n");
- dnbd3_requeue_cmd(cmd);
- ret = 0;
- }
-out:
- mutex_unlock(&sock->tx_lock);
- return ret;
-}
-
-/**
- * dnbd3_queue_rq - queue request
- * @hctx: state for a hardware queue facing the hardware block device
- * @bd: the queue data including the request
- */
-static blk_status_t dnbd3_queue_rq(struct blk_mq_hw_ctx *hctx,
- const struct blk_mq_queue_data *bd)
-{
- struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(bd->rq);
- int ret;
-
- mutex_lock(&cmd->lock);
-// cmd->requed = false;
-
- ret = dnbd3_handle_cmd(cmd, hctx->queue_num);
- if (ret < 0) {
- ret = BLK_STS_IOERR;
- } else if (ret >= 0) {
- ret = BLK_STS_OK;
- }
- mutex_unlock(&cmd->lock);
-
- return ret;
-}
-
-/**
- * dnbd3_init_request - init a mq request
- * @set: the mq tag set
- * @rq: the request
- * @hctx_idx:
- * @numa_node:
- */
-static int dnbd3_init_request(struct blk_mq_tag_set *set, struct request *rq,
- unsigned int hctx_idx, unsigned int numa_node)
-{
- struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(rq);
- cmd->dnbd3 = set->driver_data;
- cmd->requed = false;
- mutex_init(&cmd->lock);
- return 0;
-}
-
-/**
- * dnbd3_xmit_timeout - timeout function for mq
- * @req: the timedout request
- * @reserved:
- */
-static enum blk_eh_timer_return dnbd3_xmit_timeout(struct request *req,
- bool reserved)
-{
- struct dnbd3_cmd *cmd = blk_mq_rq_to_pdu(req);
- struct dnbd3_device *dev = cmd->dnbd3;
- int i;
- warn_dev(dev, "received timeout");
-
- if (!mutex_trylock(&cmd->lock)) {
- return BLK_EH_RESET_TIMER;
- }
-
- for (i = 0; i < NUMBER_CONNECTIONS; i++) {
- if (dnbd3_is_sock_alive(dev->socks[i])) {
- info_sock(&dev->socks[i], "reset request to new socket");
- 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);
- blk_mq_end_request(req, BLK_STS_TIMEOUT);
- return BLK_EH_DONE;
-}
-
-/**
- * struct blk_mq_ops - dnbd3_mq_ops
- * multiqueue operations
- */
-static struct blk_mq_ops dnbd3_mq_ops = {
- .queue_rq = dnbd3_queue_rq,
- .init_request = dnbd3_init_request,
- .timeout = dnbd3_xmit_timeout,
-};
-
-
-
-/**
* dnbd3_ioctl - the ioctl function of the dnbd3 kernel modul
* @bdev: the block device
* @mode:
@@ -301,6 +149,12 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
mutex_unlock(&dev->device_lock);
result = dnbd3_net_connect(dev);
+ if (result) {
+ if (dev->imgname) {
+ kfree(dev->imgname);
+ dev->imgname = NULL;
+ }
+ }
imgname = NULL;
}
break;
@@ -392,6 +246,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor)
mutex_init(&dev->device_lock);
mutex_lock(&dev->device_lock);
+// atomic_set(&dev->mq_requests, 0);
for (i = 0; i < NUMBER_CONNECTIONS; i++) {
dev->socks[i].device = dev;
dev->socks[i].sock_nr = i;
@@ -421,7 +276,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor)
dev->tag_set.numa_node = NUMA_NO_NODE;
dev->tag_set.cmd_size = sizeof(struct dnbd3_cmd);
dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE |
- BLK_MQ_F_SG_MERGE | BLK_MQ_F_BLOCKING;
+ BLK_MQ_F_SG_MERGE; // | BLK_MQ_F_BLOCKING;
dev->tag_set.driver_data = dev;
err = blk_mq_alloc_tag_set(&dev->tag_set);