Windows: AFSOpenRoot obtain VolumeRoot OpenReferenceCount earlier
authorJeffrey Altman <jaltman@your-file-system.com>
Sat, 29 Dec 2012 21:12:21 +0000 (16:12 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Thu, 31 Jan 2013 19:26:54 +0000 (11:26 -0800)
In AFSOpenRoot obtain the VolumeRoot reference count before performing
any operations that require use of the VolumeRoot.  If the operations
fail, release the reference count.

Change-Id: I2e5a6574f87db858aa60d812c68f637266db529e
Reviewed-on: http://gerrit.openafs.org/8862
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/kernel/lib/AFSCreate.cpp

index cf6b6f5..faf4f76 100644 (file)
@@ -1029,7 +1029,7 @@ try_exit:
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSCommonCreate (%p) FileObject %p FsContext %08lX FsContext2 %08lX\n",
+                          "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
                           Irp,
                           pFileObject,
                           pFcb,
@@ -1104,7 +1104,7 @@ try_exit:
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %08lX FsContext2 %08lX\n",
+                              "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
@@ -1119,7 +1119,7 @@ try_exit:
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %08lX FsContext2 %08lX\n",
+                              "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
@@ -1468,6 +1468,14 @@ AFSOpenRoot( IN PIRP Irp,
                             TRUE);
         }
 
+        lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
+                      VolumeCB->RootFcb,
+                      lCount);
+
         bReleaseFcb = TRUE;
 
         //
@@ -1546,14 +1554,6 @@ AFSOpenRoot( IN PIRP Irp,
         // Increment the open count on this Fcb
         //
 
-        lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
-                      VolumeCB->RootFcb,
-                      lCount);
-
         lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
@@ -1580,6 +1580,17 @@ try_exit:
 
         if( bReleaseFcb)
         {
+            if ( !NT_SUCCESS( ntStatus))
+            {
+
+                lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
+                              VolumeCB->RootFcb,
+                              lCount);
+            }
 
             AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
         }