summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkevlo <kevlo@FreeBSD.org>2010-10-18 03:34:33 +0000
committerkevlo <kevlo@FreeBSD.org>2010-10-18 03:34:33 +0000
commitc82c413dc5eb37b5d308a344aaabe4027badfa80 (patch)
tree33bedef60453c0a39877aabfffd6707498c51509
parentda39d1ffbdaa4f6df9aac3f291d9bdd82ffface9 (diff)
downloadFreeBSD-src-c82c413dc5eb37b5d308a344aaabe4027badfa80.zip
FreeBSD-src-c82c413dc5eb37b5d308a344aaabe4027badfa80.tar.gz
Fix a possible race where the directory dirent is moved to the location
that was used by ".." entry. This change seems fixed panic during attempt to access msdosfs data over nfs. Reviewed by: kib MFC after: 1 week
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index 999125d..51b6dc8 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -594,10 +594,15 @@ msdosfs_deget_dotdot(struct vnode *vp, u_long cluster, int blkoff,
vfs_unbusy(mp);
if (error == 0)
*rvp = DETOV(rdp);
- vn_lock(vp, ltype | LK_RETRY);
+ if (*rvp != vp)
+ vn_lock(vp, ltype | LK_RETRY);
if (vp->v_iflag & VI_DOOMED) {
- if (error == 0)
- vput(*rvp);
+ if (error == 0) {
+ if (*rvp == vp)
+ vunref(*rvp);
+ else
+ vput(*rvp);
+ }
error = ENOENT;
}
return (error);
OpenPOWER on IntegriCloud