On 10/6/2026 11:35 AM, Shinichi Doyashiki via gnats wrote:
the cleaner threadvstate_assert_wait_stable() at netbsd:vstate_assert_wait_stable+0x4bvcache_vget() at netbsd:vcache_vget+0x34the rm process lfs_prelock() at netbsd:lfs_prelock+0x59lfs_vfree() at netbsd:lfs_vfree+0xd4 lfs_reclaim() at netbsd:lfs_reclaim+0x275 VOP_RECLAIM() at netbsd:VOP_RECLAIM+0x60 vcache_reclaim() at netbsd:vcache_reclaim+0x1cc
The essence of the deadlock is here: the cleaner, holding the segment lock, has to vget the vnode to check its version number, so waits for the vnode state to reach VS_RECLAIMED; while VOP_RECLAIM, waiting for the segment lock, is holding that vnode in VS_RECLAIMING, so vcache_vget will never return.
One possibility might be simply not to check that segments are actually clean before releasing them. If all is well with LFS, we would trust the accounting and would not need to check; but of course there are still bugs, so this check is turned on if compiled with DEBUG.
Another possibility might be to pass a flag to vcache_get() that would allow it to return if the vnode state is VS_RECLAIMING (or maybe, specify allowable states?), explicitly avoiding this use case. This seems a bit hackish but would avoid the deadlock.
-- Konrad Schroder perseant%hhhh.org@localhost