mirror of
https://git.openafs.org/openafs.git
synced 2025-01-31 05:27:44 +00:00
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:
parent
2dbb3d044a
commit
f49dba09fb
@ -1806,17 +1806,7 @@ DECL_PIOCTL(PFlush)
|
|||||||
afs_BozonLock(&avc->pvnLock, avc); /* Since afs_TryToSmush will do a pvn_vptrunc */
|
afs_BozonLock(&avc->pvnLock, avc); /* Since afs_TryToSmush will do a pvn_vptrunc */
|
||||||
#endif
|
#endif
|
||||||
ObtainWriteLock(&avc->lock, 225);
|
ObtainWriteLock(&avc->lock, 225);
|
||||||
ObtainWriteLock(&afs_xcbhash, 456);
|
afs_ResetVCache(avc, *acred);
|
||||||
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;
|
|
||||||
}
|
|
||||||
ReleaseWriteLock(&avc->lock);
|
ReleaseWriteLock(&avc->lock);
|
||||||
#ifdef AFS_BOZONLOCK_ENV
|
#ifdef AFS_BOZONLOCK_ENV
|
||||||
afs_BozonUnlock(&avc->pvnLock, avc);
|
afs_BozonUnlock(&avc->pvnLock, avc);
|
||||||
|
@ -986,6 +986,7 @@ extern int afs_RemoteLookup(register struct VenusFid *afid,
|
|||||||
struct AFSCallBack *CallBackp,
|
struct AFSCallBack *CallBackp,
|
||||||
struct server **serverp,
|
struct server **serverp,
|
||||||
struct AFSVolSync *tsyncp);
|
struct AFSVolSync *tsyncp);
|
||||||
|
extern void afs_ResetVCache(struct vcache *, struct AFS_UCRED *);
|
||||||
extern afs_int32 afs_NFSFindVCache(struct vcache **avcp,
|
extern afs_int32 afs_NFSFindVCache(struct vcache **avcp,
|
||||||
struct VenusFid *afid);
|
struct VenusFid *afid);
|
||||||
extern void afs_vcacheInit(int astatSize);
|
extern void afs_vcacheInit(int astatSize);
|
||||||
|
@ -2775,6 +2775,30 @@ afs_PutVCache(register struct vcache *avc)
|
|||||||
} /*afs_PutVCache */
|
} /*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,
|
* Sleepa when searching for a vcache. Releases all the pending locks,
|
||||||
* sleeps then obtains the previously released locks.
|
* sleeps then obtains the previously released locks.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user