From 71a8a8567e10bef2ba2aa596e1df5f2b4bb5f31d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 28 Feb 2009 16:19:26 +0000 Subject: [PATCH] DEVEL15-window-afsd-bad-version-20090228 LICENSE MIT create a new cpp symbol CM_SCACHE_VERSION_BAD to represent data version values in cm_scache objects that are known to be invalid. then consistently apply this value throughout the code. Previously some invalid values were set to 0 and others to -1 (0xFFFFFFFF:FFFFFFFF). Also fix at least one location where CM_BUF_VERSION_BAD was not used. (cherry picked from commit 5d147351263be2636ef547f22acb24c7816348c1) --- src/WINNT/afsd/cm_dir.c | 2 +- src/WINNT/afsd/cm_scache.c | 22 ++++++++++++---------- src/WINNT/afsd/cm_scache.h | 4 ++++ src/WINNT/afsd/cm_vnodeops.c | 2 +- src/WINNT/afsd/rawops.c | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/WINNT/afsd/cm_dir.c b/src/WINNT/afsd/cm_dir.c index ceb92ff33..9710e8b56 100644 --- a/src/WINNT/afsd/cm_dir.c +++ b/src/WINNT/afsd/cm_dir.c @@ -1060,7 +1060,7 @@ cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp, bplus_free_tree++; freeBtree(scp->dirBplus); scp->dirBplus = NULL; - scp->dirDataVersion = -1; + scp->dirDataVersion = CM_SCACHE_VERSION_BAD; } if (!scp->dirBplus) { diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 2d143df85..066781c6b 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -127,7 +127,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) bufp->dirty_length = 0; bufp->flags |= CM_BUF_ERROR; bufp->error = VNOVNODE; - bufp->dataVersion = -1; /* bad */ + bufp->dataVersion = CM_BUF_VERSION_BAD; /* bad */ bufp->dirtyCounter++; if (bufp->flags & CM_BUF_WAITING) { osi_Log2(afsd_logp, "CM RecycleSCache Waking [scp 0x%x] bufp 0x%x", scp, bufp); @@ -149,7 +149,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) bufp->dirty_length = 0; bufp->flags |= CM_BUF_ERROR; bufp->error = VNOVNODE; - bufp->dataVersion = -1; /* bad */ + bufp->dataVersion = CM_BUF_VERSION_BAD; /* bad */ bufp->dirtyCounter++; if (bufp->flags & CM_BUF_WAITING) { osi_Log2(afsd_logp, "CM RecycleSCache Waking [scp 0x%x] bufp 0x%x", scp, bufp); @@ -178,8 +178,8 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) | CM_SCACHEFLAG_OUTOFSPACE | CM_SCACHEFLAG_EACCESS); scp->serverModTime = 0; - scp->dataVersion = 0; - scp->bufDataVersionLow = 0; + scp->dataVersion = CM_SCACHE_VERSION_BAD; + scp->bufDataVersionLow = CM_SCACHE_VERSION_BAD; scp->bulkStatProgress = hzero; scp->waitCount = 0; scp->waitQueueT = NULL; @@ -215,7 +215,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) scp->serverLock = (-1); scp->exclusiveLocks = 0; scp->sharedLocks = 0; - scp->lockDataVersion = -1; + scp->lockDataVersion = CM_SCACHE_VERSION_BAD; /* not locked, but there can be no references to this guy * while we hold the global refcount lock. @@ -556,7 +556,7 @@ cm_ShutdownSCache(void) if (scp->dirBplus) freeBtree(scp->dirBplus); scp->dirBplus = NULL; - scp->dirDataVersion = -1; + scp->dirDataVersion = CM_SCACHE_VERSION_BAD; lock_FinalizeRWLock(&scp->dirlock); #endif lock_FinalizeRWLock(&scp->rw); @@ -606,7 +606,7 @@ void cm_InitSCache(int newFile, long maxSCaches) scp->waitCount = 0; #ifdef USE_BPLUS scp->dirBplus = NULL; - scp->dirDataVersion = -1; + scp->dirDataVersion = CM_SCACHE_VERSION_BAD; #endif scp->waitQueueT = NULL; scp->flags &= ~CM_SCACHEFLAG_WAITING; @@ -1530,8 +1530,8 @@ void cm_MergeStatus(cm_scache_t *dscp, scp->group = 0; scp->unixModeBits = 0; scp->anyAccess = 0; - scp->dataVersion = 0; - scp->bufDataVersionLow = 0; + scp->dataVersion = CM_SCACHE_VERSION_BAD; + scp->bufDataVersionLow = CM_SCACHE_VERSION_BAD; if (dscp) { scp->parentVnode = dscp->fid.vnode; @@ -1549,7 +1549,9 @@ void cm_MergeStatus(cm_scache_t *dscp, dataVersion <<= 32; dataVersion |= statusp->DataVersion; - if (!(flags & CM_MERGEFLAG_FORCE) && dataVersion < scp->dataVersion) { + if (!(flags & CM_MERGEFLAG_FORCE) && + dataVersion < scp->dataVersion && + scp->dataVersion != CM_SCACHE_VERSION_BAD) { struct cm_cell *cellp; cellp = cm_FindCellByID(scp->fid.cell, 0); diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 1a6d6c293..49c8e8b89 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -217,12 +217,16 @@ typedef struct cm_scache { osi_queue_t * waitQueueT; /* locked by cm_scacheLock */ } cm_scache_t; +/* dataVersion */ +#define CM_SCACHE_VERSION_BAD 0xFFFFFFFFFFFFFFFF + /* mask field - tell what has been modified */ #define CM_SCACHEMASK_CLIENTMODTIME 1 /* client mod time */ #define CM_SCACHEMASK_LENGTH 2 /* length */ #define CM_SCACHEMASK_TRUNCPOS 4 /* truncation position */ /* fileType values */ +#define CM_SCACHETYPE_UNKNOWN 0 /* unknown */ #define CM_SCACHETYPE_FILE 1 /* a file */ #define CM_SCACHETYPE_DIRECTORY 2 /* a dir */ #define CM_SCACHETYPE_SYMLINK 3 /* a symbolic link */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 854657b70..5d23ccdce 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -5087,7 +5087,7 @@ void cm_LockMarkSCacheLost(cm_scache_t * scp) } scp->serverLock = -1; - scp->lockDataVersion = -1; + scp->lockDataVersion = CM_SCACHE_VERSION_BAD; lock_ReleaseWrite(&cm_scacheLock); } diff --git a/src/WINNT/afsd/rawops.c b/src/WINNT/afsd/rawops.c index 1debe4c15..4858379a3 100644 --- a/src/WINNT/afsd/rawops.c +++ b/src/WINNT/afsd/rawops.c @@ -284,7 +284,7 @@ long WriteData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op, (count >= buf_bufferSize || LargeIntegerGreaterThanOrEqualTo(LargeIntegerAdd(offset, ConvertLongToLargeInteger(count)), minLength))) { if (count < buf_bufferSize - && bufferp->dataVersion == -1) + && bufferp->dataVersion == CM_BUF_VERSION_BAD) memset(bufferp->datap, 0, buf_bufferSize); bufferp->dataVersion = scp->dataVersion; -- 2.39.5