From afdef2fa176881f11ebaac09abf1d13d0502c945 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Mon, 21 May 2012 18:41:20 +0200 Subject: [ALL] Some cleanup --- src/client/client.c | 27 ++++++++++----------------- src/kernel/blk.c | 16 +++++++++------- src/kernel/net.c | 33 +++++++++++++++++---------------- src/kernel/net.h | 2 +- src/kernel/sysfs.c | 15 --------------- src/kernel/sysfs.h | 14 ++++++++++++++ src/server/net.c | 6 +++++- src/types.h | 1 - src/version.h | 4 ++-- 9 files changed, 58 insertions(+), 60 deletions(-) (limited to 'src') 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 [-p ] -v [-r ] -d [-a ] || -f || -c \n\n", argv_0); + "\t-h -v [-r ] -d [-a ] || -f || -c \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_ */ -- cgit v1.2.3-55-g7522