Fix crash and precision of ETA with zones
authorJens Axboe <axboe@kernel.dk>
Thu, 7 Feb 2013 11:54:10 +0000 (12:54 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 7 Feb 2013 11:54:10 +0000 (12:54 +0100)
If zonesize was bigger than zoneskip, we could encounter a divide by
zero when calculating the number of bytes.

Additionally, the math was just wrong for most cases of zone settings.
Improve that.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
eta.c

diff --git a/eta.c b/eta.c
index cfb8679..5ef31c6 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -139,6 +139,15 @@ static int thread_eta(struct thread_data *td)
                bytes_total = td->fill_device_size;
        }
 
+       if (td->o.zone_size && td->o.zone_skip && bytes_total) {
+               unsigned int nr_zones;
+               uint64_t zone_bytes;
+
+               zone_bytes = bytes_total + td->o.zone_size + td->o.zone_skip;
+               nr_zones = (zone_bytes - 1) / (td->o.zone_size + td->o.zone_skip);
+               bytes_total -= nr_zones * td->o.zone_skip;
+       }
+
        /*
         * if writing and verifying afterwards, bytes_total will be twice the
         * size. In a mixed workload, verify phase will be the size of the
@@ -156,9 +165,6 @@ static int thread_eta(struct thread_data *td)
                        bytes_total <<= 1;
        }
 
-       if (td->o.zone_size && td->o.zone_skip)
-               bytes_total /= (td->o.zone_skip / td->o.zone_size);
-
        if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING) {
                double perc, perc_t;