From 3937c3b43161e130bf867183f4e36ac9786fab35 Mon Sep 17 00:00:00 2001 From: sr Date: Thu, 6 Sep 2012 20:53:14 +0200 Subject: [SERVER] Automatically assign and connect a dnbd3 device to a relayed image --- src/kernel/blk.c | 14 +++++++++++--- src/kernel/net.c | 7 ++----- 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'src/kernel') 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) { -- cgit v1.2.3-55-g7522