From f142b615bbac6195aa4e275179f37da490013432 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 30 Dec 2011 01:24:27 -0500 Subject: [PATCH] Windows: Add AFSFileEvalResultCB In response to AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID and AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME, return the new AFSFileEvalResultCB instead of a raw AFSDirEnumEntry. AFSFileEvalResultCB includes the data version number of the parent directory at the time the node was evaluated. Change-Id: Ida25790688f8ab193c234c9b3fadf4f594edd740 Reviewed-on: http://gerrit.openafs.org/6454 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- .../afsrdr/common/AFSRedirCommonDefines.h | 2 + src/WINNT/afsrdr/common/AFSUserStructs.h | 10 +++ .../afsrdr/kernel/lib/AFSCommSupport.cpp | 66 ++++++++++++++----- src/WINNT/afsrdr/user/RDRFunction.c | 34 ++++++---- 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src/WINNT/afsrdr/common/AFSRedirCommonDefines.h b/src/WINNT/afsrdr/common/AFSRedirCommonDefines.h index dbc10e655..969c1a4b7 100644 --- a/src/WINNT/afsrdr/common/AFSRedirCommonDefines.h +++ b/src/WINNT/afsrdr/common/AFSRedirCommonDefines.h @@ -69,6 +69,8 @@ #define AFS_GENERIC_MEMORY_27_TAG 'RGFA' #define AFS_GENERIC_MEMORY_28_TAG 'SGFA' #define AFS_GENERIC_MEMORY_29_TAG 'TGFA' +#define AFS_GENERIC_MEMORY_30_TAG 'UGFA' +#define AFS_GENERIC_MEMORY_31_TAG 'VGFA' #define AFS_FCB_ALLOCATION_TAG 'AFFA' #define AFS_FCB_NP_ALLOCATION_TAG 'NFFA' #define AFS_VCB_ALLOCATION_TAG 'CVFA' diff --git a/src/WINNT/afsrdr/common/AFSUserStructs.h b/src/WINNT/afsrdr/common/AFSUserStructs.h index 7aa09a8dd..fcdcf8efb 100644 --- a/src/WINNT/afsrdr/common/AFSUserStructs.h +++ b/src/WINNT/afsrdr/common/AFSUserStructs.h @@ -590,6 +590,16 @@ typedef struct _AFS_FILE_EVAL_TARGET_CB } AFSEvalTargetCB; +typedef struct _AFS_FILE_EVAL_RESULT_CB +{ + + LARGE_INTEGER ParentDataVersion; + + AFSDirEnumEntry DirEnum; + +} AFSFileEvalResultCB; + + // // Control structure for read and write requests through the PIOCtl interface // diff --git a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp index 4c18cc6ed..b8ca97db5 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp @@ -1788,6 +1788,7 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo, NTSTATUS ntStatus = STATUS_SUCCESS; AFSEvalTargetCB stTargetID; ULONG ulResultBufferLength; + AFSFileEvalResultCB *pEvalResultCB = NULL; AFSDirEnumEntry *pDirEnumCB = NULL; ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS; @@ -1807,11 +1808,11 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo, // Allocate our response buffer // - pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool, - PAGE_SIZE, - AFS_GENERIC_MEMORY_2_TAG); + pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool, + PAGE_SIZE, + AFS_GENERIC_MEMORY_30_TAG); - if( pDirEnumCB == NULL) + if( pEvalResultCB == NULL) { try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); @@ -1836,7 +1837,7 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo, &ObjectInfo->FileId, &stTargetID, sizeof( AFSEvalTargetCB), - pDirEnumCB, + pEvalResultCB, &ulResultBufferLength); if( ntStatus != STATUS_SUCCESS) @@ -1867,16 +1868,30 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo, if( DirEnumEntry != NULL) { + pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool, + PAGE_SIZE, + AFS_GENERIC_MEMORY_2_TAG); + + if( pDirEnumCB == NULL) + { + + try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); + } + + RtlCopyMemory( pDirEnumCB, &pEvalResultCB->DirEnum, + ulResultBufferLength - sizeof( AFSFileEvalResultCB) + sizeof( AFSDirEnumEntry)); + *DirEnumEntry = pDirEnumCB; } - else + +try_exit: + + if( pEvalResultCB != NULL) { - AFSExFreePool( pDirEnumCB); + AFSExFreePool( pEvalResultCB); } -try_exit: - if( !NT_SUCCESS( ntStatus)) { @@ -1903,6 +1918,7 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup, NTSTATUS ntStatus = STATUS_SUCCESS; AFSEvalTargetCB stTargetID; ULONG ulResultBufferLength; + AFSFileEvalResultCB *pEvalResultCB = NULL; AFSDirEnumEntry *pDirEnumCB = NULL; __Enter @@ -1914,11 +1930,11 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup, // Allocate our response buffer // - pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool, - PAGE_SIZE, - AFS_GENERIC_MEMORY_3_TAG); + pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool, + PAGE_SIZE, + AFS_GENERIC_MEMORY_31_TAG); - if( pDirEnumCB == NULL) + if( pEvalResultCB == NULL) { try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); @@ -1937,7 +1953,7 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup, NULL, &stTargetID, sizeof( AFSEvalTargetCB), - pDirEnumCB, + pEvalResultCB, &ulResultBufferLength); if( ntStatus != STATUS_SUCCESS) @@ -1953,16 +1969,30 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup, if( DirEnumEntry != NULL) { + pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool, + PAGE_SIZE, + AFS_GENERIC_MEMORY_3_TAG); + + if( pDirEnumCB == NULL) + { + + try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES); + } + + RtlCopyMemory( pDirEnumCB, &pEvalResultCB->DirEnum, + ulResultBufferLength - sizeof( AFSFileEvalResultCB) + sizeof( AFSDirEnumEntry)); + *DirEnumEntry = pDirEnumCB; } - else + +try_exit: + + if( pEvalResultCB != NULL) { - AFSExFreePool( pDirEnumCB); + AFSExFreePool( pEvalResultCB); } -try_exit: - if( !NT_SUCCESS( ntStatus)) { diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 02e8084b5..536ebed1d 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -940,8 +940,9 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, IN DWORD ResultBufferLength, IN OUT AFSCommResult **ResultCB) { + AFSFileEvalResultCB *pEvalResultCB = NULL; AFSDirEnumEntry * pCurrentEntry; - size_t size = sizeof(AFSCommResult) + ResultBufferLength - 1; + size_t size = ResultBufferLength ? sizeof(AFSCommResult) + ResultBufferLength - 1 : sizeof(AFSCommResult); afs_uint32 code = 0; cm_scache_t * scp = NULL; cm_scache_t * dscp = NULL; @@ -981,9 +982,13 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, } memset(*ResultCB, 0, size); - (*ResultCB)->ResultBufferLength = ResultBufferLength; - if (ResultBufferLength) - pCurrentEntry = (AFSDirEnumEntry *)&(*ResultCB)->ResultData; + (*ResultCB)->ResultBufferLength = 0; + dwRemaining = ResultBufferLength; + if (ResultBufferLength >= sizeof( AFSFileEvalResultCB)) { + pEvalResultCB = (AFSFileEvalResultCB *)&(*ResultCB)->ResultData; + pCurrentEntry = &pEvalResultCB->DirEnum; + dwRemaining -= (sizeof( AFSFileEvalResultCB) - sizeof( AFSDirEnumEntry)); + } if (ParentID.Cell != 0) { parentFid.cell = ParentID.Cell; @@ -1066,7 +1071,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, shortName[0] = '\0'; } - code = RDR_PopulateCurrentEntry(pCurrentEntry, ResultBufferLength, + code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining, dscp, scp, userp, &req, FileName, shortName, (bWow64 ? RDR_POP_WOW64 : 0) | @@ -1082,6 +1087,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, osi_Log2(afsd_logp, "RDR_EvaluateNodeByName FAILURE code=0x%x status=0x%x", code, status); } else { + pEvalResultCB->ParentDataVersion.QuadPart = dscp->dataVersion; (*ResultCB)->ResultStatus = STATUS_SUCCESS; (*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining; osi_Log0(afsd_logp, "RDR_EvaluateNodeByName SUCCESS"); @@ -1111,8 +1117,9 @@ RDR_EvaluateNodeByID( IN cm_user_t *userp, IN DWORD ResultBufferLength, IN OUT AFSCommResult **ResultCB) { - AFSDirEnumEntry * pCurrentEntry; - size_t size = sizeof(AFSCommResult) + ResultBufferLength - 1; + AFSFileEvalResultCB *pEvalResultCB = NULL; + AFSDirEnumEntry * pCurrentEntry = NULL; + size_t size = ResultBufferLength ? sizeof(AFSCommResult) + ResultBufferLength - 1 : sizeof(AFSCommResult); afs_uint32 code = 0; cm_scache_t * scp = NULL; cm_scache_t * dscp = NULL; @@ -1134,10 +1141,13 @@ RDR_EvaluateNodeByID( IN cm_user_t *userp, } memset(*ResultCB, 0, size); - (*ResultCB)->ResultBufferLength = ResultBufferLength; + (*ResultCB)->ResultBufferLength = 0; dwRemaining = ResultBufferLength; - if (ResultBufferLength) - pCurrentEntry = (AFSDirEnumEntry *)&(*ResultCB)->ResultData; + if (ResultBufferLength >= sizeof( AFSFileEvalResultCB)) { + pEvalResultCB = (AFSFileEvalResultCB *)&(*ResultCB)->ResultData; + pCurrentEntry = &pEvalResultCB->DirEnum; + dwRemaining -= (sizeof( AFSFileEvalResultCB) - sizeof( AFSDirEnumEntry)); + } RDR_InitReq(&req); if ( bWow64 ) @@ -1225,7 +1235,7 @@ RDR_EvaluateNodeByID( IN cm_user_t *userp, return; } - code = RDR_PopulateCurrentEntry(pCurrentEntry, ResultBufferLength, + code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining, dscp, scp, userp, &req, NULL, NULL, (bWow64 ? RDR_POP_WOW64 : 0) | (bNoFollow ? 0 : (RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS)), @@ -1242,6 +1252,8 @@ RDR_EvaluateNodeByID( IN cm_user_t *userp, osi_Log2(afsd_logp, "RDR_EvaluateNodeByID FAILURE code=0x%x status=0x%x", code, status); } else { + pEvalResultCB->ParentDataVersion.QuadPart = dscp->dataVersion; + (*ResultCB)->ResultStatus = STATUS_SUCCESS; (*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining; osi_Log0(afsd_logp, "RDR_EvaluateNodeByID SUCCESS"); -- 2.39.5