venus: Remove dedebug
[openafs.git] / src / WINNT / afsrdr / user / RDRInit.cpp
index 37a30d8..9e50be7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2008 Secure Endpoints, Inc.
- * Copyright (c) 2009-2011 Your File System, Inc.
+ * Copyright (c) 2009-2013 Your File System, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+extern "C" {
+#include <afsconfig.h>
+#include <afs/param.h>
+#include <afs/stds.h>
+}
+
 #ifndef _WIN32_WINNT
 #define _WIN32_WINNT 0x0500
 #endif
 #include <windows.h>
 typedef LONG NTSTATUS, *PNTSTATUS;      // not declared in ntstatus.h
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
+#include <roken.h>
 
 #include <devioctl.h>
 
@@ -61,13 +64,21 @@ typedef LONG NTSTATUS, *PNTSTATUS;      // not declared in ntstatus.h
 extern "C" {
 #include <osilog.h>
 extern osi_log_t *afsd_logp;
+extern int cm_directIO;
 
 #include <WINNT/afsreg.h>
 #include <afs/cm_config.h>
 #include <afs/cm_error.h>
+#include <afs/cm_nls.h>
+#include <afs/cm_user.h>
 }
 #include <RDRPrototypes.h>
 
+static DWORD
+RDR_SetFileStatus2( AFSFileID * pFileId,
+                    GUID *pAuthGroup,
+                    DWORD dwStatus);
+
 #ifndef FlagOn
 #define FlagOn(_F,_SF)        ((_F) & (_SF))
 #endif
@@ -163,6 +174,7 @@ RDR_Initialize(void)
     if (dwRet == ERROR_SUCCESS) {
 
         RDR_InitIoctl();
+        RDR_InitPipe();
     }
 
     return dwRet;
@@ -274,6 +286,10 @@ RDR_ShutdownNotify(void)
         // log the error, nothing to do
     }
 
+
+    RDR_ShutdownIoctl();
+    RDR_ShutdownPipe();
+
     return 0;
 }
 
@@ -305,8 +321,11 @@ RDR_ProcessWorkerThreads(DWORD numThreads)
 
     if( glDevHandle == INVALID_HANDLE_VALUE)
     {
+       dwErr = GetLastError();
+
         free(redirInitInfo);
-        return GetLastError();
+
+       return dwErr;
     }
 
     //
@@ -322,13 +341,15 @@ RDR_ProcessWorkerThreads(DWORD numThreads)
                               &bytesReturned ))
     {
 
+       dwErr = GetLastError();
+
         CloseHandle( glDevHandle);
 
         glDevHandle = NULL;
 
         free(redirInitInfo);
 
-        return GetLastError();
+       return dwErr;
     }
 
     //
