summaryrefslogtreecommitdiffstats
path: root/src/kernel/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/core.c')
-rw-r--r--src/kernel/core.c42
1 files changed, 24 insertions, 18 deletions
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);
- }
}
/**