svn commit: r279974 - stable/10/sys/fs/fdescfs
Konstantin Belousov
kib at FreeBSD.org
Sat Mar 14 08:42:41 UTC 2015
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)
More information about the svn-src-all
mailing list