summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorsr2012-09-02 18:49:16 +0200
committersr2012-09-02 18:49:16 +0200
commit8c0712acf701925fa36ca85a548d56a7851543c5 (patch)
treeb5f24197c09549f91c0c1d6de0ed1dc99cf96e0a /src/kernel
parent[KERNEL] Fix off-by-one error (diff)
downloaddnbd3-8c0712acf701925fa36ca85a548d56a7851543c5.tar.gz
dnbd3-8c0712acf701925fa36ca85a548d56a7851543c5.tar.xz
dnbd3-8c0712acf701925fa36ca85a548d56a7851543c5.zip
[SERVER] Add list of trusted servers and namespaces (load, display)
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/net.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 57279d6..b116ad6 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -124,6 +124,8 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
struct timeval timeout;
+ char get_servers = 0, set_client = 0;
+
timeout.tv_sec = SOCKET_TIMEOUT_CLIENT_DATA;
timeout.tv_usec = 0;
@@ -136,11 +138,21 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0]));
if (!dev->is_server)
{
- req1 = kmalloc(sizeof(*req1), GFP_ATOMIC);
- if (!req1)
- error_dev("FATAL: Kmalloc(1) failed.");
+ get_servers = 1;
}
}
+ if (dev->better_sock)
+ {
+ set_client = 1;
+ }
+
+ if (get_servers || set_client)
+ {
+ req1 = kmalloc(sizeof(*req1), GFP_ATOMIC);
+ if (!req1)
+ error_dev("FATAL: Kmalloc(1) failed.");
+ }
+
if (dev->cur_server.port == 0 || dev->cur_server.hostaddrtype == 0 || dev->imgname == NULL)
error_dev("FATAL: Host, port or image name not set.");
if (dev->sock)
@@ -224,6 +236,7 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
// store image information
set_capacity(dev->disk, dev->reported_size >> 9); /* 512 Byte blocks */
debug_dev_va("INFO: Filesize: %llu.", dev->reported_size);
+ dev->update_available = 0;
}
else // Switching server, connection is already established and size request was executed
{
@@ -236,15 +249,20 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
dev->panic = 0;
dev->panic_count = 0;
- dev->update_available = 0;
- if (req1) // This connection is established to the initial server (from the ioctl call)
+ if (get_servers) // This connection is established to the initial server (from the ioctl call)
{
// Enqueue request to request_queue_send for a fresh list of alt servers
req1->cmd_type = REQ_TYPE_SPECIAL;
req1->cmd_flags = CMD_GET_SERVERS;
list_add(&req1->queuelist, &dev->request_queue_send);
}
+ else if (set_client)
+ {
+ req1->cmd_type = REQ_TYPE_SPECIAL;
+ req1->cmd_flags = CMD_SET_CLIENT_MODE;
+ list_add(&req1->queuelist, &dev->request_queue_send);
+ }
// create required threads
dev->thread_send = kthread_create(dnbd3_net_send, dev, dev->disk->disk_name);