summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorsr2012-09-01 18:08:27 +0200
committersr2012-09-01 18:08:27 +0200
commit3e992e066c6aeb3972758a2304cccbdba024c31e (patch)
treeb7d31b75002d5b6edd3c18b884eebf08346828ac /src/kernel
parent[SERVER] Added soft and hard timeouts for image deletion: reject any new clie... (diff)
downloaddnbd3-3e992e066c6aeb3972758a2304cccbdba024c31e.tar.gz
dnbd3-3e992e066c6aeb3972758a2304cccbdba024c31e.tar.xz
dnbd3-3e992e066c6aeb3972758a2304cccbdba024c31e.zip
[KERNEL] Tell server whether we're a client or a server in proxy mode
[KERNEL] SysFS: Return empty string for current_server if not connected [SERVER] Code refactoring
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/blk.c2
-rw-r--r--src/kernel/dnbd3.h2
-rw-r--r--src/kernel/net.c12
-rw-r--r--src/kernel/sysfs.c4
4 files changed, 12 insertions, 8 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 012471d..35252c4 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -147,7 +147,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
memcpy(&dev->initial_server, &dev->cur_server, sizeof(dev->initial_server));
dev->imgname = imgname;
dev->rid = msg->rid;
- dev->mode = msg->mode;
+ dev->is_server = msg->is_server;
blk_queue->backing_dev_info.ra_pages = (msg->read_ahead_kb * 1024) / PAGE_CACHE_SIZE;
if (dnbd3_net_connect(dev) == 0)
{
diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h
index 6d1bd17..00cc676 100644
--- a/src/kernel/dnbd3.h
+++ b/src/kernel/dnbd3.h
@@ -61,7 +61,7 @@ typedef struct
dnbd3_server_t alt_servers[NUMBER_SERVERS]; // array of alt servers
int new_servers_num; // number of new alt servers that are waiting to be copied to above array
dnbd3_server_entry_t new_servers[NUMBER_SERVERS]; // pending new alt servers
- uint8_t discover, panic, disconnecting, mode, update_available, panic_count;
+ uint8_t discover, panic, disconnecting, is_server, update_available, panic_count;
uint16_t rid, heartbeat_count;
uint64_t reported_size;
// server switch
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 475ae63..4b4da6f 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -134,7 +134,7 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
// 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->mode == DEVICE_MODE_CLIENT)
+ if (!dev->is_server)
{
req1 = kmalloc(sizeof(*req1), GFP_ATOMIC);
if (!req1)
@@ -181,6 +181,7 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
serializer_put_uint16(&dev->payload_buffer, PROTOCOL_VERSION);
serializer_put_string(&dev->payload_buffer, dev->imgname);
serializer_put_uint16(&dev->payload_buffer, dev->rid);
+ serializer_put_uint8(&dev->payload_buffer, dev->is_server);
iov[1].iov_base = &dev->payload_buffer;
iov[1].iov_len = serializer_get_written_length(&dev->payload_buffer);
if (kernel_sendmsg(dev->sock, &msg, iov, 2, sizeof(dnbd3_request) + iov[1].iov_len) != sizeof(dnbd3_request) + iov[1].iov_len)
@@ -407,7 +408,7 @@ int dnbd3_net_discover(void *data)
debug_dev("FATAL: Kmalloc failed (discover)");
return -1;
}
- payload = (serialized_buffer_t*)buf;
+ payload = (serialized_buffer_t*)buf; // Reuse this buffer to save kernel mem
dnbd3_request.magic = dnbd3_packet_magic;
@@ -497,6 +498,7 @@ int dnbd3_net_discover(void *data)
serializer_put_uint16(payload, PROTOCOL_VERSION);
serializer_put_string(payload, dev->imgname);
serializer_put_uint16(payload, dev->rid);
+ serializer_put_uint8(payload, 1); // Pretent we're a proxy here to prevent the server from updating the atime
iov[1].iov_base = payload;
dnbd3_request.size = iov[1].iov_len = serializer_get_written_length(payload);
if (kernel_sendmsg(sock, &msg, iov, 2, sizeof(dnbd3_request) + iov[1].iov_len) != sizeof(dnbd3_request) + iov[1].iov_len)
@@ -656,8 +658,8 @@ int dnbd3_net_discover(void *data)
continue;
}
- // take server with lowest rtt
- if (ready && best_server != current_server
+ // take server with lowest rtt (only if in client mode)
+ if (!dev->is_server && ready && best_server != current_server
&& RTT_THRESHOLD_FACTOR(dev->cur_rtt) > best_rtt)
{
printk("INFO: Server %d on %s is faster (%lluµs vs. %lluµs)\n", best_server, dev->disk->disk_name, (unsigned long long)best_rtt, (unsigned long long)dev->cur_rtt);
@@ -873,7 +875,7 @@ int dnbd3_net_receive(void *data)
continue;
case CMD_GET_SERVERS:
- if (dev->mode == DEVICE_MODE_PROXY || !is_same_server(&dev->cur_server, &dev->initial_server))
+ if (dev->is_server || !is_same_server(&dev->cur_server, &dev->initial_server))
{ // If not connected to initial server, or device is in proxy mode, ignore this message
remaining = dnbd3_reply.size;
goto clear_remaining_payload;
diff --git a/src/kernel/sysfs.c b/src/kernel/sysfs.c
index ff3b5f9..4c903ea 100644
--- a/src/kernel/sysfs.c
+++ b/src/kernel/sysfs.c
@@ -31,7 +31,9 @@ ssize_t show_cur_server_addr(char *buf, dnbd3_device_t *dev)
{
if (dev->cur_server.hostaddrtype == AF_INET)
return MIN(snprintf(buf, PAGE_SIZE, "%pI4,%d\n", dev->cur_server.hostaddr, (int)ntohs(dev->cur_server.port)), PAGE_SIZE);
- return MIN(snprintf(buf, PAGE_SIZE, "%pI6,%d\n", dev->cur_server.hostaddr, (int)ntohs(dev->cur_server.port)), PAGE_SIZE);
+ else if (dev->cur_server.hostaddrtype == AF_INET6)
+ return MIN(snprintf(buf, PAGE_SIZE, "%pI6,%d\n", dev->cur_server.hostaddr, (int)ntohs(dev->cur_server.port)), PAGE_SIZE);
+ return snprintf(buf, PAGE_SIZE, "");
}
ssize_t show_cur_server_rtt(char *buf, dnbd3_device_t *dev)