Skip to content

Commit

Permalink
[inputs/diskio] Fix how major and minor identifiers of block devices …
Browse files Browse the repository at this point in the history
…are read. (#5566)

* Fix how major and minor identifiers of block devices are read.

The current implementation assure that the major and the minor are
coded on one byte. But they are not:

```
brw-rw----  1 root disk    252, 290 Feb 25 11:36 dm-290
```

290 as minor in this example is over 1 byte.

So after wondering why all my devices iops weren't correctly stored,
I found out that several points were added for some disks. For `dm-290`
it was overriding `252:34`, instead of getting udev stats for `252:290`.

The solution is here:
https://sites.uclouvain.be/SystInfo/usr/include/sys/sysmacros.h.html

The implementation is directly taken from this, fixing my bug.

* Use unix.Major/unix.Minor instead of custom implementation

* [diskio] Force type of stat.Rdev uint64 for mipsle compatibility

For most platforms, stat.Rdev is already a uint64 so this is without any effect
for linux,mipsle, unix.Stat_t.Rdev is a uint32, but the way to compute major and minor doesn't change, casting the uint32 has no impact either
  • Loading branch information
danielnelson authored Mar 22, 2019
2 parents 417c5c1 + 205de66 commit 9ba023f
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions plugins/inputs/diskio/diskio_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ func (s *DiskIO) diskInfo(devName string) (map[string]string, error) {
return ic.values, nil
}

major := stat.Rdev >> 8 & 0xff
minor := stat.Rdev & 0xff
major := unix.Major(uint64(stat.Rdev))
minor := unix.Minor(uint64(stat.Rdev))
udevDataPath := fmt.Sprintf("%s/b%d:%d", udevPath, major, minor)

di := map[string]string{}
Expand Down

0 comments on commit 9ba023f

Please sign in to comment.