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;
if (code) {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
(*ResultCB)->ResultStatus = status;
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
osi_Log2(afsd_logp, "RDR_EvaluateNodeByName cm_GetSCache parentFID failure code=0x%x status=0x%x",
code, status);
free(wszName);
if (code) {
cm_ReleaseSCache(scp);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
osi_Log2(afsd_logp, "RDR_EvaluateNodeByID cm_GetSCache parentFID failure code=0x%x status=0x%x",
code, status);
if (code) {
cm_ReleaseSCache(scp);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
osi_Log2(afsd_logp, "RDR_EvaluateNodeByID cm_GetSCache parentFID failure code=0x%x status=0x%x",
code, status);
if (code) {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
(*ResultCB)->ResultStatus = status;
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
osi_Log2(afsd_logp, "RDR_CreateFileEntry cm_GetSCache ParentFID failure code=0x%x status=0x%x",
code, status);
return;
if (code) {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
(*ResultCB)->ResultStatus = status;
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
osi_Log2(afsd_logp, "RDR_UpdateFileEntry cm_GetSCache ParentFID failure code=0x%x status=0x%x",
code, status);
return;
code = cm_GetSCache(&parentFid, &dscp, userp, &req);
if (code) {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
osi_Log2(afsd_logp, "RDR_CleanupFileEntry cm_GetSCache ParentFID failure code=0x%x status=0x%x",
code, status);
}
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- if (scp->redirBufCount > 0) {
+ if ((bLastHandle || bFlushFile) &&
+ scp->redirBufCount > 0)
+ {
LARGE_INTEGER heldExtents;
AFSFileExtentCB extentList[1024];
DWORD extentCount = 0;
}
if (bLastHandle || bFlushFile) {
- if (bScpLocked) {
- lock_ReleaseWrite(&scp->rw);
- bScpLocked = FALSE;
+ if (!bScpLocked) {
+ lock_ObtainWrite(&scp->rw);
+ bScpLocked = TRUE;
+ }
+ code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_WRITE,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ if (code == 0) {
+ if (bScpLocked) {
+ lock_ReleaseWrite(&scp->rw);
+ bScpLocked = FALSE;
+ }
+
+ code = cm_FSync(scp, userp, &req, bScpLocked);
}
- code = buf_CleanVnode(scp, userp, &req);
if (bLastHandle && code)
goto on_error;
}
code = cm_GetSCache(&parentFid, &dscp, userp, &req);
if (code) {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
osi_Log2(afsd_logp, "RDR_DeleteFileEntry cm_GetSCache ParentFID failure code=0x%x status=0x%x",
code, status);
if (code) {
osi_Log1(afsd_logp, "RDR_RenameFileEntry cm_GetSCache source parent failed code 0x%x", code);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
return;
}
if (code) {
osi_Log2(afsd_logp, "RDR_RenameFileEntry cm_SyncOp oldDscp 0x%p failed code 0x%x", oldDscp, code);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
+ if ( status == STATUS_INVALID_HANDLE)
+ status = STATUS_OBJECT_PATH_INVALID;
(*ResultCB)->ResultStatus = status;
lock_ReleaseWrite(&oldDscp->rw);
cm_ReleaseSCache(oldDscp);
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);
* we need to re-queue this extent fetch.
*/
force_retry = 1;
- continue;
+ break;
}
if (!rwheld) {
code = cm_GetBuffer(scp, bufp, NULL, userp, reqp);
if (code == 0) {
- if (bufp->flags & CM_BUF_DIRTY)
- cm_BufWrite(scp, &bufp->offset, cm_chunkSize, CM_BUF_WRITE_SCP_LOCKED, userp, reqp);
-
if (!(bufp->qFlags & CM_BUF_QREDIR)) {
#ifdef VALIDATE_CHECK_SUM
#ifdef ODS_DEBUG
char dbgstr[1024];
#endif
#endif
+ if (bufp->flags & CM_BUF_DIRTY)
+ cm_BufWrite(scp, &bufp->offset, cm_data.buf_blockSize, CM_BUF_WRITE_SCP_LOCKED, userp, reqp);
+
lock_ObtainWrite(&buf_globalLock);
if (!(bufp->flags & CM_BUF_DIRTY) &&
bufp->cmFlags == 0 &&
* non-fatal errors. re-queue the exent
*/
code = CM_ERROR_RETRY;
+ force_retry = 1;
}
}
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;
}
else
minLength = scp->length;
- if (LargeIntegerGreaterThanOrEqualTo(bufp->offset, minLength)) {
+ if (!bHaveBuffer &&
+ LargeIntegerGreaterThanOrEqualTo(bufp->offset, minLength)) {
memset(bufp->datap, 0, cm_data.buf_blockSize);
bufp->dataVersion = scp->dataVersion;
bHaveBuffer = TRUE;
}
- lock_ReleaseRead(&scp->rw);
-
- if ((RequestExtentsCB->Flags & AFS_EXTENT_FLAG_CLEAN) &&
- ByteOffset.QuadPart <= bufp->offset.QuadPart &&
- EndOffset.QuadPart >= bufp->offset.QuadPart + cm_data.blockSize) {
+ else if ((RequestExtentsCB->Flags & AFS_EXTENT_FLAG_CLEAN) &&
+ ByteOffset.QuadPart <= bufp->offset.QuadPart &&
+ EndOffset.QuadPart >= bufp->offset.QuadPart + cm_data.blockSize)
+ {
memset(bufp->datap, 0, cm_data.blockSize);
bufp->dataVersion = scp->dataVersion;
buf_SetDirty(bufp, &req, 0, cm_data.blockSize, userp);
bHaveBuffer = TRUE;
}
+ lock_ReleaseRead(&scp->rw);
}
/*
bufp, ByteOffset.QuadPart, bufp->datap - RDR_extentBaseAddress, cm_data.blockSize);
} else {
lock_ReleaseWrite(&buf_globalLock);
- lock_ReleaseWrite(&scp->rw);
}
} else {
if (bBufRelease) {
if (scp) {
if (ReleaseExtentsCB->Flags & AFS_EXTENT_FLAG_FLUSH) {
- code = buf_CleanVnode(scp, userp, &req);
+ lock_ObtainWrite(&scp->rw);
+ code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_WRITE,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&scp->rw);
+ if (code == 0)
+ code = cm_FSync(scp, userp, &req, FALSE);
}
else if (dirty) {
osi_hyper_t offset = {0,0};