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,
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
|
||||||
0);
|
0);
|
||||||
if (err == EFI_NOT_FOUND && seeded_by_efi) {
|
if (err == EFI_NOT_FOUND && seeded_by_efi) {
|
||||||
|
|
||||||
/* If the file does not exist, but we are reasonably well seeded, create the seed file */
|
/* If the file does not exist, but we are reasonably well seeded, create the seed file */
|
||||||
created = true;
|
|
||||||
err = root_dir->Open(
|
err = root_dir->Open(
|
||||||
root_dir,
|
root_dir,
|
||||||
&handle,
|
&handle,
|
||||||
(char16_t *) u"\\loader\\random-seed",
|
(char16_t *) u"\\loader\\random-seed",
|
||||||
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
|
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
|
||||||
0);
|
0);
|
||||||
}
|
if (err != EFI_SUCCESS)
|
||||||
if (err != EFI_SUCCESS) {
|
return log_full(err,
|
||||||
if (!IN_SET(err, EFI_NOT_FOUND, EFI_WRITE_PROTECTED))
|
EFI_STATUS_IS_WRITE_REFUSED(err) ? LOG_DEBUG : LOG_ERR,
|
||||||
log_error_status(err, "Failed to open random seed file: %m");
|
"Failed to open random seed file: %m");
|
||||||
return err;
|
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) {
|
if (!created) {
|
||||||
err = get_file_info(handle, &info, /* ret_size= */ NULL);
|
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;
|
wsize = info->FileSize - size;
|
||||||
err = handle->Write(handle, &wsize, seed /* All zeros now */);
|
err = handle->Write(handle, &wsize, seed /* All zeros now */);
|
||||||
if (err != EFI_SUCCESS)
|
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)
|
if (wsize != info->FileSize - size)
|
||||||
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
|
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
|
||||||
err = handle->Flush(handle);
|
err = handle->Flush(handle);
|
||||||
if (err != EFI_SUCCESS)
|
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);
|
err = handle->SetPosition(handle, 0);
|
||||||
if (err != EFI_SUCCESS)
|
if (err != EFI_SUCCESS)
|
||||||
return log_error_status(err, "Failed to seek to beginning of random seed file: %m");
|
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
|
* 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. */
|
* seed. For now the best we do is zero it. */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the random seed on disk before we use it */
|
/* Update the random seed on disk before we use it */
|
||||||
wsize = size;
|
wsize = size;
|
||||||
err = handle->Write(handle, &wsize, random_bytes);
|
err = handle->Write(handle, &wsize, random_bytes);
|
||||||
if (err != EFI_SUCCESS)
|
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)
|
if (wsize != size)
|
||||||
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
|
return log_error_status(EFI_PROTOCOL_ERROR, "Short write on random seed file.");
|
||||||
err = handle->Flush(handle);
|
err = handle->Flush(handle);
|
||||||
if (err != EFI_SUCCESS)
|
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,
|
err = BS->AllocatePool(EfiACPIReclaimMemory,
|
||||||
offsetof(struct linux_efi_random_seed, seed) + DESIRED_SEED_SIZE,
|
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
|
#endif
|
||||||
|
|
||||||
char16_t *url_replace_last_component(const char16_t *url, const char16_t *filename);
|
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