Fix diskio total computation for kernel > 2.6.31 (sf: #2942117)
authorCesare Tirabassi <norsetto@ubuntu.com>
Sat, 30 Jan 2010 13:19:38 +0000 (14:19 +0100)
committerCesare Tirabassi <norsetto@ubuntu.com>
Sat, 30 Jan 2010 13:24:40 +0000 (14:24 +0100)
(cherry picked from commit 44e3708cdb204782d728ddd6a40dec230bb9299c)

src/linux.c

index e00f264..23f95fa 100644 (file)
@@ -2256,6 +2256,7 @@ void update_diskio(void)
        struct diskio_stat *cur;
        unsigned int reads, writes;
        unsigned int total_reads = 0, total_writes = 0;
+       size_t len_devbuf;
 
        stats.current = 0;
        stats.current_read = 0;
@@ -2276,8 +2277,15 @@ void update_diskio(void)
                 * XXX: ignore devices which are part of a SW RAID (MD_MAJOR) */
                if (col_count == 5 && major != LVM_BLK_MAJOR && major != NBD_MAJOR
                                && major != RAMDISK_MAJOR && major != LOOP_MAJOR) {
-                       total_reads += reads;
-                       total_writes += writes;
+                       /* If the last character of the device is a digit we assume
+             * it is a subdevice (needed for kernel > 2.6.31) */
+                       if (devbuf) {
+                               len_devbuf = strlen(devbuf);
+                               if ((len_devbuf > 0) && !isdigit(devbuf[len_devbuf-1])) {
+                                       total_reads += reads;
+                                       total_writes += writes;
+                               }
+                       }
                } else {
                        col_count = sscanf(buf, "%u %u %s %*u %u %*u %u",
                                &major, &minor, devbuf, &reads, &writes);