/* clear things out */
biop->scp = scp; /* do not hold; held by caller */
+ biop->userp = userp; /* do not hold; held by caller */
biop->offset = *inOffsetp;
biop->length = 0;
biop->bufListp = NULL;
tblocksize = ConvertLongToLargeInteger(cm_data.buf_blockSize);
biop->scp = scp; /* do not hold; held by caller */
+ biop->userp = userp; /* do not hold; held by caller */
biop->reqp = reqp;
biop->offset = *offsetp;
/* null out the list of buffers */
if (RDR_Initialized && reportErrorToRedir) {
DWORD status;
smb_MapNTError(cm_MapRPCError(code, biop->reqp), &status, TRUE);
- RDR_SetFileStatus( &scp->fid, status);
+ RDR_SetFileStatus( &scp->fid, &biop->userp->authgroup, status);
}
} else {
if (!scp_locked)
/* bulk I/O descriptor */
typedef struct cm_bulkIO {
struct cm_scache *scp; /* typically unheld vnode ptr */
+ struct cm_user *userp; /* the user of the request */
struct cm_req *reqp; /* the request ptr */
osi_hyper_t offset; /* offset of buffers */
long length; /* # of bytes to be transferred */
osi_mutex_t mx; /* mutex */
int vcRefs; /* count of references from virtual circuits */
long flags;
+ GUID authgroup; /* AFS redirector */
} cm_user_t;
#define CM_USERFLAG_DELETE 1 /* delete on last reference */
NTSTATUS ExtentsRequestStatus;
+ GUID ExtentsRequestAuthGroup;
+
struct _AFS_FSD_EXTENT *DirtyListHead;
struct _AFS_FSD_EXTENT *DirtyListTail;
extern DWORD RDR_InvalidateVolume( IN ULONG cellID, IN ULONG volID, IN ULONG reason);
-extern DWORD RDR_SetFileStatus( IN cm_fid_t *pFileId, IN DWORD dwStatus);
+extern DWORD RDR_SetFileStatus( IN cm_fid_t *pFileId, IN GUID *pAuthGroup, IN DWORD dwStatus);
extern DWORD
RDR_InvalidateObject( IN ULONG cellID, IN ULONG volID, IN ULONG vnode,
ULONG FailureStatus;
+ GUID AuthGroup; // Length: sizeof(GUID) */
+
} AFSExtentFailureCB;
//
__Enter
{
- if( pAuthGroup == NULL)
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
RtlZeroMemory( &stAuthGroup,
{
//
- // If this isn't the same process which caused the failure then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // then try to request them again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
+ if( RtlCompareMemory( &pNPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
- try_return( ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus);
- }
- pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+ ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus;
+
+ pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+ RtlZeroMemory( &pNPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
}
//
pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = pFailureCB->FailureStatus;
+ RtlCopyMemory( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &pFailureCB->AuthGroup,
+ sizeof( GUID));
+
KeSetEvent( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
0,
FALSE);
}
NTSTATUS
-AFSWaitForExtentMapping( AFSFcb *Fcb )
+AFSWaitForExtentMapping( AFSFcb *Fcb,
+ AFSCcb *Ccb)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
LARGE_INTEGER liTimeOut;
{
//
- // If this isn't the same process which caused the failure then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // then try to request them again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
+ if( RtlCompareMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
- try_return( ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus);
- }
- Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+ ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus;
+
+ Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+ RtlZeroMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
}
- liTimeOut.QuadPart = -(50000000);
+ liTimeOut.QuadPart = -(1 * AFS_ONE_SECOND);
ntStatus = KeWaitForSingleObject( &Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
Executive,
{
//
- // If this isn't the same process which caused the failure
- // and this isn't the System process, then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // or the System Process,
+ // then try to request the extents again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId ||
- ullProcessId == 0x4)
+ if( RtlCompareMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID) ||
+ ullProcessId == (ULONGLONG)AFSSysProcess)
{
- try_return( ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus);
- }
- Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+ ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus;
+
+ Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+ RtlZeroMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
}
if( ntStatus == STATUS_TIMEOUT)
__Enter
{
- if( pAuthGroup == NULL)
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
RtlZeroMemory( &stAuthGroup,
__Enter
{
- if( pAuthGroup == NULL)
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
RtlZeroMemory( &stAuthGroup,
StartingByte.QuadPart,
ulReadByteCount);
- ntStatus = AFSWaitForExtentMapping ( pFcb );
+ ntStatus = AFSWaitForExtentMapping ( pFcb, pCcb);
if (!NT_SUCCESS(ntStatus))
{
}
pFcb->Specific.File.ExtentThreadId = (ULONGLONG)PsGetCurrentThreadId();
-
- pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
}
#endif
HANDLE hCallingUser = OnBehalfOf;
ULONG ulExtensionLength = 0;
BOOLEAN bRetry = FALSE;
+ ULONGLONG ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
pIrpSp = IoGetCurrentIrpStackLocation( Irp);
if( !bPagingIo &&
( pFcb->Specific.File.ExtentRequestProcessId == 0 ||
- ( PsGetCurrentProcessId() != AFSSysProcess &&
- pFcb->Specific.File.ExtentRequestProcessId != (ULONGLONG)PsGetCurrentProcessId())))
+ ( ullProcessId != (ULONGLONG)AFSSysProcess &&
+ pFcb->Specific.File.ExtentRequestProcessId != ullProcessId)))
{
- pFcb->Specific.File.ExtentRequestProcessId = (ULONGLONG)PsGetCurrentProcessId();
+ pFcb->Specific.File.ExtentRequestProcessId = ullProcessId;
- if( pFcb->Specific.File.ExtentRequestProcessId == (ULONGLONG)AFSSysProcess)
+ if( ullProcessId == (ULONGLONG)AFSSysProcess)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
__FUNCTION__,
pFcb);
}
-
- pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
}
//
bLocked= FALSE;
//
- // We will re-request the extents after 10 seconds of waiting for them
+ // We will re-request the extents after waiting for them
//
KeQueryTickCount( &liCurrentTime);
// Wait for it
//
- ntStatus = AFSWaitForExtentMapping ( pFcb );
+ ntStatus = AFSWaitForExtentMapping ( pFcb, pCcb);
if (!NT_SUCCESS(ntStatus))
{
IN ULONG Size);
NTSTATUS
-AFSWaitForExtentMapping ( IN AFSFcb *Fcb );
+AFSWaitForExtentMapping ( IN AFSFcb *Fcb,
+ IN AFSCcb *Ccb);
NTSTATUS
AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents );
unp = smb_FindUserByName(UuidString, cname, SMB_FLAG_CREATE);
lock_ObtainMutex(&unp->mx);
- if (!unp->userp)
+ if (!unp->userp) {
unp->userp = cm_NewUser();
+ memcpy(&unp->userp->authgroup, pGuid, sizeof(GUID));
+ }
unp->flags |= SMB_USERNAMEFLAG_SID;
lock_ReleaseMutex(&unp->mx);
userp = unp->userp;
FileId.Hash = scp->fid.hash;
if ((GetTickCount() - reqp->startTime) / 1000 > HardDeadtimeout * 5) {
- RDR_SetFileStatus( &scp->fid, STATUS_IO_TIMEOUT);
+ RDR_SetFileStatus( &scp->fid, &userp->authgroup, STATUS_IO_TIMEOUT);
return 0;
}
osi_Log2(afsd_logp, "RDR_BkgFetch cm_SyncOp failure scp=0x%p code=0x%x",
scp, code);
smb_MapNTError(cm_MapRPCError(code, reqp), &status, TRUE);
- RDR_SetFileStatus( &scp->fid, status);
+ RDR_SetFileStatus( &scp->fid, &userp->authgroup, status);
return code;
}
lock_ReleaseWrite(&scp->rw);
if (reportErrorToRedir) {
smb_MapNTError(cm_MapRPCError(code, reqp), &status, TRUE);
- RDR_SetFileStatus( &scp->fid, status);
+ RDR_SetFileStatus( &scp->fid, &userp->authgroup, status);
}
osi_Log4(afsd_logp, "Ending BKG Fetch scp 0x%p code 0x%x fetched 0x%x:%x",
osi_Log2(afsd_logp, "RDR_RequestFileExtentsAsync cm_SyncOp failure scp=0x%p code=0x%x",
scp, code);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
- RDR_SetFileStatus( &scp->fid, status);
+ RDR_SetFileStatus( &scp->fid, &userp->authgroup, status);
return FALSE;
}
break;
default:
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
- RDR_SetFileStatus(&FileId, status);
+ RDR_SetFileStatus(&FileId, &userp->authgroup, status);
bHaveBuffer = FALSE;
code = 0;
}
}
#include <RDRPrototypes.h>
+static DWORD
+RDR_SetFileStatus2( AFSFileID * pFileId,
+ GUID *pAuthGroup,
+ DWORD dwStatus);
+
#ifndef FlagOn
#define FlagOn(_F,_SF) ((_F) & (_SF))
#endif
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) {
extern "C" DWORD
RDR_SetFileStatus( cm_fid_t *fidp,
+ GUID *pAuthGroup,
DWORD dwStatus)
{
WCHAR wchBuffer[1024];
DWORD gle;
RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
+ memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
SetFileStatusCB.FailureStatus = dwStatus;
if (afsd_logp->enabled) {
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)