df: Set negative free space values to zero.
authorToni Ylenius <toniylenius@gmail.com>
Fri, 6 Jan 2012 16:13:56 +0000 (18:13 +0200)
committerFlorian Forster <octo@collectd.org>
Sat, 21 Jan 2012 11:02:59 +0000 (12:02 +0100)
Some file systems (eg. UFS) may report negative free spave values.
Previously this caused underflow, but now it is prevented by setting
negative values to zero.

Change-Id: I821adb8a6d7a40dcbd6c65ab3541fbcd714f8aba

Conflicts:

src/df.c

src/df.c

index 2e9b2ae..9d53b0b 100644 (file)
--- a/src/df.c
+++ b/src/df.c
@@ -280,7 +280,22 @@ static int df_read (void)
                        uint64_t blk_reserved;
                        uint64_t blk_used;
 
-                       /* Sanity-check for the values in the struct */
+                       /*
+                        * Sanity-check for the values in the struct
+                        */
+                       /* Check for negative "available" byes. For example UFS can
+                        * report negative free space for user. Notice. blk_reserved
+                        * will start to diminish after this. */
+#if HAVE_STATVFS
+                       /* Cast is needed to avoid compiler warnings.
+                        * ((struct statvfs).f_bavail is unsigned (POSIX)) */
+                       if (((int64_t) statbuf.f_bavail) < 0)
+                               statbuf.f_bavail = 0;
+#elif HAVE_STATFS
+                       if (statbuf.f_bavail < 0)
+                               statbuf.f_bavail = 0;
+#endif
+                       /* Make sure that f_blocks >= f_bfree >= f_bavail */
                        if (statbuf.f_bfree < statbuf.f_bavail)
                                statbuf.f_bfree = statbuf.f_bavail;
                        if (statbuf.f_blocks < statbuf.f_bfree)