]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Fix math underflow in disk accounting
authorAndrew Morton <akpm@digeo.com>
Sun, 10 Nov 2002 10:02:10 +0000 (02:02 -0800)
committerDavid S. Miller <davem@nuts.ninka.net>
Sun, 10 Nov 2002 10:02:10 +0000 (02:02 -0800)
Patch from Lev Makhlis <mlev@despammed.com>

The disk accounting will overflow after 4,000,000 seconds.  Extend that
by a factor of 1000.

drivers/block/genhd.c

index c9d6d5b2b839f1be8841834737043fc8eb8f6c7a..5bba83e6948516fd91056b872e2d9985b6ed2035 100644 (file)
@@ -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 },