From b5e4e8c14130f601bbf43dee5927222ebf7613fa Mon Sep 17 00:00:00 2001 From: Mark Vitale Date: Tue, 12 Jan 2016 18:06:51 -0500 Subject: [PATCH] afs: fs getcacheparms miscounts dcaches for large files fs getcacheparms issued with the -excessive option tabulates in-memory dcaches ("DCentries") by size. However, any dcache with validPos > 2^31 is miscounted in the 4k-16k bucket. This is caused by a type mismatch between 'validPos' (afs_size_t) and 'size' (int) which leads to a negative value for size by sign-extension. The size comparison "sieve" fails for negative numbers; it skips the first bucket (0-4K) and dumps them in the second one (4k-16k). Move the declaration of 'size' closer to its use, and declare it with the same type as 'validPos' (afs_size_t) so the comparison sieve correctly places these dcaches in the last (>=1M) bucket. Change-Id: Ib0d973da92865043a4f1c068de5e9b81bcde2b9a Reviewed-on: https://gerrit.openafs.org/12347 Reviewed-by: Stephan Wiesand Tested-by: BuildBot Reviewed-by: Benjamin Kaduk --- src/afs/afs_pioctl.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 3d15325..f4c0f5f 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -2919,7 +2919,7 @@ DECL_PIOCTL(PGetCacheSize) afs_int32 results[MAXGCSTATS]; afs_int32 flags; struct dcache * tdc; - int i, size; + int i; AFS_STATCNT(PGetCacheSize); @@ -2951,8 +2951,9 @@ DECL_PIOCTL(PGetCacheSize) tdc = afs_indexTable[i]; if (tdc){ + afs_size_t size = tdc->validPos; + results[9]++; - size = tdc->validPos; if ( 0 <= size && size < (1<<12) ) results[10]++; else if (size < (1<<14) ) results[11]++; else if (size < (1<<16) ) results[12]++; -- 1.9.4