aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-05-29 01:36:50 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-05-29 22:04:10 +0000
commit331a7601c9c21c1e55c57c5338e7affced9c7b7c (patch)
treeed41f4366b66618e10f7cadf2c4e2a482d438f5e
parent439d942b9e7ab4df2bb7a628602069d31788df17 (diff)
downloadsrc-331a7601c9c21c1e55c57c5338e7affced9c7b7c.tar.gz
src-331a7601c9c21c1e55c57c5338e7affced9c7b7c.zip
tmpfs: save on common case relocking in tmpfs_reclaim
-rw-r--r--sys/fs/tmpfs/tmpfs_vnops.c19
1 files changed, 4 insertions, 15 deletions
diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index 43a2aa77dbbb..5d0d80639046 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -1525,26 +1525,18 @@ tmpfs_reclaim(struct vop_reclaim_args *v)
struct vnode *vp;
struct tmpfs_mount *tmp;
struct tmpfs_node *node;
- bool unlock, tm_locked;
+ bool unlock;
vp = v->a_vp;
node = VP_TO_TMPFS_NODE(vp);
tmp = VFS_TO_TMPFS(vp->v_mount);
- tm_locked = false;
if (vp->v_type == VREG)
tmpfs_destroy_vobject(vp, node->tn_reg.tn_aobj);
vp->v_object = NULL;
-relock:
+ TMPFS_LOCK(tmp);
TMPFS_NODE_LOCK(node);
- if (!tm_locked && node->tn_links == 0 &&
- (node->tn_vpstate & TMPFS_VNODE_ALLOCATING) == 0) {
- TMPFS_NODE_UNLOCK(node);
- TMPFS_LOCK(tmp);
- tm_locked = true;
- goto relock;
- }
tmpfs_free_vp(vp);
/*
@@ -1552,19 +1544,16 @@ relock:
* we must free its associated data structures (now that the vnode
* is being reclaimed).
*/
+ unlock = true;
if (node->tn_links == 0 &&
(node->tn_vpstate & TMPFS_VNODE_ALLOCATING) == 0) {
- MPASS(tm_locked);
node->tn_vpstate = TMPFS_VNODE_DOOMED;
unlock = !tmpfs_free_node_locked(tmp, node, true);
- } else {
- unlock = true;
}
if (unlock) {
TMPFS_NODE_UNLOCK(node);
- if (tm_locked)
- TMPFS_UNLOCK(tmp);
+ TMPFS_UNLOCK(tmp);
}
MPASS(vp->v_data == NULL);