diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-05-25 12:18:03 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-05-25 12:18:03 -0600 |
commit | 01704502c27f6247523f4d227c94f9311ec4acb4 (patch) | |
tree | e7a2b2fa66590d037f2fdf42d6a3ed7c2b45492c /pkg/btrfs/io_device.go | |
parent | 23ab1f8be6a1f4b5ce01e05f8ed3f6b5dae30d0b (diff) |
wip
Diffstat (limited to 'pkg/btrfs/io_device.go')
-rw-r--r-- | pkg/btrfs/io_device.go | 22 |
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 |