Windows: cleanup redirector pipes
[openafs.git] / src / WINNT / afsrdr / user / RDRInit.cpp
index 371f465..c8310a9 100644 (file)
@@ -68,6 +68,11 @@ extern osi_log_t *afsd_logp;
 }
 #include <RDRPrototypes.h>
 
+static DWORD
+RDR_SetFileStatus2( AFSFileID * pFileId,
+                    GUID *pAuthGroup,
+                    DWORD dwStatus);
+
 #ifndef FlagOn
 #define FlagOn(_F,_SF)        ((_F) & (_SF))
 #endif
@@ -163,6 +168,7 @@ RDR_Initialize(void)
     if (dwRet == ERROR_SUCCESS) {
 
         RDR_InitIoctl();
+        RDR_InitPipe();
     }
 
     return dwRet;
@@ -274,6 +280,10 @@ RDR_ShutdownNotify(void)
         // log the error, nothing to do
     }
 
+
+    RDR_ShutdownIoctl();
+    RDR_ShutdownPipe();
+
     return 0;
 }
 
@@ -1010,6 +1020,25 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 break;
             }
 
+    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);
+
+                    osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+                }
+
+                RDR_GetVolumeSizeInfo( userp,
+                                       RequestBuffer->FileId,
+                                       bWow64,
+                                       RequestBuffer->ResultBufferLength,
+                                       &pResultCB);
+                break;
+            }
+
     case AFS_REQUEST_TYPE_HOLD_FID:
             {
 
@@ -1304,10 +1333,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 +1390,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 +1411,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 +1444,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,6 +1548,7 @@ RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
 
 extern "C" DWORD
 RDR_SetFileStatus( cm_fid_t *fidp,
+                   GUID *pAuthGroup,
                    DWORD dwStatus)
 {
     WCHAR               wchBuffer[1024];
@@ -1522,6 +1557,7 @@ RDR_SetFileStatus( cm_fid_t *fidp,
     DWORD               gle;
 
     RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
+    memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
     SetFileStatusCB.FailureStatus = dwStatus;
 
     if (afsd_logp->enabled) {
@@ -1548,6 +1584,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)