From 99ac0ea56ebcbba6faa8127b1000dc277607c315 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Fri, 20 Apr 2012 18:14:45 +0200 Subject: [KERNEL] Notify if new release available (sysfs) --- src/kernel/blk.c | 1 + src/kernel/dnbd3.h | 2 +- src/kernel/net.c | 5 +++++ src/kernel/sysfs.c | 13 +++++++++++++ src/server/net.c | 2 +- 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); -- cgit v1.2.3-55-g7522