summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsnmpd
diff options
context:
space:
mode:
authortrociny <trociny@FreeBSD.org>2013-03-25 19:12:36 +0000
committertrociny <trociny@FreeBSD.org>2013-03-25 19:12:36 +0000
commitd63246a757cde4bb6efc5ef5b63c866554be6f26 (patch)
tree9cbd794438b569fea8a2f50012cbbbbbb0a7a31f /usr.sbin/bsnmpd
parentfe83fcce74a0fc5b36b0b3aa414040f8d88c3a61 (diff)
downloadFreeBSD-src-d63246a757cde4bb6efc5ef5b63c866554be6f26.zip
FreeBSD-src-d63246a757cde4bb6efc5ef5b63c866554be6f26.tar.gz
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
Diffstat (limited to 'usr.sbin/bsnmpd')
-rw-r--r--usr.sbin/bsnmpd/modules/snmp_hostres/hostres_storage_tbl.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_storage_tbl.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_storage_tbl.c
index ee8bdcc..ced7e8d 100644
--- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_storage_tbl.c
+++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_storage_tbl.c
@@ -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;
OpenPOWER on IntegriCloud