Windows: Add AFSFileEvalResultCB
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 30 Dec 2011 06:24:27 +0000 (01:24 -0500)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 31 Dec 2011 21:43:52 +0000 (13:43 -0800)
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 <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>

src/WINNT/afsrdr/common/AFSRedirCommonDefines.h
src/WINNT/afsrdr/common/AFSUserStructs.h
src/WINNT/afsrdr/kernel/lib/AFSCommSupport.cpp
src/WINNT/afsrdr/user/RDRFunction.c

index dbc10e6..969c1a4 100644 (file)
@@ -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'
index 7aa09a8..fcdcf8e 100644 (file)
@@ -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
 //
index 4c18cc6..b8ca97d 100644 (file)
@@ -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))
         {
 
index 02e8084..536ebed 100644 (file)
@@ -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");