Author: kib
Date: Mon Jul 14 09:16:55 2014
New Revision: 268614
URL: http://svnweb.freebsd.org/changeset/base/268614

Log:
  Use tmpfs_vn_get_ino_gen() to handle the races with reclaim in tmpfs
  dotdot lookup.
  
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  MFC after:    2 weeks

Modified:
  head/sys/fs/tmpfs/tmpfs_vnops.c

Modified: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c     Mon Jul 14 09:13:56 2014        
(r268613)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c     Mon Jul 14 09:16:55 2014        
(r268614)
@@ -69,15 +69,22 @@ SYSCTL_INT(_vfs_tmpfs, OID_AUTO, rename_
     "Times rename had to restart due to lock contention");
 
 static int
+tmpfs_vn_get_ino_alloc(struct mount *mp, void *arg, int lkflags,
+    struct vnode **rvp)
+{
+
+       return (tmpfs_alloc_vp(mp, arg, lkflags, rvp));
+}
+
+static int
 tmpfs_lookup(struct vop_cachedlookup_args *v)
 {
        struct vnode *dvp = v->a_dvp;
        struct vnode **vpp = v->a_vpp;
        struct componentname *cnp = v->a_cnp;
-
-       int error;
        struct tmpfs_dirent *de;
        struct tmpfs_node *dnode;
+       int error;
 
        dnode = VP_TO_TMPFS_DIR(dvp);
        *vpp = NULLVP;
@@ -98,17 +105,10 @@ tmpfs_lookup(struct vop_cachedlookup_arg
                goto out;
        }
        if (cnp->cn_flags & ISDOTDOT) {
-               int ltype = 0;
-
-               ltype = VOP_ISLOCKED(dvp);
-               vhold(dvp);
-               VOP_UNLOCK(dvp, 0);
-               /* Allocate a new vnode on the matching entry. */
-               error = tmpfs_alloc_vp(dvp->v_mount, dnode->tn_dir.tn_parent,
-                   cnp->cn_lkflags, vpp);
-
-               vn_lock(dvp, ltype | LK_RETRY);
-               vdrop(dvp);
+               error = vn_vget_ino_gen(dvp, tmpfs_vn_get_ino_alloc,
+                   dnode->tn_dir.tn_parent, cnp->cn_lkflags, vpp);
+               if (error != 0)
+                       goto out;
        } else if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') {
                VREF(dvp);
                *vpp = dvp;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to