From: Lennart Poettering Date: Mon, 12 Oct 2020 16:18:33 +0000 (+0200) Subject: udev-util: use absolute rather than relative timeout when waiting for devices X-Git-Tag: v247-rc1~13^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e3d90671edbdb69393818d2b755597f84518975;p=thirdparty%2Fsystemd.git udev-util: use absolute rather than relative timeout when waiting for devices This makes it easier to accurately wait for a overall deadline. --- diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 7f93229f591..27217183813 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -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; diff --git a/src/shared/udev-util.c b/src/shared/udev-util.c index 98bbfb2ae34..33272de4bcc 100644 --- a/src/shared/udev-util.c +++ b/src/shared/udev-util.c @@ -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) { diff --git a/src/shared/udev-util.h b/src/shared/udev-util.h index 04c7ce55203..58803ea5226 100644 --- a/src/shared/udev-util.h +++ b/src/shared/udev-util.h @@ -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); diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c index ae6d8caf54e..27e9a226cbf 100644 --- a/src/udev/udevadm-info.c +++ b/src/udev/udevadm-info.c @@ -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;