From 2847dac128a8ba0e1ba1b4f9bb8fb8f638fdd9c0 Mon Sep 17 00:00:00 2001
From: Taylor R Campbell <riastradh@NetBSD.org>
Date: Fri, 11 Apr 2014 19:06:11 +0000
Subject: [PATCH 10/14] Fix locking in doscheckpath.

---
 sys/fs/msdosfs/msdosfs_lookup.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index b25bd10..905e012 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -836,7 +836,7 @@ doscheckpath(struct denode *source, struct denode *target)
 	u_long scn;
 	struct msdosfsmount *pmp;
 	struct direntry *ep;
-	struct denode *dep;
+	struct denode *dep, *ddep;
 	struct buf *bp = NULL;
 	int error = 0;
 
@@ -895,12 +895,13 @@ doscheckpath(struct denode *source, struct denode *target)
 			break;
 		}
 
-		vput(DETOV(dep));
 		brelse(bp, 0);
 		bp = NULL;
 		/* NOTE: deget() clears dep on error */
-		if ((error = deget(pmp, scn, 0, 0, &dep)) != 0)
+		if ((error = deget(pmp, scn, 0, 0, &ddep)) != 0)
 			break;
+		vput(DETOV(dep));
+		dep = ddep;
 #ifndef MAKEFS
 		if ((error = vn_lock(DETOV(dep), LK_EXCLUSIVE)) != 0) {
 			vrele(DETOV(dep));
-- 
1.8.3.1