svn commit: r190887 - in head/sys: kern nfsclient
Konstantin Belousov
kib at FreeBSD.org
Fri Apr 10 10:22:44 UTC 2009
Author: kib
Date: Fri Apr 10 10:22:44 2009
New Revision: 190887
URL: http://svn.freebsd.org/changeset/base/190887
Log:
Cache_lookup() for DOTDOT drops dvp vnode lock, allowing dvp to be reclaimed.
Check the condition and return ENOENT then.
In nfs_lookup(), respect ENOENT return from cache_lookup() when it is caused
by dvp reclaim.
Reported and tested by: pho
Modified:
head/sys/kern/vfs_cache.c
head/sys/nfsclient/nfs_vnops.c
Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c Fri Apr 10 10:16:03 2009 (r190886)
+++ head/sys/kern/vfs_cache.c Fri Apr 10 10:22:44 2009 (r190887)
@@ -554,8 +554,15 @@ success:
else
CACHE_RUNLOCK();
error = vget(*vpp, cnp->cn_lkflags | LK_INTERLOCK, cnp->cn_thread);
- if (cnp->cn_flags & ISDOTDOT)
+ if (cnp->cn_flags & ISDOTDOT) {
vn_lock(dvp, ltype | LK_RETRY);
+ if (dvp->v_iflag & VI_DOOMED) {
+ if (error == 0)
+ vput(*vpp);
+ *vpp = NULL;
+ return (ENOENT);
+ }
+ }
if (error) {
*vpp = NULL;
goto retry;
Modified: head/sys/nfsclient/nfs_vnops.c
==============================================================================
--- head/sys/nfsclient/nfs_vnops.c Fri Apr 10 10:16:03 2009 (r190886)
+++ head/sys/nfsclient/nfs_vnops.c Fri Apr 10 10:22:44 2009 (r190887)
@@ -978,6 +978,8 @@ nfs_lookup(struct vop_lookup_args *ap)
vrele(newvp);
*vpp = NULLVP;
} else if (error == ENOENT) {
+ if (dvp->v_iflag & VI_DOOMED)
+ return (ENOENT);
/*
* We only accept a negative hit in the cache if the
* modification time of the parent directory matches
More information about the svn-src-head
mailing list