diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-07-22 21:18:40 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-07-25 12:55:22 -0600 |
commit | b581d0ceb3cd0fee2e78c677bb0805cc68115661 (patch) | |
tree | 7345d8fb1b1d6b0221b6fac81e8c5c96cb6ed4d4 /cmd/btrfs-rec/inspect/rebuildmappings | |
parent | 4afd0a5b438f0eda8af3be8018bc024daeb738c3 (diff) |
rebuildmappings process: Don't require --pv
Diffstat (limited to 'cmd/btrfs-rec/inspect/rebuildmappings')
-rw-r--r-- | cmd/btrfs-rec/inspect/rebuildmappings/file_phony.go | 49 |
1 files changed, 49 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)) +} |