]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: AFSVerifyEntry purge file data on DV change
authorJeffrey Altman <jaltman@your-file-system.com>
Thu, 5 Apr 2012 04:11:11 +0000 (00:11 -0400)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 5 Apr 2012 04:58:55 +0000 (21:58 -0700)
If the data version change is detected during AFSVerifyEntry(),
treat it the same as if the AFS_OBJECT_FLAGS_VERIFY_DATA flag
had been previous set.  Purge the old data from the Windows
file cache.  Be sure to set the new metadata after the purge
so that if the file length was truncated the old data beyond
the truncation point will still be purged.

Change-Id: I80c33f303c6499f22955e9874b2f4c50d666a3cb
Reviewed-on: http://gerrit.openafs.org/7048
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp

index 721d5567dcc6bd50400ced35f81bd768ce704be1..79fe2a5eec3191d8bd3e019c52dfaa3db98a78df 100644 (file)
@@ -2676,27 +2676,29 @@ AFSVerifyEntry( IN GUID *AuthGroup,
         // Check the data version of the file
         //
 
-        if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart &&
-            !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+        if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart)
         {
+            if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+            {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
-                          pObjectInfo->DataVersion.QuadPart,
-                          &DirEntry->NameInformation.FileName,
-                          pObjectInfo->FileId.Cell,
-                          pObjectInfo->FileId.Volume,
-                          pObjectInfo->FileId.Vnode,
-                          pObjectInfo->FileId.Unique);
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                              pObjectInfo->DataVersion.QuadPart,
+                              &DirEntry->NameInformation.FileName,
+                              pObjectInfo->FileId.Cell,
+                              pObjectInfo->FileId.Volume,
+                              pObjectInfo->FileId.Vnode,
+                              pObjectInfo->FileId.Unique);
 
-            //
-            // We are ok, just get out
-            //
+                //
+                // We are ok, just get out
+                //
 
-            ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
-            try_return( ntStatus = STATUS_SUCCESS);
+                try_return( ntStatus = STATUS_SUCCESS);
+            }
         }
 
         //
@@ -2761,8 +2763,15 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 FILE_OBJECT * pCCFileObject = NULL;
                 BOOLEAN bPurgeExtents = FALSE;
 
+                if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+                {
+
+                    bPurgeExtents = TRUE;
+                }
+
                 if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
                 {
+
                     bPurgeExtents = TRUE;
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -2777,29 +2786,6 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                     ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                 }
 
-                //
-                // Update the metadata for the entry
-                //
-
-                ntStatus = AFSUpdateMetaData( DirEntry,
-                                              pDirEnumEntry);
-
-                if( !NT_SUCCESS( ntStatus))
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
-                                  &DirEntry->NameInformation.FileName,
-                                  pObjectInfo->FileId.Cell,
-                                  pObjectInfo->FileId.Volume,
-                                  pObjectInfo->FileId.Vnode,
-                                  pObjectInfo->FileId.Unique,
-                                  ntStatus);
-
-                    break;
-                }
-
                 if( pObjectInfo->Fcb != NULL)
                 {
 
@@ -2885,6 +2871,29 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                     AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
                                     TRUE);
 
+                    //
+                    // Update the metadata for the entry
+                    //
+
+                    ntStatus = AFSUpdateMetaData( DirEntry,
+                                                  pDirEnumEntry);
+
+                    if( !NT_SUCCESS( ntStatus))
+                    {
+
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+                                      &DirEntry->NameInformation.FileName,
+                                      pObjectInfo->FileId.Cell,
+                                      pObjectInfo->FileId.Volume,
+                                      pObjectInfo->FileId.Vnode,
+                                      pObjectInfo->FileId.Unique,
+                                      ntStatus);
+
+                        break;
+                    }
+
                     //
                     // Update file sizes
                     //
@@ -2905,6 +2914,30 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                 }
                 else
                 {
+
+                    //
+                    // Update the metadata for the entry
+                    //
+
+                    ntStatus = AFSUpdateMetaData( DirEntry,
+                                                  pDirEnumEntry);
+
+                    if( !NT_SUCCESS( ntStatus))
+                    {
+
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+                                      &DirEntry->NameInformation.FileName,
+                                      pObjectInfo->FileId.Cell,
+                                      pObjectInfo->FileId.Volume,
+                                      pObjectInfo->FileId.Vnode,
+                                      pObjectInfo->FileId.Unique,
+                                      ntStatus);
+
+                        break;
+                    }
+
                     AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_WARNING,
                                   "AFSValidateEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",