aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/genhd.h
diff options
context:
space:
mode:
authorBen Woodard <woodard@redhat.com>2006-03-22 02:09:31 -0500
committerJens Axboe <axboe@nelson.home.kernel.dk>2006-03-27 02:29:02 -0500
commit837c7878771c15ed8d85ecf814ece7fcb4551b46 (patch)
tree28b06f0734958802ab98e1e6712ac3c6bf8f2518 /include/linux/genhd.h
parent4c5d0bbde9669cfb7f7fd4670dc9a117aea90384 (diff)
[BLOCK] increase size of disk stat counters
The kernel's representation of the disk statistics uses the type unsigned which is 32b on both 32b and 64b platforms. Unfortunately, most system tools that work with these numbers that are exported in /proc/diskstats including iostat read these numbers into unsigned longs. This works fine on 32b platforms and when the number of IO transactions are small on 64b platforms. However, when the numbers wrap on 64b platforms & you read the numbers into unsigned longs, and compare the numbers to previous readings, then you get an unsigned representation of a negative number. This looks like a very large 64b number & gives you bizarre readouts in iostat: ilc4: Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util ilc4: sda 5.50 0.00 143.96 0.00 307496983987862656.00 0.00 153748491993931328.00 0.00 2136028725038430.00 7.94 55.12 5.59 80.42 Though fixing iostat in user space is possible, and a quick survey indicates that several other similar tools also use unsigned longs when processing /proc/diskstats. Therefore, it seems like a better approach would be to extend the length of the disk_stats structure on 64b architectures to 64b. The following patch does that. It should not affect the operation on 32b platforms. Signed-off-by: Ben Woodard <woodard@redhat.com> Cc: Rick Lindsley <ricklind@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Jens Axboe <axboe@suse.de>
Diffstat (limited to 'include/linux/genhd.h')
-rw-r--r--include/linux/genhd.h12
1 files changed, 6 insertions, 6 deletions
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index fd647fde5ec1..179fea53fc81 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -89,12 +89,12 @@ struct hd_struct {
89#define GENHD_FL_SUPPRESS_PARTITION_INFO 32 89#define GENHD_FL_SUPPRESS_PARTITION_INFO 32
90 90
91struct disk_stats { 91struct disk_stats {
92 unsigned sectors[2]; /* READs and WRITEs */ 92 unsigned long sectors[2]; /* READs and WRITEs */
93 unsigned ios[2]; 93 unsigned long ios[2];
94 unsigned merges[2]; 94 unsigned long merges[2];
95 unsigned ticks[2]; 95 unsigned long ticks[2];
96 unsigned io_ticks; 96 unsigned long io_ticks;
97 unsigned time_in_queue; 97 unsigned long time_in_queue;
98}; 98};
99 99
100struct gendisk { 100struct gendisk {