diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2020-09-30 17:08:34 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2020-09-30 17:08:34 +0000 |
commit | 4301a5a7941f736b30d3ebd79adf5499f203db0e (patch) | |
tree | 3646a759ea68566f3a913e972856777d51f581a1 | |
parent | a91812f69fb2a959cb702c5571b1e9f22699181d (diff) |
Notes
-rw-r--r-- | sys/kern/vfs_cache.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 015c298a7aeb6..be2cd07f1e75a 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -2173,7 +2173,7 @@ cache_purge_impl(struct vnode *vp) TAILQ_INIT(&ncps); vlp = VP2VNODELOCK(vp); vlp2 = NULL; - mtx_assert(vlp, MA_OWNED); + mtx_lock(vlp); retry: while (!LIST_EMPTY(&vp->v_cache_src)) { ncp = LIST_FIRST(&vp->v_cache_src); @@ -2220,13 +2220,10 @@ cache_has_entries(struct vnode *vp) void cache_purge(struct vnode *vp) { - struct mtx *vlp; SDT_PROBE1(vfs, namecache, purge, done, vp); if (!cache_has_entries(vp)) return; - vlp = VP2VNODELOCK(vp); - mtx_lock(vlp); cache_purge_impl(vp); } @@ -2239,22 +2236,18 @@ cache_purge_vgone(struct vnode *vp) struct mtx *vlp; VNPASS(VN_IS_DOOMED(vp), vp); - vlp = VP2VNODELOCK(vp); if (cache_has_entries(vp)) { - mtx_lock(vlp); cache_purge_impl(vp); - mtx_assert(vlp, MA_NOTOWNED); return; } /* * Serialize against a potential thread doing cache_purge. */ + vlp = VP2VNODELOCK(vp); mtx_wait_unlocked(vlp); if (cache_has_entries(vp)) { - mtx_lock(vlp); cache_purge_impl(vp); - mtx_assert(vlp, MA_NOTOWNED); return; } return; |