diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-07-25 12:55:44 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-07-25 12:55:44 -0600 |
commit | b3ef47542802ecd06498a2fc3a87ce26f7bc1e98 (patch) | |
tree | 7345d8fb1b1d6b0221b6fac81e8c5c96cb6ed4d4 /cmd/btrfs-rec/inspect | |
parent | c57cc3d4739ffa0346350c63fb4ec59a63b56e46 (diff) | |
parent | b581d0ceb3cd0fee2e78c677bb0805cc68115661 (diff) |
Merge branch 'lukeshu/process-without-pv'
Diffstat (limited to 'cmd/btrfs-rec/inspect')
-rw-r--r-- | cmd/btrfs-rec/inspect/rebuildmappings/file_phony.go | 49 | ||||
-rw-r--r-- | cmd/btrfs-rec/inspect/rebuildmappings/scan.go | 5 |
2 files changed, 54 insertions, 0 deletions
diff --git a/cmd/btrfs-rec/inspect/rebuildmappings/file_phony.go b/cmd/btrfs-rec/inspect/rebuildmappings/file_phony.go new file mode 100644 index 0000000..a41a16b --- /dev/null +++ b/cmd/btrfs-rec/inspect/rebuildmappings/file_phony.go @@ -0,0 +1,49 @@ +// Copyright (C) 2023 Luke Shumaker <lukeshu@lukeshu.com> +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package rebuildmappings + +import ( + "fmt" + + "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/diskio" + "git.lukeshu.com/btrfs-progs-ng/lib/slices" +) + +type phonyFile struct { + size btrfsvol.PhysicalAddr + sb btrfstree.Superblock +} + +var _ diskio.File[btrfsvol.PhysicalAddr] = (*phonyFile)(nil) + +func NewPhonyFile(size btrfsvol.PhysicalAddr, sb btrfstree.Superblock) *phonyFile { + return &phonyFile{ + size: size, + sb: sb, + } +} + +func (f *phonyFile) Name() string { return fmt.Sprintf("phony_file:device_id=%v", f.sb.DevItem.DevID) } +func (f *phonyFile) Size() btrfsvol.PhysicalAddr { return f.size } +func (*phonyFile) Close() error { return nil } + +func (f *phonyFile) ReadAt(p []byte, off btrfsvol.PhysicalAddr) (int, error) { + if len(p) == int(btrfs.SuperblockSize) && slices.Contains(off, btrfs.SuperblockAddrs) { + bs, err := binstruct.Marshal(f.sb) + if err != nil { + return 0, err + } + return copy(p, bs), nil + } + panic(fmt.Errorf("%T: should not happen: ReadAt should not be called for a phony file", f)) +} + +func (f *phonyFile) WriteAt([]byte, btrfsvol.PhysicalAddr) (int, error) { + panic(fmt.Errorf("%T: should not happen: WriteAt should not be called for a phony file", f)) +} diff --git a/cmd/btrfs-rec/inspect/rebuildmappings/scan.go b/cmd/btrfs-rec/inspect/rebuildmappings/scan.go index 9454ca0..d689136 100644 --- a/cmd/btrfs-rec/inspect/rebuildmappings/scan.go +++ b/cmd/btrfs-rec/inspect/rebuildmappings/scan.go @@ -25,6 +25,11 @@ import ( // Result types //////////////////////////////////////////////////////////////// +type ScanResult struct { + Mappings []btrfsvol.Mapping + Devices ScanDevicesResult +} + type ScanDevicesResult = map[btrfsvol.DeviceID]ScanOneDeviceResult type ScanOneDeviceResult struct { |