summaryrefslogtreecommitdiffstats
path: root/sys/fs
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 /sys/fs
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
Diffstat (limited to 'sys/fs')
-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