@@ -352,12 +373,19 @@ RDR_ProcessWorkerThreads(DWORD numThreads)
 
     for (index = 0; index < numThreads; index++)
     {
-        //
-        // 20% of worker threads should be reserved for release extent
-        // event processing
-        //
-        glWorkerThreadInfo[ glThreadHandleIndex].Flags =
-            (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
+        if ( !cm_directIO)
+        {
+            //
+            // 20% of worker threads should be reserved for release extent
+            // event processing
+            //
+            glWorkerThreadInfo[ glThreadHandleIndex].Flags =
+                (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
+        }
+        else
+        {
+            glWorkerThreadInfo[ glThreadHandleIndex].Flags = 0;
+        }
         glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
         glWorkerThreadInfo[ glThreadHandleIndex].hThread =
             CreateThread( NULL,
@@ -400,13 +428,21 @@ RDR_ProcessWorkerThreads(DWORD numThreads)
                               &bytesReturned ))
     {
 
+       //
+       // Must kill off the worker threads we spawned.
+       //
+
+       RDR_ShutdownFinal();
+
+       dwErr = GetLastError();
+
         CloseHandle( glDevHandle);
 
         glDevHandle = NULL;
 
         free(redirInitInfo);
 
-        return GetLastError();
+       return dwErr;
     }
 
     free(redirInitInfo);
@@ -461,7 +497,7 @@ RDR_RequestWorkerThread( LPVOID lpParameter)
 
             requestBuffer->RequestFlags = pInfo->Flags;
 
-            if( !RDR_DeviceIoControl( hDevHandle,
+            if( RDR_DeviceIoControl( hDevHandle,
                                       IOCTL_AFS_PROCESS_IRP_REQUEST,
                                       (void *)requestBuffer,
                                       sizeof( AFSCommRequest),
@@ -470,21 +506,27 @@ RDR_RequestWorkerThread( LPVOID lpParameter)
                                       &bytesReturned ))
             {
 
+                WaitForSingleObject( RDR_SuspendEvent, INFINITE);
+
                 //
-                // Error condition back from driver
+                // Go process the request
                 //
 
-                break;
+                if (!Exit)
+                    RDR_ProcessRequest( requestBuffer);
             }
+            else
+            {
 
-            WaitForSingleObject( RDR_SuspendEvent, INFINITE);
-
-            //
-            // Go process the request
-            //
+                if (afsd_logp->enabled) {
+                    WCHAR wchBuffer[256];
+                    DWORD gle = GetLastError();
 
-            if (!Exit)
-                RDR_ProcessRequest( requestBuffer);
+                    swprintf( wchBuffer,
+                              L"Failed to post IOCTL_AFS_IRP_REQUEST gle 0x%x", gle);
+                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+                }
+            }
         }
 
        free( requestBuffer);
@@ -523,6 +565,7 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
     BOOL                bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
     BOOL                bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
     BOOL                bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
+    BOOL                bCacheBypass = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CACHE_BYPASS) ? TRUE : FALSE;
     BOOL                bRetry = FALSE;
     BOOL                bUnsupported = FALSE;
     BOOL                bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
@@ -603,6 +646,7 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                                     RequestBuffer->Name,
                                     RequestBuffer->NameLength,
                                     RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
+                                    RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_LAST_COMPONENT ? TRUE : FALSE,
                                     bWow64, bFast, bHoldFid,
                                     RequestBuffer->ResultBufferLength,
                                     &pResultCB);
@@ -698,11 +742,12 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
             if (afsd_logp->enabled) {
-                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
                           RequestBuffer->RequestIndex,
                           RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
                           RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
-                          RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
+                          RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
+                          pFileRenameCB->TargetNameLength, (int)pFileRenameCB->TargetNameLength, pFileRenameCB->TargetName);
 
                 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
@@ -719,6 +764,66 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             break;
         }
 
+        case AFS_REQUEST_TYPE_HARDLINK_FILE:
+        {
+
+            AFSFileHardLinkCB *pFileHardLinkCB = (AFSFileHardLinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HARDLINK_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
+                          RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
+                          pFileHardLinkCB->TargetNameLength, (int)pFileHardLinkCB->TargetNameLength, pFileHardLinkCB->TargetName);
+
+                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+                }
+
+                RDR_HardLinkFileEntry( userp,
+                                       RequestBuffer->Name,
+                                       RequestBuffer->NameLength,
+                                       RequestBuffer->FileId,
+                                       pFileHardLinkCB,
+                                       bWow64,
+                                       RequestBuffer->ResultBufferLength,
+                                       &pResultCB);
+
+            break;
+        }
+
+        case AFS_REQUEST_TYPE_CREATE_SYMLINK:
+        {
+
+            AFSCreateSymlinkCB *pCreateSymlinkCB = (AFSCreateSymlinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+            WCHAR wchFileName[ 256];
+
+            if (afsd_logp->enabled) {
+                memset( wchFileName, '\0', 256 * sizeof( WCHAR));
+
+                memcpy( wchFileName,
+                        RequestBuffer->Name,
+                        RequestBuffer->NameLength);
+
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_SYMLINK Index %08lX File %S",
+                          RequestBuffer->RequestIndex, wchFileName);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+            }
+
+            RDR_CreateSymlinkEntry( userp,
+                                    RequestBuffer->FileId,
+                                    RequestBuffer->Name,
+                                    RequestBuffer->NameLength,
+                                    pCreateSymlinkCB,
+                                    bWow64,
+                                    RequestBuffer->ResultBufferLength,
+                                    &pResultCB);
+
+            break;
+        }
+
         case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
         {
 
@@ -877,369 +982,440 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             break;
         }
 
