DEVEL15-abstract-reset-vcache-20090119

LICENSE IPL10
FIXES 124147

abstract vcache resetting code so disconnected can reuse it


(cherry picked from commit 57744971179a8ee7441e73eeb9e2a56d671fcc37)
This commit is contained in:
Simon Wilkinson 2009-01-19 19:39:22 +00:00 committed by Derrick Brashear
parent 2dbb3d044a
commit f49dba09fb
3 changed files with 26 additions and 11 deletions

View File

@ -1806,17 +1806,7 @@ DECL_PIOCTL(PFlush)
afs_BozonLock(&avc->pvnLock, avc); /* Since afs_TryToSmush will do a pvn_vptrunc */
#endif
ObtainWriteLock(&avc->lock, 225);
ObtainWriteLock(&afs_xcbhash, 456);
afs_DequeueCallback(avc);
avc->states &= ~(CStatd | CDirty); /* next reference will re-stat cache entry */
ReleaseWriteLock(&afs_xcbhash);
/* now find the disk cache entries */
afs_TryToSmush(avc, *acred, 1);
osi_dnlc_purgedp(avc);
if (avc->linkData && !(avc->states & CCore)) {
afs_osi_Free(avc->linkData, strlen(avc->linkData) + 1);
avc->linkData = NULL;
}
afs_ResetVCache(avc, *acred);
ReleaseWriteLock(&avc->lock);
#ifdef AFS_BOZONLOCK_ENV
afs_BozonUnlock(&avc->pvnLock, avc);

View File

@ -986,6 +986,7 @@ extern int afs_RemoteLookup(register struct VenusFid *afid,
struct AFSCallBack *CallBackp,
struct server **serverp,
struct AFSVolSync *tsyncp);
extern void afs_ResetVCache(struct vcache *, struct AFS_UCRED *);
extern afs_int32 afs_NFSFindVCache(struct vcache **avcp,
struct VenusFid *afid);
extern void afs_vcacheInit(int astatSize);

View File

@ -2775,6 +2775,30 @@ afs_PutVCache(register struct vcache *avc)
} /*afs_PutVCache */
/*!
* Reset a vcache entry, so local contents are ignored, and the
* server will be reconsulted next time the vcache is used
*
* \param avc Pointer to the cache entry to reset
* \param acred
*
* \note avc must be write locked on entry
*/
void
afs_ResetVCache(struct vcache *avc, struct AFS_UCRED *acred) {
ObtainWriteLock(&afs_xcbhash, 456);
afs_DequeueCallback(avc);
avc->states &= ~(CStatd | CDirty); /* next reference will re-stat */
ReleaseWriteLock(&afs_xcbhash);
/* now find the disk cache entries */
afs_TryToSmush(avc, acred, 1);
osi_dnlc_purgedp(avc);
if (avc->linkData && !(avc->states & CCore)) {
afs_osi_Free(avc->linkData, strlen(avc->linkData) + 1);
avc->linkData = NULL;
}
}
/*!
* Sleepa when searching for a vcache. Releases all the pending locks,
* sleeps then obtains the previously released locks.