summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohann Latocha2012-05-21 18:41:20 +0200
committerJohann Latocha2012-05-21 18:41:20 +0200
commitafdef2fa176881f11ebaac09abf1d13d0502c945 (patch)
tree6dbc870b86fb8b2562dae2e5dc31a47210eda589
parent[KERNEL] RTT bug fixed (diff)
downloaddnbd3-afdef2fa176881f11ebaac09abf1d13d0502c945.tar.gz
dnbd3-afdef2fa176881f11ebaac09abf1d13d0502c945.tar.xz
dnbd3-afdef2fa176881f11ebaac09abf1d13d0502c945.zip
[ALL] Some cleanup
-rw-r--r--CMakeLists.txt2
-rw-r--r--dnbd3-client.conf.example4
-rw-r--r--src/client/client.c27
-rw-r--r--src/kernel/blk.c16
-rw-r--r--src/kernel/net.c33
-rw-r--r--src/kernel/net.h2
-rw-r--r--src/kernel/sysfs.c15
-rw-r--r--src/kernel/sysfs.h14
-rw-r--r--src/server/net.c6
-rw-r--r--src/types.h1
-rw-r--r--src/version.h4
11 files changed, 59 insertions, 65 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f6362b9..08d52c9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,7 +5,7 @@
PROJECT(dnbd3)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
-SET(CMAKE_BUILD_TYPE Release)
+SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -Wall -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64")
SET(CMAKE_C_FLAGS_RELEASE "-O2 -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64")
SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -Wall -Wno-unused-result -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64")
diff --git a/dnbd3-client.conf.example b/dnbd3-client.conf.example
index 9d33cf6..264632f 100644
--- a/dnbd3-client.conf.example
+++ b/dnbd3-client.conf.example
@@ -2,7 +2,6 @@
[Ubuntu 10.04]
server=132.230.4.29
-port=5003
vid=1
rid=3
device=/dev/dnbd0
@@ -10,7 +9,6 @@ ahead=256
[Ubuntu 10.10]
server=132.230.4.29
-port=5003
vid=2
rid=1
device=/dev/dnbd1
@@ -18,7 +16,6 @@ ahead=256
[Ubuntu 11.04]
server=132.230.4.29
-port=5003
vid=3
rid=1
device=/dev/dnbd2
@@ -26,7 +23,6 @@ ahead=256
[Ubuntu 11.10]
server=132.230.4.29
-port=5003
vid=4
rid=1
device=/dev/dnbd3
diff --git a/src/client/client.c b/src/client/client.c
index 92f5127..68ed70e 100644
--- a/src/client/client.c
+++ b/src/client/client.c
@@ -37,11 +37,10 @@ char *_config_file_name = DEFAULT_CLIENT_CONFIG_FILE;
void dnbd3_print_help(char* argv_0)
{
printf("\nUsage: %s\n"
- "\t-h <host> [-p <port>] -v <vid> [-r <rid>] -d <device> [-a <kb>] || -f <file> || -c <device>\n\n", argv_0);
+ "\t-h <host> -v <vid> [-r <rid>] -d <device> [-a <KB>] || -f <file> || -c <device>\n\n", argv_0);
printf("Start the DNBD3 client.\n");
printf("-f or --file \t\t Configuration file (default /etc/dnbd3-client.conf)\n");
printf("-h or --host \t\t Host running dnbd3-server.\n");
- printf("-p or --port \t\t Port used by server (default %i).\n", PORT);
printf("-v or --vid \t\t Volume-ID of exported image.\n");
printf("-r or --rid \t\t Release-ID of exported image (default 0, latest).\n");
printf("-d or --device \t\t DNBD3 device name.\n");
@@ -65,7 +64,7 @@ char* dnbd3_get_ip(char* hostname)
if ((host = gethostbyname(hostname)) == NULL)
{
- printf("ERROR: Unknown host '%s'\n", hostname);
+ printf("FATAL: Unknown host '%s'\n", hostname);
exit(EXIT_FAILURE);
}
@@ -82,19 +81,17 @@ int main(int argc, char *argv[])
dnbd3_ioctl_t msg;
msg.host = NULL;
- msg.port = PORTSTR;
msg.vid = 0;
msg.rid = 0;
msg.read_ahead_kb = DEFAULT_READ_AHEAD_KB;
int opt = 0;
int longIndex = 0;
- static const char *optString = "f:h:p:v:r:d:a:c:s:HV?";
+ static const char *optString = "f:h:v:r:d:a:c:s:HV?";
static const struct option longOpts[] =
{
{ "file", required_argument, NULL, 'f' },
{ "host", required_argument, NULL, 'h' },
- { "port", required_argument, NULL, 'p' },
{ "vid", required_argument, NULL, 'v' },
{ "rid", required_argument, NULL, 'r' },
{ "device", required_argument, NULL, 'd' },
@@ -116,9 +113,6 @@ int main(int argc, char *argv[])
case 'h':
msg.host = dnbd3_get_ip(optarg);
break;
- case 'p':
- msg.port = optarg;
- break;
case 'v':
msg.vid = atoi(optarg);
break;
@@ -159,7 +153,7 @@ int main(int argc, char *argv[])
if (ioctl(fd, IOCTL_CLOSE, &msg) < 0)
{
- printf("ERROR: ioctl not successful\n");
+ printf("ERROR: ioctl not successful (close)\n");
exit(EXIT_FAILURE);
}
@@ -175,7 +169,7 @@ int main(int argc, char *argv[])
if (ioctl(fd, IOCTL_SWITCH, &msg) < 0)
{
- printf("ERROR: ioctl not successful\n");
+ printf("ERROR: ioctl not successful (switch)\n");
exit(EXIT_FAILURE);
}
@@ -187,11 +181,11 @@ int main(int argc, char *argv[])
if (msg.host && dev && (msg.vid != 0))
{
fd = open(dev, O_WRONLY);
- printf("INFO: Connecting %s to %s:%s vid:%i rid:%i\n", dev, msg.host, msg.port, msg.vid, msg.rid);
+ printf("INFO: Connecting %s to %s vid:%i rid:%i\n", dev, msg.host, msg.vid, msg.rid);
if (ioctl(fd, IOCTL_OPEN, &msg) < 0)
{
- printf("ERROR: ioctl not successful\n");
+ printf("ERROR: ioctl not successful (connect)\n");
exit(EXIT_FAILURE);
}
@@ -214,7 +208,6 @@ int main(int argc, char *argv[])
for (i = 0; i < j; i++)
{
msg.host = g_key_file_get_string(gkf, groups[i], "server", NULL);
- msg.port = g_key_file_get_string(gkf, groups[i], "port", NULL);
msg.vid = g_key_file_get_integer(gkf, groups[i], "vid", NULL);
msg.rid = g_key_file_get_integer(gkf, groups[i], "rid", NULL);
dev = g_key_file_get_string(gkf, groups[i], "device", NULL);
@@ -224,11 +217,11 @@ int main(int argc, char *argv[])
msg.read_ahead_kb = DEFAULT_READ_AHEAD_KB;
fd = open(dev, O_WRONLY);
- printf("INFO: Connecting %s to %s:%s vid:%i rid:%i\n", dev, msg.host, msg.port, msg.vid, msg.rid);
+ printf("INFO: Connecting %s to %s vid:%i rid:%i\n", dev, msg.host, msg.vid, msg.rid);
if (ioctl(fd, IOCTL_OPEN, &msg) < 0)
{
- printf("ERROR: ioctl not successful\n");
+ printf("ERROR: ioctl not successful (connect)\n");
exit(EXIT_FAILURE);
}
@@ -241,7 +234,7 @@ int main(int argc, char *argv[])
}
else
{
- printf("WARN: Config file not found: %s\n", _config_file_name);
+ printf("ERROR: Config file not found: %s\n", _config_file_name);
}
g_key_file_free(gkf);
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 369627f..2f52cc3 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -99,6 +99,7 @@ struct block_device_operations dnbd3_blk_ops =
int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
{
+ int result = 0;
dnbd3_device_t *dev = bdev->bd_disk->private_data;
struct request_queue *blk_queue = dev->disk->queue;
dnbd3_ioctl_t *msg = kmalloc(sizeof(dnbd3_ioctl_t), GFP_KERNEL);
@@ -108,33 +109,34 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
{
case IOCTL_OPEN:
strcpy(dev->cur_server.host, msg->host);
- strcpy(dev->cur_server.port, msg->port);
+ strcpy(dev->cur_server.port, PORTSTR);
dev->vid = msg->vid;
dev->rid = msg->rid;
blk_queue->backing_dev_info.ra_pages = (msg->read_ahead_kb * 1024)/ PAGE_CACHE_SIZE;
- return dnbd3_net_connect(dev);
+ result = dnbd3_net_connect(dev);
+ break;
case IOCTL_CLOSE:
set_capacity(dev->disk, 0);
- dnbd3_net_disconnect(dev);
+ result = dnbd3_net_disconnect(dev);
break;
case IOCTL_SWITCH:
dnbd3_net_disconnect(dev);
strcpy(dev->cur_server.host, msg->host);
- return dnbd3_net_connect(dev);
+ result = dnbd3_net_connect(dev);
+ break;
case BLKFLSBUF:
break;
default:
- kfree(msg);
- return -1;
+ result = -EIO;
}
kfree(msg);
- return 0;
+ return result;
}
void dnbd3_blk_request(struct request_queue *q)
diff --git a/src/kernel/net.c b/src/kernel/net.c
index ad4884c..840282f 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -116,7 +116,7 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
return 0;
}
-void dnbd3_net_disconnect(dnbd3_device_t *dev)
+int dnbd3_net_disconnect(dnbd3_device_t *dev)
{
printk("INFO: Disconnecting device %s\n", dev->disk->disk_name);
@@ -150,6 +150,8 @@ void dnbd3_net_disconnect(dnbd3_device_t *dev)
dev->cur_server.sock = NULL;
memset(dev->cur_server.host, '\0', sizeof(dev->cur_server.host));
}
+
+ return 0;
}
void dnbd3_net_heartbeat(unsigned long arg)
@@ -157,6 +159,7 @@ void dnbd3_net_heartbeat(unsigned long arg)
dnbd3_device_t *dev = (dnbd3_device_t *) arg;
struct request *req = kmalloc(sizeof(struct request), GFP_ATOMIC);
+ // send keepalive
if (req)
{
req->cmd_type = REQ_TYPE_SPECIAL;
@@ -164,7 +167,12 @@ void dnbd3_net_heartbeat(unsigned long arg)
list_add_tail(&req->queuelist, &dev->request_queue_send);
wake_up(&dev->process_queue_send);
}
+ else
+ {
+ printk("ERROR: Couldn't create keepalive request\n");
+ }
+ // start discover
dev->discover = 1;
wake_up(&dev->process_queue_discover);
@@ -255,7 +263,7 @@ int dnbd3_net_discover(void *data)
if (kernel_sendmsg(sock, &msg, &iov, 1, sizeof(dnbd3_request)) <= 0)
goto error;
- // receive net replay
+ // receive net reply
iov.iov_base = &dnbd3_reply;
iov.iov_len = sizeof(dnbd3_reply);
if (kernel_recvmsg(sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags) <= 0)
@@ -319,8 +327,7 @@ int dnbd3_net_discover(void *data)
+dev->alt_servers[i].rtts[3] ) / 4;
-
- if ( best_rtt > dev->alt_servers[i].rtt)
+ if (best_rtt > dev->alt_servers[i].rtt)
{
best_rtt = dev->alt_servers[i].rtt;
strcpy(best_server, current_server);
@@ -346,7 +353,8 @@ int dnbd3_net_discover(void *data)
continue;
// take server with lowest rtt
- if (ready && num > 1 && strcmp(dev->cur_server.host, best_server) && !kthread_should_stop() && dev->cur_server.rtt > best_rtt + RTT_THRESHOLD)
+ if (ready && num > 1 && strcmp(dev->cur_server.host, best_server) && !kthread_should_stop()
+ && dev->cur_server.rtt > best_rtt + RTT_THRESHOLD)
{
printk("INFO: Server %s on %s is faster (%lluus)\n", best_server, dev->disk->disk_name, best_rtt);
kfree(buf);
@@ -357,10 +365,6 @@ int dnbd3_net_discover(void *data)
dnbd3_net_connect(dev);
return 0;
}
- else
- {
- dev->cur_server.rtt = best_rtt;
- }
turn = (turn +1) % 4;
if (turn == 3)
@@ -382,6 +386,9 @@ int dnbd3_net_send(void *data)
init_msghdr(msg);
+ dnbd3_request.vid = dev->vid;
+ dnbd3_request.rid = dev->rid;
+
set_user_nice(current, -20);
while (!kthread_should_stop() || !list_empty(&dev->request_queue_send))
@@ -402,8 +409,6 @@ int dnbd3_net_send(void *data)
{
case REQ_TYPE_FS:
dnbd3_request.cmd = CMD_GET_BLOCK;
- dnbd3_request.vid = dev->vid;
- dnbd3_request.rid = dev->rid;
dnbd3_request.offset = blk_rq_pos(blk_request) << 9; // *512
dnbd3_request.size = blk_rq_bytes(blk_request); // bytes left to complete entire request
break;
@@ -413,13 +418,9 @@ int dnbd3_net_send(void *data)
{
case REQ_GET_FILESIZE:
dnbd3_request.cmd = CMD_GET_SIZE;
- dnbd3_request.vid = dev->vid;
- dnbd3_request.rid = dev->rid;
break;
case REQ_GET_SERVERS:
dnbd3_request.cmd = CMD_GET_SERVERS;
- dnbd3_request.vid = dev->vid;
- dnbd3_request.rid = dev->rid;
break;
}
break;
@@ -487,7 +488,7 @@ int dnbd3_net_receive(void *data)
if (list_empty(&dev->request_queue_receive))
continue;
- // receive net replay
+ // receive net reply
iov.iov_base = &dnbd3_reply;
iov.iov_len = sizeof(dnbd3_reply);
if (kernel_recvmsg(dev->cur_server.sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags) <= 0)
diff --git a/src/kernel/net.h b/src/kernel/net.h
index 3dfca41..64816bc 100644
--- a/src/kernel/net.h
+++ b/src/kernel/net.h
@@ -32,7 +32,7 @@
int dnbd3_net_connect(dnbd3_device_t *lo);
-void dnbd3_net_disconnect(dnbd3_device_t *lo);
+int dnbd3_net_disconnect(dnbd3_device_t *lo);
int dnbd3_net_send(void *data);
diff --git a/src/kernel/sysfs.c b/src/kernel/sysfs.c
index fe4321e..a455bd2 100644
--- a/src/kernel/sysfs.c
+++ b/src/kernel/sysfs.c
@@ -23,21 +23,6 @@
#include "sysfs.h"
#include "utils.h"
-typedef struct
-{
- struct attribute attr;
- ssize_t (*show)(char *, dnbd3_device_t *);
- ssize_t (*store)(const char *, size_t, dnbd3_device_t *);
-} device_attr_t;
-
-typedef struct
-{
- struct attribute attr;
- ssize_t (*show)(char *, dnbd3_server_t *);
- ssize_t (*store)(const char *, size_t, dnbd3_server_t *);
-} server_attr_t;
-
-
ssize_t show_cur_server_ip(char *buf, dnbd3_device_t *dev)
{
return sprintf(buf, "%s\n", dev->cur_server.host);
diff --git a/src/kernel/sysfs.h b/src/kernel/sysfs.h
index 09a053f..ab5ceb5 100644
--- a/src/kernel/sysfs.h
+++ b/src/kernel/sysfs.h
@@ -27,5 +27,19 @@ void dnbd3_sysfs_init(dnbd3_device_t *dev);
void dnbd3_sysfs_exit(dnbd3_device_t *dev);
+typedef struct
+{
+ struct attribute attr;
+ ssize_t (*show)(char *, dnbd3_device_t *);
+ ssize_t (*store)(const char *, size_t, dnbd3_device_t *);
+} device_attr_t;
+
+typedef struct
+{
+ struct attribute attr;
+ ssize_t (*show)(char *, dnbd3_server_t *);
+ ssize_t (*store)(const char *, size_t, dnbd3_server_t *);
+} server_attr_t;
+
#endif /* SYSFS_H_ */
diff --git a/src/server/net.c b/src/server/net.c
index ce491dd..cd93c0d 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -53,7 +53,11 @@ void *dnbd3_handle_query(void *dnbd3_client)
uint64_t map_y;
char map_x, bit_mask;
- uint64_t todo_size, todo_offset, cur_offset, last_offset = 0;
+ uint64_t todo_size = 0;
+ uint64_t todo_offset = 0;
+ uint64_t cur_offset = 0;
+ uint64_t last_offset = 0;
+
int dirty = 0;
while (recv(client->sock, &request, sizeof(dnbd3_request_t), MSG_WAITALL) > 0)
diff --git a/src/types.h b/src/types.h
index 75bc8a1..04dcf85 100644
--- a/src/types.h
+++ b/src/types.h
@@ -32,7 +32,6 @@
typedef struct
{
char *host;
- char *port;
int vid;
int rid;
int read_ahead_kb;
diff --git a/src/version.h b/src/version.h
index 3dd8618..60246b7 100644
--- a/src/version.h
+++ b/src/version.h
@@ -21,7 +21,7 @@
#ifndef VERSION_H_
#define VERSION_H_
-#define VERSION_STRING "0.7.0"
-#define VERSION_NUMBER 070
+#define VERSION_STRING "1.0.0"
+#define VERSION_NUMBER 100
#endif /* VERSION_H_ */