}
/*!
+ * Wait for cache drain if conditions warrant.
+ * */
+void
+afs_MaybeWaitForCacheDrain(void)
+{
+ if (afs_blocksUsed - afs_blocksDiscarded >
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
+ if (afs_WaitForCacheDrain == 0)
+ afs_WaitForCacheDrainCount++;
+ afs_WaitForCacheDrain = 1;
+ afs_osi_Sleep(&afs_WaitForCacheDrain);
+ }
+}
+
+/*!
* /struct CTD_stats
*
* Keep statistics on run time for afs_CacheTruncateDaemon. This is a
ReleaseReadLock(&avc->lock);
while ((afs_blocksUsed - afs_blocksDiscarded) >
PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
- if (afs_WaitForCacheDrain == 0)
- afs_WaitForCacheDrainCount++;
- afs_WaitForCacheDrain = 1;
- afs_osi_Sleep(&afs_WaitForCacheDrain);
+ afs_MaybeWaitForCacheDrain();
}
afs_MaybeFreeDiscardedDCache();
/* need to check if someone else got the chunk first. */
while (afs_blocksUsed >
PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
ReleaseWriteLock(&avc->lock);
- if (afs_blocksUsed - afs_blocksDiscarded >
- PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
- if (afs_WaitForCacheDrain == 0)
- afs_WaitForCacheDrainCount++;
- afs_WaitForCacheDrain = 1;
- afs_osi_Sleep(&afs_WaitForCacheDrain);
- }
+ afs_MaybeWaitForCacheDrain();
afs_MaybeFreeDiscardedDCache();
afs_MaybeWakeupTruncateDaemon();
ObtainWriteLock(&avc->lock, 509);