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 <bgilmore@valvesoftware.com>
This commit is contained in:
Brandon Gilmore 2018-07-16 06:56:27 -07:00 committed by Ben Kochie
parent c4102f1175
commit 76bbd8dd18
2 changed files with 7 additions and 3 deletions

View file

@ -51,7 +51,7 @@ type filesystemCollector struct {
} }
type filesystemLabels struct { type filesystemLabels struct {
device, mountPoint, fsType string device, mountPoint, fsType, options string
} }
type filesystemStats struct { type filesystemStats struct {

View file

@ -91,8 +91,11 @@ func (c *filesystemCollector) GetStats() ([]filesystemStats, error) {
} }
var ro float64 var ro float64
if (buf.Flags & readOnly) != 0 { for _, option := range strings.Split(labels.options, ",") {
if option == "ro" {
ro = 1 ro = 1
break
}
} }
stats = append(stats, filesystemStats{ stats = append(stats, filesystemStats{
@ -150,6 +153,7 @@ func mountPointDetails() ([]filesystemLabels, error) {
device: parts[0], device: parts[0],
mountPoint: parts[1], mountPoint: parts[1],
fsType: parts[2], fsType: parts[2],
options: parts[3],
}) })
} }
return filesystems, scanner.Err() return filesystems, scanner.Err()