diff options
Diffstat (limited to 'src/udev/udevd.c')
-rw-r--r-- | src/udev/udevd.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/udev/udevd.c b/src/udev/udevd.c index db935d6095..c5dd739c94 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -74,6 +74,7 @@ static bool reload; static int children; static int children_max; static int exec_delay; +static int event_timeout = 30; static sigset_t sigmask_orig; static UDEV_LIST(event_list); static UDEV_LIST(worker_list); @@ -312,6 +313,9 @@ static void worker_new(struct event *event) } } + if (event_timeout != 30) + udev_event->timeout_usec = event_timeout * USEC_PER_SEC; + /* apply rules, create node, symlinks */ udev_event_execute_rules(udev_event, rules, &sigmask_orig); @@ -1009,6 +1013,8 @@ static void kernel_cmdline_options(struct udev *udev) children_max = strtoul(opt + 18, NULL, 0); } else if (startswith(opt, "udev.exec-delay=")) { exec_delay = strtoul(opt + 16, NULL, 0); + } else if (startswith(opt, "udev.event-timeout=")) { + event_timeout = strtoul(opt + 16, NULL, 0); } free(s); @@ -1026,6 +1032,7 @@ int main(int argc, char *argv[]) { "debug", no_argument, NULL, 'D' }, { "children-max", required_argument, NULL, 'c' }, { "exec-delay", required_argument, NULL, 'e' }, + { "event-timeout", required_argument, NULL, 't' }, { "resolve-names", required_argument, NULL, 'N' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, @@ -1069,6 +1076,9 @@ int main(int argc, char *argv[]) case 'e': exec_delay = strtoul(optarg, NULL, 0); break; + case 't': + event_timeout = strtoul(optarg, NULL, 0); + break; case 'D': debug = true; log_set_max_level(LOG_DEBUG); @@ -1406,7 +1416,7 @@ int main(int argc, char *argv[]) if (worker->state != WORKER_RUNNING) continue; - if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > 30 * USEC_PER_SEC) { + if ((now(CLOCK_MONOTONIC) - worker->event_start_usec) > event_timeout * USEC_PER_SEC) { log_error("worker [%u] %s timeout; kill it", worker->pid, worker->event ? worker->event->devpath : "<idle>"); kill(worker->pid, SIGKILL); |