From 37e4ed696b77455a738fa948b93498c8740721bc Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Thu, 2 Feb 2012 01:13:50 +0100 Subject: [SERVER] Parsing config file with glib [KERNEL] Bugfixes [CLIENT] Using vid and rid --- src/kernel/blk.c | 16 +++++++++------- src/kernel/core.c | 5 +++++ src/kernel/dnbd3.h | 3 ++- src/kernel/net.c | 26 +++++++++++++++----------- 4 files changed, 31 insertions(+), 19 deletions(-) (limited to 'src/kernel') diff --git a/src/kernel/blk.c b/src/kernel/blk.c index ccc45dc..c4bbeb1 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -31,6 +31,9 @@ int dnbd3_blk_add_device(dnbd3_device_t *dev, int minor) INIT_LIST_HEAD(&dev->request_queue_send); INIT_LIST_HEAD(&dev->request_queue_receive); + dev->vid = 0; + dev->rid = 0; + if (!(disk = alloc_disk(1))) { printk("ERROR: dnbd3 alloc_disk failed.\n"); @@ -92,18 +95,17 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u case IOCTL_SET_HOST: strcpy(lo->host, (char *) arg); break; - case IOCTL_SET_PORT: strcpy(lo->port, (char *) arg); break; - case IOCTL_SET_IMAGE: - strcpy(lo->image_id, (char *) arg); + case IOCTL_SET_VID: + lo->vid = arg; + break; + case IOCTL_SET_RID: + lo->rid = arg; break; case IOCTL_CONNECT: - if (lo->host && lo->port && lo->image_id) - dnbd3_net_connect(lo); - else - return -1; + dnbd3_net_connect(lo); break; case IOCTL_DISCONNECT: dnbd3_net_disconnect(lo); diff --git a/src/kernel/core.c b/src/kernel/core.c index 0e81fdd..086a764 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -27,12 +27,14 @@ dnbd3_device_t dnbd3_device[MAX_NUMBER_DEVICES]; static int __init dnbd3_init(void) { int i; + // initialize block device if ((major = register_blkdev(0, "dnbd3")) == 0) { printk("ERROR: dnbd3 register_blkdev failed.\n"); return -EIO; } + // add MAX_NUMBER_DEVICES devices for (i = 0; i < MAX_NUMBER_DEVICES; i++) { @@ -42,6 +44,7 @@ static int __init dnbd3_init(void) return -EIO; } } + printk("INFO: dnbd3 init successful.\n"); return 0; } @@ -49,10 +52,12 @@ static int __init dnbd3_init(void) static void __exit dnbd3_exit(void) { int i; + for (i = 0; i < MAX_NUMBER_DEVICES; i++) { dnbd3_blk_del_device(&dnbd3_device[i]); } + unregister_blkdev(major, "dnbd3"); printk("INFO: dnbd3 exit.\n"); } diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h index 13af803..8dc0f47 100644 --- a/src/kernel/dnbd3.h +++ b/src/kernel/dnbd3.h @@ -40,7 +40,8 @@ typedef struct // network char host[16]; char port[6]; - char image_id[MAX_FILE_NAME]; + int vid; + int rid; struct socket *sock; struct timer_list hb_timer; struct request hb_request; diff --git a/src/kernel/net.c b/src/kernel/net.c index dba45c6..a83b4b6 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -29,14 +29,14 @@ void dnbd3_net_connect(dnbd3_device_t *lo) dnbd3_request_t dnbd3_request; dnbd3_reply_t dnbd3_reply; - if (!lo->host || !lo->port || !lo->image_id) + if (!lo->host || !lo->port || (lo->vid == 0) || (lo->rid == 0)) { - printk("ERROR: Host or port not set."); + printk("ERROR: Host, port, vid or rid not set.\n"); return; } - // TODO: check if allready connected - printk("INFO: Connecting device %s\n", lo->disk->disk_name); + // TODO: check if already connected + printk("INFO: Connecting device %s to %s\n", lo->disk->disk_name, lo->host); // initialize socket if (sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &lo->sock) < 0) @@ -54,15 +54,17 @@ void dnbd3_net_connect(dnbd3_device_t *lo) return; } - // prepare message and send request + // prepare message dnbd3_request.cmd = CMD_GET_SIZE; - strcpy(dnbd3_request.image_id, lo->image_id); + dnbd3_request.vid = lo->vid; + dnbd3_request.rid = lo->rid; msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = MSG_WAITALL | MSG_NOSIGNAL; // No SIGPIPE + // send message iov.iov_base = &dnbd3_request; iov.iov_len = sizeof(dnbd3_request); kernel_sendmsg(lo->sock, &msg, &iov, 1, sizeof(dnbd3_request)); @@ -78,9 +80,8 @@ void dnbd3_net_connect(dnbd3_device_t *lo) printk("ERROR: File size returned by server is < 0.\n"); return; } - - printk("INFO: dnbd3 filesize: %llu\n", dnbd3_reply.filesize); set_capacity(lo->disk, dnbd3_reply.filesize >> 9); /* 512 Byte blocks */ + printk("INFO: dnbd3 filesize: %llu\n", dnbd3_reply.filesize); // start sending thread lo->thread_send = kthread_create(dnbd3_net_send, lo, lo->disk->disk_name); @@ -104,8 +105,11 @@ void dnbd3_net_disconnect(dnbd3_device_t *lo) printk("INFO: Disconnecting device %s\n", lo->disk->disk_name); // kill sending and receiving threads - kthread_stop(lo->thread_send); - kthread_stop(lo->thread_receive); + if (lo->thread_send && lo->thread_receive) + { + kthread_stop(lo->thread_send); + kthread_stop(lo->thread_receive); + } // clear sock if (lo->sock) @@ -117,7 +121,7 @@ void dnbd3_net_disconnect(dnbd3_device_t *lo) if (&lo->hb_timer) del_timer(&lo->hb_timer); - // move already send requests to request_queue_send + // move already send requests to request_queue_send again if (!list_empty(&lo->request_queue_receive)) { printk("WARN: Request queue was not empty on %s\n", lo->disk->disk_name); -- cgit v1.2.3-55-g7522