Skip site navigation (1)Skip section navigation (2)
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>