mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-17 18:34:57 +02:00
nvmutil: stronger race-condition check on prw
do it per read, in the fallback pread/pwrite per read/write that is Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+23
-18
@@ -2097,25 +2097,30 @@ real_pread_pwrite:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
verified = lseek_loop(fd, (off_t)0, SEEK_CUR,
|
|
||||||
loop_eagain, loop_eintr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Verify again before I/O
|
|
||||||
* (even with OFF_ERR)
|
|
||||||
*
|
|
||||||
* This implements the first check
|
|
||||||
* even with OFF_ERR, but without
|
|
||||||
* the recovery. On ERR_RESET, if
|
|
||||||
* the check fails again, then we
|
|
||||||
* know something else is touching
|
|
||||||
* the file, so it's best that we
|
|
||||||
* probably leave it alone and err.
|
|
||||||
*/
|
|
||||||
if (verified != off)
|
|
||||||
goto err_prw;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
/*
|
||||||
|
* Verify again before I/O
|
||||||
|
* (even with OFF_ERR)
|
||||||
|
*
|
||||||
|
* This implements the first check
|
||||||
|
* even with OFF_ERR, but without
|
||||||
|
* the recovery. On ERR_RESET, if
|
||||||
|
* the check fails again, then we
|
||||||
|
* know something else is touching
|
||||||
|
* the file, so it's best that we
|
||||||
|
* probably leave it alone and err.
|
||||||
|
*
|
||||||
|
* In other words, ERR_RESET only
|
||||||
|
* tolerates one change. Any more
|
||||||
|
* will cause an exit, including
|
||||||
|
* per EINTR/EAGAIN re-spin.
|
||||||
|
*/
|
||||||
|
verified = lseek_loop(fd, (off_t)0, SEEK_CUR,
|
||||||
|
loop_eagain, loop_eintr);
|
||||||
|
|
||||||
|
if (verified != off)
|
||||||
|
goto err_prw;
|
||||||
|
|
||||||
if (rw_type == IO_PREAD)
|
if (rw_type == IO_PREAD)
|
||||||
r = read(fd, mem, nrw);
|
r = read(fd, mem, nrw);
|
||||||
else if (rw_type == IO_PWRITE)
|
else if (rw_type == IO_PWRITE)
|
||||||
|
|||||||
Reference in New Issue
Block a user