From 3e8cd5b2284fd68206cd7ea9943e892fcce037f8 Mon Sep 17 00:00:00 2001 From: sr Date: Sun, 9 Sep 2012 23:01:00 +0200 Subject: [SERVER] Automatically connect a dnbd3 device for a relayed image [SERVER] Automatically disconnect dnbd3 device if local cache copy is complete [SERVER] Pre-allocate disk space for cache file [KERNEL] Refuse connection if server reports disk size < 4096 bytes --- src/kernel/net.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/kernel/net.c') diff --git a/src/kernel/net.c b/src/kernel/net.c index 67a4b17..d6ebb32 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -231,6 +231,8 @@ int dnbd3_net_connect(dnbd3_device_t *dev) error_dev_va("FATAL: Server provides rid %d, requested was %d.", (int)rid, (int)dev->rid); dev->rid = rid; dev->reported_size = serializer_get_uint64(&dev->payload_buffer); + if (dev->reported_size < 4096) + error_dev("ERROR: Reported size by server is < 4096"); // store image information set_capacity(dev->disk, dev->reported_size >> 9); /* 512 Byte blocks */ debug_dev_va("INFO: Filesize: %llu.", dev->reported_size); @@ -442,6 +444,9 @@ int dnbd3_net_discover(void *data) continue; dev->discover = 0; + if (dev->reported_size < 4096) + continue; + // Check if the list of alt servers needs to be updated and do so if neccessary if (dev->new_servers_num) { @@ -457,6 +462,7 @@ int dnbd3_net_discover(void *data) { // REMOVE request alt_server->host.type = 0; + debug_dev_va("Removing alt server %pI4", alt_server->host.addr); continue; } // ADD, so just reset fail counter @@ -469,9 +475,8 @@ int dnbd3_net_discover(void *data) if (alt_server == NULL) // All NUMBER_SERVERS slots are taken, ignore entry continue; // Add new server entry - memcpy(alt_server->host.addr, dev->new_servers[i].host.addr, 16); - alt_server->host.type = dev->new_servers[i].host.type; - alt_server->host.port = dev->new_servers[i].host.port; + alt_server->host = dev->new_servers[i].host; + debug_dev_va("Adding alt server %pI4", alt_server->host.addr); alt_server->rtts[0] = alt_server->rtts[1] = alt_server->rtts[2] = alt_server->rtts[3] = RTT_UNREACHABLE; @@ -576,7 +581,11 @@ int dnbd3_net_discover(void *data) // Request block dnbd3_request.cmd = CMD_GET_BLOCK; // Pick random block - if (sizeof(size_t) >= 8) + if (dev->reported_size == 0) + { + dnbd3_request.offset = 0; + } + else if (sizeof(size_t) >= 8) { dnbd3_request.offset = ((((start.tv_usec << 12) ^ start.tv_usec) << 4) % dev->reported_size) & ~(uint64_t)(RTT_BLOCK_SIZE-1); //printk("Random offset 64bit: %lluMiB\n", (unsigned long long)(dnbd3_request.offset >> 20)); -- cgit v1.2.3-55-g7522