-
Notifications
You must be signed in to change notification settings - Fork 163
/
block.go
35 lines (28 loc) · 862 Bytes
/
block.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Copyright (c) 2023 ScyllaDB.
package disks
import (
"fmt"
"os"
"path"
"strconv"
"strings"
"syscall"
"golang.org/x/sys/unix"
)
func GetBlockSize(device string, sysfsPath string) (int, error) {
var stat syscall.Stat_t
err := syscall.Stat(device, &stat)
if err != nil {
return 0, fmt.Errorf("can't stat device %q: %w", device, err)
}
major, minor := unix.Major(stat.Rdev), unix.Minor(stat.Rdev)
blockSizeRaw, err := os.ReadFile(path.Join(sysfsPath, fmt.Sprintf("/dev/block/%d:%d/queue/logical_block_size", major, minor)))
if err != nil {
return 0, fmt.Errorf("can't read device %d:%d logical block size file: %w", major, minor, err)
}
blockSize, err := strconv.Atoi(strings.TrimSpace(string(blockSizeRaw)))
if err != nil {
return 0, fmt.Errorf("can't parse block size %q: %w", string(blockSizeRaw), err)
}
return blockSize, nil
}