cm_PutVolume(volp);
if (volp->cbExpiresRO) {
volp->cbExpiresRO = 0;
+ volp->cbIssuedRO = 0;
if (volp->cbServerpRO) {
cm_PutServer(volp->cbServerpRO);
volp->cbServerpRO = NULL;
cbrp->serverp = NULL;
}
scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
+ scp->cbIssued = time(NULL);
}
if (scp->flags & CM_SCACHEFLAG_PURERO) {
if (volSyncp) {
lock_ObtainWrite(&cm_scacheLock);
volp->cbExpiresRO = scp->cbExpires;
+ volp->cbIssuedRO = scp->cbIssued;
volp->creationDateRO = volSyncp->spare1;
if (volp->cbServerpRO != scp->cbServerp) {
if (volp->cbServerpRO)
{
lock_ObtainWrite(&scp->rw);
scp->cbExpires = volp->cbExpiresRO;
+ scp->cbIssued = volp->cbIssuedRO;
if (volp->cbServerpRO != scp->cbServerp) {
if (scp->cbServerp)
cm_PutServer(scp->cbServerp);
#ifndef CM_MEMMAP_H
#define CM_MEMMAP_H 1
-#define CM_CONFIG_DATA_VERSION 19
+#define CM_CONFIG_DATA_VERSION 20
#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
typedef struct cm_config_data {
scp->cbServerp = NULL;
}
scp->cbExpires = 0;
+ scp->cbIssued = 0;
scp->volumeCreationDate = 0;
scp->fid.vnode = 0;
cm_data.fakeSCache.magic = CM_SCACHE_MAGIC;
cm_data.fakeSCache.cbServerp = (struct cm_server *)(-1);
cm_data.fakeSCache.cbExpires = (time_t)-1;
+ cm_data.fakeSCache.cbExpires = time(NULL);
/* can leave clientModTime at 0 */
cm_data.fakeSCache.fileType = CM_SCACHETYPE_FILE;
cm_data.fakeSCache.unixModeBits = 0777;
scp->cbServerp = NULL;
}
scp->cbExpires = 0;
+ scp->cbIssued = 0;
_InterlockedAnd(&scp->flags, ~CM_SCACHEFLAG_CALLBACK);
lock_ReleaseWrite(&scp->rw);
#endif
scp->cbServerp = NULL;
scp->cbExpires = 0;
+ scp->cbIssued = 0;
scp->volumeCreationDate = 0;
scp->fileLocksH = NULL;
scp->fileLocksT = NULL;
scp->cbServerp = NULL;
}
scp->cbExpires = 0;
+ scp->cbIssued = 0;
scp->volumeCreationDate = 0;
_InterlockedAnd(&scp->flags, ~(CM_SCACHEFLAG_CALLBACK | CM_SCACHEFLAG_LOCAL | CM_SCACHEFLAG_RDR_IN_USE));
cm_dnlcPurgedp(scp);
/* callback info */
struct cm_server *cbServerp; /* server granting callback */
time_t cbExpires; /* time callback expires */
+ time_t cbIssued; /* time callback was issued */
/* access cache */
long anyAccess; /* anonymous user's access */
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown);
}
volp->cbExpiresRO = 0;
+ volp->cbIssuedRO = 0;
volp->cbServerpRO = NULL;
lock_FinalizeRWLock(&volp->rw);
}
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, vl_unknown, volp->vol[volType].state);
}
volp->cbExpiresRO = 0;
+ volp->cbIssuedRO = 0;
volp->cbServerpRO = NULL;
}
}
volp->vol[volType].flags = 0;
}
volp->cbExpiresRO = 0;
+ volp->cbIssuedRO = 0;
volp->cbServerpRO = NULL;
volp->creationDateRO = 0;
cm_AddVolumeToNameHashTable(volp);
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 */
+ time_t cbIssuedRO; /* latest RO issue time; by cm_scacheLock */
time_t creationDateRO; /* latest volume creation date; 0 if unknown; by cm_scacheLock */
time_t lastUpdateTime; /* most recent volume location update cm_volumeLock */
} cm_volume_t;