summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorsr2012-09-03 21:00:26 +0200
committersr2012-09-03 21:00:26 +0200
commit60b2ba6ef9ed779d750958b6422f05c93a4a2d91 (patch)
tree46fdacf6a9439947e91af4c3d9de3006d41e5380 /src/kernel
parent[*] Fixed and unified formatting (diff)
downloaddnbd3-60b2ba6ef9ed779d750958b6422f05c93a4a2d91.tar.gz
dnbd3-60b2ba6ef9ed779d750958b6422f05c93a4a2d91.tar.xz
dnbd3-60b2ba6ef9ed779d750958b6422f05c93a4a2d91.zip
[SERVER] Check which dnbd3 devices are idle and ready to use for proxy mode
[SERVER] Skeleton of server-to-server communication [SERVER] Update access-time of images in use by actual clients [*] Add dnbd3_host_t type to handle address+port+addrtype consistently across the project
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/blk.c14
-rw-r--r--src/kernel/dnbd3.h4
-rw-r--r--src/kernel/net.c78
-rw-r--r--src/kernel/sysfs.c22
4 files changed, 56 insertions, 62 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index bc138c3..4282295 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -140,9 +140,9 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
}
else
{
- memcpy(dev->cur_server.hostaddr, msg->addr, 16);
- dev->cur_server.port = msg->port;
- dev->cur_server.hostaddrtype = msg->addrtype;
+ if (sizeof(msg->host) != sizeof(dev->cur_server.host))
+ printk("Odd size bug#1 triggered in IOCTL\n");
+ memcpy(&dev->cur_server.host, &msg->host, sizeof(msg->host));
dev->cur_server.failures = 0;
memcpy(&dev->initial_server, &dev->cur_server, sizeof(dev->initial_server));
dev->imgname = imgname;
@@ -176,9 +176,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
case IOCTL_SWITCH:
dnbd3_net_disconnect(dev);
- memcpy(dev->cur_server.hostaddr, msg->addr, 16);
- dev->cur_server.port = msg->port;
- dev->cur_server.hostaddrtype = msg->addrtype;
+ memcpy(&dev->cur_server.host, &msg->host, sizeof(msg->host));
result = dnbd3_net_connect(dev);
break;
@@ -195,9 +193,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
result = -EAGAIN;
else
{
- memcpy(dev->new_servers[dev->new_servers_num].hostaddr, msg->addr, 16);
- dev->new_servers[dev->new_servers_num].port = msg->port;
- dev->new_servers[dev->new_servers_num].hostaddrtype = msg->addrtype;
+ memcpy(&dev->new_servers[dev->new_servers_num].host, &msg->host, sizeof(msg->host));
dev->new_servers[dev->new_servers_num].failures = (cmd == IOCTL_ADD_SRV ? 0 : 1); // 0 = ADD, 1 = REM
++dev->new_servers_num;
result = 0;
diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h
index fb83575..e7911cf 100644
--- a/src/kernel/dnbd3.h
+++ b/src/kernel/dnbd3.h
@@ -35,11 +35,9 @@ extern int major;
typedef struct
{
+ dnbd3_host_t host;
unsigned long rtts[4]; // Last four round trip time measurements in µs
- uint16_t port; // Port in network representation
uint16_t protocol_version; // dnbd3 protocol version of this server
- uint8_t hostaddr[16]; // Address in network representation (IPv4 or IPv6)
- uint8_t hostaddrtype; // Address type (AF_INET or AF_INET6)
uint8_t failures; // How many times the server was unreachable
} dnbd3_server_t;
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 2cd3cac..f437464 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -36,34 +36,34 @@
*/
#if 1 // Change to 0 to disable debug messages
#define debug_print_va_host(_host, _fmt, ...) do { \
- if (dev->cur_server.hostaddrtype == AF_INET) \
- printk("%s:%d " _fmt " (%s, %pI4:%d)\n", __FILE__, __LINE__, __VA_ARGS__, dev->disk->disk_name, (_host).hostaddr, (int)ntohs((_host).port)); \
+ if ((_host).type == AF_INET) \
+ printk("%s:%d " _fmt " (%s, %pI4:%d)\n", __FILE__, __LINE__, __VA_ARGS__, dev->disk->disk_name, (_host).addr, (int)ntohs((_host).port)); \
else \
- printk("%s:%d " _fmt " (%s, [%pI6]:%d)\n", __FILE__, __LINE__, __VA_ARGS__, dev->disk->disk_name, (_host).hostaddr, (int)ntohs((_host).port)); \
+ printk("%s:%d " _fmt " (%s, [%pI6]:%d)\n", __FILE__, __LINE__, __VA_ARGS__, dev->disk->disk_name, (_host).addr, (int)ntohs((_host).port)); \
} while(0)
#define debug_error_va_host(_host, _fmt, ...) do { \
debug_print_va_host(_host, _fmt, __VA_ARGS__); \
goto error; \
} while(0)
-#define debug_dev_va(_fmt, ...) debug_print_va_host(dev->cur_server, _fmt, __VA_ARGS__)
-#define error_dev_va(_fmt, ...) debug_error_va_host(dev->cur_server, _fmt, __VA_ARGS__)
-#define debug_alt_va(_fmt, ...) debug_print_va_host(dev->alt_servers[i], _fmt, __VA_ARGS__)
-#define error_alt_va(_fmt, ...) debug_error_va_host(dev->alt_servers[i], _fmt, __VA_ARGS__)
+#define debug_dev_va(_fmt, ...) debug_print_va_host(dev->cur_server.host, _fmt, __VA_ARGS__)
+#define error_dev_va(_fmt, ...) debug_error_va_host(dev->cur_server.host, _fmt, __VA_ARGS__)
+#define debug_alt_va(_fmt, ...) debug_print_va_host(dev->alt_servers[i].host, _fmt, __VA_ARGS__)
+#define error_alt_va(_fmt, ...) debug_error_va_host(dev->alt_servers[i].host, _fmt, __VA_ARGS__)
#define debug_print_host(_host, txt) do { \
- if (dev->cur_server.hostaddrtype == AF_INET) \
- printk("%s:%d " txt " (%s, %pI4:%d)\n", __FILE__, __LINE__, dev->disk->disk_name, (_host).hostaddr, (int)ntohs((_host).port)); \
+ if ((_host).type == AF_INET) \
+ printk("%s:%d " txt " (%s, %pI4:%d)\n", __FILE__, __LINE__, dev->disk->disk_name, (_host).addr, (int)ntohs((_host).port)); \
else \
- printk("%s:%d " txt " (%s, [%pI6]:%d)\n", __FILE__, __LINE__, dev->disk->disk_name, (_host).hostaddr, (int)ntohs((_host).port)); \
+ printk("%s:%d " txt " (%s, [%pI6]:%d)\n", __FILE__, __LINE__, dev->disk->disk_name, (_host).addr, (int)ntohs((_host).port)); \
} while(0)
#define debug_error_host(_host, txt) do { \
debug_print_host(_host, txt); \
goto error; \
} while(0)
-#define debug_dev(txt) debug_print_host(dev->cur_server, txt)
-#define error_dev(txt) debug_error_host(dev->cur_server, txt)
-#define debug_alt(txt) debug_print_host(dev->alt_servers[i], txt)
-#define error_alt(txt) debug_error_host(dev->alt_servers[i], txt)
+#define debug_dev(txt) debug_print_host(dev->cur_server.host, txt)
+#define error_dev(txt) debug_error_host(dev->cur_server.host, txt)
+#define debug_alt(txt) debug_print_host(dev->alt_servers[i].host, txt)
+#define error_alt(txt) debug_error_host(dev->alt_servers[i].host, txt)
#else // Silent
@@ -79,9 +79,9 @@
static inline int is_same_server(const dnbd3_server_t *const a, const dnbd3_server_t *const b)
{
- return (a->hostaddrtype == b->hostaddrtype)
- && (a->port == b->port)
- && (0 == memcmp(a->hostaddr, b->hostaddr, (a->hostaddrtype == AF_INET ? 4 : 16)));
+ return (a->host.type == b->host.type)
+ && (a->host.port == b->host.port)
+ && (0 == memcmp(a->host.addr, b->host.addr, (a->host.type == AF_INET ? 4 : 16)));
}
static inline dnbd3_server_t *get_existing_server(const dnbd3_server_entry_t *const newserver, dnbd3_device_t *const dev)
@@ -89,9 +89,9 @@ static inline dnbd3_server_t *get_existing_server(const dnbd3_server_entry_t *co
int i;
for (i = 0; i < NUMBER_SERVERS; ++i)
{
- if ((newserver->hostaddrtype == dev->alt_servers[i].hostaddrtype)
- && (newserver->port == dev->alt_servers[i].port)
- && (0 == memcmp(newserver->hostaddr, dev->alt_servers[i].hostaddr, (newserver->hostaddrtype == AF_INET ? 4 : 16))))
+ if ((newserver->host.type == dev->alt_servers[i].host.type)
+ && (newserver->host.port == dev->alt_servers[i].host.port)
+ && (0 == memcmp(newserver->host.addr, dev->alt_servers[i].host.addr, (newserver->host.type == AF_INET ? 4 : 16))))
{
return &dev->alt_servers[i];
break;
@@ -105,7 +105,7 @@ static inline dnbd3_server_t *get_free_alt_server(dnbd3_device_t *const dev)
int i;
for (i = 0; i < NUMBER_SERVERS; ++i)
{
- if (dev->alt_servers[i].hostaddrtype == 0)
+ if (dev->alt_servers[i].host.type == 0)
return &dev->alt_servers[i];
}
for (i = 0; i < NUMBER_SERVERS; ++i)
@@ -153,12 +153,12 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
error_dev("FATAL: Kmalloc(1) failed.");
}
- if (dev->cur_server.port == 0 || dev->cur_server.hostaddrtype == 0 || dev->imgname == NULL)
+ if (dev->cur_server.host.port == 0 || dev->cur_server.host.type == 0 || dev->imgname == NULL)
error_dev("FATAL: Host, port or image name not set.");
if (dev->sock)
error_dev("ERROR: Already connected.");
- if (dev->cur_server.hostaddrtype != AF_INET)
+ if (dev->cur_server.host.type != AF_INET)
error_dev("ERROR: IPv6 not implemented.");
else
debug_dev("INFO: Connecting...");
@@ -180,8 +180,8 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
kernel_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout));
dev->sock->sk->sk_allocation = GFP_NOIO;
sin.sin_family = AF_INET;
- memcpy(&(sin.sin_addr.s_addr), dev->cur_server.hostaddr, 4);
- sin.sin_port = dev->cur_server.port;
+ memcpy(&(sin.sin_addr.s_addr), dev->cur_server.host.addr, 4);
+ sin.sin_port = dev->cur_server.host.port;
if (kernel_connect(dev->sock, (struct sockaddr *) &sin, sizeof(sin), 0) != 0)
error_dev("FATAL: Connection to host failed.");
// Request filesize
@@ -291,8 +291,8 @@ error:
sock_release(dev->sock);
dev->sock = NULL;
}
- dev->cur_server.hostaddrtype = 0;
- dev->cur_server.port = 0;
+ dev->cur_server.host.type = 0;
+ dev->cur_server.host.port = 0;
if (req1) kfree(req1);
return -1;
}
@@ -337,8 +337,8 @@ int dnbd3_net_disconnect(dnbd3_device_t *dev)
sock_release(dev->sock);
dev->sock = NULL;
}
- dev->cur_server.hostaddrtype = 0;
- dev->cur_server.port = 0;
+ dev->cur_server.host.type = 0;
+ dev->cur_server.host.port = 0;
dev->disconnecting = 0;
@@ -451,7 +451,7 @@ int dnbd3_net_discover(void *data)
spin_lock_irqsave(&dev->blk_lock, irqflags);
for (i = 0; i < dev->new_servers_num; ++i)
{
- if (dev->new_servers[i].hostaddrtype != AF_INET) // Invalid entry.. (Add IPv6)
+ if (dev->new_servers[i].host.type != AF_INET) // Invalid entry.. (Add IPv6)
continue;
alt_server = get_existing_server(&dev->new_servers[i], dev);
if (alt_server != NULL) // Server already known
@@ -459,7 +459,7 @@ int dnbd3_net_discover(void *data)
if (dev->new_servers[i].failures == 1)
{
// REMOVE request
- alt_server->hostaddrtype = 0;
+ alt_server->host.type = 0;
continue;
}
// ADD, so just reset fail counter
@@ -472,9 +472,9 @@ 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->hostaddr, dev->new_servers[i].hostaddr, 16);
- alt_server->hostaddrtype = dev->new_servers[i].hostaddrtype;
- alt_server->port = dev->new_servers[i].port;
+ 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->rtts[0] = alt_server->rtts[1]
= alt_server->rtts[2] = alt_server->rtts[3]
= RTT_UNREACHABLE;
@@ -490,7 +490,7 @@ int dnbd3_net_discover(void *data)
for (i=0; i < NUMBER_SERVERS; ++i)
{
- if (dev->alt_servers[i].hostaddrtype == 0) // Empty slot
+ if (dev->alt_servers[i].host.type == 0) // Empty slot
continue;
if (!dev->panic && dev->alt_servers[i].failures > 50) // If not in panic mode, skip server if it failed too many times
continue;
@@ -506,8 +506,8 @@ int dnbd3_net_discover(void *data)
kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout));
sock->sk->sk_allocation = GFP_NOIO;
sin.sin_family = AF_INET; // add IPv6.....
- memcpy(&sin.sin_addr.s_addr, dev->alt_servers[i].hostaddr, 4);
- sin.sin_port = dev->alt_servers[i].port;
+ memcpy(&sin.sin_addr.s_addr, dev->alt_servers[i].host.addr, 4);
+ sin.sin_port = dev->alt_servers[i].host.port;
if (kernel_connect(sock, (struct sockaddr *) &sin, sizeof(sin), 0) < 0)
goto error;
@@ -565,7 +565,7 @@ int dnbd3_net_discover(void *data)
// panic mode, take first responding server
if (dev->panic)
{
- printk("WARN: Panic mode (%s), taking server %pI4 : %d\n", dev->disk->disk_name, dev->alt_servers[i].hostaddr, (int)ntohs(dev->alt_servers[i].port));
+ debug_alt("WARN: Panic mode, changing server:");
if (best_sock != NULL) sock_release(best_sock);
dev->better_sock = sock; // Pass over socket to take a shortcut in *_connect();
kfree(buf);
@@ -796,7 +796,7 @@ int dnbd3_net_send(void *data)
return 0;
error:
- printk("ERROR: Connection to server %pI4 : %d lost (send)\n", dev->cur_server.hostaddr, (int)ntohs(dev->cur_server.port));
+ debug_dev("ERROR: Connection to server lost (send)");
if (dev->sock)
kernel_sock_shutdown(dev->sock, SHUT_RDWR);
dev->thread_send = NULL;
diff --git a/src/kernel/sysfs.c b/src/kernel/sysfs.c
index 596e745..d219c86 100644
--- a/src/kernel/sysfs.c
+++ b/src/kernel/sysfs.c
@@ -29,10 +29,10 @@
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);
- 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);
+ if (dev->cur_server.host.type == AF_INET)
+ return MIN(snprintf(buf, PAGE_SIZE, "%pI4,%d\n", dev->cur_server.host.addr, (int)ntohs(dev->cur_server.host.port)), PAGE_SIZE);
+ else if (dev->cur_server.host.type == AF_INET6)
+ return MIN(snprintf(buf, PAGE_SIZE, "%pI6,%d\n", dev->cur_server.host.addr, (int)ntohs(dev->cur_server.host.port)), PAGE_SIZE);
*buf = '\0';
return 0;
}
@@ -47,7 +47,7 @@ ssize_t show_alt_server_num(char *buf, dnbd3_device_t *dev)
int i, num = 0;
for (i = 0; i < NUMBER_SERVERS; ++i)
{
- if (dev->alt_servers[i].hostaddrtype) ++num;
+ if (dev->alt_servers[i].host.type) ++num;
}
return MIN(snprintf(buf, PAGE_SIZE, "%d\n", num), PAGE_SIZE);
}
@@ -57,17 +57,17 @@ ssize_t show_alt_servers(char *buf, dnbd3_device_t *dev)
int i, size = PAGE_SIZE, ret;
for (i = 0; i < NUMBER_SERVERS; ++i)
{
- if (dev->alt_servers[i].hostaddrtype == AF_INET)
+ if (dev->alt_servers[i].host.type == AF_INET)
ret = MIN(snprintf(buf, size, "%pI4,%d,%llu,%d\n",
- dev->alt_servers[i].hostaddr,
- (int)ntohs(dev->alt_servers[i].port),
+ dev->alt_servers[i].host.addr,
+ (int)ntohs(dev->alt_servers[i].host.port),
(unsigned long long)((dev->alt_servers[i].rtts[0] + dev->alt_servers[i].rtts[1] + dev->alt_servers[i].rtts[2] + dev->alt_servers[i].rtts[3]) / 4),
(int)dev->alt_servers[i].failures)
, size);
- else if (dev->alt_servers[i].hostaddrtype == AF_INET6)
+ else if (dev->alt_servers[i].host.type == AF_INET6)
ret = MIN(snprintf(buf, size, "%pI6,%d,%llu,%d\n",
- dev->alt_servers[i].hostaddr,
- (int)ntohs(dev->alt_servers[i].port),
+ dev->alt_servers[i].host.addr,
+ (int)ntohs(dev->alt_servers[i].host.port),
(unsigned long long)((dev->alt_servers[i].rtts[0] + dev->alt_servers[i].rtts[1] + dev->alt_servers[i].rtts[2] + dev->alt_servers[i].rtts[3]) / 4),
(int)dev->alt_servers[i].failures)
, size);