From 3e992e066c6aeb3972758a2304cccbdba024c31e Mon Sep 17 00:00:00 2001 From: sr Date: Sat, 1 Sep 2012 18:08:27 +0200 Subject: [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 --- src/kernel/blk.c | 2 +- src/kernel/dnbd3.h | 2 +- src/kernel/net.c | 12 +++++++----- src/kernel/sysfs.c | 4 +++- 4 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src/kernel') 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) -- cgit v1.2.3-55-g7522