summaryrefslogtreecommitdiffstats
path: root/src/kernel/mq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/mq.c')
-rw-r--r--src/kernel/mq.c75
1 files changed, 27 insertions, 48 deletions
diff --git a/src/kernel/mq.c b/src/kernel/mq.c
index 3b0bde5..98e6e14 100644
--- a/src/kernel/mq.c
+++ b/src/kernel/mq.c
@@ -11,27 +11,11 @@
#include "block.h"
#define DNBD3_CMD_REQUEUED 1
-//
-//static void dnbd3_config_put(struct dnbd3_device_t *dev)
-//{
-// if (refcount_dec_and_mutex_lock(&dev->config_refs,
-// &dev->config_lock)) {
-//
-// dev->tag_set.timeout = 0;
-// dev->disk->queue->limits.discard_granularity = 0;
-// dev->disk->queue->limits.discard_alignment = 0;
-// blk_queue_max_discard_sectors(dev->disk->queue, UINT_MAX);
-// blk_queue_flag_clear(QUEUE_FLAG_DISCARD, dev->disk->queue);
-//
-// mutex_unlock(&dev->config_lock);
-// nbd_put(dev);
-// module_put(THIS_MODULE);
-// }
-//}
+
#define dnbd3_priv_to_cmd(req) ((req)->cmd_flags >> REQ_FLAG_BITS)
-static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int index)
+static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_sock *sock, struct dnbd3_cmd *cmd, int index)
{
struct request *req = blk_mq_rq_from_pdu(cmd);
dnbd3_request_t dnbd3_request;
@@ -44,7 +28,7 @@ static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int
sigset_t blocked, oldset;
void *kaddr;
int result;
- dev->pending = req;
+ sock->pending = req;
init_msghdr(msg);
dnbd3_request.magic = dnbd3_packet_magic;
@@ -79,7 +63,7 @@ static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int
fixup_request(dnbd3_request);
iov.iov_base = &dnbd3_request;
iov.iov_len = sizeof(dnbd3_request);
- if (kernel_sendmsg(dev->sock, &msg, &iov, 1, sizeof(dnbd3_request)) != sizeof(dnbd3_request)) {
+ if (kernel_sendmsg(sock->sock, &msg, &iov, 1, sizeof(dnbd3_request)) != sizeof(dnbd3_request)) {
printk(KERN_ERR "dnbd3: connection to server lost\n");
result = -EIO;
goto error;
@@ -88,7 +72,7 @@ static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int
// receive net reply
iov.iov_base = &dnbd3_reply;
iov.iov_len = sizeof(dnbd3_reply);
- result = kernel_recvmsg(dev->sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags);
+ result = kernel_recvmsg(sock->sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags);
if (!result) {
printk(KERN_ERR "dnbd3: connection to server lost\n");
result = -EIO;
@@ -119,7 +103,7 @@ static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int
kaddr = kmap(bvec->bv_page) + bvec->bv_offset;
iov.iov_base = kaddr;
iov.iov_len = bvec->bv_len;
- if (kernel_recvmsg(dev->sock, &msg, &iov, 1, bvec->bv_len, msg.msg_flags) != bvec->bv_len) {
+ if (kernel_recvmsg(sock->sock, &msg, &iov, 1, bvec->bv_len, msg.msg_flags) != bvec->bv_len) {
kunmap(bvec->bv_page);
sigprocmask(SIG_SETMASK, &oldset, NULL );
printk(KERN_ERR "dnbd3: could not receive form net to block layer\n");
@@ -129,10 +113,8 @@ static int dnbd3_send_cmd(struct dnbd3_device_t *dev, struct dnbd3_cmd *cmd, int
sigprocmask(SIG_SETMASK, &oldset, NULL );
}
-//
-// __blk_end_request_all(req, 0);
blk_mq_end_request(req, 0);
- dev->pending = NULL;
+ sock->pending = NULL;
error:
return result;
}
@@ -150,57 +132,54 @@ static int dnbd3_handle_cmd(struct dnbd3_cmd *cmd, int index)
{
struct request *req = blk_mq_rq_from_pdu(cmd);
struct dnbd3_device_t *dev = cmd->dnbd3;
+ struct dnbd3_sock *sock;
int ret = -1;
printk(KERN_DEBUG "dnbd3: handle request at position %lu and size %d, device %i\n", blk_rq_pos(req), blk_rq_bytes(req), dev->minor);
- if (!refcount_inc_not_zero(&dev->config_refs)) {
- dev_err_ratelimited(disk_to_dev(dev->disk), "socks array is empty\n");
- blk_mq_start_request(req);
- return -EINVAL;
- }
+// if (index >= 1) { // TODO use next server with good rtt for this request
+// printk(KERN_INFO "dnbd3: index is %d", index);
+// dev_err_ratelimited(disk_to_dev(dev->disk), "attempted send on invalid socket\n");
+// blk_mq_start_request(req);
+// return -EINVAL;
+// }
- if (index >= 1) { // TODO use next server with good rtt for this request
- printk(KERN_INFO "dnbd3: index is %d", index);
+ sock = &dev->socks[index];
+ if (!sock->sock) {
+ printk(KERN_INFO "dnbd3: index is %d but no socket was found\n", index);
dev_err_ratelimited(disk_to_dev(dev->disk), "attempted send on invalid socket\n");
-// nbd_config_put(nbd);
-// TODO what to do here?
blk_mq_start_request(req);
return -EINVAL;
}
+
+
cmd->status = BLK_STS_OK;
again:
- mutex_lock(&dev->socket_lock);
- if (!dev->sock) {
- mutex_unlock(&dev->socket_lock);
- printk(KERN_DEBUG "dnbd3: not connected, try to reconnect\n");
- if (!dnbd3_net_connect(dev)) {
- printk(KERN_ERR "dnbd3: failed to reconnect\n");
- blk_mq_start_request(req);
- return -EIO;
- }
- goto again;
+ mutex_lock(&sock->lock);
+ if (unlikely(!sock->sock)) {
+ mutex_unlock(&sock->lock);
+ printk(KERN_DEBUG "dnbd3: not connected\n");
+ return -EIO;
}
blk_mq_start_request(req);
- if (unlikely(dev->pending && dev->pending != req)) {
+ if (unlikely(sock->pending && sock->pending != req)) {
dnbd3_requeue_cmd(cmd);
ret = 0;
goto out;
}
- ret = dnbd3_send_cmd(dev, cmd, index);
+ ret = dnbd3_send_cmd(dev, sock, cmd, index);
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(&dev->socket_lock);
-// nbd_config_put(nbd);
+ mutex_unlock(&sock->lock);
return ret;
}