summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorsr2012-09-06 20:53:14 +0200
committersr2012-09-06 20:53:14 +0200
commit3937c3b43161e130bf867183f4e36ac9786fab35 (patch)
tree61d475fd537ebda0c08848877741cf437040f2a7 /src/kernel
parent... (diff)
downloaddnbd3-3937c3b43161e130bf867183f4e36ac9786fab35.tar.gz
dnbd3-3937c3b43161e130bf867183f4e36ac9786fab35.tar.xz
dnbd3-3937c3b43161e130bf867183f4e36ac9786fab35.zip
[SERVER] Automatically assign and connect a dnbd3 device to a relayed image
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/blk.c14
-rw-r--r--src/kernel/net.c7
2 files changed, 13 insertions, 8 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 4282295..388f8b6 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -148,6 +148,9 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
dev->imgname = imgname;
dev->rid = msg->rid;
dev->is_server = msg->is_server;
+ // Forget all alt servers on explicit connect, set first al server to initial server
+ memset(dev->alt_servers, 0, sizeof(dev->alt_servers[0])*NUMBER_SERVERS);
+ memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0]));
blk_queue->backing_dev_info.ra_pages = (msg->read_ahead_kb * 1024) / PAGE_CACHE_SIZE;
if (dnbd3_net_connect(dev) == 0)
{
@@ -175,9 +178,14 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
break;
case IOCTL_SWITCH:
- dnbd3_net_disconnect(dev);
- memcpy(&dev->cur_server.host, &msg->host, sizeof(msg->host));
- result = dnbd3_net_connect(dev);
+ if (memcmp(&dev->cur_server.host, &msg->host, sizeof(msg->host)))
+ {
+ dnbd3_net_disconnect(dev);
+ dev->cur_server.host = msg->host;
+ result = dnbd3_net_connect(dev);
+ }
+ else
+ result = 0;
break;
case IOCTL_ADD_SRV:
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 323c59c..67a4b17 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -131,15 +131,12 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
// do some checks before connecting
- if (is_same_server(&dev->cur_server, &dev->initial_server))
+ if (!dev->is_server && is_same_server(&dev->cur_server, &dev->initial_server))
{
// Forget all known alt servers
memset(dev->alt_servers, 0, sizeof(dev->alt_servers[0])*NUMBER_SERVERS);
memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0]));
- if (!dev->is_server)
- {
- get_servers = 1;
- }
+ get_servers = 1;
}
if (dev->better_sock)
{