reset/sanlk_reset.c | 5 ++++-
reset/sanlk_resetd.c | 39 ++++++++++++++++++++++++++++++++++++---
2 files changed, 40 insertions(+), 4 deletions(-)
New commits:
commit 111109e3e74584ec7cbccfbdeb85dcbe1d81dcab
Author: David Teigland <teigland(a)redhat.com>
Date: Mon Aug 11 12:10:21 2014 -0500
reset: add ability to clear all
"sanlk-reset clear all" will unregister all names.
Also, register for an ls name that already exists
will result in sanlk-resetd doing end, then reg.
Signed-off-by: David Teigland <teigland(a)redhat.com>
diff --git a/reset/sanlk_reset.c b/reset/sanlk_reset.c
index ddd7af2..a69d1e3 100644
--- a/reset/sanlk_reset.c
+++ b/reset/sanlk_reset.c
@@ -463,6 +463,9 @@ static void usage(void)
printf("Update the local sanlk-resetd to not watch lockspaces for reset
events:\n");
printf("%s end lockspace_name ...\n", prog_name);
printf("\n");
+ printf("Update the local sanlk-resetd to clear all lockspaces being
watched:\n");
+ printf("%s clear all\n", prog_name);
+ printf("\n");
printf("Reset another host through a lockspace it is watching:\n");
printf("%s reset lockspace_name:host_id ...\n", prog_name);
printf(" --host-id | -i <num>\n");
@@ -562,7 +565,7 @@ int main(int argc, char *argv[])
* Update local sanlk-resetd.
*/
- if (!strcmp(cmd, "reg") || !strcmp(cmd, "end")) {
+ if (!strcmp(cmd, "reg") || !strcmp(cmd, "end") || !strcmp(cmd,
"clear")) {
return update_local_daemon(cmd);
}
diff --git a/reset/sanlk_resetd.c b/reset/sanlk_resetd.c
index 0c0c0f8..c9deedb 100644
--- a/reset/sanlk_resetd.c
+++ b/reset/sanlk_resetd.c
@@ -251,6 +251,21 @@ static void set_event_out(char *ls_name, uint64_t event_out, uint64_t
from_host,
log_error("set_event error %d ls %s", rv, ls_name);
}
+static int find_ls(char *name)
+{
+ int i;
+
+ for (i = 0; i < MAX_LS; i++) {
+ if (!ls_names[i])
+ continue;
+
+ if (!strcmp(name, ls_names[i]))
+ return i;
+ }
+
+ return -1;
+}
+
static int register_ls(int i)
{
int fd;
@@ -260,12 +275,12 @@ static int register_ls(int i)
fd = sanlock_reg_event(ls_names[i], NULL, 0);
if (fd < 0) {
- log_error("reg_event error %d ls %s", fd, ls_names[i]);
+ log_error("reg_event %d error %d ls %s", i, fd, ls_names[i]);
free(ls_names[i]);
ls_names[i] = NULL;
return fd;
} else {
- log_debug("reg_event fd %d ls %s", fd, ls_names[i]);
+ log_debug("reg_event %d fd %d ls %s", i, fd, ls_names[i]);
ls_fd[i] = fd;
pollfd[i].fd = fd;
pollfd[i].events = POLLIN;
@@ -276,6 +291,7 @@ static int register_ls(int i)
static void unregister_ls(int i)
{
+ log_debug("end_event %d fd %d ls %s", i, ls_fd[i], ls_names[i]);
sanlock_end_event(ls_fd[i], ls_names[i], 0);
free(ls_names[i]);
ls_names[i] = NULL;
@@ -458,7 +474,7 @@ static void process_update(int fd)
return;
}
- buf[UPDATE_SIZE] = '\0';
+ buf[UPDATE_SIZE-1] = '\0';
rv = sscanf(buf, "%s %s", cmd, name);
if (rv != 2) {
@@ -469,6 +485,15 @@ static void process_update(int fd)
if (!strcmp(cmd, "reg")) {
log_debug("process_update reg %s", name);
+ /* if the name exists, end then reg */
+ i = find_ls(name);
+ if (i > -1) {
+ unregister_ls(i);
+ ls_names[i] = strdup(name);
+ register_ls(i);
+ return;
+ }
+
for (i = 0; i < MAX_LS; i++) {
if (ls_names[i])
continue;
@@ -487,6 +512,14 @@ static void process_update(int fd)
unregister_ls(i);
return;
}
+ } else if (!strcmp(cmd, "clear")) {
+ log_debug("process_update clear %s", name);
+
+ for (i = 0; i < MAX_LS; i++) {
+ if (!ls_names[i])
+ continue;
+ unregister_ls(i);
+ }
} else {
log_debug("process_update cmd unknown");
}