summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFrantisek Sumsal <frantisek@sumsal.cz>2022-08-31 18:03:00 +0000
committerGitHub <noreply@github.com>2022-08-31 18:03:00 +0000
commit47190275cfc937acb40a7dd99b2cbeccefc731ae (patch)
tree3b80c652b50c1fe524cd5b9574725fb92d4b651a /src
parenta9f1bf409ffccd39f0f30cfbd27fb650453f895d (diff)
parent39fdc6f82d144e617c6768084f512c938ca2ccca (diff)
downloadsystemd-47190275cfc937acb40a7dd99b2cbeccefc731ae.tar.gz
Merge pull request #24515 from yuwata/dissect-timeout
dissect-image: extend timeout for waiting devlink
Diffstat (limited to 'src')
-rw-r--r--src/shared/dissect-image.c21
-rw-r--r--src/shared/udev-util.c57
-rw-r--r--src/shared/udev-util.h4
-rw-r--r--src/udev/udevadm-info.c2
4 files changed, 39 insertions, 45 deletions
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c
index 87712abfb3..4782330a0c 100644
--- a/src/shared/dissect-image.c
+++ b/src/shared/dissect-image.c
@@ -2055,9 +2055,28 @@ static int verity_partition(
if (!IN_SET(r, 0, -ENODEV, -ENOENT, -EBUSY))
return log_debug_errno(r, "Checking whether existing verity device %s can be reused failed: %m", node);
if (r == 0) {
+ usec_t timeout_usec = 100 * USEC_PER_MSEC;
+ const char *e;
+
+ /* On slower machines, like non-KVM vm, setting up device may take a long time.
+ * Let's make the timeout configurable. */
+ e = getenv("SYSTEMD_DISSECT_VERITY_TIMEOUT_SEC");
+ if (e) {
+ usec_t t;
+
+ r = parse_sec(e, &t);
+ if (r < 0)
+ log_debug_errno(r,
+ "Failed to parse timeout specified in $SYSTEMD_DISSECT_VERITY_TIMEOUT_SEC, "
+ "using the default timeout (%s).",
+ FORMAT_TIMESPAN(timeout_usec, USEC_PER_MSEC));
+ else
+ timeout_usec = t;
+ }
+
/* 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", usec_add(now(CLOCK_MONOTONIC), 100 * USEC_PER_MSEC), NULL);
+ r = device_wait_for_devlink(node, "block", timeout_usec, 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 3c1a674f57..db3161b5ce 100644
--- a/src/shared/udev-util.c
+++ b/src/shared/udev-util.c
@@ -123,29 +123,6 @@ int udev_parse_config_full(
return 0;
}
-/* Note that if -ENOENT is returned, it will be logged at debug level rather than error,
- * because it's an expected, common occurrence that the caller will handle with a fallback */
-static int device_new_from_dev_path(const char *devlink, sd_device **ret_device) {
- struct stat st;
- int r;
-
- assert(devlink);
-
- if (stat(devlink, &st) < 0)
- return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno,
- "Failed to stat() %s: %m", devlink);
-
- if (!S_ISBLK(st.st_mode))
- return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK),
- "%s does not point to a block device: %m", devlink);
-
- r = sd_device_new_from_stat_rdev(ret_device, &st);
- if (r < 0)
- return log_error_errno(r, "Failed to initialize device from %s: %m", devlink);
-
- return 0;
-}
-
struct DeviceMonitorData {
const char *sysname;
const char *devlink;
@@ -208,11 +185,10 @@ static int device_wait_for_initialization_internal(
sd_device *_device,
const char *devlink,
const char *subsystem,
- usec_t deadline,
+ usec_t timeout_usec,
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;
/* Ensure that if !_device && devlink, device gets unrefd on errors since it will be new */
_cleanup_(sd_device_unrefp) sd_device *device = sd_device_ref(_device);
@@ -225,9 +201,9 @@ static int device_wait_for_initialization_internal(
/* Devlink might already exist, if it does get the device to use the sysname filtering */
if (!device && devlink) {
- r = device_new_from_dev_path(devlink, &device);
- if (r < 0 && r != -ENOENT)
- return r;
+ r = sd_device_new_from_devname(&device, devlink);
+ if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
+ return log_error_errno(r, "Failed to create sd-device object from %s: %m", devlink);
}
if (device) {
@@ -270,21 +246,20 @@ static int device_wait_for_initialization_internal(
if (r < 0)
return log_error_errno(r, "Failed to start device monitor: %m");
- if (deadline != USEC_INFINITY) {
- r = sd_event_add_time(
- event, &timeout_source,
- CLOCK_MONOTONIC, deadline, 0,
+ if (timeout_usec != USEC_INFINITY) {
+ r = sd_event_add_time_relative(
+ event, NULL,
+ CLOCK_MONOTONIC, timeout_usec, 0,
NULL, INT_TO_PTR(-ETIMEDOUT));
if (r < 0)
return log_error_errno(r, "Failed to add timeout event source: %m");
}
- /* Check again, maybe things changed. Udev will re-read the db if the device wasn't initialized
- * yet. */
+ /* Check again, maybe things changed. Udev will re-read the db if the device wasn't initialized yet. */
if (!device && devlink) {
- r = device_new_from_dev_path(devlink, &device);
- if (r < 0 && r != -ENOENT)
- return r;
+ r = sd_device_new_from_devname(&device, devlink);
+ if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
+ return log_error_errno(r, "Failed to create sd-device object from %s: %m", devlink);
}
if (device && sd_device_get_is_initialized(device) > 0) {
if (ret)
@@ -301,12 +276,12 @@ static int device_wait_for_initialization_internal(
return 0;
}
-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_initialization(sd_device *device, const char *subsystem, usec_t timeout_usec, sd_device **ret) {
+ return device_wait_for_initialization_internal(device, NULL, subsystem, timeout_usec, 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_wait_for_devlink(const char *devlink, const char *subsystem, usec_t timeout_usec, sd_device **ret) {
+ return device_wait_for_initialization_internal(NULL, devlink, subsystem, timeout_usec, ret);
}
int device_is_renaming(sd_device *dev) {
diff --git a/src/shared/udev-util.h b/src/shared/udev-util.h
index 43a1b846f4..c3c3dbe842 100644
--- a/src/shared/udev-util.h
+++ b/src/shared/udev-util.h
@@ -36,8 +36,8 @@ 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 deadline, sd_device **ret);
-int device_wait_for_devlink(const char *path, const char *subsystem, usec_t deadline, sd_device **ret);
+int device_wait_for_initialization(sd_device *device, const char *subsystem, usec_t timeout_usec, sd_device **ret);
+int device_wait_for_devlink(const char *path, const char *subsystem, usec_t timeout_usec, sd_device **ret);
int device_is_renaming(sd_device *dev);
bool device_for_action(sd_device *dev, sd_device_action_t action);
diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c
index 04baed2e0c..fccc967a47 100644
--- a/src/udev/udevadm-info.c
+++ b/src/udev/udevadm-info.c
@@ -846,7 +846,7 @@ int info_main(int argc, char *argv[], void *userdata) {
r = device_wait_for_initialization(
device,
NULL,
- usec_add(now(CLOCK_MONOTONIC), arg_wait_for_initialization_timeout),
+ arg_wait_for_initialization_timeout,
&d);
if (r < 0)
return r;