From: Jeffrey Altman Date: Sun, 15 Jan 2012 16:08:23 +0000 (-0500) Subject: Windows: deadlock bet. DirEntry lock + DirectoryNodeHdr.TreeLock X-Git-Tag: upstream/1.8.0_pre1^2~2821 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=d9884a480c96d14a3e5a6b08cde5e5003d7a4694;p=packages%2Fo%2Fopenafs.git 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 --- 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