[systemd-devel] [PATCH] udev: settle should return immediately when timeout is 0

Nir Soffer nirsof at gmail.com
Sat Apr 11 13:31:05 PDT 2015


udevadm manual says:

    A value of 0 will check if the queue is empty and always return
    immediately.

However, currently we ignore the deadline if the value is 0, and wait
without any limit.

Zero timeout behaved according to the documentation until commit
ead7c62ab7 (udevadm: settle - kill alarm()). Looking at this patch, it
seems that the behavior change was unintended.

This patch restores the documented behavior.
---
 src/udev/udevadm-settle.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c
index 2c84ada..0c9c1d9 100644
--- a/src/udev/udevadm-settle.c
+++ b/src/udev/udevadm-settle.c
@@ -49,7 +49,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                 { "quiet",          no_argument,       NULL, 'q' }, /* removed */
                 {}
         };
-        usec_t deadline;
+        usec_t deadline = 0;
         const char *exists = NULL;
         unsigned int timeout = 120;
         struct pollfd pfd[1] = { {.fd = -1}, };
@@ -99,7 +99,8 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        deadline = now(CLOCK_MONOTONIC) + timeout * USEC_PER_SEC;
+        if (timeout != 0)
+                deadline = now(CLOCK_MONOTONIC) + timeout * USEC_PER_SEC;
 
         /* guarantee that the udev daemon isn't pre-processing */
         if (getuid() == 0) {
@@ -142,7 +143,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) {
                         break;
                 }
 
-                if (timeout > 0 && now(CLOCK_MONOTONIC) >= deadline)
+                if (timeout == 0 || now(CLOCK_MONOTONIC) >= deadline)
                         break;
 
                 /* wake up when queue is empty */
-- 
1.9.3



More information about the systemd-devel mailing list