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>
pull/1003/head
Brandon Gilmore 6 years ago committed by Ben Kochie
parent c4102f1175
commit 76bbd8dd18

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

@ -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()

Loading…
Cancel
Save