boot: log about RO I/O errors at debug level.

Inspired by #42307, but does not fix it. We just recognize more types of
errors that can be triggered by RO media, and downgrade to debug log
level.

Inspired-by: #42307
This commit is contained in:
Lennart Poettering
2026-06-01 11:01:06 +02:00
parent 8ff7a5cd09
commit c0e7046c17
2 changed files with 28 additions and 11 deletions
+24 -11
View File
@@ -193,20 +193,24 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) {
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
0);
if (err == EFI_NOT_FOUND && seeded_by_efi) {
/* If the file does not exist, but we are reasonably well seeded, create the seed file */
created = true;
err = root_dir->Open(
root_dir,
&handle,
(char16_t *) u"\\loader\\random-seed",
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
0);
}
if (err != EFI_SUCCESS) {
if (!IN_SET(err, EFI_NOT_FOUND, EFI_WRITE_PROTECTED))
log_error_status(err, "Failed to open random seed file: %m");
return err;
}
if (err != EFI_SUCCESS)
return log_full(err,
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to open random seed file: %m");
created = true;
} else if (err != EFI_SUCCESS)
return log_full(err,
err == EFI_NOT_FOUND || EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to open random seed file: %m");
if (!created) {
err = get_file_info(handle, &info, /* ret_size= */ NULL);
@@ -280,12 +284,16 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) {
wsize = info->FileSize - size;
err = handle->Write(handle, &wsize, seed /* All zeros now */);
if (err != EFI_SUCCESS)
return log_error_status(err, "Failed to write random seed file: %m");
return log_full(err,
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to write random seed file: %m");
if (wsize != info->FileSize - size)
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
err = handle->Flush(handle);
if (err != EFI_SUCCESS)
return log_error_status(err, "Failed to flush random seed file: %m");
return log_full(err,
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to flush random seed file: %m");
err = handle->SetPosition(handle, 0);
if (err != EFI_SUCCESS)
return log_error_status(err, "Failed to seek to beginning of random seed file: %m");
@@ -301,16 +309,21 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) {
* flimsy. So instead we rely on userspace eventually truncating this when it writes a new
* seed. For now the best we do is zero it. */
}
/* Update the random seed on disk before we use it */
wsize = size;
err = handle->Write(handle, &wsize, random_bytes);
if (err != EFI_SUCCESS)
return log_error_status(err, "Failed to write random seed file: %m");
return log_full(err,
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to write random seed file: %m");
if (wsize != size)
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
err = handle->Flush(handle);
if (err != EFI_SUCCESS)
return log_error_status(err, "Failed to flush random seed file: %m");
return log_full(err,
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
"Failed to flush random seed file: %m");
err = BS->AllocatePool(EfiACPIReclaimMemory,
offsetof(struct linux_efi_random_seed, seed) + DESIRED_SEED_SIZE,
+4
View File
@@ -263,3 +263,7 @@ char16_t *get_extra_dir(const EFI_DEVICE_PATH *file_path);
#endif
char16_t *url_replace_last_component(const char16_t *url, const char16_t *filename);
static inline bool EFI_STATUS_IS_WRITE_REFUSED(EFI_STATUS status) {
return IN_SET(status, EFI_WRITE_PROTECTED, EFI_DEVICE_ERROR, EFI_ACCESS_DENIED);
}