Windows: More specific error values
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCreate.cpp
index 13554ae..e07d8ce 100644 (file)
@@ -379,7 +379,7 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         }
 
         //
-        // We have our root node shared
+        // We have a reference on the root volume
         //
 
         bReleaseVolume = TRUE;
@@ -694,15 +694,15 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 // fail with collision
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              ntStatus);
-
                 if( pDirectoryCB != NULL)
                 {
 
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
+                                  &pDirectoryCB->NameInformation.FileName,
+                                  ntStatus);
+
                     InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
@@ -716,6 +716,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 else
                 {
 
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonCreate Object name collision on create Status %08lX\n",
+                                  ntStatus);
+
                     InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
@@ -1042,6 +1047,10 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                RtlCopyMemory( &pCcb->AuthGroup,
+                               &stAuthGroup,
+                               sizeof( GUID));
+
                 //
                 // If we have a substitute name, then use it
                 //
@@ -1124,10 +1133,6 @@ try_exit:
 
                 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
 
-                RtlCopyMemory( &pFcb->AuthGroup,
-                               &stAuthGroup,
-                               sizeof( GUID));
-
                 //
                 // For files perform additional processing
                 //
@@ -1168,6 +1173,12 @@ try_exit:
                 //
 
                 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
+
+                if( pCcb != NULL)
+                {
+                    AFSInsertCcb( pFcb,
+                                  pCcb);
+                }
             }
             else
             {
@@ -1235,8 +1246,6 @@ try_exit:
                           "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
                           pVolumeCB,
                           pVolumeCB->VolumeReferenceCount);
-
-            AFSReleaseResource( pVolumeCB->VolumeLock);
         }
 
         //
@@ -1611,6 +1620,8 @@ AFSOpenRoot( IN PIRP Irp,
 
         (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // OK, update the share access on the fileobject
         //
@@ -1682,7 +1693,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
 
                 *Ccb = NULL;
             }
@@ -1767,7 +1779,7 @@ AFSProcessCreate( IN PIRP               Irp,
                           "AFSProcessCreate Request failed due to read only volume %wZ\n",
                           FullFileName);
 
-            try_return( ntStatus = STATUS_ACCESS_DENIED);
+            try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
 
         pParentObjectInfo = ParentDirCB->ObjectInformation;
@@ -1911,6 +1923,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
         (*Ccb)->DirectoryCB = pDirEntry;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // If this is a file, update the headers filesizes.
         //
@@ -1932,8 +1946,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
 
             (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
         }
@@ -1958,12 +1972,13 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
         }
         else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
                  (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
-                 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+                 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+                 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
         {
 
             //
@@ -1978,8 +1993,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
         }
 
         //
@@ -2116,6 +2131,7 @@ try_exit:
                                             FALSE); // Leave it in the enum list so the worker cleans it up
 
                 AFSNotifyDelete( pDirEntry,
+                                 AuthGroup,
                                  FALSE);
 
                 //
@@ -2130,7 +2146,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             if( bAllocatedFcb)
@@ -2286,6 +2303,8 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         (*Ccb)->DirectoryCB = ParentDirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         if( TargetDirectoryCB != NULL &&
             FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
                                 TargetName,
@@ -2396,7 +2415,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
@@ -2508,6 +2528,7 @@ AFSProcessOpen( IN PIRP Irp,
         {
 
             ntStatus = AFSNotifyDelete( DirectoryCB,
+                                        AuthGroup,
                                         TRUE);
 
             if( !NT_SUCCESS( ntStatus))
@@ -2670,7 +2691,8 @@ AFSProcessOpen( IN PIRP Irp,
         }
         else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
                  pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
-                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
         {
 
         }
@@ -2775,6 +2797,8 @@ AFSProcessOpen( IN PIRP Irp,
 
         (*Ccb)->FileAccess = ulFileAccess;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // Perform the access check on the target if this is a mount point or symlink
         //
@@ -2915,7 +2939,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
@@ -2981,7 +3006,7 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
                           Irp,
                           &DirectoryCB->NameInformation.FileName);
 
-            try_return( ntStatus = STATUS_ACCESS_DENIED);
+            try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
 
         pParentObjectInfo = ParentDirCB->ObjectInformation;
@@ -3131,6 +3156,8 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         (*Ccb)->DirectoryCB = DirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // Need to purge any data currently in the cache
         //
@@ -3335,7 +3362,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
@@ -3616,7 +3644,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
 
                 *Ccb = NULL;
             }
@@ -3830,7 +3859,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
 
                 *Ccb = NULL;
             }