-    case AFS_REQUEST_TYPE_PIOCTL_READ:
-            {
-                AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+        case AFS_REQUEST_TYPE_PIOCTL_READ:
+        {
+            AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+            }
 
-                RDR_PioctlRead( userp,
-                                RequestBuffer->FileId,
-                                pPioctlCB,
-                                bWow64,
-                                bIsLocalSystem,
-                                RequestBuffer->ResultBufferLength,
-                                &pResultCB);
-                break;
+            RDR_PioctlRead( userp,
+                            RequestBuffer->FileId,
+                            pPioctlCB,
+                            bWow64,
+                            bIsLocalSystem,
+                            RequestBuffer->ResultBufferLength,
+                            &pResultCB);
+            break;
+        }
+
+        case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
+        {
+            AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
-            {
-                AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_PioctlClose( userp,
+                             RequestBuffer->FileId,
+                             pPioctlCB,
+                             bWow64,
+                             RequestBuffer->ResultBufferLength,
+                             &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+        case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
+        {
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
+                          BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
 
-                RDR_PioctlClose( userp,
-                                RequestBuffer->FileId,
-                                pPioctlCB,
-                                bWow64,
-                                RequestBuffer->ResultBufferLength,
-                                &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
+            AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-    case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
-            {
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
-                              BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
+            RDR_ByteRangeLockSync( userp,
+                                   RequestBuffer->FileId,
+                                   pBRLRequestCB,
+                                   bWow64,
+                                   RequestBuffer->ResultBufferLength,
+                                   &pResultCB);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            break;
+        }
 
-                AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+        case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
+        {
+            AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                RDR_ByteRangeLockSync( userp,
-                                       RequestBuffer->FileId,
-                                       pBRLRequestCB,
-                                       bWow64,
-                                       RequestBuffer->ResultBufferLength,
-                                       &pResultCB);
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
-            {
-                AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_ByteRangeUnlock( userp,
+                                 RequestBuffer->FileId,
+                                 pBRURequestCB,
+                                 bWow64,
+                                 RequestBuffer->ResultBufferLength,
+                                 &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+        case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
+        {
+            AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_ByteRangeUnlock( userp,
-                                     RequestBuffer->FileId,
-                                     pBRURequestCB,
-                                     bWow64,
-                                     RequestBuffer->ResultBufferLength,
-                                     &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
-            {
-                AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
-
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+            RDR_ByteRangeUnlockAll( userp,
+                                    RequestBuffer->FileId,
+                                    pBRURequestCB,
+                                    bWow64,
+                                    RequestBuffer->ResultBufferLength,
+                                    &pResultCB);
+            break;
+        }
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+        case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
+        {
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_ByteRangeUnlockAll( userp,
-                                        RequestBuffer->FileId,
-                                        pBRURequestCB,
-                                        bWow64,
-                                        RequestBuffer->ResultBufferLength,
-                                        &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
-            {
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+            RDR_GetVolumeInfo( userp,
+                               RequestBuffer->FileId,
+                               bWow64,
+                               RequestBuffer->ResultBufferLength,
+                               &pResultCB);
+            break;
+        }
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+        case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
+        {
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_GetVolumeInfo( userp,
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+            }
+
+            RDR_GetVolumeSizeInfo( userp,
                                    RequestBuffer->FileId,
                                    bWow64,
                                    RequestBuffer->ResultBufferLength,
                                    &pResultCB);
-                break;
+            break;
+        }
+
+        case AFS_REQUEST_TYPE_HOLD_FID:
+        {
+
+            AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
+                          RequestBuffer->RequestIndex);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_HOLD_FID:
-            {
+            RDR_HoldFid( userp,
+                         pHoldFidCB,
+                         bFast,
+                         RequestBuffer->ResultBufferLength,
+                         &pResultCB);
 
-                AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
-                              RequestBuffer->RequestIndex);
+        case AFS_REQUEST_TYPE_RELEASE_FID:
+        {
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                RDR_HoldFid( userp,
-                             pHoldFidCB,
-                             bFast,
-                             RequestBuffer->ResultBufferLength,
-                             &pResultCB);
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
+                          RequestBuffer->RequestIndex);
 
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_RELEASE_FID:
-            {
+            RDR_ReleaseFid( userp,
+                            pReleaseFidCB,
+                            bFast,
+                            RequestBuffer->ResultBufferLength,
+                            &pResultCB);
 
-                AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
-                              RequestBuffer->RequestIndex);
+        case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
+        {
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                RDR_ReleaseFid( userp,
-                                pReleaseFidCB,
-                                bFast,
-                                RequestBuffer->ResultBufferLength,
-                                &pResultCB);
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
-            {
+            RDR_CleanupFileEntry( userp,
+                                  RequestBuffer->FileId,
+                                  RequestBuffer->Name,
+                                  RequestBuffer->NameLength,
+                                  pCleanupCB,
+                                  bWow64,
+                                  bFlushFile,
+                                  bDeleteFile,
+                                  bUnlockFile,
+                                  RequestBuffer->ResultBufferLength,
+                                  &pResultCB);
 
-                AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+        case AFS_REQUEST_TYPE_PIPE_OPEN:
+        {
+            AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_CleanupFileEntry( userp,
-                                      RequestBuffer->FileId,
-                                      RequestBuffer->Name,
-                                      RequestBuffer->NameLength,
-                                      pCleanupCB,
-                                      bWow64,
-                                      bFlushFile,
-                                      bDeleteFile,
-                                      bUnlockFile,
-                                      RequestBuffer->ResultBufferLength,
-                                      &pResultCB);
-
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_OPEN:
-            {
-                AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_PipeOpen( userp,
+                          RequestBuffer->FileId,
+                          RequestBuffer->Name,
+                          RequestBuffer->NameLength,
+                          pPipeCB,
+                          bWow64,
+                          RequestBuffer->ResultBufferLength,
+                          &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+        case AFS_REQUEST_TYPE_PIPE_WRITE:
+        {
+            AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_PipeOpen( userp,
-                              RequestBuffer->FileId,
-                              RequestBuffer->Name,
-                              RequestBuffer->NameLength,
-                              pPipeCB,
-                              bWow64,
-                              RequestBuffer->ResultBufferLength,
-                              &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_WRITE:
-            {
-                AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
-                BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
+            RDR_PipeWrite( userp,
+                           RequestBuffer->FileId,
+                           pPipeCB,
+                           pPipeData,
+                           bWow64,
+                           RequestBuffer->ResultBufferLength,
+                           &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+        case AFS_REQUEST_TYPE_PIPE_READ:
+        {
+            AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_PipeWrite( userp,
-                               RequestBuffer->FileId,
-                               pPipeCB,
-                               pPipeData,
-                               bWow64,
-                               RequestBuffer->ResultBufferLength,
-                               &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_READ:
-            {
-                AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_PipeRead( userp,
+                          RequestBuffer->FileId,
+                          pPipeCB,
+                          bWow64,
+                          RequestBuffer->ResultBufferLength,
+                          &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+        case AFS_REQUEST_TYPE_PIPE_CLOSE:
+        {
+            AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                RDR_PipeRead( userp,
-                              RequestBuffer->FileId,
-                              pPipeCB,
-                              bWow64,
-                              RequestBuffer->ResultBufferLength,
-                              &pResultCB);
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_CLOSE:
-            {
-                AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_PipeClose( userp,
+                           RequestBuffer->FileId,
+                           pPipeCB,
+                           bWow64,
+                           RequestBuffer->ResultBufferLength,
+                           &pResultCB);
+            break;
+        }
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
-                              RequestBuffer->RequestIndex,
-                              RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
-                              RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+        case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
+        {
+            AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
 
-                RDR_PipeClose( userp,
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
+                          RequestBuffer->RequestIndex);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+            }
+
+            RDR_PipeTransceive( userp,
                                 RequestBuffer->FileId,
                                 pPipeCB,
+                                pPipeData,
                                 bWow64,
                                 RequestBuffer->ResultBufferLength,
                                 &pResultCB);
-                break;
-            }
+            break;
+        }
 
+        case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
+        {
+            AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-    case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
-            {
-                AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
-                BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
+                          RequestBuffer->RequestIndex);
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
-                              RequestBuffer->RequestIndex);
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+            }
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+            RDR_PipeQueryInfo( userp,
+                               RequestBuffer->FileId,
+                               pPipeInfoCB,
+                               bWow64,
+                               RequestBuffer->ResultBufferLength,
+                               &pResultCB);
+            break;
+        }
 
-                RDR_PipeTransceive( userp,
-                                    RequestBuffer->FileId,
-                                    pPipeCB,
-                                    pPipeData,
-                                    bWow64,
-                                    RequestBuffer->ResultBufferLength,
-                                    &pResultCB);
-                break;
+        case AFS_REQUEST_TYPE_PIPE_SET_INFO:
+        {
+            AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
+
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
+                          RequestBuffer->RequestIndex);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
-            {
-                AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+            RDR_PipeSetInfo( userp,
+                             RequestBuffer->FileId,
+                             pPipeInfoCB,
+                             pPipeData,
+                             bWow64,
+                             RequestBuffer->ResultBufferLength,
+                             &pResultCB);
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
-                              RequestBuffer->RequestIndex);
+            break;
+        }
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
 
-                RDR_PipeQueryInfo( userp,
-                                   RequestBuffer->FileId,
-                                   pPipeInfoCB,
-                                   bWow64,
-                                   RequestBuffer->ResultBufferLength,
-                                   &pResultCB);
-                break;
+        case AFS_REQUEST_TYPE_PROCESS_READ_FILE: {
+            AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_READ_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    case AFS_REQUEST_TYPE_PIPE_SET_INFO:
-            {
-                AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
-                BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
+            RDR_ReadFile( userp,
+                          RequestBuffer->FileId,
+                          &pFileIOCB->IOOffset,
+                          pFileIOCB->IOLength,
+                          pFileIOCB->MappedIOBuffer,
+                          bWow64,
+                          bCacheBypass,
+                          RequestBuffer->ResultBufferLength,
+                          &pResultCB);
 
-                if (afsd_logp->enabled) {
-                    swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
-                              RequestBuffer->RequestIndex);
+            break;
+        }
 
-                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
-                }
+        case AFS_REQUEST_TYPE_PROCESS_WRITE_FILE: {
+            AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
 
-                RDR_PipeSetInfo( userp,
-                                 RequestBuffer->FileId,
-                                 pPipeInfoCB,
-                                 pPipeData,
-                                 bWow64,
-                                 RequestBuffer->ResultBufferLength,
-                                 &pResultCB);
+            if (afsd_logp->enabled) {
+                swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_WRITE_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
+                          RequestBuffer->RequestIndex,
+                          RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+                          RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
 
-                break;
+                osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-    default:
+            RDR_WriteFile( userp,
+                           RequestBuffer->FileId,
+                           pFileIOCB,
+                           &pFileIOCB->IOOffset,
+                           pFileIOCB->IOLength,
+                           pFileIOCB->MappedIOBuffer,
+                           bWow64,
+                           bCacheBypass,
+                           RequestBuffer->ResultBufferLength,
+                           &pResultCB);
+
+            break;
+        }
+
+        default:
             bUnsupported = TRUE;
 
             if (afsd_logp->enabled) {
@@ -1255,7 +1431,8 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
 
     if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
     {
-       if (pResultCB == NULL) {
+
+        if (pResultCB == NULL) {
            // We failed probably due to a memory allocation error
             // unless the unsupported flag was set.
            pResultCB = &stResultCB;
@@ -1266,6 +1443,11 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 pResultCB->ResultStatus = STATUS_NO_MEMORY;
        }
 
+        if (userp) {
+            pResultCB->Authenticated = cm_HaveToken( userp,
+                                                     RequestBuffer->FileId.Cell);
+        }
+
         //
         // This is how the filter associates the response information passed in the IOCtl below to the
         // original call. This request index is setup by the filter and should not be modified, otherwise the
@@ -1304,10 +1486,12 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
             }
 
-            sprintf( pBuffer,
-                     "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
-                     GetLastError());
-            osi_panic(pBuffer, __FILE__, __LINE__);
+            if (gle != ERROR_NOT_READY) {
+                sprintf( pBuffer,
+                         "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
+                         GetLastError());
+                osi_panic(pBuffer, __FILE__, __LINE__);
+            }
         }
 
     }
@@ -1359,7 +1543,8 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                                                  dwResultBufferLength);
                 }
 
-                if (gle != ERROR_GEN_FAILURE) {
+                if (gle != ERROR_GEN_FAILURE &&
+                    gle != ERROR_NOT_READY) {
                     sprintf( pBuffer,
                              "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
                              gle);
@@ -1379,7 +1564,7 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
               osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
           }
 
-          RDR_SetFileStatus( (cm_fid_t *)&RequestBuffer->FileId, STATUS_NO_MEMORY);
+          RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
        }
     }
     else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
@@ -1412,10 +1597,12 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 }
 
 
-                // TODO - instead of a panic we should release the locks
-                sprintf( pBuffer,
-                         "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
-                osi_panic(pBuffer, __FILE__, __LINE__);
+                if (gle != ERROR_NOT_READY) {
+                    // TODO - instead of a panic we should release the locks
+                    sprintf( pBuffer,
+                             "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
+                    osi_panic(pBuffer, __FILE__, __LINE__);
+                }
             }
 
             free(SetByteRangeLockResultCB);
@@ -1514,21 +1701,22 @@ RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
 
 extern "C" DWORD
 RDR_SetFileStatus( cm_fid_t *fidp,
+                   GUID *pAuthGroup,
                    DWORD dwStatus)
 {
     WCHAR               wchBuffer[1024];
     AFSExtentFailureCB  SetFileStatusCB;
     DWORD               bytesReturned;
     DWORD               gle;
-    AFSFileID          *pFileId = (AFSFileID *)fidp;
 
-    SetFileStatusCB.FileId = *pFileId;
+    RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
+    memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
     SetFileStatusCB.FailureStatus = dwStatus;
 
     if (afsd_logp->enabled) {
         swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
-                  pFileId->Cell, pFileId->Volume,
-                  pFileId->Vnode, pFileId->Unique,
+                  SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
+                  SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
                   dwStatus);
 
         osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
@@ -1549,6 +1737,43 @@ RDR_SetFileStatus( cm_fid_t *fidp,
     return 0;
 }
 
+static DWORD
+RDR_SetFileStatus2( AFSFileID *pFileId,
+                   GUID *pAuthGroup,
+                   DWORD dwStatus)
+{
+    WCHAR               wchBuffer[1024];
+    AFSExtentFailureCB  SetFileStatusCB;
+    DWORD               bytesReturned;
+    DWORD               gle;
+
+    memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
+    memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
+    SetFileStatusCB.FailureStatus = dwStatus;
+
+    if (afsd_logp->enabled) {
+        swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
+                  SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
+                  SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
+                  dwStatus);
+
+        osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+    }
+
+    if( !RDR_DeviceIoControl( glDevHandle,
+                              IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
+                              (void *)&SetFileStatusCB,
+                              sizeof(AFSExtentFailureCB),
+                              (void *)NULL,
+                              0,
+                              &bytesReturned ))
+    {
+        gle = GetLastError();
+        return gle;
+    }
+
+    return 0;
+}
 
 extern "C" DWORD
 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)