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:
parent
c4102f1175
commit
76bbd8dd18
|
@ -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 {
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue