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:
+24
-11
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user