diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 8fa09cd5fc..a80d9218e9 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -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); diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index 1c060f384a..3e63905885 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -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); diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 68d9145de7..3b75118147 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -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.