From 79d8554fa985e83f01008a534cf5f0a56d25d861 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 10 Nov 2002 02:02:10 -0800 Subject: [PATCH] [PATCH] Fix math underflow in disk accounting Patch from Lev Makhlis The disk accounting will overflow after 4,000,000 seconds. Extend that by a factor of 1000. --- drivers/block/genhd.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index c9d6d5b2b839..5bba83e69485 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -324,9 +324,16 @@ static ssize_t disk_size_read(struct gendisk * disk, { return off ? 0 : sprintf(page, "%llu\n",(unsigned long long)get_capacity(disk)); } -static inline unsigned MSEC(unsigned x) + +static inline unsigned jiffies_to_msec(unsigned jif) { - return x * 1000 / HZ; +#if 1000 % HZ == 0 + return jif * (1000 / HZ); +#elif HZ % 1000 == 0 + return jif / (HZ / 1000); +#else + return (jif / HZ) * 1000 + (jif % HZ) * 1000 / HZ; +#endif } static ssize_t disk_stat_read(struct gendisk * disk, char *page, size_t count, loff_t off) @@ -338,11 +345,11 @@ static ssize_t disk_stat_read(struct gendisk * disk, "%8u %8u %8u" "\n", disk->reads, disk->read_merges, (u64)disk->read_sectors, - MSEC(disk->read_ticks), + jiffies_to_msec(disk->read_ticks), disk->writes, disk->write_merges, (u64)disk->write_sectors, - MSEC(disk->write_ticks), - disk->in_flight, MSEC(disk->io_ticks), - MSEC(disk->time_in_queue)); + jiffies_to_msec(disk->write_ticks), + disk->in_flight, jiffies_to_msec(disk->io_ticks), + jiffies_to_msec(disk->time_in_queue)); } static struct disk_attribute disk_attr_dev = { .attr = {.name = "dev", .mode = S_IRUGO }, -- 2.39.5