]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
abstract-reset-vcache-20090119
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Mon, 19 Jan 2009 19:39:12 +0000 (19:39 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 19 Jan 2009 19:39:12 +0000 (19:39 +0000)
LICENSE IPL10
FIXES 124147

abstract vcache resetting code so disconnected can reuse it

src/afs/afs_pioctl.c
src/afs/afs_prototypes.h
src/afs/afs_vcache.c

index 6a0cd0e42a8a84a9267836bcd3e32328d9bca64b..adb314f68c00b9f102039888d1ff6b9b69b82823 100644 (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);
index f1aee38da02fd2108b0a7992e8fc9535d8d84341..828f84b1a7609061283a37224a663553ecba2c2a 100644 (file)
@@ -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);
index 550a905563667cbdd1e8a163294bef6beb84b1d8..e298083089cb200c8ae5247ced3de72ce7995d15 100644 (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.