From 76bbd8dd1865b63e52fd19322e84a1bb4ea97b29 Mon Sep 17 00:00:00 2001 From: Brandon Gilmore Date: Mon, 16 Jul 2018 06:56:27 -0700 Subject: [PATCH] Use /proc/mounts instead of statfs(2) for ro state (#1002) While the statfs(2) approach is reliable for normally mounted filesystems, the flags returned can be inconsistent when filesystem has been remounted read-only after encountering an error. The returned flags do accurately represent the internal state of the filesystem, but they do not reflect whether the VFS layer will accept writes. Instead, it makes sense to parse the current VFS mount state from the options field in /proc/mounts since it takes precedence. Signed-off-by: Brandon Gilmore --- collector/filesystem_common.go | 2 +- collector/filesystem_linux.go | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/collector/filesystem_common.go b/collector/filesystem_common.go index 47ee4bff..da4cecd3 100644 --- a/collector/filesystem_common.go +++ b/collector/filesystem_common.go @@ -51,7 +51,7 @@ type filesystemCollector struct { } type filesystemLabels struct { - device, mountPoint, fsType string + device, mountPoint, fsType, options string } type filesystemStats struct { diff --git a/collector/filesystem_linux.go b/collector/filesystem_linux.go index 78e0aea0..eedce006 100644 --- a/collector/filesystem_linux.go +++ b/collector/filesystem_linux.go @@ -91,8 +91,11 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) { } var ro float64 - if (buf.Flags & readOnly) != 0 { - ro = 1 + for _, option := range strings.Split(labels.options, ",") { + if option == "ro" { + ro = 1 + break + } } stats = append(stats, filesystemStats{ @@ -150,6 +153,7 @@ func mountPointDetails() ([]filesystemLabels, error) { device: parts[0], mountPoint: parts[1], fsType: parts[2], + options: parts[3], }) } return filesystems, scanner.Err()