hrStorageSize and hrStorageUsed are 32 bit integers, reporting a fs

size and usage in hrStorageAllocationUnits. If the file system has
more than 2^31 allocations it can not be shown correctly and the
meters are useless.

In such cases follow net-snmp behaviour and increase
hrStorageAllocationUnits so the values fit under INT_MAX.

PR:		bin/177183
Submitted by:	Eugene Grosbein egrosbein rdtc.ru
MFC after:	2 weeks
This commit is contained in:
Mikolaj Golub 2013-03-25 19:12:36 +00:00
parent 730cecb05a
commit aebd8de674

View File

@ -442,10 +442,9 @@ static void
storage_OS_get_fs(void)
{
struct storage_entry *entry;
uint64_t used_blocks_count = 0;
uint64_t size, used;
int i, mounted_fs_count, units;
char fs_string[SE_DESC_MLEN];
int mounted_fs_count;
int i = 0;
if ((mounted_fs_count = getfsstat(NULL, 0, MNT_NOWAIT)) < 0) {
syslog(LOG_ERR, "hrStorageTable: getfsstat() failed: %m");
@ -488,22 +487,17 @@ storage_OS_get_fs(void)
entry->flags |= HR_STORAGE_FOUND;
entry->type = fs_get_type(&fs_buf[i]); /*XXX - This is wrong*/
if (fs_buf[i].f_bsize > INT_MAX)
entry->allocationUnits = INT_MAX;
else
entry->allocationUnits = fs_buf[i].f_bsize;
if (fs_buf[i].f_blocks > INT_MAX)
entry->size = INT_MAX;
else
entry->size = fs_buf[i].f_blocks;
used_blocks_count = fs_buf[i].f_blocks - fs_buf[i].f_bfree;
if (used_blocks_count > INT_MAX)
entry->used = INT_MAX;
else
entry->used = used_blocks_count;
units = fs_buf[i].f_bsize;
size = fs_buf[i].f_blocks;
used = fs_buf[i].f_blocks - fs_buf[i].f_bfree;
while (size > INT_MAX) {
units <<= 1;
size >>= 1;
used >>= 1;
}
entry->allocationUnits = units;
entry->size = size;
entry->used = used;
entry->allocationFailures = 0;