80 lines
3.0 KiB
Diff
80 lines
3.0 KiB
Diff
From 5a34ff0a99a3c5e7ba4f7982d5de3d0dcc9e3045 Mon Sep 17 00:00:00 2001
|
|
From: Craig Small <csmall@enc.com.au>
|
|
Date: Wed, 29 Jan 2014 22:22:11 +1100
|
|
Subject: [PATCH] Check for presence of disks in vmstat
|
|
|
|
vmstat -d or vmstat -p would crash mysteriously under different
|
|
circumstances. The problem was eventually tracked down to /sys not
|
|
being mounted which meant is_disk() always returned false.
|
|
The partition would then be attempted to be linked to a non-existent
|
|
disk causing a segfault.
|
|
|
|
vmstat will now not link to a disk if none exists.
|
|
The change in testing will skip those tests when /sys/block doesn't
|
|
exist.
|
|
|
|
Many thanks to Daniel Schepler for his analysis and suggestions.
|
|
|
|
Bug-Debian: http://bugs.debian.org/736628
|
|
---
|
|
proc/sysinfo.c | 7 +++++--
|
|
testsuite/vmstat.test/vmstat.exp | 22 +++++++++++++++-------
|
|
2 files changed, 20 insertions(+), 9 deletions(-)
|
|
|
|
diff --git proc/sysinfo.c proc/sysinfo.c
|
|
index f318376..1680cc4 100644
|
|
--- proc/sysinfo.c
|
|
+++ proc/sysinfo.c
|
|
@@ -938,8 +938,11 @@ unsigned int getdiskstat(struct disk_stat **disks, struct partition_stat **parti
|
|
&(*partitions)[cPartition].writes,
|
|
&(*partitions)[cPartition].requested_writes
|
|
);
|
|
- (*partitions)[cPartition++].parent_disk = cDisk-1;
|
|
- (*disks)[cDisk-1].partitions++;
|
|
+
|
|
+ if (cDisk > 0) {
|
|
+ (*partitions)[cPartition++].parent_disk = cDisk-1;
|
|
+ (*disks)[cDisk-1].partitions++;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
diff --git testsuite/vmstat.test/vmstat.exp testsuite/vmstat.test/vmstat.exp
|
|
index fb5de14..f470afc 100644
|
|
--- testsuite/vmstat.test/vmstat.exp
|
|
+++ testsuite/vmstat.test/vmstat.exp
|
|
@@ -26,15 +26,23 @@ expect_pass "$test" "^Cache\\s+Num\\s+Total\\s+Size\\s+Pages\\s+\(\[\(\)A-Za-z0-
|
|
}
|
|
|
|
set test "vmstat disk information (-d option)"
|
|
-spawn $vmstat -d
|
|
-expect_pass "$test" "^disk\[ -\]+reads\[ -\]+writes\[ -\]+IO\[ -\]+\\s+total\\s+merged\\s+sectors\\s+ms\\s+total\\s+merged\\s+sectors\\s+ms\\s+cur\\s+sec\\s+"
|
|
+if { [ file readable "/sys/block" ] == 0 } {
|
|
+ unsupported "$test /sys/block not readable"
|
|
+} else {
|
|
+ spawn $vmstat -d
|
|
+ expect_pass "$test" "^disk\[ -\]+reads\[ -\]+writes\[ -\]+IO\[ -\]+\\s+total\\s+merged\\s+sectors\\s+ms\\s+total\\s+merged\\s+sectors\\s+ms\\s+cur\\s+sec\\s+"
|
|
+}
|
|
|
|
# Need a partition
|
|
set diskstats [ exec cat /proc/diskstats ]
|
|
-if [ regexp "\\s+\\d+\\s+\\d+\\s+\(\[a-z\]+\\d+\)\\s+\[0-9\]\[0-9\]+" $diskstats line partition == 1 ] {
|
|
- set test "vmstat partition (using $partition)"
|
|
- spawn $vmstat -p $partition
|
|
- expect_pass "$test" "^${partition}\\s+reads"
|
|
+if { [ file readable "/sys/block" ] == 0 } {
|
|
+ unsupported "vmstat partition /sys/block not readable"
|
|
} else {
|
|
- unsupported "vmstat partition (cannot find partition)"
|
|
+ if [ regexp "\\s+\\d+\\s+\\d+\\s+\(\[a-z\]+\\d+\)\\s+\[0-9\]\[0-9\]+" $diskstats line partition == 1 ] {
|
|
+ set test "vmstat partition (using $partition)"
|
|
+ spawn $vmstat -p $partition
|
|
+ expect_pass "$test" "^${partition}\\s+reads"
|
|
+ } else {
|
|
+ unsupported "vmstat partition (cannot find partition)"
|
|
+ }
|
|
}
|
|
--
|
|
1.7.9.2
|
|
|