func fetchDeviceName()

in metric/system/cgroup/cgv2/io_helper_linux.go [32:74]


func fetchDeviceName(major uint64, minor uint64) (bool, string, error) {
	// iterate over /dev/ and pull major and minor values
	found := false
	var devName string
	var curMajor uint64
	var curMinor uint64
	var devID uint64
	walkFunc := func(path string, d fs.DirEntry, err error) error {
		if d.IsDir() && path != "/dev/" {
			return fs.SkipDir
		}
		if d.Type() != fs.ModeDevice {
			return nil
		}
		fInfo, dirErr := d.Info()
		if dirErr != nil {
			return nil //nolint: nilerr // errors are hidden on purpose
		}
		infoT, ok := fInfo.Sys().(*syscall.Stat_t)
		if !ok {
			return nil
		}
		devID = uint64(infoT.Rdev)

		// do some bitmapping to extract the major and minor device values
		// The odd duplicated logic here is to deal with 32 and 64 bit values.
		// see bits/sysmacros.h
		curMajor = ((devID & 0xfffff00000000000) >> 32) | ((devID & 0x00000000000fff00) >> 8)
		curMinor = ((devID & 0x00000000000000ff) >> 0) | ((devID & 0x00000ffffff00000) >> 12)
		if curMajor == major && curMinor == minor {
			found = true
			devName = d.Name()
		}
		return nil
	}

	err := filepath.WalkDir("/dev/", walkFunc)
	if err != nil {
		return false, "", fmt.Errorf("error walking /dev/: %w", err)
	}

	return found, devName, nil
}