Code change:
resizeError := fmt.Errorf("resize of device %s failed: %v. btrfs output: %s", deviceMountPath, err, string(output)) return false, resizeError } <ins> func (resizefs *ResizeFs) NeedResize(devicePath string, deviceMountPath string) (bool, error) { deviceSize, err := resizefs.getDeviceSize(devicePath) if err != nil { return false, err } var fsSize, blockSize uint64 format, err := getDiskFormat(resizefs.exec, devicePath) if err != nil { formatErr := fmt.Errorf("ResizeFS.Resize - error checking format for device %s: %v", devicePath, err) return false, formatErr } // If disk has no format, there is no need to resize the disk because mkfs.* // by default will use whole disk anyways. if format == "" { return false, nil } klog.V(3).Infof("ResizeFs.needResize - checking mounted volume %s", devicePath) switch format { case "ext3", "ext4": blockSize, fsSize, err = resizefs.getExtSize(devicePath) klog.V(5).Infof("Ext size: filesystem size=%d, block size=%d", fsSize, blockSize) case "xfs": blockSize, fsSize, err = resizefs.getXFSSize(deviceMountPath) klog.V(5).Infof("Xfs size: filesystem size=%d, block size=%d, err=%v", fsSize, blockSize, err) default: klog.Errorf("Not able to parse given filesystem info. fsType: %s, will not resize", format) return false, fmt.Errorf("Could not parse fs info on given filesystem format: %s. Supported fs types are: xfs, ext3, ext4", format) } if err != nil { return false, err } // Tolerate one block difference, just in case of rounding errors somewhere. klog.V(5).Infof("Volume %s: device size=%d, filesystem size=%d, block size=%d", devicePath, deviceSize, fsSize, blockSize) if deviceSize <= fsSize+blockSize { return false, nil } return true, nil } func (resizefs *ResizeFs) getDeviceSize(devicePath string) (uint64, error) { output, err := resizefs.exec.Command("blockdev", "--getsize64", devicePath).CombinedOutput() outStr := strings.TrimSpace(string(output)) if err != nil { return 0, fmt.Errorf("failed to read size of device %s: %s: %s", devicePath, err, outStr) } size, err := strconv.ParseUint(outStr, 10, 64) if err != nil { return 0, fmt.Errorf("failed to parse size of device %s %s: %s", devicePath, outStr, err) } return size, nil } func (resizefs *ResizeFs) getExtSize(devicePath string) (uint64, uint64, error) { output, err := resizefs.exec.Command("dumpe2fs", "-h", devicePath).CombinedOutput() if err != nil { return 0, 0, fmt.Errorf("failed to read size of filesystem on %s: %s: %s", devicePath, err, string(output)) } blockSize, blockCount, _ := resizefs.parseFsInfoOutput(string(output), ":", "block size", "block count") if blockSize == 0 { return 0, 0, fmt.Errorf("could not find block size of device %s", devicePath) } if blockCount == 0 { return 0, 0, fmt.Errorf("could not find block count of device %s", devicePath) } return blockSize, blockSize * blockCount, nil } func (resizefs *ResizeFs) getXFSSize(devicePath string) (uint64, uint64, error) { output, err := resizefs.exec.Command("xfs_io", "-c", "statfs", devicePath).CombinedOutput() if err != nil { return 0, 0, fmt.Errorf("failed to read size of filesystem on %s: %s: %s", devicePath, err, string(output)) } blockSize, blockCount, _ := resizefs.parseFsInfoOutput(string(output), "=", "geom.bsize", "geom.datablocks") if blockSize == 0 { return 0, 0, fmt.Errorf("could not find block size of device %s", devicePath) } if blockCount == 0 { return 0, 0, fmt.Errorf("could not find block count of device %s", devicePath) } return blockSize, blockSize * blockCount, nil } func (resizefs *ResizeFs) parseFsInfoOutput(cmdOutput string, spliter string, blockSizeKey string, blockCountKey string) (uint64, uint64, error) { lines := strings.Split(cmdOutput, "n") var blockSize, blockCount uint64 var err error for _, line := range lines { tokens := strings.Split(line, spliter) if len(tokens) != 2 { continue } key, value := strings.ToLower(strings.TrimSpace(tokens[0])), strings.ToLower(strings.TrimSpace(tokens[1])) if key == blockSizeKey { blockSize, err = strconv.ParseUint(value, 10, 64) if err != nil { return 0, 0, fmt.Errorf("failed to parse block size %s: %s", value, err) } } if key == blockCountKey { blockCount, err = strconv.ParseUint(value, 10, 64) if err != nil { return 0, 0, fmt.Errorf("failed to parse block count %s: %s", value, err) } } } return blockSize, blockCount, err } </ins>

Related discussion:
text: This bot triages issues and PRs according to the following rules: After 90d of inactivity, is applied After 30d of inactivity since was applied, is applied After 30d of inactivity since was applied, the issue is closed You can: Reopen this issue or PR with Mark this issue or PR as fresh with Offer to help out with [Issue Triage][1] Please send feedback to sig-contributor-experience at . /close [1]:
Closing this issue. <detailsIn response to : The Kubernetes project currently lacks enough active contributors to adequately respond to all issues and PRs. After 90d of inactivity, is applied After 30d of inactivity since was applied, is applied After 30d of inactivity since was applied, the issue is closedReopen this issue or PR with Mark this issue or PR as fresh with Offer to help out with [Issue Triage][1] Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
/remove-lifecycle stale /reopen
Reopened this issue. <detailsIn response to : /remove-lifecycle stale /reopen Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
The issue has been marked as an important bug and triaged. Such issues are automatically marked as frozen when hitting the rotten state to avoid missing important bugs. Please send feedback to sig-contributor-experience at . /lifecycle frozen
This issue is labeled with but has not been updated in over 90 days, and should be re-triaged. Important-soon issues must be staffed and worked on either currently, or very soon, ideally in time for the next release. You can: Confirm that this issue is still relevant with (org members only) Deprioritize it with or Close this issue with For more details on the triage process, see /remove-triage accepted
/triage accepted /priority long-term what is the latest status on this?
The label(s) cannot be applied, because the repository doesn't have them. <detailsIn response to : /triage accepted /priority long-term what is the latest status on this? Instructions for interacting with me using PR comments are available .