From dc8fcb26807c734cf79d8a82d2ba655f226ad135 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Wed, 4 Sep 2019 15:10:03 +0200 Subject: prepared kernel module to have configurable number of connections --- src/kernel/core.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'src/kernel/core.c') diff --git a/src/kernel/core.c b/src/kernel/core.c index 6aa3b50..2f7ddcb 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -74,6 +74,7 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { int result = -EIO; + bool old_msg = false; struct dnbd3_device *dev = bdev->bd_disk->private_data; char *imgname = NULL; dnbd3_ioctl_t *msg = NULL; @@ -87,7 +88,12 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, return -ENOMEM; } result = copy_from_user((char *)msg, (char *)arg, 2); - if (result != 0 || msg->len != sizeof(*msg)) { + if (result != 0) { + result = -ENOEXEC; + goto error; + } else if (msg->len == 40){ /* old msg length was 40 */ + old_msg = true; + } else if (msg->len != sizeof(*msg)) { result = -ENOEXEC; goto error; } @@ -146,6 +152,11 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0])); + if (old_msg || msg->number_connections == 0) { + dev->number_connections = 4; + } else { + dev->number_connections = msg->number_connections; + } mutex_unlock(&dev->device_lock); result = dnbd3_net_connect(dev); @@ -209,8 +220,12 @@ static int dnbd3_ioctl(struct block_device *bdev, fmode_t mode, break; } error: - if (msg) kfree(msg); - if (imgname) kfree(imgname); + if (msg) { + kfree(msg); + } + if (imgname) { + kfree(imgname); + } return result; } @@ -240,19 +255,11 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor) struct gendisk *disk; struct request_queue *q; int err = -ENOMEM; - int i; debug("adding device %d", 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; - mutex_init(&dev->socks[i].tx_lock); - } - disk = alloc_disk(1); if (!disk) { error_dev(dev, "allocating disc failed"); @@ -265,14 +272,15 @@ int dnbd3_add_device(struct dnbd3_device *dev, int minor) err = -EEXIST; } - if (err < 0) + if (err < 0) { goto out_free_disk; + } dev->minor = 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 = NUMBER_CONNECTIONS; + dev->tag_set.nr_hw_queues = 1; dev->tag_set.queue_depth = 128; dev->tag_set.numa_node = NUMA_NO_NODE; dev->tag_set.cmd_size = sizeof(struct dnbd3_cmd); @@ -404,9 +412,10 @@ static void dnbd3_dev_remove(struct dnbd3_device *dev) { struct gendisk *disk = dev->disk; struct request_queue *q; - int i; - dnbd3_net_disconnect(dev); + if (dev->connected) { + dnbd3_net_disconnect(dev); + } if (disk) { q = disk->queue; @@ -421,9 +430,6 @@ static void dnbd3_dev_remove(struct dnbd3_device *dev) dev->imgname = NULL; } mutex_destroy(&dev->device_lock); - for (i = 0; i < NUMBER_CONNECTIONS; i++) { - mutex_destroy(&dev->socks[i].tx_lock); - } } /** -- cgit v1.2.3-55-g7522