From 57744971179a8ee7441e73eeb9e2a56d671fcc37 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Mon, 19 Jan 2009 19:39:12 +0000 Subject: [PATCH] abstract-reset-vcache-20090119 LICENSE IPL10 FIXES 124147 abstract vcache resetting code so disconnected can reuse it --- src/afs/afs_pioctl.c | 12 +----------- src/afs/afs_prototypes.h | 1 + src/afs/afs_vcache.c | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 6a0cd0e42..adb314f68 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 f1aee38da..828f84b1a 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -987,6 +987,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 550a90556..e29808308 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. -- 2.39.5