aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nlplug-findfs.c31
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;
}
}