diff options
author | Johann Latocha | 2012-01-24 20:42:30 +0100 |
---|---|---|
committer | Johann Latocha | 2012-01-24 20:42:30 +0100 |
commit | 90123ef4fbe457642325362ca07fe5b75df3f0c9 (patch) | |
tree | 12654b30e62d0819c54abbceae483800d1d608d1 /src/kernel | |
parent | Support files > 4GB (diff) | |
download | dnbd3-90123ef4fbe457642325362ca07fe5b75df3f0c9.tar.gz dnbd3-90123ef4fbe457642325362ca07fe5b75df3f0c9.tar.xz dnbd3-90123ef4fbe457642325362ca07fe5b75df3f0c9.zip |
Serving more than one image.
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/blk.c | 4 | ||||
-rw-r--r-- | src/kernel/core.c | 5 | ||||
-rw-r--r-- | src/kernel/dnbd3.h | 1 | ||||
-rw-r--r-- | src/kernel/net.c | 9 |
4 files changed, 15 insertions, 4 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c index bf7f4e8..8a31841 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -36,7 +36,9 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, case IOCTL_SET_PORT: _port = (char *) arg; break; - + case IOCTL_SET_IMAGE: + _image_id = (char *) arg; + break; case IOCTL_CONNECT: dnbd3_net_connect(); break; diff --git a/src/kernel/core.c b/src/kernel/core.c index 3b6ce54..3fe88f3 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -28,8 +28,9 @@ struct request_queue *dnbd3_queue; spinlock_t dnbd3_lock; // network -char* _host; -char* _port; +char* _host = NULL; +char* _port = NULL; +char* _image_id = NULL; struct socket *_sock; // process diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h index 11eee48..71be4e8 100644 --- a/src/kernel/dnbd3.h +++ b/src/kernel/dnbd3.h @@ -36,6 +36,7 @@ extern spinlock_t dnbd3_lock; // network extern char* _host; extern char* _port; +extern char* _image_id; extern struct socket *_sock; // process diff --git a/src/kernel/net.c b/src/kernel/net.c index 1ec92ca..ac8e81d 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -31,7 +31,7 @@ void dnbd3_net_connect(void) struct task_struct *thread_send; struct task_struct *thread_receive; - if (!_host || !_port) + if (!_host || !_port || !_image_id) { printk("ERROR: Host or port not set."); return; @@ -55,6 +55,7 @@ void dnbd3_net_connect(void) // prepare message and send request dnbd3_request.cmd = CMD_GET_SIZE; + strcpy(dnbd3_request.image_id, _image_id); msg.msg_name = NULL; msg.msg_namelen = 0; msg.msg_control = NULL; @@ -71,6 +72,12 @@ void dnbd3_net_connect(void) kernel_recvmsg(_sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags); // set filesize + if (dnbd3_reply.filesize <= 0) + { + printk("ERROR: File size returned by server is < 0.\n"); + return; + } + printk("INFO: dnbd3 filesize: %llu\n", dnbd3_reply.filesize); set_capacity(disk, dnbd3_reply.filesize >> 9); /* 512 Byte blocks */ |