windows-64bit-data-version-20071114
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 14 Nov 2007 06:22:04 +0000 (06:22 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 14 Nov 2007 06:22:04 +0000 (06:22 +0000)
Add support for 64-bit AFSFetchStatus data version values

src/WINNT/afsd/cm_btree.c
src/WINNT/afsd/cm_buf.c
src/WINNT/afsd/cm_buf.h
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_dcache.c
src/WINNT/afsd/cm_dir.h
src/WINNT/afsd/cm_memmap.h
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h

index ac2a572..b3ad945 100644 (file)
@@ -2185,7 +2185,7 @@ cm_BPlusDirEnumTest(cm_scache_t * dscp, afs_uint32 locked)
            char buffer[1024];
            cm_scache_t *scp;
            char * type = "ScpNotFound";
-           afs_int32 dv = -1;
+           afs_uint64 dv = -1;
 
            scp = cm_FindSCache(&entryp->fid);
            if (scp) {
@@ -2214,10 +2214,10 @@ cm_BPlusDirEnumTest(cm_scache_t * dscp, afs_uint32 locked)
                }
 
                dv = scp->dataVersion;
-           cm_ReleaseSCache(scp);
+                cm_ReleaseSCache(scp);
            }
 
-           sprintf(buffer, "'%s' Fid = (%d,%d,%d,%d) Short = '%s' Type %s DV %d",
+           sprintf(buffer, "'%s' Fid = (%d,%d,%d,%d) Short = '%s' Type %s DV %I64d",
                    entryp->name,
                    entryp->fid.cell, entryp->fid.volume, entryp->fid.vnode, entryp->fid.unique,
                    entryp->shortName,
index 6b4446b..a84750d 100644 (file)
@@ -1500,10 +1500,9 @@ long buf_FlushCleanPages(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
 }       
 
 /* Must be called with scp->mx held */
-long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion)
+long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion)
 {
     cm_buf_t * bp;
-    cm_buf_t * nbp;
     unsigned int i;
     int found = 0;
 
index 39db4c3..d604cf1 100644 (file)
@@ -78,7 +78,7 @@ typedef struct cm_buf {
     cm_user_t *userp;          /* user who wrote to the buffer last */
         
     /* fields added for the CM; locked by scp->mx */
-    afs_uint32 dataVersion;    /* data version of this page */
+    afs_uint64 dataVersion;    /* data version of this page */
     afs_uint32 cmFlags;                /* flags for cm */
 
     /* syncop state */
@@ -201,7 +201,7 @@ extern long buf_DirtyBuffersExist(cm_fid_t * fidp);
 
 extern long buf_CleanDirtyBuffers(cm_scache_t *scp);
 
-extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion);
+extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion);
 
 /* error codes */
 #define CM_BUF_EXISTS  1       /* buffer exists, and shouldn't */
index 866f8d2..cfab90d 100644 (file)
@@ -744,7 +744,7 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
     cep->lock.pid_writer = 0;
     cep->lock.src_indicator = 0;
     cep->Length = scp->length.LowPart;
-    cep->DataVersion = scp->dataVersion;
+    cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
     cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
         cep->cbExpires = scp->volp->cbExpiresRO;
@@ -858,7 +858,7 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
 #else
     cep->Length = (afs_int64) scp->length.QuadPart;
 #endif
-    cep->DataVersion = scp->dataVersion;
+    cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
     cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
         cep->cbExpires = scp->volp->cbExpiresRO;
index ee7fd07..dcc0752 100644 (file)
@@ -1412,7 +1412,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp
         afsStatus.FileType = 0x2;
         afsStatus.LinkCount = scp->linkCount;
         afsStatus.Length = cm_fakeDirSize;
-        afsStatus.DataVersion = cm_data.fakeDirVersion;
+        afsStatus.DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF);
         afsStatus.Author = 0x1;
         afsStatus.Owner = 0x0;
         afsStatus.CallerAccess = 0x9;
@@ -1425,7 +1425,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp
         afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime;
         afsStatus.Group = 0;
         afsStatus.SyncCounter = 0;
-        afsStatus.dataVersionHigh = 0;
+        afsStatus.dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32);
         afsStatus.lockCount = 0;
         afsStatus.Length_hi = 0;
         afsStatus.errorCode = 0;
