From 100186ec2e4ca5046e1bc312918d4630de00bc7e Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 26 Jun 2009 15:11:10 +0000 Subject: [PATCH] windows-callback-server-tracking-for-readonly-vols-20090626 LICENSE MIT Readonly volume callbacks apply to every cm_scache_t from the same volume. We were already tracking the cbExpires time in the cm_volume_t. We need to also track the cbServerp in the cm_volume_t so that the cm_scache_t objects can be assigned the correct server from which the callback was issued. Add cbServerpRO field to the cm_volume_t. Bump the memory map version to force a rebuild of the cache data. --- src/WINNT/afsd/cm_callback.c | 12 ++++++++++++ src/WINNT/afsd/cm_memmap.h | 2 +- src/WINNT/afsd/cm_volume.c | 3 +++ src/WINNT/afsd/cm_volume.h | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 7895e0a..63522b8 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -1733,6 +1733,12 @@ void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp, cm_volume_t * volp = cm_GetVolumeByFID(&scp->fid); if (volp) { volp->cbExpiresRO = scp->cbExpires; + if (volp->cbServerpRO != scp->cbServerp) { + if (volp->cbServerpRO) + cm_PutServer(volp->cbServerpRO); + cm_GetServer(scp->cbServerp); + volp->cbServerpRO = scp->cbServerp; + } cm_PutVolume(volp); } } @@ -1931,6 +1937,12 @@ void cm_CheckCBExpiration(void) scp->cbExpires > 0) { scp->cbExpires = volp->cbExpiresRO; + if (volp->cbServerpRO != scp->cbServerp) { + if (scp->cbServerp) + cm_PutServer(scp->cbServerp); + cm_GetServer(volp->cbServerpRO); + scp->cbServerp = volp->cbServerpRO; + } } cm_PutVolume(volp); } diff --git a/src/WINNT/afsd/cm_memmap.h b/src/WINNT/afsd/cm_memmap.h index 6588928..07881b3 100644 --- a/src/WINNT/afsd/cm_memmap.h +++ b/src/WINNT/afsd/cm_memmap.h @@ -10,7 +10,7 @@ #ifndef CM_MEMMAP_H #define CM_MEMMAP_H 1 -#define CM_CONFIG_DATA_VERSION 5 +#define CM_CONFIG_DATA_VERSION 6 #define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24) typedef struct cm_config_data { diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index e41d05a..cc6b802 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -72,6 +72,7 @@ cm_ShutdownVolume(void) cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown); } volp->cbExpiresRO = 0; + volp->cbServerpRO = NULL; lock_FinalizeRWLock(&volp->rw); } @@ -110,6 +111,7 @@ void cm_InitVolume(int newFile, long maxVols) cm_VolumeStatusNotification(volp, volp->vol[volType].ID, vl_unknown, volp->vol[volType].state); } volp->cbExpiresRO = 0; + volp->cbServerpRO = NULL; } } osi_EndOnce(&once); @@ -927,6 +929,7 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep, volp->vol[volType].flags = 0; } volp->cbExpiresRO = 0; + volp->cbServerpRO = NULL; cm_AddVolumeToNameHashTable(volp); lock_ReleaseWrite(&cm_volumeLock); } diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index aae0c3e..704d216 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -42,6 +42,7 @@ typedef struct cm_volume { osi_rwlock_t rw; afs_uint32 flags; /* by rw */ afs_int32 refCount; /* by Interlocked operations */ + struct cm_server *cbServerpRO; /* server granting RO callback; by cm_scacheLock */ time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */ } cm_volume_t; -- 1.9.4