summaryrefslogtreecommitdiff
path: root/pkg/btrfs/io_device.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-05-25 12:18:03 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-05-25 12:18:03 -0600
commit01704502c27f6247523f4d227c94f9311ec4acb4 (patch)
treee7a2b2fa66590d037f2fdf42d6a3ed7c2b45492c /pkg/btrfs/io_device.go
parent23ab1f8be6a1f4b5ce01e05f8ed3f6b5dae30d0b (diff)
wip
Diffstat (limited to 'pkg/btrfs/io_device.go')
-rw-r--r--pkg/btrfs/io_device.go22
1 files changed, 13 insertions, 9 deletions
diff --git a/pkg/btrfs/io_device.go b/pkg/btrfs/io_device.go
index 26450b7..042c9f2 100644
--- a/pkg/btrfs/io_device.go
+++ b/pkg/btrfs/io_device.go
@@ -9,21 +9,25 @@ type Device struct {
*os.File
}
-func (dev Device) Size() (int64, error) {
+func (dev Device) Size() (PhysicalAddr, error) {
fi, err := dev.Stat()
if err != nil {
return 0, err
}
- return fi.Size(), nil
+ return PhysicalAddr(fi.Size()), nil
}
-var superblockAddrs = []int64{
+var superblockAddrs = []PhysicalAddr{
0x00_0001_0000, // 64KiB
0x00_0400_0000, // 64MiB
0x40_0000_0000, // 256GiB
}
-func (dev *Device) Superblocks() ([]Ref[Superblock], error) {
+func (dev *Device) ReadAt(dat []byte, paddr PhysicalAddr) (int, error) {
+ return dev.File.ReadAt(dat, int64(paddr))
+}
+
+func (dev *Device) Superblocks() ([]Ref[PhysicalAddr, Superblock], error) {
const superblockSize = 0x1000
sz, err := dev.Size()
@@ -31,12 +35,12 @@ func (dev *Device) Superblocks() ([]Ref[Superblock], error) {
return nil, err
}
- var ret []Ref[Superblock]
+ var ret []Ref[PhysicalAddr, Superblock]
for i, addr := range superblockAddrs {
if addr+superblockSize <= sz {
- superblock := Ref[Superblock]{
- dev: dev,
- addr: addr,
+ superblock := Ref[PhysicalAddr, Superblock]{
+ File: dev,
+ Addr: addr,
}
if err := superblock.Read(); err != nil {
return nil, fmt.Errorf("superblock %d: %w", i, err)
@@ -50,7 +54,7 @@ func (dev *Device) Superblocks() ([]Ref[Superblock], error) {
return ret, nil
}
-func (dev *Device) superblock() (ret Ref[Superblock], err error) {
+func (dev *Device) Superblock() (ret Ref[PhysicalAddr, Superblock], err error) {
sbs, err := dev.Superblocks()
if err != nil {
return ret, err