Do not leak transient ENOLCK error from flush_newblk_dep() loop.
The buffer lock is retried on failed LK_SLEEPFAIL attempt, and error from the failed attempt is irrelevant. But since there is path after retry which does not clear error, it is possible to return spurious error from the function. The issue resulted in a spurious failure of softdep_sync_buf(), causing further spurious failure of ffs_sync(). In collaboration with: pho Reviewed by: mckusick Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
This commit is contained in:
parent
76db05eb14
commit
7b05b8a29c
@ -12954,6 +12954,7 @@ flush_newblk_dep(vp, mp, lbn)
|
||||
LK_INTERLOCK, BO_LOCKPTR(bo));
|
||||
if (error == ENOLCK) {
|
||||
ACQUIRE_LOCK(ump);
|
||||
error = 0;
|
||||
continue; /* Slept, retry */
|
||||
}
|
||||
if (error != 0)
|
||||
|
Loading…
Reference in New Issue
Block a user