if (scp->flags & CM_SCACHEFLAG_RO || scp->flags & CM_SCACHEFLAG_PURERO)
cep->states |= 4;
if (scp->fileType == CM_SCACHETYPE_MOUNTPOINT &&
- scp->mountPointStringp[0])
+ scp->mpDataVersion == scp->dataVersion)
cep->states |= 8;
if (scp->flags & CM_SCACHEFLAG_WAITING)
cep->states |= 0x40;
if (scp->flags & CM_SCACHEFLAG_RO || scp->flags & CM_SCACHEFLAG_PURERO)
cep->states |= 4;
if (scp->fileType == CM_SCACHETYPE_MOUNTPOINT &&
- scp->mountPointStringp[0])
+ scp->mpDataVersion == scp->dataVersion)
cep->states |= 8;
if (scp->flags & CM_SCACHEFLAG_WAITING)
cep->states |= 0x40;
cm_FreelanceFetchMountPointString(cm_scache_t *scp)
{
lock_ObtainMutex(&cm_Freelance_Lock);
- if (!scp->mountPointStringp[0] &&
+ if (scp->mpDataVersion != scp->dataVersion &&
scp->fid.cell == AFS_FAKE_ROOT_CELL_ID &&
scp->fid.volume == AFS_FAKE_ROOT_VOL_ID &&
(afs_int32)(scp->fid.unique - cm_data.fakeUnique) - 1 >= 0 &&
scp->fid.unique - cm_data.fakeUnique <= cm_noLocalMountPoints) {
strncpy(scp->mountPointStringp, cm_localMountPoints[scp->fid.unique-cm_data.fakeUnique-1].mountPointStringp, MOUNTPOINTLEN);
scp->mountPointStringp[MOUNTPOINTLEN-1] = 0; /* null terminate */
+ scp->mpDataVersion = scp->dataVersion;
}
lock_ReleaseMutex(&cm_Freelance_Lock);
scp->mask = 0;
/* discard symlink info */
+ scp->mpDataVersion = CM_SCACHE_VERSION_BAD;
scp->mountPointStringp[0] = '\0';
memset(&scp->mountRootFid, 0, sizeof(cm_fid_t));
memset(&scp->dotdotFid, 0, sizeof(cm_fid_t));
lock_ReleaseWrite(&buf_globalLock);
}
- /*
- * If the dataVersion has changed, the mountPointStringp must be cleared
- * in order to force a re-evaluation by cm_HandleLink(). The Windows CM
- * does not update a mountpoint or symlink by altering the contents of
- * the file data; but the Unix CM does.
- */
if (scp->dataVersion != dataVersion && !(flags & CM_MERGEFLAG_FETCHDATA)) {
- scp->mountPointStringp[0] = '\0';
-
osi_Log5(afsd_logp, "cm_MergeStatus data version change scp 0x%p cell %u vol %u vn %u uniq %u",
scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
if (scp->fileType == CM_SCACHETYPE_DFSLINK)
cm_VolStatus_Invalidate_DFS_Mapping(scp);
-
- /* Force mount points and symlinks to be re-evaluated */
- scp->mountPointStringp[0] = '\0';
}
void cm_AFSFidFromFid(AFSFid *afsFidp, cm_fid_t *fidp)
}
sprintf(output,
"%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) type=%d dv=%I64d len=0x%I64x "
- "mp='%s' Locks (server=0x%x shared=%d excl=%d clnt=%d) fsLockCount=%d linkCount=%d anyAccess=0x%x "
+ "mpDV=%I64d mp='%s' Locks (server=0x%x shared=%d excl=%d clnt=%d) fsLockCount=%d linkCount=%d anyAccess=0x%x "
"flags=0x%x cbServer='%s' cbExpires='%s' volumeCreationDate='%s' refCount=%u\r\n",
cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique,
- scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp,
+ scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mpDataVersion, scp->mountPointStringp,
scp->serverLock, scp->sharedLocks, scp->exclusiveLocks, scp->clientLocks, scp->fsLockCount,
scp->linkCount, scp->anyAccess, scp->flags, srvStr ? srvStr : "<none>", cbt ? cbt : "<none>",
cdrot ? cdrot : "<none>", scp->refCount);
{
long code;
- if (scp->mountPointStringp[0])
+ if (scp->mountPointStringp[0] &&
+ scp->mpDataVersion == scp->dataVersion)
return 0;
#ifdef AFS_FREELANCE_CLIENT
/* convert the terminating dot to a NUL */
temp[scp->length.LowPart - 1] = 0;
memcpy(scp->mountPointStringp, temp, scp->length.LowPart);
+ scp->mpDataVersion = scp->dataVersion;
}
return code;
long code = 0;
lock_AssertWrite(&linkScp->rw);
- if (!linkScp->mountPointStringp[0]) {
+ if (!linkScp->mountPointStringp[0] ||
+ linkScp->mpDataVersion != linkScp->dataVersion) {
#ifdef AFS_FREELANCE_CLIENT
/* File servers do not have data for freelance entries */