MEMORYSTATUSEX memStatus;
DWORD maxMemoryCacheSize;
+#if 0
+ /*
+ * For now disable the memory extent interface because there
+ * have been reports of data corruption.
+ */
memStatus.dwLength = sizeof(memStatus);
if (GlobalMemoryStatusEx(&memStatus)) {
/*
*/
maxMemoryCacheSize = 65536;
}
+#else
+ maxMemoryCacheSize = 0;
+#endif
*pRedirInitInfoLen = (DWORD) (sizeof(AFSRedirectorInitInfo) + (cm_CachePathLen + TempPathLen) * sizeof(WCHAR));
*ppRedirInitInfo = (AFSRedirectorInitInfo *)malloc(*pRedirInitInfoLen);
}
/*
- * Obtain the status information for the specified object and
- *
+ * Obtain the status information for the specified object using
+ * an inline bulk status rpc. cm_BPlusDirEnumBulkStatOne() will
+ * obtain current status for the directory object, the object
+ * which is the focus of the inquiry and as many other objects
+ * in the directory for which there are not callbacks registered
+ * since we are likely to be asked for other objects in the directory.
*/
static afs_uint32
RDR_BulkStatLookup( cm_scache_t *dscp,
code);
}
-
if (enump)
{
code = cm_BPlusDirEnumBulkStatOne(enump, scp);
#define RDR_POP_WOW64 0x04
#define RDR_POP_NO_GETSTATUS 0x08
-afs_uint32
+static afs_uint32
RDR_PopulateCurrentEntry( IN AFSDirEnumEntry * pCurrentEntry,
IN DWORD dwMaxEntryLength,
IN cm_scache_t * dscp,
IN wchar_t * name,
IN wchar_t * shortName,
IN DWORD dwFlags,
+ IN afs_uint32 cmError,
OUT AFSDirEnumEntry **ppNextEntry,
OUT DWORD * pdwRemainingLength)
{
lock_ReleaseWrite(&scp->rw);
code = RDR_BulkStatLookup(dscp, scp, userp, reqp);
if (code) {
- osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry RXR_BulkStatLookup failed for scp=0x%p code=0x%x",
+ osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry RDR_BulkStatLookup failed for scp=0x%p code=0x%x",
scp, code);
return code;
}
bMustFake = TRUE;
}
}
-
}
+ /* Populate the error code */
+ smb_MapNTError(cmError, &pCurrentEntry->NTStatus, TRUE);
+
/* Populate the real or fake data */
pCurrentEntry->FileId.Cell = scp->fid.cell;
pCurrentEntry->FileId.Volume = scp->fid.volume;
wcsncpy(wname, name, len);
pCurrentEntry->FileNameLength = (ULONG)(sizeof(WCHAR) * len);
- osi_Log2(afsd_logp, "RDR_PopulateCurrentEntry scp=0x%p fileType=%d",
- scp, scp->fileType);
+ osi_Log3(afsd_logp, "RDR_PopulateCurrentEntry scp=0x%p fileType=%d dv=%u",
+ scp, scp->fileType, (afs_uint32)scp->dataVersion);
if (!(dwFlags & RDR_POP_NO_GETSTATUS))
cm_SyncOpDone( scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
return code;
}
-afs_uint32
+static afs_uint32
RDR_PopulateCurrentEntryNoScp( IN AFSDirEnumEntry * pCurrentEntry,
IN DWORD dwMaxEntryLength,
IN cm_scache_t * dscp,
IN wchar_t * name,
IN wchar_t * shortName,
IN DWORD dwFlags,
+ IN afs_uint32 cmError,
OUT AFSDirEnumEntry **ppNextEntry,
OUT DWORD * pdwRemainingLength)
{
dwEntryLength = sizeof(AFSDirEnumEntry);
+ /* Populate the error code */
+ smb_MapNTError(cmError, &pCurrentEntry->NTStatus, TRUE);
+
+ /* Populate the fake data */
pCurrentEntry->FileId.Cell = fidp->cell;
pCurrentEntry->FileId.Volume = fidp->volume;
pCurrentEntry->FileId.Vnode = fidp->vnode;
return;
}
+ osi_Log1(afsd_logp, "RDR_EnumerateDirectory dv=%u", (afs_uint32)dscp->dataVersion);
+
/*
* If there is no enumeration handle, then this is a new query
- * and we must perform an enumeration for the specified object
+ * and we must perform an enumeration for the specified object.
*/
if (QueryCB->EnumHandle == (ULONG_PTR)NULL) {
cm_dirOp_t dirop;
code = cm_BeginDirOp(dscp, userp, &req, CM_DIRLOCK_READ, CM_DIROP_FLAG_NONE, &dirop);
if (code == 0) {
- code = cm_BPlusDirEnumerate(dscp, userp, &req, TRUE, NULL, !bSkipStatus, &enump);
+ code = cm_BPlusDirEnumerate(dscp, userp, &req,
+ TRUE /* dir locked */, NULL /* no mask */,
+ TRUE /* fetch status? */, &enump);
if (code) {
osi_Log1(afsd_logp, "RDR_EnumerateDirectory cm_BPlusDirEnumerate failure code=0x%x",
code);
enump = (cm_direnum_t *)QueryCB->EnumHandle;
}
- if (enump && ResultBufferLength) {
- cm_direnum_entry_t * entryp = NULL;
+ if (enump) {
+ if (ResultBufferLength == 0) {
+ code = cm_BPlusDirEnumBulkStat(enump);
+ if (code) {
+ osi_Log1(afsd_logp, "RDR_EnumerateDirectory cm_BPlusDirEnumBulkStat failure code=0x%x",
+ code);
+ }
+ } else {
+ cm_direnum_entry_t * entryp = NULL;
+
+ pDirEnumResp->SnapshotDataVersion.QuadPart = enump->dataVersion;
- getnextentry:
- if (dwMaxEntryLength < sizeof(AFSDirEnumEntry) + (MAX_PATH + MOUNTPOINTLEN) * sizeof(wchar_t)) {
- osi_Log0(afsd_logp, "RDR_EnumerateDirectory out of space, returning");
- goto outofspace;
- }
+ getnextentry:
+ if (dwMaxEntryLength < sizeof(AFSDirEnumEntry) + (MAX_PATH + MOUNTPOINTLEN) * sizeof(wchar_t)) {
+ osi_Log0(afsd_logp, "RDR_EnumerateDirectory out of space, returning");
+ goto outofspace;
+ }
- code = cm_BPlusDirNextEnumEntry(enump, &entryp);
+ code = cm_BPlusDirNextEnumEntry(enump, &entryp);
- if ((code == 0 || code == CM_ERROR_STOPNOW) && entryp) {
- cm_scache_t *scp;
- int stopnow = (code == CM_ERROR_STOPNOW);
+ if ((code == 0 || code == CM_ERROR_STOPNOW) && entryp) {
+ cm_scache_t *scp = NULL;
+ int stopnow = (code == CM_ERROR_STOPNOW);
- if ( !wcscmp(L".", entryp->name) || !wcscmp(L"..", entryp->name) ) {
- osi_Log0(afsd_logp, "RDR_EnumerateDirectory skipping . or ..");
- if (stopnow)
- goto outofspace;
- goto getnextentry;
- }
+ if ( !wcscmp(L".", entryp->name) || !wcscmp(L"..", entryp->name) ) {
+ osi_Log0(afsd_logp, "RDR_EnumerateDirectory skipping . or ..");
+ if (stopnow)
+ goto outofspace;
+ goto getnextentry;
+ }
- if ( FALSE /* bSkipStatus */) {
- scp = cm_FindSCache(&entryp->fid);
- code = 0;
- } else {
- code = cm_GetSCache(&entryp->fid, &scp, userp, &req);
- }
+ if (bSkipStatus) {
+ code = cm_GetSCache(&entryp->fid, &scp, userp, &req);
+ if (code) {
+ osi_Log5(afsd_logp, "RDR_EnumerateDirectory cm_GetSCache failure cell %u vol %u vnode %u uniq %u code=0x%x",
+ entryp->fid.cell, entryp->fid.volume, entryp->fid.vnode, entryp->fid.unique, code);
+ }
+ } else {
+ code = entryp->errorCode;
+ scp = code ? NULL : cm_FindSCache(&entryp->fid);
+ }
- if (!code) {
if (scp) {
- code = RDR_PopulateCurrentEntry(pCurrentEntry, dwMaxEntryLength,
+ code = RDR_PopulateCurrentEntry( pCurrentEntry, dwMaxEntryLength,
dscp, scp, userp, &req,
entryp->name,
cm_Is8Dot3(entryp->name) ? NULL : entryp->shortName,
(bWow64 ? RDR_POP_WOW64 : 0) |
(bSkipStatus ? RDR_POP_NO_GETSTATUS : 0),
+ code,
&pCurrentEntry, &dwMaxEntryLength);
cm_ReleaseSCache(scp);
} else {
entryp->name,
cm_Is8Dot3(entryp->name) ? NULL : entryp->shortName,
(bWow64 ? RDR_POP_WOW64 : 0),
+ code,
&pCurrentEntry, &dwMaxEntryLength);
}
if (stopnow)
goto outofspace;
goto getnextentry;
- } else {
- osi_Log2(afsd_logp, "RDR_EnumerateDirectory cm_GetSCache failure scp=0x%p code=0x%x",
- scp, code);
- if (stopnow)
- goto outofspace;
- goto getnextentry;
}
}
}
- if (enump && ResultBufferLength == 0) {
- code = cm_BPlusDirEnumBulkStat(enump);
- if (code) {
- osi_Log1(afsd_logp, "RDR_EnumerateDirectory cm_BPlusDirEnumBulkStat failure code=0x%x",
- code);
- }
- }
outofspace:
if (code || enump->next == enump->count || ResultBufferLength == 0) {
(*ResultCB)->ResultBufferLength = ResultBufferLength - dwMaxEntryLength;
pDirEnumResp->EnumHandle = (ULONG_PTR) enump;
+ pDirEnumResp->CurrentDataVersion.QuadPart = dscp->dataVersion;
}
if (dscp)
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;
}
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;
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);
shortName[0] = '\0';
}
- code = RDR_PopulateCurrentEntry(pCurrentEntry, ResultBufferLength,
+ code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining,
dscp, scp, userp, &req,
FileName, shortName,
(bWow64 ? RDR_POP_WOW64 : 0) |
(bNoFollow ? 0 : (RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS)),
- NULL, &dwRemaining);
+ 0, NULL, &dwRemaining);
if (bHoldFid)
RDR_FlagScpInUse( scp, FALSE );
cm_ReleaseSCache(scp);
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");
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;
}
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 )
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);
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)),
- NULL, &dwRemaining);
+ 0, NULL, &dwRemaining);
if (bHoldFid)
RDR_FlagScpInUse( scp, FALSE );
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");
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;
code = RDR_PopulateCurrentEntry(&pResultCB->DirEnum, dwRemaining,
dscp, scp, userp, &req, FileName, shortName,
RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS,
- NULL, &dwRemaining);
+ 0, NULL, &dwRemaining);
if (bHoldFid)
RDR_FlagScpInUse( scp, FALSE );
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;
pResultCB = (AFSFileUpdateResultCB *)(*ResultCB)->ResultData;
+ pResultCB->ParentDataVersion.QuadPart = dscp->dataVersion;
+
code = RDR_PopulateCurrentEntry(&pResultCB->DirEnum, dwRemaining,
dscp, scp, userp, &req, NULL, NULL,
RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS,
- NULL, &dwRemaining);
+ 0, NULL, &dwRemaining);
(*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining;
osi_Log0(afsd_logp, "RDR_UpdateFileEntry SUCCESS");
} else {
IN DWORD ResultBufferLength,
IN OUT AFSCommResult **ResultCB)
{
- size_t size = sizeof(AFSCommResult);
+ AFSFileCleanupResultCB *pResultCB = NULL;
+ size_t size = sizeof(AFSCommResult) + ResultBufferLength - 1;
cm_fid_t Fid;
cm_fid_t parentFid;
afs_uint32 code = 0;
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);
code = cm_Unlink(dscp, NULL, FileName, userp, &req);
}
+ if ( ResultBufferLength >= sizeof( AFSFileCleanupResultCB))
+ {
+ (*ResultCB)->ResultBufferLength = sizeof( AFSFileCleanupResultCB);
+ pResultCB = (AFSFileCleanupResultCB *)&(*ResultCB)->ResultData;
+ pResultCB->ParentDataVersion.QuadPart = dscp ? dscp->dataVersion : 0;
+ } else {
+ (*ResultCB)->ResultBufferLength = 0;
+ }
+
if (code == 0) {
(*ResultCB)->ResultStatus = 0;
- (*ResultCB)->ResultBufferLength = 0;
osi_Log0(afsd_logp, "RDR_CleanupFileEntry SUCCESS");
} else {
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
(*ResultCB)->ResultStatus = status;
- (*ResultCB)->ResultBufferLength = 0;
osi_Log2(afsd_logp, "RDR_CleanupFileEntry FAILURE code=0x%x status=0x%x",
code, status);
}
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);
DWORD TargetFileNameLength = pRenameCB->TargetNameLength;
cm_fid_t SourceParentFid;
cm_fid_t TargetParentFid;
+ cm_fid_t SourceFid;
+ cm_fid_t OrigTargetFid = {0,0,0,0,0};
+ cm_fid_t TargetFid;
cm_scache_t * oldDscp;
cm_scache_t * newDscp;
+ cm_dirOp_t dirop;
wchar_t shortName[13];
wchar_t SourceFileName[260];
wchar_t TargetFileName[260];
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);
return;
}
+ /* Obtain the original FID just for debugging purposes */
+ code = cm_BeginDirOp( oldDscp, userp, &req, CM_DIRLOCK_READ, CM_DIROP_FLAG_NONE, &dirop);
+ if (code == 0) {
+ code = cm_BPlusDirLookup(&dirop, SourceFileName, &SourceFid);
+ code = cm_BPlusDirLookup(&dirop, TargetFileName, &OrigTargetFid);
+ cm_EndDirOp(&dirop);
+ }
+
code = cm_Rename( oldDscp, NULL, SourceFileName,
newDscp, TargetFileName, userp, &req);
if (code == 0) {
- cm_dirOp_t dirop;
- cm_fid_t targetFid;
cm_scache_t *scp = 0;
DWORD dwRemaining;
code = cm_BeginDirOp( newDscp, userp, &req, CM_DIRLOCK_READ, CM_DIROP_FLAG_NONE, &dirop);
if (code == 0) {
- code = cm_BPlusDirLookup(&dirop, TargetFileName, &targetFid);
+ code = cm_BPlusDirLookup(&dirop, TargetFileName, &TargetFid);
cm_EndDirOp(&dirop);
}
}
osi_Log4(afsd_logp, "RDR_RenameFileEntry Target FID cell=0x%x vol=0x%x vn=0x%x uniq=0x%x",
- targetFid.cell, targetFid.volume,
- targetFid.vnode, targetFid.unique);
+ TargetFid.cell, TargetFid.volume,
+ TargetFid.vnode, TargetFid.unique);
- code = cm_GetSCache(&targetFid, &scp, userp, &req);
+ code = cm_GetSCache(&TargetFid, &scp, userp, &req);
if (code) {
osi_Log1(afsd_logp, "RDR_RenameFileEntry cm_GetSCache target failed code 0x%x", code);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);
RDR_PopulateCurrentEntry(&pResultCB->DirEnum, dwRemaining,
newDscp, scp, userp, &req, TargetFileName, shortName,
RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS,
- NULL, &dwRemaining);
+ 0, NULL, &dwRemaining);
(*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining;
cm_ReleaseSCache(scp);
* 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;
}
}
cm_req_t req;
int dirty = 0;
int released = 0;
+ int deleted = 0;
DWORD status;
#ifdef ODS_DEBUG
#ifdef VALIDATE_CHECK_SUM
code, status);
}
+ deleted = scp && (scp->flags & CM_SCACHEFLAG_DELETED);
+
/*
* We do not stop processing as a result of being unable to find the cm_scache object.
* If this occurs something really bad has happened since the cm_scache object must have
* been recycled while extents were held by the redirector. However, we will be resilient
* and carry on without it.
+ *
+ * If the file is known to be deleted, there is no point attempting to ask the
+ * file server about it or update the attributes.
*/
- if (scp && ReleaseExtentsCB->AllocationSize.QuadPart != scp->length.QuadPart) {
+ if (scp && ReleaseExtentsCB->AllocationSize.QuadPart != scp->length.QuadPart &&
+ !deleted)
+ {
cm_attr_t setAttr;
memset(&setAttr, 0, sizeof(cm_attr_t));
cm_scache_t * scp = NULL;
int dirty = 0;
int released = 0;
+ int deleted = 0;
char * p;
userp = RDR_UserFromAuthGroup( &pFileCB->AuthGroup);
*/
}
+ deleted = scp && (scp->flags & CM_SCACHEFLAG_DELETED);
+
/* if the scp was not found, do not perform the length check */
if (scp && (pFileCB->AllocationSize.QuadPart != scp->length.QuadPart)) {
cm_attr_t setAttr;
#endif
}
- if ( (ReleaseFileExtentsResultCB->Flags & AFS_EXTENT_FLAG_DIRTY) ||
- (pExtent->Flags & AFS_EXTENT_FLAG_DIRTY) )
+ if ((ReleaseFileExtentsResultCB->Flags & AFS_EXTENT_FLAG_DIRTY) ||
+ (pExtent->Flags & AFS_EXTENT_FLAG_DIRTY))
{
#ifdef VALIDATE_CHECK_SUM
if ( buf_ValidateCheckSum(bufp) ) {
pExtent->CacheOffset.HighPart,
pExtent->CacheOffset.LowPart);
- buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
- dirty++;
+ if (!deleted) {
+ buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
+ dirty++;
+ }
} else {
#ifdef ODS_DEBUG
snprintf(dbgstr, 1024,
}
}
#else /* !VALIDATE_CHECK_SUM */
- buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
- dirty++;
+ if (!deleted) {
+ buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
+ dirty++;
+ }
#ifdef ODS_DEBUG
snprintf(dbgstr, 1024,
"RDR_ProcessReleaseFileExtentsResult dirty! vol 0x%x vno 0x%x uniq 0x%x foffset 0x%x:%x coffset 0x%x:%x\n",
#ifdef ODS_DEBUG
HexCheckSum(md5dbg, sizeof(md5dbg), bufp->md5cksum);
#endif
- if ( !buf_ValidateCheckSum(bufp) ) {
+ if (!buf_ValidateCheckSum(bufp) ) {
buf_ComputeCheckSum(bufp);
#ifdef ODS_DEBUG
HexCheckSum(md5dbg3, sizeof(md5dbg2), bufp->md5cksum);
#ifdef DEBUG
DebugBreak();
#endif
- buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
- dirty++;
+ if (!deleted) {
+ buf_SetDirty(bufp, &req, pExtent->DirtyOffset, pExtent->DirtyLength, userp);
+ dirty++;
+ }
} else {
buf_ComputeCheckSum(bufp);
#ifdef ODS_DEBUG
&volStat, &Name, &OfflineMsg, &MOTD);
rx_PutConnection(rxconnp);
- } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, &req, &scp->fid, 0, NULL, NULL, NULL, code));
code = cm_MapRPCError(code, &req);
if (code == 0) {
pResultCB->TotalAllocationUnits.QuadPart = volStat.PartMaxBlocks;