mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-17 18:34:57 +02:00
util/nvmutil: EINTR looping on write_gbe_file
up to a maximum number of retries Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+26
-10
@@ -109,7 +109,7 @@ static void close_files(void);
|
|||||||
* When reading files, we loop on error EINTR
|
* When reading files, we loop on error EINTR
|
||||||
* a maximum number of times as defined, thus:
|
* a maximum number of times as defined, thus:
|
||||||
*/
|
*/
|
||||||
#define MAX_RETRY_READ 30
|
#define MAX_RETRY_RW 30
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Portable macro based on BSD nitems.
|
* Portable macro based on BSD nitems.
|
||||||
@@ -796,7 +796,7 @@ read_file_exact(int fd, void *buf, size_t len,
|
|||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
err(ECANCELED, "Trying to open bad fd: %s", path);
|
err(ECANCELED, "Trying to open bad fd: %s", path);
|
||||||
|
|
||||||
for (retry = 0; retry < MAX_RETRY_READ; retry++) {
|
for (retry = 0; retry < MAX_RETRY_RW; retry++) {
|
||||||
if (op)
|
if (op)
|
||||||
rval = pread(fd, buf, len, off);
|
rval = pread(fd, buf, len, off);
|
||||||
else
|
else
|
||||||
@@ -1036,16 +1036,32 @@ override_part_modified(void)
|
|||||||
static void
|
static void
|
||||||
write_gbe_file_part(size_t p)
|
write_gbe_file_part(size_t p)
|
||||||
{
|
{
|
||||||
ssize_t rval = pwrite(gbe_fd, gbe_mem_offset(p, "pwrite"),
|
int retry;
|
||||||
GBE_PART_SIZE, gbe_file_offset(p, "pwrite"));
|
ssize_t rval;
|
||||||
|
|
||||||
if (rval == -1)
|
if (gbe_fd == -1)
|
||||||
err(ECANCELED, "Can't write %zu b to '%s' p%zu",
|
err(ECANCELED, "Trying to write bad gbe_fd: %s", fname);
|
||||||
GBE_PART_SIZE, fname, p);
|
|
||||||
|
|
||||||
if (rval != GBE_PART_SIZE)
|
for (retry = 0; retry < MAX_RETRY_RW; retry++) {
|
||||||
err(ECANCELED, "CORRUPTED WRITE (%zd b) to file '%s' p%zu",
|
rval = pwrite(gbe_fd, gbe_mem_offset(p, "pwrite"),
|
||||||
rval, fname, p);
|
GBE_PART_SIZE, gbe_file_offset(p, "pwrite"));
|
||||||
|
|
||||||
|
if (rval == GBE_PART_SIZE) {
|
||||||
|
errno = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rval != -1)
|
||||||
|
err(ECANCELED,
|
||||||
|
"Short pwrite, %zd bytes, on file: %s",
|
||||||
|
rval, fname);
|
||||||
|
|
||||||
|
if (errno != EINTR)
|
||||||
|
err(ECANCELED,
|
||||||
|
"Could not pwrite file: '%s'", fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
err(EINTR, "pwrite: max retries exceeded on file: %s", fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user