Windows: OpenTargetDirectory AFSInitFcb Reparse Test
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCreate.cpp
index def89e9..8f8d994 100644 (file)
@@ -99,7 +99,7 @@ try_exit:
 
         NOTHING;
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
         AFSDbgLogMsg( 0,
@@ -107,6 +107,8 @@ try_exit:
                       "EXCEPTION - AFSCreate\n");
 
         ntStatus = STATUS_ACCESS_DENIED;
+
+        AFSDumpTraceFilesFnc();
     }
 
     //
@@ -686,6 +688,28 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
               pDirectoryCB == NULL))
         {
 
+            if ( pVolumeCB &&
+                 BooleanFlagOn( pVolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+            {
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSCommonCreate ReadOnly Device on create Status %08lX\n",
+                              ntStatus);
+
+                InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSCommonCreate Decrement13 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              &pParentDirectoryCB->NameInformation.FileName,
+                              pParentDirectoryCB,
+                              NULL,
+                              pParentDirectoryCB->OpenReferenceCount);
+
+                try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
+            }
+
             if( uniComponentName.Length == 0 ||
                 pDirectoryCB != NULL)
             {
@@ -1048,6 +1072,9 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+                                TRUE);
+
                 RtlCopyMemory( &pCcb->AuthGroup,
                                &stAuthGroup,
                                sizeof( GUID));
@@ -1109,6 +1136,8 @@ try_exit:
                 pCcb->NameArray = pNameArray;
 
                 pNameArray = NULL;
+
+                AFSReleaseResource( &pCcb->NPCcb->CcbLock);
             }
 
             //
@@ -1138,9 +1167,15 @@ try_exit:
                 // For files perform additional processing
                 //
 
-                if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+                switch( pFcb->Header.NodeTypeCode)
                 {
-                    pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+
+                    case AFS_FILE_FCB:
+                    case AFS_IOCTL_FCB:
+                    {
+
+                        pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+                    }
                 }
 
                 //
@@ -1215,7 +1250,7 @@ try_exit:
             if( uniSubstitutedPathName.Buffer != NULL)
             {
 
-                AFSExFreePool( uniSubstitutedPathName.Buffer);
+                AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
 
                 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
             }
@@ -1234,7 +1269,7 @@ try_exit:
         if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
         {
 
-            AFSExFreePool( uniRootFileName.Buffer);
+            AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
         }
 
         if( bReleaseVolume)
@@ -2273,7 +2308,7 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
+                              "AFSOpenTargetDirectory (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
                               Irp,
                               &ParentDirectoryCB->NameInformation.FileName,
                               ntStatus);
@@ -2281,7 +2316,7 @@ AFSOpenTargetDirectory( IN PIRP Irp,
                 try_return( ntStatus);
             }
 
-            if ( ntStatus == STATUS_REPARSE)
+            if ( ntStatus != STATUS_REPARSE)
             {
 
                 bAllocatedFcb = TRUE;
@@ -3035,11 +3070,15 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSObjectInfoCB *pObjectInfo = NULL;
     LONG lCount;
+    LARGE_INTEGER liSaveSize;
+    LARGE_INTEGER liSaveVDL;
+    LARGE_INTEGER liSaveAlloc;
 
     __Enter
     {
 
         pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
+
         usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
 
         pFileObject = pIrpSp->FileObject;
@@ -3216,13 +3255,17 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         (*Ccb)->GrantedAccess = *pDesiredAccess;
 
         //
-        // Need to purge any data currently in the cache
+        // Set the file length to zero
         //
 
-        CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                             NULL,
-                             0,
-                             FALSE);
+        AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
+                        TRUE);
+
+        bReleasePaging = TRUE;
+
+        liSaveSize = pObjectInfo->Fcb->Header.FileSize;
+        liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
+        liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
 
         pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
         pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
@@ -3246,6 +3289,16 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         KeQuerySystemTime( &pObjectInfo->LastWriteTime);
 
+        //
+        // Set the update flag accordingly
+        //
+
+        SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
+                                          AFS_FCB_FLAG_UPDATE_CREATE_TIME |
+                                          AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
+                                          AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
+                                          AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
         ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
                                              pObjectInfo,
                                              AuthGroup);
@@ -3253,6 +3306,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
+            pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
+            pObjectInfo->Fcb->Header.FileSize = liSaveSize;
+            pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
+            pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
+            pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
+
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
@@ -3263,34 +3322,6 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             try_return( ntStatus);
         }
 
-        AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
-                        TRUE);
-
-        bReleasePaging = TRUE;
-
-        pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
-
-        pFileObject->FsContext = (void *)pObjectInfo->Fcb;
-
-        pFileObject->FsContext2 = (void *)*Ccb;
-
-        //
-        // Set the update flag accordingly
-        //
-
-        SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
-                                          AFS_FCB_FLAG_UPDATE_CREATE_TIME |
-                                          AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
-                                          AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
-                                          AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
-
-        CcSetFileSizes( pFileObject,
-                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
-
-        AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
-
-        bReleasePaging = FALSE;
-
         ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
 
         if( ulCreateDisposition == FILE_SUPERSEDE)
@@ -3371,8 +3402,27 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
                       pObjectInfo->ParentObjectInformation,
                       lCount);
 
+        AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
+
+        bReleaseFcb = FALSE;
+
         *Fcb = pObjectInfo->Fcb;
 
+        //
+        // Now that the Fcb->Resource has been dropped
+        // we can call CcSetFileSizes.  We are still holding
+        // the PagingIoResource
+        //
+
+        pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
+
+        pFileObject->FsContext = (void *)pObjectInfo->Fcb;
+
+        pFileObject->FsContext2 = (void *)*Ccb;
+
+        CcSetFileSizes( pFileObject,
+                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
 try_exit:
 
         if( bReleasePaging)