From 1e9bc9f889579db48eea9ad22dd63df216afb1b3 Mon Sep 17 00:00:00 2001 From: Don Lewis Date: Fri, 16 May 2003 19:46:51 +0000 Subject: [PATCH] Detect that a vnode has been reclaimed while vflush() was waiting to lock the vnode and restart the loop. Vflush() is vulnerable since it does not hold a reference to the vnode and it holds no other locks while waiting for the vnode lock. The vnode will no longer be on the list when the loop is restarted. Approved by: re (rwatson) --- sys/kern/vfs_subr.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index ae9ef7fa1a7..14c29232f8a 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -2397,6 +2397,17 @@ loop: VI_LOCK(vp); mtx_unlock(&mntvnode_mtx); vn_lock(vp, LK_INTERLOCK | LK_EXCLUSIVE | LK_RETRY, td); + /* + * This vnode could have been reclaimed while we were + * waiting for the lock since we are not holding a + * reference. + * Start over if the vnode was reclaimed. + */ + if (vp->v_mount != mp) { + VOP_UNLOCK(vp, 0, td); + mtx_lock(&mntvnode_mtx); + goto loop; + } /* * Skip over a vnodes marked VV_SYSTEM. */