diff options
-rw-r--r-- | libmultipath/uevent.c | 8 | ||||
-rw-r--r-- | libmultipath/uevent.h | 1 | ||||
-rw-r--r-- | multipathd/cli.c | 2 | ||||
-rw-r--r-- | multipathd/cli.h | 2 | ||||
-rw-r--r-- | multipathd/cli_handlers.c | 33 | ||||
-rw-r--r-- | multipathd/cli_handlers.h | 1 | ||||
-rw-r--r-- | multipathd/main.c | 1 | ||||
-rw-r--r-- | multipathd/multipathd.8 | 4 |
8 files changed, 52 insertions, 0 deletions
diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c index f18c20b..d8f3647 100644 --- a/libmultipath/uevent.c +++ b/libmultipath/uevent.c @@ -52,6 +52,12 @@ pthread_mutex_t uevc_lock, *uevc_lockp = &uevc_lock; pthread_cond_t uev_cond, *uev_condp = &uev_cond; uev_trigger *my_uev_trigger; void * my_trigger_data; +int servicing_uev; + +int is_uevent_busy(void) +{ + return (uevqhp != NULL || servicing_uev); +} static struct uevent * alloc_uevent (void) { @@ -96,7 +102,9 @@ uevq_thread(void * et) while (1) { pthread_mutex_lock(uevc_lockp); + servicing_uev = 0; pthread_cond_wait(uev_condp, uevc_lockp); + servicing_uev = 1; pthread_mutex_unlock(uevc_lockp); service_uevq(); diff --git a/libmultipath/uevent.h b/libmultipath/uevent.h index 55ce42c..e1a1254 100644 --- a/libmultipath/uevent.h +++ b/libmultipath/uevent.h @@ -17,3 +17,4 @@ struct uevent { int uevent_listen(int (*store_uev)(struct uevent *, void * trigger_data), void * trigger_data); +int is_uevent_busy(void); diff --git a/multipathd/cli.c b/multipathd/cli.c index 208a0ad..741e3d6 100644 --- a/multipathd/cli.c +++ b/multipathd/cli.c @@ -174,6 +174,7 @@ load_keys (void) r += add_key(keys, "devices", DEVICES, 0); r += add_key(keys, "format", FMT, 1); r += add_key(keys, "wildcards", WILDCARDS, 0); + r += add_key(keys, "count", COUNT, 0); r += add_key(keys, "quit", QUIT, 0); r += add_key(keys, "exit", QUIT, 0); @@ -443,6 +444,7 @@ cli_init (void) { add_handler(RESTOREQ+MAPS, NULL); add_handler(REINSTATE+PATH, NULL); add_handler(FAIL+PATH, NULL); + add_handler(COUNT+PATHS, NULL); add_handler(QUIT, NULL); return 0; diff --git a/multipathd/cli.h b/multipathd/cli.h index f22d459..05de4e3 100644 --- a/multipathd/cli.h +++ b/multipathd/cli.h @@ -23,6 +23,7 @@ enum { __BLACKLIST, __DEVICES, __FMT, + __COUNT, __WILDCARDS, __QUIT, }; @@ -51,6 +52,7 @@ enum { #define BLACKLIST (1 << __BLACKLIST) #define DEVICES (1 << __DEVICES) #define FMT (1 << __FMT) +#define COUNT (1 << __COUNT) #define WILDCARDS (1 << __WILDCARDS) #define QUIT (1 << __QUIT) diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index 71a73ff..0542fde 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -18,6 +18,29 @@ #include "main.h" #include "cli.h" +#include "uevent.h" + +int +count_paths(char **r, int *l, struct vectors *vecs) +{ + int i, len; + struct path *pp; + char * reply; + unsigned int maxlen = INITIAL_REPLY_LEN; + int monitored_count = 0; + + reply = MALLOC(maxlen); + if (!reply) + return 1; + vector_foreach_slot(vecs->pathvec, pp, i) + if (pp->fd != -1) + monitored_count++; + len = sprintf(reply, "Paths: %d\nBusy: %s\n", monitored_count, + is_uevent_busy()? "True" : "False"); + *r = reply; + *l = len + 1; + return 0; +} int show_paths (char ** r, int * len, struct vectors * vecs, char * style) @@ -176,6 +199,16 @@ cli_list_config (void * v, char ** reply, int * len, void * data) } int +cli_count_paths (void * v, char ** reply, int * len, void * data) +{ + struct vectors * vecs = (struct vectors *)data; + + condlog(3, "count paths (operator)"); + + return count_paths(reply, len, vecs); +} + +int cli_list_paths (void * v, char ** reply, int * len, void * data) { struct vectors * vecs = (struct vectors *)data; diff --git a/multipathd/cli_handlers.h b/multipathd/cli_handlers.h index b3ad377..71009b7 100644 --- a/multipathd/cli_handlers.h +++ b/multipathd/cli_handlers.h @@ -25,5 +25,6 @@ int cli_restore_all_queueing(void * v, char ** reply, int * len, void * data); int cli_suspend(void * v, char ** reply, int * len, void * data); int cli_resume(void * v, char ** reply, int * len, void * data); int cli_reinstate(void * v, char ** reply, int * len, void * data); +int cli_count_paths(void * v, char ** reply, int * len, void * data); int cli_fail(void * v, char ** reply, int * len, void * data); int cli_quit(void * v, char ** reply, int * len, void * data); diff --git a/multipathd/main.c b/multipathd/main.c index c247c43..d2c2cc3 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -783,6 +783,7 @@ uxlsnrloop (void * ap) set_handler_callback(RESTOREQ+MAP, cli_restore_queueing); set_handler_callback(DISABLEQ+MAPS, cli_disable_all_queueing); set_handler_callback(RESTOREQ+MAPS, cli_restore_all_queueing); + set_handler_callback(COUNT+PATHS, cli_count_paths); set_handler_callback(QUIT, cli_quit); umask(077); diff --git a/multipathd/multipathd.8 b/multipathd/multipathd.8 index a2d71d8..5ab7330 100644 --- a/multipathd/multipathd.8 +++ b/multipathd/multipathd.8 @@ -69,6 +69,10 @@ Add a path to the list of monitored paths. $path is as listed in /sys/block (e.g .B remove|del path $path Stop monitoring a path. $path is as listed in /sys/block (e.g. sda). .TP +.B count paths +Show the number of monitored paths, and whether multipathd is currently +handling a uevent. +.TP .B add map $map Add a multipath device to the list of monitored devices. $map can either be a device-mapper device as listed in /sys/block (e.g. dm-0) or it can be the alias for the multipath device (e.g. mpath1) or the uid of the multipath device (e.g. 36005076303ffc56200000000000010aa). .TP |