window-afsd-bad-version-20090228
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 28 Feb 2009 16:19:13 +0000 (16:19 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 28 Feb 2009 16:19:13 +0000 (16:19 +0000)
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.

src/WINNT/afsd/cm_dir.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/rawops.c

index ceb92ff..9710e8b 100644 (file)
@@ -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) {
index 2d143df..066781c 100644 (file)
@@ -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);
index 1a6d6c2..49c8e8b 100644 (file)
@@ -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 */
index 854657b..5d23ccd 100644 (file)
@@ -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);
 }
 
index 2c28d96..baac384 100644 (file)
@@ -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;