From 0d73a2f983c2ec7b4498d92ef1f0f79f2445a2f8 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 7 Feb 2013 12:54:10 +0100 Subject: [PATCH] Fix crash and precision of ETA with zones 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 --- eta.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/eta.c b/eta.c index cfb86793..5ef31c69 100644 --- 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; -- 2.25.1