if (tdc)
ObtainWriteLock(&tdc->lock, 653);
} else if (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
tdc = afs_FindDCache(avc, filePos);
if (tdc) {
ObtainWriteLock(&tdc->lock, 654);
if (!tdc) {
afs_MaybeWakeupTruncateDaemon();
while (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
ReleaseWriteLock(&avc->lock);
if (afs_blocksUsed - afs_blocksDiscarded >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 1;
afs_osi_Sleep(&afs_WaitForCacheDrain);
}
if (tdc)
ObtainWriteLock(&tdc->lock, 657);
} else if (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
tdc = afs_FindDCache(avc, filePos);
if (tdc) {
ObtainWriteLock(&tdc->lock, 658);
if (!tdc) {
afs_MaybeWakeupTruncateDaemon();
while (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
ReleaseWriteLock(&avc->lock);
if (afs_blocksUsed - afs_blocksDiscarded >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 1;
afs_osi_Sleep(&afs_WaitForCacheDrain);
}
extern afs_int32 *afs_dvnextTbl; /*Dcache hash table links */
extern afs_int32 *afs_dcnextTbl; /*Dcache hash table links */
extern afs_int32 afs_cacheFiles; /*Size of afs_indexTable */
-extern afs_int32 afs_cacheBlocks; /*1K blocks in cache */
+extern afs_size_t afs_cacheBlocks; /*1K blocks in cache */
extern afs_int32 afs_cacheStats; /*Stat entries in cache */
extern struct vcache *afs_vhashT[VCSIZE]; /*Stat cache hash table */
extern struct vcache *afs_vhashTV[VCSIZE]; /* cache hash table on volume */
#define CM_CACHESIZEDRAINEDPCT 95 /* wakeup processes when down to here. */
#define CM_WAITFORDRAINPCT 98 /* sleep if cache is this full. */
+#define PERCENT(p, v) \
+ ( (p)*128/100*(v) / 128 )
+
#define afs_CacheIsTooFull() \
(afs_blocksUsed - afs_blocksDiscarded > \
- (CM_DCACHECOUNTFREEPCT*afs_cacheBlocks)/100 || \
+ PERCENT(CM_DCACHECOUNTFREEPCT, afs_cacheBlocks) || \
afs_freeDCCount - afs_discardDCCount < \
- ((100-CM_DCACHECOUNTFREEPCT)*afs_cacheFiles)/100)
+ PERCENT(100-CM_DCACHECOUNTFREEPCT, afs_cacheFiles))
+
/* Handy max length of a numeric string. */
#define CVBS 12 /* max afs_int32 is 2^32 ~ 4*10^9, +1 for NULL, +luck */
#include "afs/afs_osidnlc.h"
/* Forward declarations. */
-static void afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint);
+static void afs_GetDownD(afs_int32 anumber, afs_size_t *aneedSpace, afs_int32 buckethint);
static void afs_FreeDiscardedDCache(void);
static void afs_DiscardDCache(struct dcache *);
static void afs_FreeDCache(struct dcache *);
afs_hyper_t afs_indexCounter; /*Fake time for marking index
* entries */
afs_int32 afs_cacheFiles = 0; /*Size of afs_indexTable */
-afs_int32 afs_cacheBlocks; /*1K blocks in cache */
+afs_size_t afs_cacheBlocks; /*1K blocks in cache */
afs_int32 afs_cacheStats; /*Stat entries in cache */
-afs_int32 afs_blocksUsed; /*Number of blocks in use */
-afs_int32 afs_blocksDiscarded; /*Blocks freed but not truncated */
+afs_size_t afs_blocksUsed; /*Number of blocks in use */
+afs_size_t afs_blocksDiscarded; /*Blocks freed but not truncated */
afs_int32 afs_fsfragsize = 1023; /*Underlying Filesystem minimum unit
*of disk allocation usually 1K
*this value is (truefrag -1 ) to
{
osi_timeval_t CTD_tmpTime;
u_int counter;
- u_int cb_lowat;
+ afs_size_t cb_lowat;
u_int dc_hiwat =
(100 - CM_DCACHECOUNTFREEPCT +
CM_DCACHEEXTRAPCT) * afs_cacheFiles / 100;
osi_GetuTime(&CTD_stats.CTD_afterSleep);
afs_TruncateDaemonRunning = 1;
while (1) {
- cb_lowat = ((CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT)
- * afs_cacheBlocks) / 100;
+ cb_lowat = PERCENT(CM_DCACHESPACEFREEPCT-CM_DCACHEEXTRAPCT, afs_cacheBlocks);
MObtainWriteLock(&afs_xdcache, 266);
if (afs_CacheTooFull) {
- int space_needed, slots_needed;
+ afs_size_t space_needed;
+ afs_int32 slots_needed;
/* if we get woken up, we should try to clean something out */
for (counter = 0; counter < 10; counter++) {
space_needed =
#define MAXATONCE 16 /* max we can obtain at once */
static void
-afs_GetDownD(int anumber, int *aneedSpace, afs_int32 buckethint)
+afs_GetDownD(afs_int32 anumber, afs_size_t *aneedSpace, afs_int32 buckethint)
{
struct dcache *tdc;
if (afs_WaitForCacheDrain) {
if (afs_blocksUsed <=
- (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 0;
afs_osi_Wakeup(&afs_WaitForCacheDrain);
}
if (afs_WaitForCacheDrain) {
if ((afs_blocksUsed - afs_blocksDiscarded) <=
- (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 0;
afs_osi_Wakeup(&afs_WaitForCacheDrain);
}
if (afs_WaitForCacheDrain) {
if ((afs_blocksUsed - afs_blocksDiscarded) <=
- (CM_CACHESIZEDRAINEDPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_CACHESIZEDRAINEDPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 0;
afs_osi_Wakeup(&afs_WaitForCacheDrain);
}
AFS_STATCNT(afs_MaybeFreeDiscardedDCache);
- while (afs_blocksDiscarded
- && (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+ while (afs_blocksDiscarded &&
+ (afs_blocksUsed > PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
afs_FreeDiscardedDCache();
}
return 0;
}
/* Sleep here when cache needs to be drained. */
- if (setLocks && !slowPass
- && (afs_blocksUsed >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100)) {
+ if (setLocks && !slowPass &&
+ (afs_blocksUsed > PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks))) {
/* Make sure truncate daemon is running */
afs_MaybeWakeupTruncateDaemon();
ObtainWriteLock(&tdc->tlock, 614);
ReleaseWriteLock(&tdc->lock);
ReleaseReadLock(&avc->lock);
while ((afs_blocksUsed - afs_blocksDiscarded) >
- (CM_WAITFORDRAINPCT * afs_cacheBlocks) / 100) {
+ PERCENT(CM_WAITFORDRAINPCT, afs_cacheBlocks)) {
afs_WaitForCacheDrain = 1;
afs_osi_Sleep(&afs_WaitForCacheDrain);
}