You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.1 KiB
53 lines
2.1 KiB
From b2575f7d4f06ab9df5c5744e0324160effda437e Mon Sep 17 00:00:00 2001 |
|
From: Nir Soffer <nirsof@gmail.com> |
|
Date: Wed, 8 Apr 2015 04:04:16 +0300 |
|
Subject: [PATCH] udev: restore udevadm settle timeout |
|
|
|
Commit 9ea28c55a2 (udev: remove seqnum API and all assumptions about |
|
seqnums) introduced a regresion, ignoring the timeout option when |
|
waiting until the event queue is empty. |
|
|
|
Previously, if the udev event queue was not empty when the timeout was |
|
expired, udevadm settle was returning with exit code 1. To check if the |
|
queue is empty, you could invoke udevadm settle with timeout=0. This |
|
patch restores the previous behavior. |
|
|
|
(David: fixed timeout==0 handling and dropped redundant assignment) |
|
|
|
Cherry-picked from: 0736455b1186c9515e0f093e1e686e684d225787 |
|
Resolves: #1210981 |
|
--- |
|
src/udev/udevadm-settle.c | 6 ++++++ |
|
1 file changed, 6 insertions(+) |
|
|
|
diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c |
|
index fff5de7a8b..e60c4623bd 100644 |
|
--- a/src/udev/udevadm-settle.c |
|
+++ b/src/udev/udevadm-settle.c |
|
@@ -56,6 +56,7 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { |
|
{ "quiet", no_argument, NULL, 'q' }, /* removed */ |
|
{} |
|
}; |
|
+ usec_t deadline; |
|
const char *exists = NULL; |
|
unsigned int timeout = 120; |
|
struct pollfd pfd[1] = { {.fd = -1}, }; |
|
@@ -105,6 +106,8 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { |
|
return EXIT_FAILURE; |
|
} |
|
|
|
+ deadline = now(CLOCK_MONOTONIC) + timeout * USEC_PER_SEC; |
|
+ |
|
/* guarantee that the udev daemon isn't pre-processing */ |
|
if (getuid() == 0) { |
|
struct udev_ctrl *uctrl; |
|
@@ -146,6 +149,9 @@ static int adm_settle(struct udev *udev, int argc, char *argv[]) { |
|
break; |
|
} |
|
|
|
+ if (timeout > 0 && now(CLOCK_MONOTONIC) >= deadline) |
|
+ break; |
|
+ |
|
/* wake up when queue is empty */ |
|
if (poll(pfd, 1, MSEC_PER_SEC) > 0 && pfd[0].revents & POLLIN) |
|
udev_queue_flush(queue);
|
|
|