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