Skip to content

Commit 1d80834

Browse files
authored
extract device type determination (#332)
Signed-off-by: Avi Deitcher <[email protected]>
1 parent 1abc0d0 commit 1d80834

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

disk/devicetype.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package disk
2+
3+
import (
4+
"fmt"
5+
iofs "io/fs"
6+
"os"
7+
)
8+
9+
type DeviceType int
10+
11+
const (
12+
DeviceTypeUnknown DeviceType = iota
13+
DeviceTypeFile
14+
DeviceTypeBlockDevice
15+
)
16+
17+
func DetermineDeviceType(f iofs.File) (DeviceType, error) {
18+
info, err := f.Stat()
19+
if err != nil {
20+
return DeviceTypeUnknown, fmt.Errorf("could not stat file: %v", err)
21+
}
22+
mode := info.Mode()
23+
var dt DeviceType
24+
switch {
25+
case mode.IsRegular():
26+
dt = DeviceTypeFile
27+
case mode&os.ModeDevice != 0:
28+
dt = DeviceTypeBlockDevice
29+
default:
30+
return DeviceTypeUnknown, fmt.Errorf("device %s is neither a block device nor a regular file", info.Name())
31+
}
32+
return dt, nil
33+
}

diskfs.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,14 @@ func initDisk(b backend.Storage, sectorSize SectorSize) (*disk.Disk, error) {
101101
}
102102

103103
// get device information
104+
deviceType, err := disk.DetermineDeviceType(b)
105+
if err != nil {
106+
return nil, err
107+
}
108+
104109
devInfo, err := b.Stat()
105110
if err != nil {
106-
return nil, fmt.Errorf("could not get info for device %s: %v", devInfo.Name(), err)
111+
return nil, fmt.Errorf("could not get info for device: %v", err)
107112
}
108113

109114
newDisk := &disk.Disk{
@@ -114,14 +119,13 @@ func initDisk(b backend.Storage, sectorSize SectorSize) (*disk.Disk, error) {
114119
DefaultBlocks: true,
115120
}
116121

117-
mode := devInfo.Mode()
118-
switch {
119-
case mode.IsRegular():
122+
switch deviceType {
123+
case disk.DeviceTypeFile:
120124
log.Debug("initDisk(): regular file")
121125
if newDisk.Size <= 0 {
122126
return nil, fmt.Errorf("could not get file size for device %s", devInfo.Name())
123127
}
124-
case mode&os.ModeDevice != 0:
128+
case disk.DeviceTypeBlockDevice:
125129
log.Debug("initDisk(): block device")
126130
osFile, err := newDisk.Backend.Sys()
127131
if err != nil {
@@ -145,7 +149,8 @@ func initDisk(b backend.Storage, sectorSize SectorSize) (*disk.Disk, error) {
145149
newDisk.PhysicalBlocksize = pblksize
146150
newDisk.DefaultBlocks = false
147151
}
148-
152+
case disk.DeviceTypeUnknown:
153+
return nil, fmt.Errorf("device %s is neither a block device nor a regular file", devInfo.Name())
149154
default:
150155
return nil, fmt.Errorf("device %s is neither a block device nor a regular file", devInfo.Name())
151156
}

0 commit comments

Comments
 (0)