udev-util: use absolute rather than relative timeout when waiting for devices
This makes it easier to accurately wait for a overall deadline.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user