summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortjr <tjr@FreeBSD.org>2003-03-16 11:19:54 +0000
committertjr <tjr@FreeBSD.org>2003-03-16 11:19:54 +0000
commitc7f6ce0200c73f9bd40e24c337d29c1deeed5011 (patch)
tree553c850e9df37d80c4dc6535d1897b6c021253a8
parent4641d3d127dcdaae61daa54f6eee3d51be117e44 (diff)
downloadFreeBSD-src-c7f6ce0200c73f9bd40e24c337d29c1deeed5011.zip
FreeBSD-src-c7f6ce0200c73f9bd40e24c337d29c1deeed5011.tar.gz
Make udf_allocv() return an unlocked vnode instead of a locked one
to avoid a "locking against myself" panic when udf_hashins() tries to lock it again. Lock the vnode in udf_hashins() before adding it to the hash bucket.
-rw-r--r--sys/fs/udf/udf_vnops.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/sys/fs/udf/udf_vnops.c b/sys/fs/udf/udf_vnops.c
index 6582f92..d48e36d 100644
--- a/sys/fs/udf/udf_vnops.c
+++ b/sys/fs/udf/udf_vnops.c
@@ -127,10 +127,10 @@ udf_hashins(struct udf_node *node)
udfmp = node->udfmp;
+ vn_lock(node->i_vnode, LK_EXCLUSIVE | LK_RETRY, curthread);
mtx_lock(&udfmp->hash_mtx);
TAILQ_INSERT_TAIL(&udfmp->udf_tqh, node, tq);
mtx_unlock(&udfmp->hash_mtx);
- vn_lock(node->i_vnode, LK_EXCLUSIVE | LK_RETRY, curthread);
return (0);
}
@@ -161,7 +161,6 @@ udf_allocv(struct mount *mp, struct vnode **vpp, struct thread *td)
return (error);
}
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
*vpp = vp;
return (0);
}
OpenPOWER on IntegriCloud