ffs_update(): Do not assume that EBUSY can only come LK_NOWAIT trylock

Instead do protective check for the local flags and do not interpret
EBUSY specially if we did not request trylock mode for bread().

Reviewed by:	mckusick
Reported and tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2021-08-26 19:17:39 +03:00
parent f822d4feb8
commit bb536de6c0

View File

@ -153,9 +153,14 @@ ffs_update(vp, waitfor)
error = ffs_breadz(VFSTOUFS(vp->v_mount), ITODEVVP(ip), bn, bn,
(int) fs->fs_bsize, NULL, NULL, 0, NOCRED, flags, NULL, &bp);
if (error != 0) {
if (error != EBUSY)
/*
* If EBUSY was returned without GB_LOCK_NOWAIT (which
* requests trylock for buffer lock), it is for some
* other reason and we should not handle it specially.
*/
if (error != EBUSY || (flags & GB_LOCK_NOWAIT) == 0)
return (error);
KASSERT((IS_SNAPSHOT(ip)), ("EBUSY from non-snapshot"));
/*
* Wait for our inode block to become available.
*