From: Jeffrey Altman Date: Thu, 5 Apr 2012 04:11:11 +0000 (-0400) Subject: Windows: AFSVerifyEntry purge file data on DV change X-Git-Tag: upstream/1.8.0_pre1^2~2642 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=ba3ba96976f17cb5e83fae1e0a42fd6564b75719;p=packages%2Fo%2Fopenafs.git Windows: AFSVerifyEntry purge file data on DV change 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 Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index 721d5567d..79fe2a5ee 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -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",