diff options
Diffstat (limited to 'nlplug-findfs.c')
-rw-r--r-- | nlplug-findfs.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/nlplug-findfs.c b/nlplug-findfs.c index b11b7b8..7a3a136 100644 --- a/nlplug-findfs.c +++ b/nlplug-findfs.c @@ -40,6 +40,7 @@ #include "arg.h" +#define MAX_EVENT_TIMEOUT 5000 #define DEFAULT_EVENT_TIMEOUT 250 /* usb mass storage needs 1 sec to settle */ #define USB_STORAGE_TIMEOUT 1000 @@ -204,6 +205,7 @@ struct ueventconf { char *bootrepos; char *apkovls; int timeout; + int usb_storage_timeout; int efd; unsigned running_threads; pthread_t cryptsetup_tid; @@ -682,8 +684,6 @@ static int searchdev(struct uevent *ev, const char *searchdev, char *bootrepos, static int dispatch_uevent(struct uevent *ev, struct ueventconf *conf) { - static int timeout_increment = USB_STORAGE_TIMEOUT; - if (conf->subsystem_filter && ev->subsystem && strcmp(ev->subsystem, conf->subsystem_filter) != 0) { dbg("subsystem '%s' filtered out (by '%s').", @@ -701,10 +701,8 @@ static int dispatch_uevent(struct uevent *ev, struct ueventconf *conf) conf->modalias_count++; /* increase timeout so usb drives gets time to settle */ - if (strcmp(buf, "usb_storage") == 0) { - conf->timeout += timeout_increment; - timeout_increment = 0; - } + if (strcmp(buf, "usb_storage") == 0) + conf->usb_storage_timeout = USB_STORAGE_TIMEOUT; } else if (ev->devname != NULL) { if (conf->program_argv[0] != NULL) { @@ -842,6 +840,7 @@ int main(int argc, char *argv[]) size_t total_bytes = 0; int found = 0; int not_found_is_ok = 0; + int timeout = DEFAULT_EVENT_TIMEOUT; char *program_argv[2] = {0,0}; pthread_t tid; sigset_t sigchldmask; @@ -853,7 +852,8 @@ int main(int argc, char *argv[]) memset(&conf, 0, sizeof(conf)); conf.program_argv = program_argv; - conf.timeout = DEFAULT_EVENT_TIMEOUT; + conf.timeout = MAX_EVENT_TIMEOUT; + conf.usb_storage_timeout = 0; use_lvm = access(LVM_PATH, X_OK) == 0; use_mdadm = access(MDADM_PATH, X_OK) == 0; @@ -890,7 +890,7 @@ int main(int argc, char *argv[]) conf.program_argv[0] = EARGF(usage(1)); break; case 't': - conf.timeout = atoi(EARGF(usage(1))); + timeout = atoi(EARGF(usage(1))); break; default: usage(1); @@ -921,14 +921,15 @@ int main(int argc, char *argv[]) conf.running_threads |= TRIGGER_THREAD; while (1) { - r = poll(fds, numfds, (spawn_active(&spawnmgr) || conf.running_threads) ? -1 : conf.timeout); + int t = conf.timeout + conf.usb_storage_timeout; + r = poll(fds, numfds, (spawn_active(&spawnmgr) || conf.running_threads) ? -1 : t); if (r == -1) { if (errno == EINTR || errno == ERESTART) continue; err(1, "poll"); } if (r == 0) { - dbg("exit due to timeout (%i)", conf.timeout); + dbg("exit due to timeout (%i)", t); break; } @@ -977,9 +978,19 @@ int main(int argc, char *argv[]) if ((found & FOUND_DEVICE) || ((found & FOUND_BOOTREPO) && (found & FOUND_APKOVL))) { + /* we have found everything we need, so no + no need to wait for anything new event */ if (conf.timeout) dbg("FOUND! setting timeout to 0"); conf.timeout = 0; + conf.usb_storage_timeout= 0; + } else if ((found & FOUND_BOOTREPO) && conf.timeout) { + /* we have found boot repo, but not apkovl + we reduce timeout to default timeout */ + if (conf.timeout != timeout) + dbg("Setting timeout to %d", + timeout); + conf.timeout = timeout; } } |