From: Yu Watanabe Date: Fri, 2 Sep 2022 17:05:30 +0000 (+0900) Subject: udevadm-wait: wait for two periodic timer triggered before exit X-Git-Tag: v252-rc1~247^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6bb2e5189979d6888dffefad1ede39210ace2b0;p=thirdparty%2Fsystemd.git udevadm-wait: wait for two periodic timer triggered before exit --- diff --git a/src/udev/udevadm-wait.c b/src/udev/udevadm-wait.c index f0c28a7905a..53fdacb867d 100644 --- a/src/udev/udevadm-wait.c +++ b/src/udev/udevadm-wait.c @@ -257,6 +257,7 @@ static int setup_timer(sd_event *event) { static int reset_timer(sd_event *e, sd_event_source **s); static int on_periodic_timer(sd_event_source *s, uint64_t usec, void *userdata) { + static unsigned counter = 0; sd_event *e; int r; @@ -264,9 +265,16 @@ static int on_periodic_timer(sd_event_source *s, uint64_t usec, void *userdata) e = sd_event_source_get_event(s); - r = check_and_exit(e); - if (r != 0) - return r; + /* Even if all devices exists, we try to wait for uevents to be emitted from kernel. */ + if (check()) + counter++; + else + counter = 0; + + if (counter >= 2) { + log_debug("All requested devices popped up without receiving kernel uevents."); + return sd_event_exit(e, 0); + } r = reset_timer(e, &s); if (r < 0) @@ -290,6 +298,11 @@ static int setup_periodic_timer(sd_event *event) { if (r < 0) return r; + /* Set the lower priority than device monitor, to make uevents always dispatched first. */ + r = sd_event_source_set_priority(s, SD_EVENT_PRIORITY_NORMAL + 1); + if (r < 0) + return r; + return sd_event_source_set_floating(s, true); }