]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-util: use absolute rather than relative timeout when waiting for devices
authorLennart Poettering <lennart@poettering.net>
Mon, 12 Oct 2020 16:18:33 +0000 (18:18 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 22 Oct 2020 12:58:28 +0000 (14:58 +0200)
This makes it easier to accurately wait for a overall deadline.

src/shared/dissect-image.c
src/shared/udev-util.c
src/shared/udev-util.h
src/udev/udevadm-info.c

index 7f93229f59134cccf65e2f13836c81e472d0acd6..2721718381361cfed4cdf22ab319ae14bc5bff0b 100644 (file)
@@ -1726,7 +1726,7 @@ static int verity_partition(
                         if (r == 0) {
                                 /* devmapper might say that the device exists, but the devlink might not yet have been
                                  * created. Check and wait for the udev event in that case. */
-                                r = device_wait_for_devlink(node, "block", 100 * USEC_PER_MSEC, NULL);
+                                r = device_wait_for_devlink(node, "block", usec_add(now(CLOCK_MONOTONIC), 100 * USEC_PER_MSEC), NULL);
                                 /* Fallback to activation with a unique device if it's taking too long */
                                 if (r == -ETIMEDOUT)
                                         break;
index 98bbfb2ae3444ebc3b0cc61d930b50061f076b39..33272de4bcc741e6a45c3019c842cca69f02403d 100644 (file)
@@ -195,8 +195,9 @@ static int device_wait_for_initialization_internal(
                 sd_device *_device,
                 const char *devlink,
                 const char *subsystem,
-                usec_t timeout,
+                usec_t deadline,
                 sd_device **ret) {
+
         _cleanup_(sd_device_monitor_unrefp) sd_device_monitor *monitor = NULL;
         _cleanup_(sd_event_source_unrefp) sd_event_source *timeout_source = NULL;
         _cleanup_(sd_event_unrefp) sd_event *event = NULL;
@@ -256,10 +257,10 @@ static int device_wait_for_initialization_internal(
         if (r < 0)
                 return log_error_errno(r, "Failed to start device monitor: %m");
 
-        if (timeout != USEC_INFINITY) {
-                r = sd_event_add_time_relative(
+        if (deadline != USEC_INFINITY) {
+                r = sd_event_add_time(
                                 event, &timeout_source,
-                                CLOCK_MONOTONIC, timeout, 0,
+                                CLOCK_MONOTONIC, deadline, 0,
                                 NULL, INT_TO_PTR(-ETIMEDOUT));
                 if (r < 0)
                         return log_error_errno(r, "Failed to add timeout event source: %m");
@@ -287,12 +288,12 @@ static int device_wait_for_initialization_internal(
         return 0;
 }
 
-int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t timeout, sd_device **ret) {
-        return device_wait_for_initialization_internal(device, NULL, subsystem, timeout, ret);
+int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t deadline, sd_device **ret) {
+        return device_wait_for_initialization_internal(device, NULL, subsystem, deadline, ret);
 }
 
-int device_wait_for_devlink(const char *devlink, const char *subsystem, usec_t timeout, sd_device **ret) {
-        return device_wait_for_initialization_internal(NULL, devlink, subsystem, timeout, ret);
+int device_wait_for_devlink(const char *devlink, const char *subsystem, usec_t deadline, sd_device **ret) {
+        return device_wait_for_initialization_internal(NULL, devlink, subsystem, deadline, ret);
 }
 
 int device_is_renaming(sd_device *dev) {
index 04c7ce55203df2d2ef2467dc275b155f3388856d..58803ea5226f4cd55b51537ccbc784169df4489e 100644 (file)
@@ -28,7 +28,7 @@ static inline int udev_parse_config(void) {
         return udev_parse_config_full(NULL, NULL, NULL, NULL, NULL);
 }
 
-int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t timeout, sd_device **ret);
-int device_wait_for_devlink(const char *path, const char *subsystem, usec_t timeout, sd_device **ret);
+int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t deadline, sd_device **ret);
+int device_wait_for_devlink(const char *path, const char *subsystem, usec_t deadline, sd_device **ret);
 int device_is_renaming(sd_device *dev);
 bool device_for_action(sd_device *dev, DeviceAction action);
index ae6d8caf54e02c39c4b5f4245b5523cc9713eb97..27e9a226cbf2de27490a3d5736ea4e6e8bad9dbb 100644 (file)
@@ -493,7 +493,11 @@ int info_main(int argc, char *argv[], void *userdata) {
                 if (arg_wait_for_initialization_timeout > 0) {
                         sd_device *d;
 
-                        r = device_wait_for_initialization(device, NULL, arg_wait_for_initialization_timeout, &d);
+                        r = device_wait_for_initialization(
+                                        device,
+                                        NULL,
+                                        usec_add(now(CLOCK_MONOTONIC), arg_wait_for_initialization_timeout),
+                                        &d);
                         if (r < 0)
                                 return r;