Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Oct 2010 03:34:33 +0000 (UTC)
From:      Kevin Lo <kevlo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214001 - head/sys/fs/msdosfs
Message-ID:  <201010180334.o9I3YXlg064427@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevlo
Date: Mon Oct 18 03:34:33 2010
New Revision: 214001
URL: http://svn.freebsd.org/changeset/base/214001

Log:
  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

Modified:
  head/sys/fs/msdosfs/msdosfs_lookup.c

Modified: head/sys/fs/msdosfs/msdosfs_lookup.c
==============================================================================
--- head/sys/fs/msdosfs/msdosfs_lookup.c	Sun Oct 17 23:15:36 2010	(r214000)
+++ head/sys/fs/msdosfs/msdosfs_lookup.c	Mon Oct 18 03:34:33 2010	(r214001)
@@ -594,10 +594,15 @@ msdosfs_deget_dotdot(struct vnode *vp, u
 	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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010180334.o9I3YXlg064427>