From d9884a480c96d14a3e5a6b08cde5e5003d7a4694 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 15 Jan 2012 11:08:23 -0500 Subject: [PATCH] Windows: deadlock bet. DirEntry lock + DirectoryNodeHdr.TreeLock The DirectoryNodeHdr.TreeLock must be obtained before the DirEntry->NonPaged->Lock. In AFSLocateNameEntry(), the DirEntry lock is obtained before the TreeLock when processing a symlink object. For that case obtain the TreeLOCK first. Drop it if it is not required. Change-Id: I5b73f98b4bc7fcd5c02b8f255fa2423b52eb4a4d Reviewed-on: http://gerrit.openafs.org/6558 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp index 1c8b2610c..3b3f306e9 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSNameSupport.cpp @@ -305,6 +305,9 @@ AFSLocateNameEntry( IN GUID *AuthGroup, try_return( ntStatus); } + AFSAcquireExcl( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock, + TRUE); + AFSAcquireExcl( &pDirEntry->NonPaged->Lock, TRUE); @@ -333,9 +336,6 @@ AFSLocateNameEntry( IN GUID *AuthGroup, // Directory TreeLock should be exclusively held // - AFSAcquireExcl( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock, - TRUE); - ntStatus = AFSVerifyEntry( AuthGroup, pDirEntry); @@ -372,6 +372,11 @@ AFSLocateNameEntry( IN GUID *AuthGroup, continue; } } + else + { + + AFSReleaseResource( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock); + } // // If we were given a zero length target name then deny access to the entry -- 2.39.5