]> granicus.if.org Git - zfs/commitdiff
Fix coverity defects: CID 155928
authorDon Brady <don.brady@intel.com>
Tue, 7 Feb 2017 17:29:47 +0000 (10:29 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 7 Feb 2017 17:29:47 +0000 (09:29 -0800)
CID 155928: Integer handling issues (DIVIDE_BY_ZERO)

In the current vdev label, the leaf count is always non-zero
but it doesn't hurt to check the count for future proofing.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Don Brady <don.brady@intel.com>
Closes #5749

cmd/zdb/zdb.c

index d53cb2184cc8fcd645719ea7eac1bd845fa634ed..94b359029c3ebaaec3f4417bb03b884ddf6ffd81 100644 (file)
@@ -2303,7 +2303,7 @@ dump_nvlist_stats(nvlist_t *nvl, size_t cap)
 {
        zdb_nvl_stats_t stats = { 0 };
        size_t size, sum = 0, total;
-       size_t noise, average;
+       size_t noise;
 
        /* requires nvlist with non-unique names for stat collection */
        VERIFY0(nvlist_alloc(&stats.zns_string, 0, 0));
@@ -2344,15 +2344,18 @@ dump_nvlist_stats(nvlist_t *nvl, size_t cap)
        (void) printf("%12s %4d %6d bytes (%5.2f%%)\n\n", "nvlists:",
            stats.zns_list_count, (int)size, 100.0 * size / total);
 
-       average = stats.zns_leaf_total / stats.zns_leaf_count;
-       (void) printf("%12s %4d %6d bytes average\n",
-           "leaf vdevs:", stats.zns_leaf_count, (int)average);
-       (void) printf("%24d bytes largest\n", (int)stats.zns_leaf_largest);
+       if (stats.zns_leaf_count > 0) {
+               size_t average = stats.zns_leaf_total / stats.zns_leaf_count;
 
-       if (dump_opt['l'] >= 3)
-               (void) printf("  space for %d additional leaf vdevs\n",
-                   (int)((cap - total) / average));
+               (void) printf("%12s %4d %6d bytes average\n", "leaf vdevs:",
+                   stats.zns_leaf_count, (int)average);
+               (void) printf("%24d bytes largest\n",
+                   (int)stats.zns_leaf_largest);
 
+               if (dump_opt['l'] >= 3 && average > 0)
+                       (void) printf("  space for %d additional leaf vdevs\n",
+                           (int)((cap - total) / average));
+       }
        (void) printf("\n");
 
        nvlist_free(stats.zns_string);