]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: Take FCB resource in presection create.
authorRod Widdowson <rdw@your-file-system.com>
Sun, 25 Aug 2013 19:25:55 +0000 (12:25 -0700)
committerJeffrey Altman <jaltman@your-file-system.com>
Fri, 30 Aug 2013 19:12:04 +0000 (12:12 -0700)
Fix a lock inversion in the paging query file information path (called
from within section create).

The query file takes the FCB resource, but that is a lower rank
lock than the SOP resource which is taken in AcquireFileForNtCreateSection,

We fix the inversion by grabbing the FCB resource in
AcquireFileForNtCreateSection.

Change-Id: I6ea8d2ebf9d454f78469e86765ae36e1993533b2
Reviewed-on: http://gerrit.openafs.org/10190
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
src/WINNT/afsrdr/kernel/fs/AFSFastIoSupport.cpp

index 6ea12117a3504fc3d80dda2155d565bc38dc2743..8f9ccac81f76951bdd0907d0e046d041106b6874 100644 (file)
@@ -264,6 +264,15 @@ AFSFastIoAcquireFile( IN struct _FILE_OBJECT *FileObject)
 
     AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
+                 "AFSFastIoAcquireFile Acquiring Fcb lock %p EXCL %08lX\n",
+                 &pFcb->NPFcb->Resource,
+                 PsGetCurrentThread()));
+
+    AFSAcquireExcl( &pFcb->NPFcb->Resource,
+                   TRUE);
+
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                 AFS_TRACE_LEVEL_VERBOSE,
                   "AFSFastIoAcquireFile Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                   &pFcb->NPFcb->SectionObjectResource,
                   PsGetCurrentThread()));
@@ -293,6 +302,17 @@ AFSFastIoReleaseFile( IN struct _FILE_OBJECT *FileObject)
 
     AFSFcb *pFcb = (AFSFcb *)FileObject->FsContext;
 
+    if( ExIsResourceAcquiredExclusiveLite( &pFcb->NPFcb->Resource))
+    {
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                     AFS_TRACE_LEVEL_VERBOSE,
+                     "AFSFastIoReleaseFile Releasing Fcb Lock %p EXCL %08lX\n",
+                     &pFcb->NPFcb->Resource,
+                     PsGetCurrentThread()));
+
+       AFSReleaseResource( &pFcb->NPFcb->Resource);
+    }
+
     if( ExIsResourceAcquiredExclusiveLite( &pFcb->NPFcb->SectionObjectResource))
     {
        PFILE_OBJECT fileObject = pFcb->Specific.File.SectionCreateFO;