summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorJohann Latocha2012-01-24 20:42:30 +0100
committerJohann Latocha2012-01-24 20:42:30 +0100
commit90123ef4fbe457642325362ca07fe5b75df3f0c9 (patch)
tree12654b30e62d0819c54abbceae483800d1d608d1 /src/kernel
parentSupport files > 4GB (diff)
downloaddnbd3-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.c4
-rw-r--r--src/kernel/core.c5
-rw-r--r--src/kernel/dnbd3.h1
-rw-r--r--src/kernel/net.c9
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 */