From 80fd019d337aefe04532476d342ddb0d1aff2851 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Thu, 16 Feb 2012 19:54:15 +0100 Subject: [KERNEL] Major bug fixes --- dnbd3-server.conf.example | 8 +++---- src/config.h | 14 ++++++------ src/kernel/core.c | 6 +++--- src/kernel/dnbd3.h | 2 +- src/kernel/net.c | 54 +++++++++++++++++++++++------------------------ src/server/net.c | 6 +++--- src/server/server.c | 2 +- src/server/utils.c | 4 ++-- 8 files changed, 49 insertions(+), 47 deletions(-) diff --git a/dnbd3-server.conf.example b/dnbd3-server.conf.example index 0169bc2..d04aea0 100644 --- a/dnbd3-server.conf.example +++ b/dnbd3-server.conf.example @@ -2,24 +2,24 @@ [Ubuntu 10.04] file=/home/jjl/Data/ISOs/Ubuntu/ubuntu-10.04.3-desktop-i386.iso -servers=132.230.4.29;132.230.4.220 +servers=132.230.4.29;132.230.4.220;132.230.8.96 vid=1 rid=3 [Ubuntu 10.10] file=/home/jjl/Data/ISOs/Ubuntu/ubuntu-10.10-desktop-i386.iso -servers=132.230.4.29;132.230.4.220 +servers=132.230.4.29;132.230.4.220;132.230.8.96 vid=2 rid=1 [Ubuntu 11.04] file=/home/jjl/Data/ISOs/Ubuntu/ubuntu-11.04-desktop-i386.iso -servers=132.230.4.29;132.230.4.220 +servers=132.230.4.29;132.230.4.220;132.230.8.96 vid=3 rid=1 [Ubuntu 11.10] file=/home/jjl/Data/ISOs/Ubuntu/ubuntu-11.10-desktop-i386.iso -servers=132.230.4.29;132.230.4.220 +servers=132.230.4.29;132.230.4.220;132.230.8.96 vid=4 rid=1 diff --git a/src/config.h b/src/config.h index 4b4fb6f..77caf11 100644 --- a/src/config.h +++ b/src/config.h @@ -24,16 +24,18 @@ // network #define PORT 5003 #define PORTSTR "5003" -#define SERVER_SOCKET_TIMEOUT 30 -#define CLIENT_SOCKET_TIMEOUT_DATA 5 -#define CLIENT_SOCKET_TIMEOUT_DISCOVERY 1 -#define HB_INTERVAL 10*HZ -#define MAX_NUMBER_SERVERS 8 + +#define SOCKET_TIMEOUT_SERVER 30 +#define SOCKET_TIMEOUT_CLIENT_DATA 5 +#define SOCKET_TIMEOUT_CLIENT_DISCOVERY 1 +#define TIMER_INTERVAL_HEARTBEAT 2*HZ +#define TIMER_INTERVAL_PANIC 1*HZ +#define NUMBER_SERVERS 8 // block device #define KERNEL_SECTOR_SIZE 512 #define DNBD3_BLOCK_SIZE 4096 -#define MAX_NUMBER_DEVICES 8 +#define NUMBER_DEVICES 8 // misc #define DEFAULT_SERVER_CONFIG_FILE "/etc/dnbd3-server.conf" diff --git a/src/kernel/core.c b/src/kernel/core.c index 086a764..167c591 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -22,7 +22,7 @@ #include "blk.h" int major; -dnbd3_device_t dnbd3_device[MAX_NUMBER_DEVICES]; +dnbd3_device_t dnbd3_device[NUMBER_DEVICES]; static int __init dnbd3_init(void) { @@ -36,7 +36,7 @@ static int __init dnbd3_init(void) } // add MAX_NUMBER_DEVICES devices - for (i = 0; i < MAX_NUMBER_DEVICES; i++) + for (i = 0; i < NUMBER_DEVICES; i++) { if (dnbd3_blk_add_device(&dnbd3_device[i], i) != 0) { @@ -53,7 +53,7 @@ static void __exit dnbd3_exit(void) { int i; - for (i = 0; i < MAX_NUMBER_DEVICES; i++) + for (i = 0; i < NUMBER_DEVICES; i++) { dnbd3_blk_del_device(&dnbd3_device[i]); } diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h index 0231306..140754c 100644 --- a/src/kernel/dnbd3.h +++ b/src/kernel/dnbd3.h @@ -45,7 +45,7 @@ typedef struct struct socket *sock; struct timer_list hb_timer; int num_servers; - struct in_addr servers[MAX_NUMBER_SERVERS]; + struct in_addr servers[NUMBER_SERVERS]; int discover, panic; // process diff --git a/src/kernel/net.c b/src/kernel/net.c index aa93a47..112ebab 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -30,7 +30,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) struct request *req = kmalloc(sizeof(struct request), GFP_ATOMIC); struct timeval timeout; - timeout.tv_sec = CLIENT_SOCKET_TIMEOUT_DATA; + timeout.tv_sec = SOCKET_TIMEOUT_CLIENT_DATA; timeout.tv_usec = 0; // do some checks before connecting @@ -59,6 +59,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) dev->sock = NULL; return; } + kernel_setsockopt(dev->sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, sizeof(timeout)); kernel_setsockopt(dev->sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout)); dev->sock->sk->sk_allocation = GFP_NOIO; sin.sin_family = AF_INET; @@ -96,7 +97,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev) init_timer(&dev->hb_timer); dev->hb_timer.data = (unsigned long) dev; dev->hb_timer.function = dnbd3_net_heartbeat; - dev->hb_timer.expires = jiffies + HB_INTERVAL; + dev->hb_timer.expires = jiffies + TIMER_INTERVAL_HEARTBEAT; add_timer(&dev->hb_timer); } @@ -110,13 +111,6 @@ void dnbd3_net_disconnect(dnbd3_device_t *dev) del_timer(&dev->hb_timer); // kill sending and receiving threads -// if (dev->thread_send && dev->thread_receive && dev->thread_discover) -// { -// kthread_stop(dev->thread_send); -// kthread_stop(dev->thread_receive); -// kthread_stop(dev->thread_discover); -// } - if (dev->thread_send) kthread_stop(dev->thread_send); @@ -150,7 +144,11 @@ void dnbd3_net_heartbeat(unsigned long arg) dev->discover = 1; wake_up(&dev->process_queue_discover); - dev->hb_timer.expires = jiffies + HB_INTERVAL; + if (dev->panic) + dev->hb_timer.expires = jiffies + TIMER_INTERVAL_PANIC; + else + dev->hb_timer.expires = jiffies + TIMER_INTERVAL_HEARTBEAT; + add_timer(&dev->hb_timer); } @@ -167,14 +165,14 @@ int dnbd3_net_discover(void *data) uint64_t filesize; char *buf; - char ip[16]; + char host[16]; struct timeval start, end; uint64_t t1, t2 = 0; int i, num = 0; struct timeval timeout; - timeout.tv_sec = CLIENT_SOCKET_TIMEOUT_DISCOVERY; + timeout.tv_sec = SOCKET_TIMEOUT_CLIENT_DISCOVERY; timeout.tv_usec = 0; init_msghdr(msg); @@ -182,23 +180,21 @@ int dnbd3_net_discover(void *data) buf = kmalloc(4096, GFP_KERNEL); if (!buf) { - printk("ERROR: Kmalloc failed (discover)\n"); + printk("FATAL: Kmalloc failed (discover)\n"); return -1; } - set_user_nice(current, -20); - while (!kthread_should_stop()) { - wait_event_interruptible(dev->process_queue_discover, kthread_should_stop() || dev->discover || dev->panic); + wait_event_interruptible(dev->process_queue_discover, kthread_should_stop() || dev->discover); - if (!&dev->discover && !dev->panic) + if (!&dev->discover) continue; num = dev->num_servers; dev->discover = 0; - for (i=0; i < num && i < MAX_NUMBER_SERVERS; i++) + for (i=0; i < num && i < NUMBER_SERVERS; i++) { // initialize socket and connect if (sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock) < 0) @@ -207,15 +203,16 @@ int dnbd3_net_discover(void *data) sock = NULL; continue; } + kernel_setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, sizeof(timeout)); kernel_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout)); - inet_ntoa(dev->servers[i], ip); + inet_ntoa(dev->servers[i], host); sock->sk->sk_allocation = GFP_NOIO; sin.sin_family = AF_INET; - sin.sin_addr.s_addr = inet_addr(ip); + sin.sin_addr.s_addr = inet_addr(host); sin.sin_port = htons(simple_strtol(dev->port, NULL, 10)); if (kernel_connect(sock, (struct sockaddr *) &sin, sizeof(sin), 0) < 0) { - printk("ERROR: Couldn't connect to host %s:%s (discover)\n", ip, dev->port); + printk("ERROR: Couldn't connect to host %s:%s (discover)\n", host, dev->port); sock = NULL; continue; } @@ -223,12 +220,12 @@ int dnbd3_net_discover(void *data) // panic mode, take first responding server if (dev->panic) { - printk("WARN: Panic mode, taking server %s\n", ip); + printk("WARN: Panic mode, taking server %s\n", host); sock_release(sock); kfree(buf); dev->thread_discover = NULL; dnbd3_net_disconnect(dev); - strcpy(dev->host, ip); + strcpy(dev->host, host); dnbd3_net_connect(dev); return 0; } @@ -283,13 +280,13 @@ int dnbd3_net_discover(void *data) sock_release(sock); sock = NULL; - // TODO: work here + // TODO: take fastest server t1 = (start.tv_sec*1000000ull) + start.tv_usec; t2 = (end.tv_sec*1000000ull) + end.tv_usec; - printk("DEBUG: Server: %s RTT: %llums\n", ip,t2 - t1); - + printk("DEBUG: Server: %s RTT: %llums\n", host,t2 - t1); continue; + error: printk("ERROR: kernel_sendmsg or kernel_recvmsg (discover)\n"); sock_release(sock); @@ -465,7 +462,10 @@ int dnbd3_net_receive(void *data) iov.iov_base = kaddr; iov.iov_len = size; if (kernel_recvmsg(dev->sock, &msg, &iov, 1, size, msg.msg_flags) <= 0) + { + kunmap(bvec->bv_page); goto error; + } kunmap(bvec->bv_page); sigprocmask(SIG_SETMASK, &oldset, NULL); @@ -492,7 +492,7 @@ int dnbd3_net_receive(void *data) case CMD_GET_SERVERS: dev->num_servers = dnbd3_reply.size / sizeof(struct in_addr); size = sizeof(struct in_addr); - for (i = 0; i < dev->num_servers && i < MAX_NUMBER_SERVERS; i++) + for (i = 0; i < dev->num_servers && i < NUMBER_SERVERS; i++) { iov.iov_base = &dev->servers[i]; iov.iov_len = size; diff --git a/src/server/net.c b/src/server/net.c index af521b9..a42588d 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -63,14 +63,14 @@ void *dnbd3_handle_query(void *dnbd3_client) } pthread_spin_lock(&client->spinlock); - if (client->image->num_servers < MAX_NUMBER_SERVERS) + if (client->image->num_servers < NUMBER_SERVERS) reply.size = client->image->num_servers * sizeof(struct in_addr); else - reply.size = MAX_NUMBER_SERVERS * sizeof(struct in_addr); + reply.size = NUMBER_SERVERS * sizeof(struct in_addr); send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0); - for (i = 0; i < client->image->num_servers && i < MAX_NUMBER_SERVERS; i++) + for (i = 0; i < client->image->num_servers && i < NUMBER_SERVERS; i++) { inet_aton(client->image->servers[i], &server); send(client->sock, (char *) &server, sizeof(struct in_addr), 0); diff --git a/src/server/server.c b/src/server/server.c index d6db52d..dba7cdd 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -151,7 +151,7 @@ int main(int argc, char* argv[]) unsigned int len = sizeof(client); int fd; struct timeval timeout; - timeout.tv_sec = SERVER_SOCKET_TIMEOUT; + timeout.tv_sec = SOCKET_TIMEOUT_SERVER; timeout.tv_usec = 0; // setup icp diff --git a/src/server/utils.c b/src/server/utils.c index 891d0b9..70e195e 100644 --- a/src/server/utils.c +++ b/src/server/utils.c @@ -51,8 +51,8 @@ void dnbd3_load_config(char *file) _images[i].rid = g_key_file_get_integer(gkf, groups[i], "rid", NULL); _images[i].atime = 0; - if (_images[i].num_servers > MAX_NUMBER_SERVERS) - printf("WARN: Max allowed servers %i\n", MAX_NUMBER_SERVERS); + if (_images[i].num_servers > NUMBER_SERVERS) + printf("WARN: Max allowed servers %i\n", NUMBER_SERVERS); fd = open(_images[i].file, O_RDONLY); if (fd > 0) -- cgit v1.2.3-55-g7522