mirror of
https://github.com/systemd/systemd.git
synced 2025-02-01 09:47:35 +03:00
dissect-image: try to open device node before activating
Hopefully decrease the chance that the device is removed soon after it is detected.
This commit is contained in:
parent
12f5fbdf30
commit
f80015ff40
@ -2069,7 +2069,16 @@ static int verity_partition(
|
|||||||
* retry a few times before giving up. */
|
* retry a few times before giving up. */
|
||||||
for (unsigned i = 0; i < N_DEVICE_NODE_LIST_ATTEMPTS; i++) {
|
for (unsigned i = 0; i < N_DEVICE_NODE_LIST_ATTEMPTS; i++) {
|
||||||
_cleanup_(sym_crypt_freep) struct crypt_device *existing_cd = NULL;
|
_cleanup_(sym_crypt_freep) struct crypt_device *existing_cd = NULL;
|
||||||
|
_cleanup_close_ int fd = -1;
|
||||||
|
|
||||||
|
/* First, check if the device already exists. */
|
||||||
|
fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY);
|
||||||
|
if (fd < 0 && !ERRNO_IS_DEVICE_ABSENT(errno))
|
||||||
|
return log_debug_errno(errno, "Failed to open verity device %s: %m", node);
|
||||||
|
if (fd >= 0)
|
||||||
|
goto check; /* The device already exists. Let's check it. */
|
||||||
|
|
||||||
|
/* The symlink to the device node does not exist yet. Assume not activated, and let's activate it. */
|
||||||
r = do_crypt_activate_verity(cd, name, verity);
|
r = do_crypt_activate_verity(cd, name, verity);
|
||||||
if (r >= 0)
|
if (r >= 0)
|
||||||
goto success; /* The device is activated. */
|
goto success; /* The device is activated. */
|
||||||
@ -2087,6 +2096,7 @@ static int verity_partition(
|
|||||||
-EBUSY /* Volume is being opened but not ready, crypt_init_by_name() can fetch details. */))
|
-EBUSY /* Volume is being opened but not ready, crypt_init_by_name() can fetch details. */))
|
||||||
return log_debug_errno(r, "Failed to activate verity device %s: %m", node);
|
return log_debug_errno(r, "Failed to activate verity device %s: %m", node);
|
||||||
|
|
||||||
|
check:
|
||||||
if (!restore_deferred_remove){
|
if (!restore_deferred_remove){
|
||||||
/* To avoid races, disable automatic removal on umount while setting up the new device. Restore it on failure. */
|
/* To avoid races, disable automatic removal on umount while setting up the new device. Restore it on failure. */
|
||||||
r = dm_deferred_remove_cancel(name);
|
r = dm_deferred_remove_cancel(name);
|
||||||
@ -2115,7 +2125,7 @@ static int verity_partition(
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_debug_errno(r, "Failed to check if existing verity device %s can be reused: %m", node);
|
return log_debug_errno(r, "Failed to check if existing verity device %s can be reused: %m", node);
|
||||||
|
|
||||||
if (r >= 0) { /* FIXME: Drop this meaningless condition later. */
|
if (fd < 0) {
|
||||||
/* devmapper might say that the device exists, but the devlink might not yet have been
|
/* 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. */
|
* created. Check and wait for the udev event in that case. */
|
||||||
r = device_wait_for_devlink(node, "block", verity_timeout(), NULL);
|
r = device_wait_for_devlink(node, "block", verity_timeout(), NULL);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user