Date: Sun, 15 Jul 2012 15:00:29 +0000 (UTC) From: Attilio Rao <attilio@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r238487 - projects/fuse/sys/fs/fuse Message-ID: <201207151500.q6FF0TkP053984@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: attilio Date: Sun Jul 15 15:00:28 2012 New Revision: 238487 URL: http://svn.freebsd.org/changeset/base/238487 Log: - Don't acquire the vnode locks in the vfs_hash_* functions with LK_RETRY as we cannot deal with reclaimed vnode. - insmntque() and vfs_hash_insert() vput() the source vnode in case of error, so we must not unlock there. - TODO: handle the case where there as an hash collision in vfs_hash_insert() Reported by: pho Tested by: pho Modified: projects/fuse/sys/fs/fuse/fuse_node.c Modified: projects/fuse/sys/fs/fuse/fuse_node.c ============================================================================== --- projects/fuse/sys/fs/fuse/fuse_node.c Sun Jul 15 14:40:49 2012 (r238486) +++ projects/fuse/sys/fs/fuse/fuse_node.c Sun Jul 15 15:00:28 2012 (r238487) @@ -176,7 +176,6 @@ fuse_vnode_alloc(struct mount *mp, enum vtype vtyp, struct vnode **vpp) { - const int lkflags = LK_EXCLUSIVE | LK_RETRY; struct fuse_vnode_data *fvdat; struct vnode *vp2; int err = 0; @@ -187,7 +186,7 @@ fuse_vnode_alloc(struct mount *mp, return EINVAL; } *vpp = NULL; - err = vfs_hash_get(mp, fuse_vnode_hash(nodeid), lkflags, td, vpp, + err = vfs_hash_get(mp, fuse_vnode_hash(nodeid), LK_EXCLUSIVE, td, vpp, fuse_vnode_cmp, &nodeid); if (err) return (err); @@ -203,21 +202,19 @@ fuse_vnode_alloc(struct mount *mp, free(fvdat, M_FUSEVN); return (err); } - vn_lock(*vpp, lkflags); + lockmgr((*vpp)->v_vnlock, LK_EXCLUSIVE, NULL); fuse_vnode_init(*vpp, fvdat, nodeid, vtyp); err = insmntque(*vpp, mp); ASSERT_VOP_ELOCKED(*vpp, "fuse_vnode_alloc"); if (err) { - VOP_UNLOCK(*vpp, 0); free(fvdat, M_FUSEVN); *vpp = NULL; return (err); } - err = vfs_hash_insert(*vpp, fuse_vnode_hash(nodeid), lkflags, + err = vfs_hash_insert(*vpp, fuse_vnode_hash(nodeid), LK_EXCLUSIVE, td, &vp2, fuse_vnode_cmp, &nodeid); if (err) { - VOP_UNLOCK(*vpp, 0); fuse_vnode_destroy(*vpp); *vpp = NULL; return (err);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207151500.q6FF0TkP053984>