Author: kib
Date: Sat Mar 14 08:42:40 2015
New Revision: 279974
URL: https://svnweb.freebsd.org/changeset/base/279974

Log:
  MFC r279401:
  Some fixes for fdescfs lookup code Do not ever return doomed vnode from.
  lookup. Reuse the vn_vget_ino_gen() helper to handle parallel unmounts .

Modified:
  stable/10/sys/fs/fdescfs/fdesc_vnops.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/fdescfs/fdesc_vnops.c
==============================================================================
--- stable/10/sys/fs/fdescfs/fdesc_vnops.c      Sat Mar 14 08:29:03 2015        
(r279973)
+++ stable/10/sys/fs/fdescfs/fdesc_vnops.c      Sat Mar 14 08:42:40 2015        
(r279974)
@@ -247,6 +247,28 @@ loop:
        return (0);
 }
 
+struct fdesc_get_ino_args {
+       fdntype ftype;
+       unsigned fd_fd;
+       int ix;
+       struct file *fp;
+       struct thread *td;
+};
+
+static int
+fdesc_get_ino_alloc(struct mount *mp, void *arg, int lkflags,
+    struct vnode **rvp)
+{
+       struct fdesc_get_ino_args *a;
+       int error;
+
+       a = arg;
+       error = fdesc_allocvp(a->ftype, a->fd_fd, a->ix, mp, rvp);
+       fdrop(a->fp, a->td);
+       return (error);
+}
+
+
 /*
  * vp is the current namei directory
  * ndp is the name to locate in that directory...
@@ -265,6 +287,7 @@ fdesc_lookup(ap)
        char *pname = cnp->cn_nameptr;
        struct thread *td = cnp->cn_thread;
        struct file *fp;
+       struct fdesc_get_ino_args arg;
        int nlen = cnp->cn_namelen;
        u_int fd, fd1;
        int error;
@@ -326,6 +349,8 @@ fdesc_lookup(ap)
                vn_lock(dvp, LK_RETRY | LK_EXCLUSIVE);
                vdrop(dvp);
                fvp = dvp;
+               if ((dvp->v_iflag & VI_DOOMED) != 0)
+                       error = ENOENT;
        } else {
                /*
                 * Unlock our root node (dvp) when doing this, since we might
@@ -335,16 +360,13 @@ fdesc_lookup(ap)
                 * opposite lock order. Vhold the root vnode first so we don't
                 * lose it.
                 */
-               vhold(dvp);
-               VOP_UNLOCK(dvp, 0);
-               error = fdesc_allocvp(Fdesc, fd, FD_DESC + fd, dvp->v_mount,
-                   &fvp);
-               fdrop(fp, td);
-               /*
-                * The root vnode must be locked last to prevent deadlock 
condition.
-                */
-               vn_lock(dvp, LK_RETRY | LK_EXCLUSIVE);
-               vdrop(dvp);
+               arg.ftype = Fdesc;
+               arg.fd_fd = fd;
+               arg.ix = FD_DESC + fd;
+               arg.fp = fp;
+               arg.td = td;
+               error = vn_vget_ino_gen(dvp, fdesc_get_ino_alloc, &arg,
+                   LK_EXCLUSIVE, &fvp);
        }
        
        if (error)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to