summaryrefslogtreecommitdiffstats
path: root/src/kernel/core.c
diff options
context:
space:
mode:
authorFrederic Robra2019-08-13 15:13:04 +0200
committerFrederic Robra2019-08-13 15:13:04 +0200
commit3dcda423a8c3bfeacdb11cf164a717ce7ca78572 (patch)
tree1e87d6703df443352f80747c9fff77727f73641a /src/kernel/core.c
parentadded todos (diff)
downloaddnbd3-ng-3dcda423a8c3bfeacdb11cf164a717ce7ca78572.tar.gz
dnbd3-ng-3dcda423a8c3bfeacdb11cf164a717ce7ca78572.tar.xz
dnbd3-ng-3dcda423a8c3bfeacdb11cf164a717ce7ca78572.zip
changed strategy to connect to diffrent sockets
Diffstat (limited to 'src/kernel/core.c')
-rw-r--r--src/kernel/core.c61
1 files changed, 21 insertions, 40 deletions
diff --git a/src/kernel/core.c b/src/kernel/core.c
index 8bb23d9..6f0dab4 100644
--- a/src/kernel/core.c
+++ b/src/kernel/core.c
@@ -72,6 +72,8 @@ static void dnbd3_requeue_cmd(struct dnbd3_cmd *cmd)
if (!cmd->requed) {
cmd->requed = true;
blk_mq_requeue_request(req, true);
+ } else {
+ blk_mq_end_request(req, BLK_STS_IOERR);
}
}
@@ -84,47 +86,22 @@ 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 = NULL;
- bool first_try = true;
+ struct dnbd3_sock *sock = &dev->socks[index];
int ret = -1;
- int i;
- int sock_alive = 0;
- debug_dev(dev, "handle request at position %lu, size %d, index %d",
- blk_rq_pos(req), blk_rq_bytes(req), index);
+// debug_dev(dev, "handle request at position %lu, size %d, index %d",
+// blk_rq_pos(req), blk_rq_bytes(req), index);
-again:
- for (i = 0; i < NUMBER_CONNECTIONS; i++) {
- if (dnbd3_is_sock_alive(dev->socks[i])) {
- if (index == sock_alive) {
- sock = &dev->socks[i];
- }
- sock_alive++;
- }
- }
+ if (!(sock->server && sock->sock && !sock->panic)) {
+// warn_dev(dev, "attempted send on invalid socket %d", index);
+ msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000);
- if (!sock) { // TODO let the mq queues be the same number as NUMBER_CONNECTIONS than handle them
- warn_dev(dev, "index is %d but no socket was found", index);
- dev_err_ratelimited(disk_to_dev(dev->disk), "attempted send on invalid socket\n");
- if (sock_alive > 0) {
- blk_mq_update_nr_hw_queues(&dev->tag_set, sock_alive);
- dnbd3_requeue_cmd(cmd);
- ret = 0;
- goto out;
- }
- if (first_try) {
- debug_dev(dev, "no socket found, going to sleep");
- msleep(SOCKET_TIMEOUT_CLIENT_DATA * 1000);
- first_try = false;
- goto again;
- }
- error_dev(dev, "failed to find a socket, end request");
- blk_mq_end_request(req, BLK_STS_IOERR);
- return -EINVAL;
+ dnbd3_requeue_cmd(cmd);
+ ret = 0;
+ goto out;
}
-
cmd->status = BLK_STS_OK;
mutex_lock(&sock->tx_lock);
@@ -164,7 +141,7 @@ static blk_status_t dnbd3_queue_rq(struct blk_mq_hw_ctx *hctx,
int ret;
mutex_lock(&cmd->lock);
- cmd->requed = false;
+// cmd->requed = false;
ret = dnbd3_handle_cmd(cmd, hctx->queue_num);
if (ret < 0) {
@@ -290,7 +267,6 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
}
}
- mutex_lock(&dev->device_lock);
switch (cmd) {
case IOCTL_OPEN:
debug_dev(dev, "ioctl open");
@@ -301,13 +277,14 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
} else if (msg == NULL) {
result = -EINVAL;
} else {
+ mutex_lock(&dev->device_lock);
if (sizeof(msg->host) != sizeof(dev->initial_server.host)) {
warn_dev(dev, "odd size bug#1 triggered in ioctl");
}
memcpy(&dev->initial_server.host, &msg->host,
sizeof(msg->host));
dev->initial_server.failures = 0;
- dnbd3_set_rtt_unreachable(&dev->initial_server)
+ dnbd3_set_rtt_unknown(&dev->initial_server)
dev->imgname = imgname;
dev->rid = msg->rid;
dev->use_server_provided_alts =
@@ -320,6 +297,9 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
* NUMBER_SERVERS);
memcpy(dev->alt_servers, &dev->initial_server,
sizeof(dev->alt_servers[0]));
+
+ mutex_unlock(&dev->device_lock);
+
result = dnbd3_net_connect(dev);
imgname = NULL;
}
@@ -352,12 +332,14 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
} else if (msg == NULL) {
result = -EINVAL;
} else {
+ mutex_lock(&dev->device_lock);
memcpy(&dev->new_servers[dev->new_servers_num].host,
&msg->host, sizeof(msg->host));
/* 0 = ADD, 1 = REM */
dev->new_servers[dev->new_servers_num].failures =
(cmd == IOCTL_ADD_SRV ? 0 : 1);
- ++dev->new_servers_num;
+ dev->new_servers_num++;
+ mutex_unlock(&dev->device_lock);
result = 0;
}
break;
@@ -372,7 +354,6 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode,
result = -EIO;
break;
}
- mutex_unlock(&dev->device_lock);
error:
if (msg) kfree(msg);
if (imgname) kfree(imgname);
@@ -435,7 +416,7 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor)
dev->disk = disk;
dev->tag_set.ops = &dnbd3_mq_ops;
/* this can be changed later with blk_mq_update_nr_hw_queues() */
- dev->tag_set.nr_hw_queues = 1;
+ dev->tag_set.nr_hw_queues = NUMBER_CONNECTIONS;
dev->tag_set.queue_depth = 128;
dev->tag_set.numa_node = NUMA_NO_NODE;
dev->tag_set.cmd_size = sizeof(struct dnbd3_cmd);