From 5469414bf80a321f48cb825250605a2581a627c8 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 9 Jun 2005 18:40:49 +0000 Subject: [PATCH] Timeout event implementation: The daemon side of this is mostly the same as the patch I sent out. To select a timeout period different than the default and to get the timeout period, I added two library calls, dm_set_event_timeout() and dm_get_event_timeout(). If people are against them, the other option is to tack extra arguments onto dm_regiser_for_event() and dm_get_registered_device(). I also added a -t option to dmevent, so people can try out timeouts. --- daemons/dmeventd/dmevent.c | 55 +++++++++++++++++++++++++++----------- libdm/libdm-event.h | 6 +++++ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/daemons/dmeventd/dmevent.c b/daemons/dmeventd/dmevent.c index 0874c8bd9..9ea63d6ab 100644 --- a/daemons/dmeventd/dmevent.c +++ b/daemons/dmeventd/dmevent.c @@ -30,6 +30,7 @@ static enum event_type events = ALL_ERRORS; /* All until we can distinguish. */ static char default_dso_name[] = "noop"; /* default DSO is noop */ static int default_reg = 1; /* default action is register */ +static uint32_t timeout; /* Display help. */ static void print_usage(char *name) @@ -45,6 +46,7 @@ static void print_usage(char *name) " -h Print this usage.\n" " -l List registered devices.\n" " -r Register for event (default).\n" + " -t (un)register for timeout event.\n" " -u Unregister for event.\n" "\n", cmd); } @@ -54,7 +56,7 @@ static int parse_argv(int argc, char **argv, char **dso_name_arg, char **device_arg, int *reg, int *list) { int c; - const char *options = "d:hlru"; + const char *options = "d:hlrt:u"; while ((c = getopt(argc, argv, options)) != -1) { switch (c) { @@ -70,6 +72,14 @@ static int parse_argv(int argc, char **argv, char **dso_name_arg, case 'r': *reg = 1; break; + case 't': + events = TIMEOUT; + if (sscanf(optarg, "%"SCNu32, &timeout) != 1){ + fprintf(stderr, "invalid timeout '%s'\n", + optarg); + timeout = 0; + } + break; case 'u': *reg = 0; break; @@ -119,19 +129,25 @@ int main(int argc, char **argv) multilog_init_verbose(standard, _LOG_DEBUG); if (list) { - do { - if (!(ret= dm_get_registered_device(&dso_name, - &device, - &events, next))) { - printf("%s %s 0x%x\n", - dso_name, device, events); + while (1) { + if ((ret= dm_get_registered_device(&dso_name, &device, + &events, next))) + break; + printf("%s %s 0x%x", dso_name, device, events); + if (events & TIMEOUT){ + if ((ret = dm_get_event_timeout(device, + &timeout))) { + ret = EXIT_FAILURE; + goto out; + } + printf(" %"PRIu32"\n", timeout); + } else + printf("\n"); + if (device_arg) + break; - if (device_arg) - break; - - next = 1; - } - } while (!ret); + next = 1; + } ret = (ret && device_arg) ? EXIT_FAILURE : EXIT_SUCCESS; goto out; @@ -143,9 +159,16 @@ int main(int argc, char **argv) reg ? "": "un", device, strerror(-ret)); ret = EXIT_FAILURE; } else { - printf("%s %sregistered successfully.\n", - device, reg ? "" : "un"); - ret = EXIT_SUCCESS; + if (reg && (events & TIMEOUT) && + ((ret = dm_set_event_timeout(device, timeout)))){ + fprintf(stderr, "Failed to set timeout for %s: %s\n", + device, strerror(-ret)); + ret = EXIT_FAILURE; + } else { + printf("%s %sregistered successfully.\n", + device, reg ? "" : "un"); + ret = EXIT_SUCCESS; + } } out: diff --git a/libdm/libdm-event.h b/libdm/libdm-event.h index a257b7f0f..d92eb71e2 100644 --- a/libdm/libdm-event.h +++ b/libdm/libdm-event.h @@ -25,6 +25,7 @@ #define FIFO_SERVER "/var/run/dmeventd-server" #define PIDFILE "/var/run/dmeventd.pid" +#define DEFAULT_TIMEOUT 10 /* Commands for the daemon passed in the message below. */ enum dmeventd_command { CMD_ACTIVE = 1, @@ -32,6 +33,8 @@ enum dmeventd_command { CMD_UNREGISTER_FOR_EVENT, CMD_GET_REGISTERED_DEVICE, CMD_GET_NEXT_REGISTERED_DEVICE, + CMD_SET_TIMEOUT, + CMD_GET_TIMEOUT, }; /* Message passed between client and daemon. */ @@ -60,6 +63,7 @@ enum event_type { PATH_ERROR = 0x10, /* Failure on an io path. */ ADAPTOR_ERROR = 0x20, /* Failure off a host adaptor. */ SYNC_STATUS = 0x40, /* Mirror synchronization completed/failed. */ + TIMEOUT = 0x80, /* Timeout has occured */ }; #define ALL_ERRORS (SECTOR_ERROR | DEVICE_ERROR | PATH_ERROR | ADAPTOR_ERROR) @@ -69,6 +73,8 @@ int dm_unregister_for_event(char *dso_name, char *device, enum event_type events); int dm_get_registered_device(char **dso_name, char **device, enum event_type *events, int next); +int dm_set_event_timeout(char *device, uint32_t timeout); +int dm_get_event_timeout(char *device, uint32_t *timeout); /* Prototypes for DSO interface. */ void process_event(char *device, enum event_type event);