summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohann Latocha2012-04-20 18:14:45 +0200
committerJohann Latocha2012-04-20 18:14:45 +0200
commit99ac0ea56ebcbba6faa8127b1000dc277607c315 (patch)
treee488e43451ca481af4c28ecd661c02dc3b3ce803
parent[SERVER] tcp-cork (diff)
downloaddnbd3-99ac0ea56ebcbba6faa8127b1000dc277607c315.tar.gz
dnbd3-99ac0ea56ebcbba6faa8127b1000dc277607c315.tar.xz
dnbd3-99ac0ea56ebcbba6faa8127b1000dc277607c315.zip
[KERNEL] Notify if new release available (sysfs)
-rw-r--r--src/kernel/blk.c1
-rw-r--r--src/kernel/dnbd3.h2
-rw-r--r--src/kernel/net.c5
-rw-r--r--src/kernel/sysfs.c13
-rw-r--r--src/server/net.c2
5 files changed, 21 insertions, 2 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index 2b12b74..7010ef7 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -42,6 +42,7 @@ int dnbd3_blk_add_device(dnbd3_device_t *dev, int minor)
dev->vid = 0;
dev->rid = 0;
+ dev->update_available = 0;
dev->alt_servers_num = 0;
memset(dev->alt_servers, 0, sizeof(dnbd3_server_t)*NUMBER_SERVERS);
dev->thread_send = NULL;
diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h
index cdc70a8..038cfb6 100644
--- a/src/kernel/dnbd3.h
+++ b/src/kernel/dnbd3.h
@@ -52,7 +52,7 @@ typedef struct
// network
dnbd3_server_t cur_server;
- int vid, rid;
+ int vid, rid, update_available;
int alt_servers_num;
dnbd3_server_t alt_servers[NUMBER_SERVERS];
int discover, panic;
diff --git a/src/kernel/net.c b/src/kernel/net.c
index b7bba0f..838e18b 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -75,6 +75,7 @@ void dnbd3_net_connect(dnbd3_device_t *dev)
dev->panic = 0;
dev->alt_servers_num = 0;
+ dev->update_available = 0;
// enqueue request to request_queue_send (ask alt servers)
@@ -554,6 +555,10 @@ int dnbd3_net_receive(void *data)
list_del_init(&blk_request->queuelist);
spin_unlock_irq(&dev->blk_lock);
kfree(blk_request);
+
+ if (dev->rid < dnbd3_reply.rid)
+ dev->update_available = 1;
+
continue;
default:
diff --git a/src/kernel/sysfs.c b/src/kernel/sysfs.c
index 43fbe8f..fe4321e 100644
--- a/src/kernel/sysfs.c
+++ b/src/kernel/sysfs.c
@@ -63,6 +63,11 @@ ssize_t show_rid(char *buf, dnbd3_device_t *dev)
return sprintf(buf, "%d\n", dev->rid);
}
+ssize_t show_update_available(char *buf, dnbd3_device_t *dev)
+{
+ return sprintf(buf, "%d\n", dev->update_available);
+}
+
ssize_t show_alt_server_ip(char *buf, dnbd3_server_t *srv)
{
return sprintf(buf, "%s\n", srv->host);
@@ -108,6 +113,13 @@ device_attr_t rid =
.store = NULL,
};
+device_attr_t update_available =
+{
+ .attr = {.name = "update_available", .mode = 0444 },
+ .show = show_update_available,
+ .store = NULL,
+};
+
server_attr_t alt_server_ip =
{
.attr = {.name = "alt_server_ip", .mode = 0444 },
@@ -143,6 +155,7 @@ struct attribute *device_attrs[] =
&alt_server_num.attr,
&vid.attr,
&rid.attr,
+ &update_available.attr,
NULL,
};
diff --git a/src/server/net.c b/src/server/net.c
index 7fe5a16..ce491dd 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -72,7 +72,7 @@ void *dnbd3_handle_query(void *dnbd3_client)
int num = (image->num_servers < NUMBER_SERVERS) ? image->num_servers : NUMBER_SERVERS;
reply.vid = image->vid;
- reply.rid = image->rid;
+ reply.rid = dnbd3_get_image(request.vid, 0)->rid;
reply.size = num * sizeof(struct in_addr);
send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0);