From 5d245327f057389950c30bb36af6d12f6f96c73a Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 14 Nov 2007 06:22:04 +0000 Subject: [PATCH] windows-64bit-data-version-20071114 Add support for 64-bit AFSFetchStatus data version values --- src/WINNT/afsd/cm_btree.c | 6 +++--- src/WINNT/afsd/cm_buf.c | 3 +-- src/WINNT/afsd/cm_buf.h | 4 ++-- src/WINNT/afsd/cm_callback.c | 4 ++-- src/WINNT/afsd/cm_dcache.c | 8 +++++--- src/WINNT/afsd/cm_dir.h | 8 ++++---- src/WINNT/afsd/cm_memmap.h | 2 +- src/WINNT/afsd/cm_scache.c | 24 ++++++++++++++---------- src/WINNT/afsd/cm_scache.h | 6 +++--- 9 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/WINNT/afsd/cm_btree.c b/src/WINNT/afsd/cm_btree.c index ac2a57271..b3ad945a4 100644 --- a/src/WINNT/afsd/cm_btree.c +++ b/src/WINNT/afsd/cm_btree.c @@ -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, diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index 6b4446b72..a84750df6 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -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; diff --git a/src/WINNT/afsd/cm_buf.h b/src/WINNT/afsd/cm_buf.h index 39db4c394..d604cf18e 100644 --- a/src/WINNT/afsd/cm_buf.h +++ b/src/WINNT/afsd/cm_buf.h @@ -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 */ diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 866f8d255..cfab90de0 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -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; diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index ee7fd07df..dcc075231 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -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 */ diff --git a/src/WINNT/afsd/cm_dir.h b/src/WINNT/afsd/cm_dir.h index 1d3eb6efa..febebb6f7 100644 --- a/src/WINNT/afsd/cm_dir.h +++ b/src/WINNT/afsd/cm_dir.h @@ -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; diff --git a/src/WINNT/afsd/cm_memmap.h b/src/WINNT/afsd/cm_memmap.h index fc48e8105..21c9a571b 100644 --- a/src/WINNT/afsd/cm_memmap.h +++ b/src/WINNT/afsd/cm_memmap.h @@ -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; diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 9b6ed5e44..9d7bdbc83 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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 diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 586b67a4e..01aef071d 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -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 -- 2.39.5