@@ -1679,7 +1679,9 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp
              qdp;
              qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) {
             tbufp = osi_GetQData(qdp);
-            tbufp->dataVersion = afsStatus.DataVersion;
+            tbufp->dataVersion = afsStatus.dataVersionHigh;
+            tbufp->dataVersion <<= 32;
+            tbufp->dataVersion |= afsStatus.DataVersion;
 
 #ifdef DISKCACHE95
             /* write buffer out to disk cache */
index 1d3eb6e..febebb6 100644 (file)
@@ -116,15 +116,15 @@ typedef struct cm_dirOp {
     osi_hyper_t   length;       /* scp->length at the time
                                    cm_BeginDirOp() was called.*/
     osi_hyper_t   newLength;    /* adjusted scp->length */
-    afs_uint32    dataVersion;  /* scp->dataVersion when
+    afs_uint64    dataVersion;  /* scp->dataVersion when
                                    cm_BeginDirOp() was called.*/
-    afs_uint32    newDataVersion; /* scp->dataVersion when
+    afs_uint64    newDataVersion; /* scp->dataVersion when
                                      cm_CheckDirOpForSingleChange()
                                      was called. */
 
-    afs_uint32    dirtyBufCount;
+    afs_uint64    dirtyBufCount;
 
-    afs_uint32    nBuffers;     /* number of buffers below */
+    afs_uint64    nBuffers;     /* number of buffers below */
     cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
 } cm_dirOp_t;
 
index fc48e81..21c9a57 100644 (file)
@@ -46,7 +46,7 @@ typedef struct cm_config_data {
     cm_fid_t            rootFid;
     cm_scache_t *       rootSCachep;
     cm_scache_t         fakeSCache;
-    afs_uint32          fakeDirVersion;
+    afs_uint64          fakeDirVersion;
 
     cm_aclent_t *       aclLRUp;
     cm_aclent_t        *       aclLRUEndp;
index 9b6ed5e..9d7bdbc 100644 (file)
@@ -1476,6 +1476,8 @@ void cm_MergeStatus(cm_scache_t *dscp,
                    AFSVolSync *volsyncp,
                     cm_user_t *userp, afs_uint32 flags)
 {
+    afs_uint64 dataVersion;
+
     // yj: i want to create some fake status for the /afs directory and the
     // entries under that directory
 #ifdef AFS_FREELANCE_CLIENT
@@ -1486,7 +1488,7 @@ void cm_MergeStatus(cm_scache_t *dscp,
         statusp->LinkCount = scp->linkCount;
         statusp->Length = cm_fakeDirSize;
         statusp->Length_hi = 0;
-        statusp->DataVersion = cm_data.fakeDirVersion;
+        statusp->DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF);
         statusp->Author = 0x1;
         statusp->Owner = 0x0;
         statusp->CallerAccess = 0x9;
@@ -1499,7 +1501,7 @@ void cm_MergeStatus(cm_scache_t *dscp,
         statusp->ServerModTime = FakeFreelanceModTime;
         statusp->Group = 0;
         statusp->SyncCounter = 0;
-        statusp->dataVersionHigh = 0;
+        statusp->dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32);
        statusp->errorCode = 0;
     }
 #endif /* AFS_FREELANCE_CLIENT */
@@ -1535,8 +1537,11 @@ void cm_MergeStatus(cm_scache_t *dscp,
        scp->flags &= ~CM_SCACHEFLAG_EACCESS;
     }
 
-    if (!(flags & CM_MERGEFLAG_FORCE)
-         && statusp->DataVersion < (unsigned long) scp->dataVersion) {
+    dataVersion = statusp->dataVersionHigh;
+    dataVersion <<= 32;
+    dataVersion |= statusp->DataVersion;
+
+    if (!(flags & CM_MERGEFLAG_FORCE) && dataVersion < scp->dataVersion) {
         struct cm_cell *cellp;
 
         cellp = cm_FindCellByID(scp->fid.cell);
@@ -1551,8 +1556,8 @@ void cm_MergeStatus(cm_scache_t *dscp,
             if (volp)
                 cm_PutVolume(volp);
         }
-        osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d",
-                  scp, scp->dataVersion, statusp->DataVersion);
+        osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %I64d, RPC dv %I64d",
+                  scp, scp->dataVersion, dataVersion);
         /* we have a number of data fetch/store operations running
          * concurrently, and we can tell which one executed last at the
          * server by its mtime.
@@ -1629,19 +1634,18 @@ void cm_MergeStatus(cm_scache_t *dscp,
         cm_AddACLCache(scp, userp, statusp->CallerAccess);
     }
 
-    if ((flags & CM_MERGEFLAG_STOREDATA) &&
-       statusp->DataVersion - scp->dataVersion == 1) {
+    if ((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion == 1) {
        cm_buf_t *bp;
 
        for (bp = cm_data.buf_fileHashTablepp[BUF_FILEHASH(&scp->fid)]; bp; bp=bp->fileHashp)
        {
            if (cm_FidCmp(&scp->fid, &bp->fid) == 0 && 
                bp->dataVersion == scp->dataVersion)
-               bp->dataVersion = statusp->DataVersion;
+               bp->dataVersion = dataVersion;
        }
 
     }
-    scp->dataVersion = statusp->DataVersion;
+    scp->dataVersion = dataVersion;
 }
 
 /* note that our stat cache info is incorrect, so force us eventually
index 586b67a..01aef07 100644 (file)
@@ -116,7 +116,7 @@ typedef struct cm_scache {
     cm_prefetch_t prefetch;            /* prefetch info structure */
     afs_uint32 unixModeBits;           /* unix protection mode bits */
     afs_uint32 linkCount;              /* link count */
-    afs_uint32 dataVersion;            /* data version */
+    afs_uint64 dataVersion;            /* data version */
     afs_uint32 owner;                  /* file owner */
     afs_uint32 group;                  /* file owning group */
     cm_user_t *creator;                        /* user, if new file */
@@ -161,7 +161,7 @@ typedef struct cm_scache {
                                  */
     unsigned long lastRefreshCycle; /* protected with cm_scacheLock
                                      * for all scaches. */
-    afs_uint32 lockDataVersion; /* dataVersion of the scp at the time
+    afs_uint64  lockDataVersion; /* dataVersion of the scp at the time
                                    the server lock for the scp was
                                    asserted for this lock the last
                                    time. */
@@ -192,7 +192,7 @@ typedef struct cm_scache {
 #ifdef USE_BPLUS
     /* directory B+ tree */             /* only allocated if is directory */
     osi_rwlock_t dirlock;               /* controls access to dirBplus */
-    afs_uint32   dirDataVersion;        /* data version represented by dirBplus */
+    afs_uint64   dirDataVersion;        /* data version represented by dirBplus */
     struct tree *dirBplus;              /* dirBplus */
 #endif