summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btrfs-rec/inspect/dumptrees/print_tree.go (renamed from lib/btrfsprogs/btrfsinspect/print_tree.go)2
-rw-r--r--cmd/btrfs-rec/inspect/mount/mount.go (renamed from lib/btrfsprogs/btrfsinspect/mount.go)6
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/kmp.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp.go)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/kmp_test.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp_test.go)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go)21
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process_blockgroups.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go)5
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_exact.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/matchsums.go)2
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_fuzzy.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/fuzzymatchsums.go)6
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process_sums_logical.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/logicalsums.go)13
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/process_sums_physical.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/physicalsums.go)3
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/scan.go (renamed from lib/btrfsprogs/btrfsinspect/scandevices.go)4
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/sumrunwithgaps.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/sumrunwithgaps.go)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600 (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60 (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738 (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d (renamed from lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d)0
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/rebuild.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go)53
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/rebuild_treecb.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_treecb.go)14
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wantcb.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wantcb.go)62
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wanttyp.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wanttyp.go)6
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/scan.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go)24
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/util.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/util.go)8
-rw-r--r--cmd/btrfs-rec/inspect_dumptrees.go6
-rw-r--r--cmd/btrfs-rec/inspect_lsfiles.go4
-rw-r--r--cmd/btrfs-rec/inspect_lstrees.go8
-rw-r--r--cmd/btrfs-rec/inspect_mount.go6
-rw-r--r--cmd/btrfs-rec/inspect_rebuildmappings.go5
-rw-r--r--cmd/btrfs-rec/inspect_rebuildtrees.go (renamed from cmd/btrfs-rec/inspect_rebuildnodes.go)10
-rw-r--r--cmd/btrfs-rec/inspect_scandevices.go4
-rw-r--r--cmd/btrfs-rec/inspect_spewitems.go2
-rw-r--r--cmd/btrfs-rec/main.go2
-rw-r--r--lib/btrfs/btrfstree/btree_forrest.go (renamed from lib/btrfs/btrfstree/root.go)0
-rw-r--r--lib/btrfs/btrfstree/btree_tree.go (renamed from lib/btrfs/btrfstree/ops.go)0
-rw-r--r--lib/btrfscheck/graph.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go)112
-rw-r--r--lib/btrfsutil/graph.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/graph.go)49
-rw-r--r--lib/btrfsutil/graph_loops.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/loops.go)8
-rw-r--r--lib/btrfsutil/nestedlock.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/nestedlock.go)2
-rw-r--r--lib/btrfsutil/old_rebuilt_forrest.go (renamed from lib/btrfsprogs/btrfsutil/broken_btree.go)153
-rw-r--r--lib/btrfsutil/open.go (renamed from lib/btrfsprogs/btrfsutil/open.go)0
-rw-r--r--lib/btrfsutil/print_addrspace.go (renamed from lib/btrfsprogs/btrfsinspect/print_addrspace.go)2
-rw-r--r--lib/btrfsutil/rebuilt_forrest.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/forrest.go)32
-rw-r--r--lib/btrfsutil/rebuilt_readitem.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio/keyio.go)25
-rw-r--r--lib/btrfsutil/rebuilt_tree.go (renamed from lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/tree.go)25
-rw-r--r--lib/btrfsutil/skinny_paths.go (renamed from lib/btrfsprogs/btrfsutil/skinny_paths.go)0
-rw-r--r--lib/btrfsutil/walk.go (renamed from lib/btrfsprogs/btrfsutil/walk.go)0
-rw-r--r--lib/textui/log.go88
47 files changed, 383 insertions, 389 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/print_tree.go b/cmd/btrfs-rec/inspect/dumptrees/print_tree.go
index 240c72f..676306a 100644
--- a/lib/btrfsprogs/btrfsinspect/print_tree.go
+++ b/cmd/btrfs-rec/inspect/dumptrees/print_tree.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrfsinspect
+package dumptrees
import (
"context"
diff --git a/lib/btrfsprogs/btrfsinspect/mount.go b/cmd/btrfs-rec/inspect/mount/mount.go
index 0ac8497..da0bbb6 100644
--- a/lib/btrfsprogs/btrfsinspect/mount.go
+++ b/cmd/btrfs-rec/inspect/mount/mount.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrfsinspect
+package mount
import (
"context"
@@ -25,7 +25,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
@@ -44,7 +44,7 @@ func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string, noChecksums b
rootSubvol := &subvolume{
Subvolume: btrfs.Subvolume{
- FS: btrfsutil.NewBrokenTrees(ctx, fs),
+ FS: btrfsutil.NewOldRebuiltForrest(ctx, fs),
TreeID: btrfsprim.FS_TREE_OBJECTID,
NoChecksums: noChecksums,
},
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp.go b/cmd/btrfs-rec/inspect/rebuildmappings/kmp.go
index 20772ba..20772ba 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/kmp.go
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp_test.go b/cmd/btrfs-rec/inspect/rebuildmappings/kmp_test.go
index acec9b8..acec9b8 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/kmp_test.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/kmp_test.go
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go b/cmd/btrfs-rec/inspect/rebuildmappings/process.go
index cdf5e5a..7ce3748 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process.go
@@ -12,7 +12,6 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
@@ -26,7 +25,7 @@ func getNodeSize(fs *btrfs.FS) (btrfsvol.AddrDelta, error) {
return btrfsvol.AddrDelta(sb.NodeSize), nil
}
-func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) error {
+func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults ScanDevicesResult) error {
nodeSize, err := getNodeSize(fs)
if err != nil {
return err
@@ -55,7 +54,7 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
dlog.Infof(ctx, "plan: 6/6 search for block groups in checksum map (fuzzy)")
_ctx := ctx
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "1/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "1/6")
dlog.Infof(_ctx, "1/6: Processing %d chunks...", numChunks)
for _, devID := range devIDs {
devResults := scanResults[devID]
@@ -69,7 +68,7 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
}
dlog.Info(_ctx, "... done processing chunks")
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "2/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "2/6")
dlog.Infof(_ctx, "2/6: Processing %d device extents...", numDevExts)
for _, devID := range devIDs {
devResults := scanResults[devID]
@@ -85,7 +84,7 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
// too much. (Because nodes are numerous and small, while the
// others are few and large; so it is likely that many of the
// nodes will be subsumed by other things.)
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "3/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "3/6")
dlog.Infof(_ctx, "3/6: Processing %d nodes...", numNodes)
for _, devID := range devIDs {
devResults := scanResults[devID]
@@ -110,7 +109,7 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
// Use block groups to add missing flags (and as a hint to
// combine node entries).
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "4/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "4/6")
dlog.Infof(_ctx, "4/6: Processing %d block groups...", numBlockGroups)
// First dedup them, because they change for allocations and
// CoW means that they'll bounce around a lot, so you likely
@@ -158,23 +157,23 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
// The fuzzy-search is only fast because the exact-search is so good at getting `physicalBlocks` down.
// Empirically: if I remove the exact-search step, then the fuzzy-match step is more than an order of magnitude
// slower.
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "5/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "5/6")
dlog.Infof(_ctx, "5/6: Searching for %d block groups in checksum map (exact)...", len(bgs))
physicalSums := ExtractPhysicalSums(scanResults)
logicalSums := ExtractLogicalSums(ctx, scanResults)
- if err := matchBlockGroupSums(ctx, fs, bgs, physicalSums, logicalSums); err != nil {
+ if err := matchBlockGroupSumsExact(ctx, fs, bgs, physicalSums, logicalSums); err != nil {
return err
}
dlog.Info(ctx, "... done searching for exact block groups")
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "6/6")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "6/6")
dlog.Infof(_ctx, "6/6: Searching for %d block groups in checksum map (fuzzy)...", len(bgs))
- if err := fuzzyMatchBlockGroupSums(ctx, fs, bgs, physicalSums, logicalSums); err != nil {
+ if err := matchBlockGroupSumsFuzzy(ctx, fs, bgs, physicalSums, logicalSums); err != nil {
return err
}
dlog.Info(_ctx, "... done searching for fuzzy block groups")
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.step", "report")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.step", "report")
dlog.Info(_ctx, "report:")
unmappedPhysicalRegions := ListUnmappedPhysicalRegions(fs)
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go b/cmd/btrfs-rec/inspect/rebuildmappings/process_blockgroups.go
index 0e2d5a0..f8d2337 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process_blockgroups.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -9,7 +9,6 @@ import (
"sort"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
)
@@ -20,7 +19,7 @@ type BlockGroup struct {
Flags btrfsvol.BlockGroupFlags
}
-func DedupBlockGroups(scanResults btrfsinspect.ScanDevicesResult) (map[btrfsvol.LogicalAddr]BlockGroup, error) {
+func DedupBlockGroups(scanResults ScanDevicesResult) (map[btrfsvol.LogicalAddr]BlockGroup, error) {
// Dedup
bgsSet := make(containers.Set[BlockGroup])
for _, devResults := range scanResults {
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/matchsums.go b/cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_exact.go
index a3e724e..533ae67 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/matchsums.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_exact.go
@@ -17,7 +17,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
)
-func matchBlockGroupSums(ctx context.Context,
+func matchBlockGroupSumsExact(ctx context.Context,
fs *btrfs.FS,
blockgroups map[btrfsvol.LogicalAddr]BlockGroup,
physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr],
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/fuzzymatchsums.go b/cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_fuzzy.go
index 4724c12..00f367f 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/fuzzymatchsums.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process_matchsums_fuzzy.go
@@ -37,7 +37,7 @@ func (a fuzzyRecord) Compare(b fuzzyRecord) int {
}
}
-func fuzzyMatchBlockGroupSums(ctx context.Context,
+func matchBlockGroupSumsFuzzy(ctx context.Context,
fs *btrfs.FS,
blockgroups map[btrfsvol.LogicalAddr]BlockGroup,
physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr],
@@ -45,7 +45,7 @@ func fuzzyMatchBlockGroupSums(ctx context.Context,
) error {
_ctx := ctx
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.substep", "indexing")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.substep", "indexing")
dlog.Info(ctx, "Indexing physical regions...") // O(m)
regions := ListUnmappedPhysicalRegions(fs)
physicalIndex := make(map[btrfssum.ShortSum][]btrfsvol.QualifiedPhysicalAddr)
@@ -62,7 +62,7 @@ func fuzzyMatchBlockGroupSums(ctx context.Context,
}
dlog.Info(ctx, "... done indexing")
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-mappings.substep", "searching")
+ ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-mappings.process.substep", "searching")
dlog.Info(ctx, "Searching...")
numBlockgroups := len(blockgroups)
for i, bgLAddr := range maps.SortedKeys(blockgroups) {
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/logicalsums.go b/cmd/btrfs-rec/inspect/rebuildmappings/process_sums_logical.go
index 7c02d05..2cdabb7 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/logicalsums.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process_sums_logical.go
@@ -15,13 +15,12 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
)
-func ExtractLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevicesResult) SumRunWithGaps[btrfsvol.LogicalAddr] {
- var records []btrfsinspect.SysExtentCSum
+func ExtractLogicalSums(ctx context.Context, scanResults ScanDevicesResult) SumRunWithGaps[btrfsvol.LogicalAddr] {
+ var records []SysExtentCSum
for _, devResults := range scanResults {
records = append(records, devResults.FoundExtentCSums...)
}
@@ -53,10 +52,10 @@ func ExtractLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevice
// "AAAAAAA" shouldn't be present, and if we just discard "BBBBBBBB"
// because it conflicts with "CCCCCCC", then we would erroneously
// include "AAAAAAA".
- addrspace := new(containers.RBTree[btrfsinspect.SysExtentCSum])
+ addrspace := new(containers.RBTree[SysExtentCSum])
for _, newRecord := range records {
for {
- conflict := addrspace.Search(func(oldRecord btrfsinspect.SysExtentCSum) int {
+ conflict := addrspace.Search(func(oldRecord SysExtentCSum) int {
switch {
case newRecord.Sums.Addr.Add(newRecord.Sums.Size()) <= oldRecord.Sums.Addr:
// 'newRecord' is wholly to the left of 'oldRecord'.
@@ -128,7 +127,7 @@ func ExtractLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevice
case newRecord.Sums.Addr.Add(newRecord.Sums.Size()) > overlapEnd:
suffix = newRecord.Sums.Sums[newOverlapEnd:]
}
- unionRecord := btrfsinspect.SysExtentCSum{
+ unionRecord := SysExtentCSum{
Generation: oldRecord.Generation,
Sums: btrfsitem.ExtentCSum{
SumRun: btrfssum.SumRun[btrfsvol.LogicalAddr]{
@@ -148,7 +147,7 @@ func ExtractLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevice
var flattened SumRunWithGaps[btrfsvol.LogicalAddr]
var curAddr btrfsvol.LogicalAddr
var curSums strings.Builder
- addrspace.Range(func(node *containers.RBNode[btrfsinspect.SysExtentCSum]) bool {
+ addrspace.Range(func(node *containers.RBNode[SysExtentCSum]) bool {
curEnd := curAddr + (btrfsvol.LogicalAddr(curSums.Len()/sumSize) * btrfssum.BlockSize)
if node.Value.Sums.Addr != curEnd {
if curSums.Len() > 0 {
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/physicalsums.go b/cmd/btrfs-rec/inspect/rebuildmappings/process_sums_physical.go
index da22fbf..392ded9 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/physicalsums.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/process_sums_physical.go
@@ -13,11 +13,10 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
)
-func ExtractPhysicalSums(scanResults btrfsinspect.ScanDevicesResult) map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr] {
+func ExtractPhysicalSums(scanResults ScanDevicesResult) map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr] {
ret := make(map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr], len(scanResults))
for devID, devResults := range scanResults {
ret[devID] = devResults.Checksums
diff --git a/lib/btrfsprogs/btrfsinspect/scandevices.go b/cmd/btrfs-rec/inspect/rebuildmappings/scan.go
index d54be71..2128a48 100644
--- a/lib/btrfsprogs/btrfsinspect/scandevices.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/scan.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrfsinspect
+package rebuildmappings
import (
"context"
@@ -110,7 +110,7 @@ var sbSize = btrfsvol.PhysicalAddr(binstruct.StaticSize(btrfstree.Superblock{}))
// ScanOneDevice mostly mimics btrfs-progs
// cmds/rescue-chunk-recover.c:scan_one_device().
func ScanOneDevice(ctx context.Context, dev *btrfs.Device, sb btrfstree.Superblock) (ScanOneDeviceResult, error) {
- ctx = dlog.WithField(ctx, "btrfsinspect.scandevices.dev", dev.Name())
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-mappings.scan.dev", dev.Name())
result := ScanOneDeviceResult{
FoundNodes: make(map[btrfsvol.LogicalAddr][]btrfsvol.PhysicalAddr),
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/sumrunwithgaps.go b/cmd/btrfs-rec/inspect/rebuildmappings/sumrunwithgaps.go
index f79e2be..f79e2be 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/sumrunwithgaps.go
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/sumrunwithgaps.go
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d
index 9d14adf..9d14adf 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/593a5dd328ee86bac6820e3f98383aebadd2af3a22aa248546a228b08451c30d
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600 b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600
index 269f061..269f061 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/6bd9babbebf7eb78814e1f3425bfa6ccd6bfd42824a26e8cbd63b5117934e600
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60 b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60
index b8f1562..b8f1562 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/84ed65595ad05a58e293dbf423c1a816b697e2763a29d7c37aa476d6eef6fd60
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738 b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738
index be67506..be67506 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/9be40f71bc49b1b5c3b8e08d58d0f69cc22aefb12fd9b5931e49ff0e41953738
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d
index c3bfa37..c3bfa37 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d
+++ b/cmd/btrfs-rec/inspect/rebuildmappings/testdata/fuzz/FuzzIndexAll/e43317ec61b0da9627d7b2fc0237d369082a6bf5dfe39e05c113b42ff6218d5d
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild.go
index cf334a0..bbfcdde 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"context"
@@ -14,15 +14,14 @@ import (
"github.com/datawire/dlib/dgroup"
"github.com/datawire/dlib/dlog"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"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/btrfsprogs/btrfsinspect"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfscheck"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
@@ -46,10 +45,10 @@ func (o keyAndTree) String() string {
type rebuilder struct {
sb btrfstree.Superblock
- graph graph.Graph
- keyIO *keyio.Handle
+ graph btrfsutil.Graph
+ keyIO *btrfsutil.KeyIO
- rebuilt *btrees.RebuiltForrest
+ rebuilt *btrfsutil.RebuiltForrest
curKey struct {
TreeID btrfsprim.ObjID
@@ -75,8 +74,8 @@ type Rebuilder interface {
ListRoots(context.Context) map[btrfsprim.ObjID]containers.Set[btrfsvol.LogicalAddr]
}
-func NewRebuilder(ctx context.Context, fs *btrfs.FS, nodeScanResults btrfsinspect.ScanDevicesResult) (Rebuilder, error) {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.step", "read-fs-data")
+func NewRebuilder(ctx context.Context, fs *btrfs.FS, nodeScanResults rebuildmappings.ScanDevicesResult) (Rebuilder, error) {
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.step", "read-fs-data")
sb, nodeGraph, keyIO, err := ScanDevices(ctx, fs, nodeScanResults) // ScanDevices does its own logging
if err != nil {
return nil, err
@@ -87,7 +86,7 @@ func NewRebuilder(ctx context.Context, fs *btrfs.FS, nodeScanResults btrfsinspec
graph: nodeGraph,
keyIO: keyIO,
}
- o.rebuilt = btrees.NewRebuiltForrest(sb, nodeGraph, keyIO, o)
+ o.rebuilt = btrfsutil.NewRebuiltForrest(sb, nodeGraph, keyIO, o)
return o, nil
}
@@ -96,7 +95,7 @@ func (o *rebuilder) ListRoots(ctx context.Context) map[btrfsprim.ObjID]container
}
func (o *rebuilder) Rebuild(ctx context.Context) error {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.step", "rebuild")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.step", "rebuild")
// Initialize
o.retryItemQueue = make(map[btrfsprim.ObjID]containers.Set[keyAndTree])
@@ -114,7 +113,7 @@ func (o *rebuilder) Rebuild(ctx context.Context) error {
// Run
for passNum := 0; len(o.treeQueue) > 0 || len(o.addedItemQueue) > 0 || len(o.settledItemQueue) > 0 || len(o.augmentQueue) > 0; passNum++ {
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.pass", passNum)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.pass", passNum)
// Crawl trees (Drain o.treeQueue, fill o.addedItemQueue).
if err := o.processTreeQueue(ctx); err != nil {
@@ -147,7 +146,7 @@ func (o *rebuilder) Rebuild(ctx context.Context) error {
// processTreeQueue drains o.treeQueue, filling o.addedItemQueue.
func (o *rebuilder) processTreeQueue(ctx context.Context) error {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep", "collect-items")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep", "collect-items")
queue := maps.SortedKeys(o.treeQueue)
o.treeQueue = make(containers.Set[btrfsprim.ObjID])
@@ -181,7 +180,7 @@ func (s settleItemStats) String() string {
// processAddedItemQueue drains o.addedItemQueue, filling o.augmentQueue and o.settledItemQueue.
func (o *rebuilder) processAddedItemQueue(ctx context.Context) error {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep", "settle-items")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep", "settle-items")
queue := maps.Keys(o.addedItemQueue)
o.addedItemQueue = make(containers.Set[keyAndTree])
@@ -192,13 +191,13 @@ func (o *rebuilder) processAddedItemQueue(ctx context.Context) error {
var progress settleItemStats
progress.D = len(queue)
progressWriter := textui.NewProgress[settleItemStats](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep.progress", &progress)
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep.progress", &progress)
for i, key := range queue {
progress.N = i
progressWriter.Set(progress)
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.settle.item", key)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.settle.item", key)
tree := o.rebuilt.Tree(ctx, key.TreeID)
incPtr, ok := tree.Items(ctx).Load(key.Key)
if !ok {
@@ -214,7 +213,7 @@ func (o *rebuilder) processAddedItemQueue(ctx context.Context) error {
progress.NumAugments = o.numAugments
progress.NumAugmentTrees = len(o.augmentQueue)
progressWriter.Set(progress)
- } else if !handleWouldBeNoOp(key.ItemType) {
+ } else if !btrfscheck.HandleItemWouldBeNoOp(key.ItemType) {
o.settledItemQueue.Insert(key)
}
}
@@ -240,7 +239,7 @@ func (s processItemStats) String() string {
// processSettledItemQueue drains o.settledItemQueue, filling o.augmentQueue and o.treeQueue.
func (o *rebuilder) processSettledItemQueue(ctx context.Context) error {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep", "process-items")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep", "process-items")
queue := maps.Keys(o.settledItemQueue)
o.settledItemQueue = make(containers.Set[keyAndTree])
@@ -251,7 +250,7 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error {
var progress processItemStats
progress.D = len(queue)
progressWriter := textui.NewProgress[processItemStats](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep.progress", &progress)
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep.progress", &progress)
type keyAndBody struct {
keyAndTree
@@ -265,7 +264,7 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error {
if err := ctx.Err(); err != nil {
return err
}
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.process.item", key)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.process.item", key)
item := keyAndBody{
keyAndTree: key,
Body: o.rebuilt.Tree(ctx, key.TreeID).ReadItem(ctx, key.Key),
@@ -281,10 +280,10 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error {
defer progressWriter.Done()
o.curKey.Key.OK = true
for item := range itemChan {
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.process.item", item.keyAndTree)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.process.item", item.keyAndTree)
o.curKey.TreeID = item.TreeID
o.curKey.Key.Val = item.Key
- handleItem(o, ctx, item.TreeID, btrfstree.Item{
+ btrfscheck.HandleItem(o, ctx, item.TreeID, btrfstree.Item{
Key: item.Key,
Body: item.Body,
})
@@ -305,7 +304,7 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error {
// processAugmentQueue drains o.augmentQueue (and maybe o.retryItemQueue), filling o.addedItemQueue.
func (o *rebuilder) processAugmentQueue(ctx context.Context) error {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep", "apply-augments")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep", "apply-augments")
resolvedAugments := make(map[btrfsprim.ObjID]containers.Set[btrfsvol.LogicalAddr], len(o.augmentQueue))
var progress textui.Portion[int]
@@ -313,7 +312,7 @@ func (o *rebuilder) processAugmentQueue(ctx context.Context) error {
if err := ctx.Err(); err != nil {
return err
}
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.augment.tree", treeID)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.augment.tree", treeID)
resolvedAugments[treeID] = o.resolveTreeAugments(ctx, treeID)
progress.D += len(resolvedAugments[treeID])
}
@@ -323,9 +322,9 @@ func (o *rebuilder) processAugmentQueue(ctx context.Context) error {
runtime.GC()
progressWriter := textui.NewProgress[textui.Portion[int]](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep.progress", &progress)
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.substep.progress", &progress)
for _, treeID := range maps.SortedKeys(resolvedAugments) {
- ctx := dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.augment.tree", treeID)
+ ctx := dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.rebuild.augment.tree", treeID)
for _, nodeAddr := range maps.SortedKeys(resolvedAugments[treeID]) {
if err := ctx.Err(); err != nil {
progressWriter.Set(progress)
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_treecb.go b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_treecb.go
index 492436b..e6a0777 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_treecb.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_treecb.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"context"
@@ -13,7 +13,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
)
-// AddedItem implements btrees.Callbacks.
+// AddedItem implements btrfsutil.RebuiltForrestCallbacks.
func (o *rebuilder) AddedItem(ctx context.Context, tree btrfsprim.ObjID, key btrfsprim.Key) {
o.addedItemQueue.Insert(keyAndTree{
TreeID: tree,
@@ -21,14 +21,14 @@ func (o *rebuilder) AddedItem(ctx context.Context, tree btrfsprim.ObjID, key btr
})
}
-// AddedRoot implements btrees.Callbacks.
+// AddedRoot implements btrfsutil.RebuiltForrestCallbacks.
func (o *rebuilder) AddedRoot(ctx context.Context, tree btrfsprim.ObjID, root btrfsvol.LogicalAddr) {
if retries := o.retryItemQueue[tree]; retries != nil {
o.addedItemQueue.InsertFrom(retries)
}
}
-// LookupRoot implements btrees.Callbacks.
+// LookupRoot implements btrfsutil.RebuiltForrestCallbacks.
func (o *rebuilder) LookupRoot(ctx context.Context, tree btrfsprim.ObjID) (offset btrfsprim.Generation, item btrfsitem.Root, ok bool) {
wantKey := WantWithTree{
TreeID: btrfsprim.ROOT_TREE_OBJECTID,
@@ -50,7 +50,7 @@ func (o *rebuilder) LookupRoot(ctx context.Context, tree btrfsprim.ObjID) (offse
case *btrfsitem.Root:
return btrfsprim.Generation(foundKey.Offset), *itemBody, true
case *btrfsitem.Error:
- o.fsErr(ctx, fmt.Errorf("error decoding item: %v: %w", foundKey, itemBody.Err))
+ o.FSErr(ctx, fmt.Errorf("error decoding item: %v: %w", foundKey, itemBody.Err))
return 0, btrfsitem.Root{}, false
default:
// This is a panic because the item decoder should not emit ROOT_ITEM items as anything but
@@ -59,7 +59,7 @@ func (o *rebuilder) LookupRoot(ctx context.Context, tree btrfsprim.ObjID) (offse
}
}
-// LookupUUID implements btrees.Callbacks.
+// LookupUUID implements btrfsutil.RebuiltForrestCallbacks.
func (o *rebuilder) LookupUUID(ctx context.Context, uuid btrfsprim.UUID) (id btrfsprim.ObjID, ok bool) {
wantKey := WantWithTree{
TreeID: btrfsprim.UUID_TREE_OBJECTID,
@@ -76,7 +76,7 @@ func (o *rebuilder) LookupUUID(ctx context.Context, uuid btrfsprim.UUID) (id btr
case *btrfsitem.UUIDMap:
return itemBody.ObjID, true
case *btrfsitem.Error:
- o.fsErr(ctx, fmt.Errorf("error decoding item: %v: %w", wantKey, itemBody.Err))
+ o.FSErr(ctx, fmt.Errorf("error decoding item: %v: %w", wantKey, itemBody.Err))
return 0, false
default:
// This is a panic because the item decoder should not emit UUID_SUBVOL items as anything but
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wantcb.go b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wantcb.go
index adf3cff..4a5029e 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wantcb.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wantcb.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"bytes"
@@ -15,17 +15,17 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
)
-// fsErr implements rebuildCallbacks.
-func (o *rebuilder) fsErr(ctx context.Context, e error) {
+// FSErr implements btrfscheck.GraphCallbacks.
+func (o *rebuilder) FSErr(ctx context.Context, e error) {
dlog.Errorf(ctx, "filesystem error: %v", e)
}
-// want implements rebuildCallbacks.
-func (o *rebuilder) want(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType) {
+// Want implements btrfscheck.GraphCallbacks.
+func (o *rebuilder) Want(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType) {
wantKey := WantWithTree{
TreeID: treeID,
Key: Want{
@@ -47,7 +47,7 @@ func (o *rebuilder) _want(ctx context.Context, wantKey WantWithTree) (key btrfsp
// check if we already have it
tgt := wantKey.Key.Key()
- if key, _, ok := o.rebuilt.Tree(ctx, wantKey.TreeID).Items(ctx).Search(func(key btrfsprim.Key, _ keyio.ItemPtr) int {
+ if key, _, ok := o.rebuilt.Tree(ctx, wantKey.TreeID).Items(ctx).Search(func(key btrfsprim.Key, _ btrfsutil.ItemPtr) int {
key.Offset = 0
return tgt.Compare(key)
}); ok {
@@ -61,11 +61,11 @@ func (o *rebuilder) _want(ctx context.Context, wantKey WantWithTree) (key btrfsp
}
wants := make(containers.Set[btrfsvol.LogicalAddr])
o.rebuilt.Tree(ctx, wantKey.TreeID).PotentialItems(ctx).Subrange(
- func(k btrfsprim.Key, _ keyio.ItemPtr) int {
+ func(k btrfsprim.Key, _ btrfsutil.ItemPtr) int {
k.Offset = 0
return tgt.Compare(k)
},
- func(_ btrfsprim.Key, v keyio.ItemPtr) bool {
+ func(_ btrfsprim.Key, v btrfsutil.ItemPtr) bool {
wants.InsertFrom(o.rebuilt.Tree(ctx, wantKey.TreeID).LeafToRoots(ctx, v.Node))
return true
})
@@ -73,8 +73,8 @@ func (o *rebuilder) _want(ctx context.Context, wantKey WantWithTree) (key btrfsp
return btrfsprim.Key{}, false
}
-// wantOff implements rebuildCallbacks.
-func (o *rebuilder) wantOff(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, off uint64) {
+// WantOff implements btrfscheck.GraphCallbacks.
+func (o *rebuilder) WantOff(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, off uint64) {
wantKey := WantWithTree{
TreeID: treeID,
Key: Want{
@@ -108,8 +108,8 @@ func (o *rebuilder) _wantOff(ctx context.Context, wantKey WantWithTree) (ok bool
}
wants := make(containers.Set[btrfsvol.LogicalAddr])
o.rebuilt.Tree(ctx, wantKey.TreeID).PotentialItems(ctx).Subrange(
- func(k btrfsprim.Key, _ keyio.ItemPtr) int { return tgt.Compare(k) },
- func(_ btrfsprim.Key, v keyio.ItemPtr) bool {
+ func(k btrfsprim.Key, _ btrfsutil.ItemPtr) int { return tgt.Compare(k) },
+ func(_ btrfsprim.Key, v btrfsutil.ItemPtr) bool {
wants.InsertFrom(o.rebuilt.Tree(ctx, wantKey.TreeID).LeafToRoots(ctx, v.Node))
return true
})
@@ -117,8 +117,8 @@ func (o *rebuilder) _wantOff(ctx context.Context, wantKey WantWithTree) (ok bool
return false
}
-// wantDirIndex implements rebuildCallbacks.
-func (o *rebuilder) wantDirIndex(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, name []byte) {
+// WantDirIndex implements btrfscheck.GraphCallbacks.
+func (o *rebuilder) WantDirIndex(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, name []byte) {
wantKey := WantWithTree{
TreeID: treeID,
Key: Want{
@@ -140,11 +140,11 @@ func (o *rebuilder) wantDirIndex(ctx context.Context, reason string, treeID btrf
tgt := wantKey.Key.Key()
found := false
o.rebuilt.Tree(ctx, treeID).Items(ctx).Subrange(
- func(key btrfsprim.Key, _ keyio.ItemPtr) int {
+ func(key btrfsprim.Key, _ btrfsutil.ItemPtr) int {
key.Offset = 0
return tgt.Compare(key)
},
- func(_ btrfsprim.Key, ptr keyio.ItemPtr) bool {
+ func(_ btrfsprim.Key, ptr btrfsutil.ItemPtr) bool {
if itemName, ok := o.keyIO.Names[ptr]; ok && bytes.Equal(itemName, name) {
found = true
}
@@ -161,11 +161,11 @@ func (o *rebuilder) wantDirIndex(ctx context.Context, reason string, treeID btrf
}
wants := make(containers.Set[btrfsvol.LogicalAddr])
o.rebuilt.Tree(ctx, treeID).PotentialItems(ctx).Subrange(
- func(key btrfsprim.Key, _ keyio.ItemPtr) int {
+ func(key btrfsprim.Key, _ btrfsutil.ItemPtr) int {
key.Offset = 0
return tgt.Compare(key)
},
- func(_ btrfsprim.Key, ptr keyio.ItemPtr) bool {
+ func(_ btrfsprim.Key, ptr btrfsutil.ItemPtr) bool {
if itemName, ok := o.keyIO.Names[ptr]; ok && bytes.Equal(itemName, name) {
wants.InsertFrom(o.rebuilt.Tree(ctx, treeID).LeafToRoots(ctx, ptr.Node))
}
@@ -176,10 +176,10 @@ func (o *rebuilder) wantDirIndex(ctx context.Context, reason string, treeID btrf
func (o *rebuilder) _walkRange(
ctx context.Context,
- items *containers.SortedMap[btrfsprim.Key, keyio.ItemPtr],
+ items *containers.SortedMap[btrfsprim.Key, btrfsutil.ItemPtr],
treeID, objID btrfsprim.ObjID, typ btrfsprim.ItemType,
beg, end uint64,
- fn func(key btrfsprim.Key, ptr keyio.ItemPtr, beg, end uint64),
+ fn func(key btrfsprim.Key, ptr btrfsutil.ItemPtr, beg, end uint64),
) {
min := btrfsprim.Key{
ObjectID: objID,
@@ -192,7 +192,7 @@ func (o *rebuilder) _walkRange(
Offset: end - 1,
}
items.Subrange(
- func(runKey btrfsprim.Key, _ keyio.ItemPtr) int {
+ func(runKey btrfsprim.Key, _ btrfsutil.ItemPtr) int {
switch {
case min.Compare(runKey) < 0:
return 1
@@ -202,14 +202,14 @@ func (o *rebuilder) _walkRange(
return 0
}
},
- func(runKey btrfsprim.Key, runPtr keyio.ItemPtr) bool {
+ func(runKey btrfsprim.Key, runPtr btrfsutil.ItemPtr) bool {
runSizeAndErr, ok := o.keyIO.Sizes[runPtr]
if !ok {
panic(fmt.Errorf("should not happen: %v (%v) did not have a size recorded",
runPtr, keyAndTree{TreeID: treeID, Key: runKey}))
}
if runSizeAndErr.Err != nil {
- o.fsErr(ctx, fmt.Errorf("get size: %v (%v): %w",
+ o.FSErr(ctx, fmt.Errorf("get size: %v (%v): %w",
runPtr, keyAndTree{TreeID: treeID, Key: runKey},
runSizeAndErr.Err))
return true
@@ -273,7 +273,7 @@ func (o *rebuilder) _wantRange(
ctx,
o.rebuilt.Tree(ctx, treeID).Items(ctx),
treeID, objID, typ, beg, end,
- func(runKey btrfsprim.Key, _ keyio.ItemPtr, runBeg, runEnd uint64) {
+ func(runKey btrfsprim.Key, _ btrfsutil.ItemPtr, runBeg, runEnd uint64) {
var overlappingGaps []*containers.RBNode[gap]
gaps.Subrange(
func(gap gap) int {
@@ -324,7 +324,7 @@ func (o *rebuilder) _wantRange(
ctx,
potentialItems,
treeID, objID, typ, gap.Beg, gap.End,
- func(k btrfsprim.Key, v keyio.ItemPtr, runBeg, runEnd uint64) {
+ func(k btrfsprim.Key, v btrfsutil.ItemPtr, runBeg, runEnd uint64) {
// TODO: This is dumb and greedy.
if last < runBeg {
// log an error
@@ -350,10 +350,10 @@ func (o *rebuilder) _wantRange(
})
}
-// func implements rebuildCallbacks.
+// WantCSum implements btrfscheck.GraphCallbacks.
//
// interval is [beg, end)
-func (o *rebuilder) wantCSum(ctx context.Context, reason string, inodeTree, inode btrfsprim.ObjID, beg, end btrfsvol.LogicalAddr) {
+func (o *rebuilder) WantCSum(ctx context.Context, reason string, inodeTree, inode btrfsprim.ObjID, beg, end btrfsvol.LogicalAddr) {
inodeWant := WantWithTree{
TreeID: inodeTree,
Key: Want{
@@ -377,7 +377,7 @@ func (o *rebuilder) wantCSum(ctx context.Context, reason string, inodeTree, inod
panic(fmt.Errorf("should not happen: INODE_ITEM did not have flags recorded"))
}
if inodeFlags.Err != nil {
- o.fsErr(inodeCtx, inodeFlags.Err)
+ o.FSErr(inodeCtx, inodeFlags.Err)
return
}
@@ -391,8 +391,8 @@ func (o *rebuilder) wantCSum(ctx context.Context, reason string, inodeTree, inod
uint64(roundDown(beg, btrfssum.BlockSize)), uint64(roundUp(end, btrfssum.BlockSize)))
}
-// wantFileExt implements rebuildCallbacks.
-func (o *rebuilder) wantFileExt(ctx context.Context, reason string, treeID btrfsprim.ObjID, ino btrfsprim.ObjID, size int64) {
+// WantFileExt implements btrfscheck.GraphCallbacks.
+func (o *rebuilder) WantFileExt(ctx context.Context, reason string, treeID btrfsprim.ObjID, ino btrfsprim.ObjID, size int64) {
o._wantRange(
ctx, reason,
treeID, ino, btrfsprim.EXTENT_DATA_KEY,
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wanttyp.go b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wanttyp.go
index 2b471fe..a517579 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_wanttyp.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/rebuild_wanttyp.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"context"
@@ -96,8 +96,8 @@ func (o WantWithTree) String() string {
}
const (
- logFieldItemWant = "btrfsinspect.rebuild-nodes.rebuild.want"
- logFieldTreeWant = "btrfsinspect.rebuild-nodes.rebuild.add-tree.want"
+ logFieldItemWant = "btrfs.inspect.rebuild-trees.rebuild.want"
+ logFieldTreeWant = "btrfs.util.rebuilt-forrest.add-tree.want"
)
func withWant(ctx context.Context, logField, reason string, wantKey WantWithTree) context.Context {
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go b/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
index 17949ab..2995a2e 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"context"
@@ -10,22 +10,21 @@ import (
"github.com/datawire/dlib/dlog"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
"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/btrfsprogs/btrfsinspect"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
-func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) (btrfstree.Superblock, graph.Graph, *keyio.Handle, error) {
+func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults rebuildmappings.ScanDevicesResult) (btrfstree.Superblock, btrfsutil.Graph, *btrfsutil.KeyIO, error) {
dlog.Info(ctx, "Reading superblock...")
sb, err := fs.Superblock()
if err != nil {
- return btrfstree.Superblock{}, graph.Graph{}, nil, err
+ return btrfstree.Superblock{}, btrfsutil.Graph{}, nil, err
}
dlog.Infof(ctx, "Reading node data from FS...")
@@ -33,24 +32,24 @@ func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sca
var stats textui.Portion[int]
stats.D = countNodes(scanResults)
progressWriter := textui.NewProgress[textui.Portion[int]](
- dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.read.substep", "read-nodes"),
+ dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.read.substep", "read-nodes"),
dlog.LogLevelInfo, textui.Tunable(1*time.Second))
- nodeGraph := graph.New(*sb)
- keyIO := keyio.NewHandle(fs, *sb)
+ nodeGraph := btrfsutil.NewGraph(*sb)
+ keyIO := btrfsutil.NewKeyIO(fs, *sb)
progressWriter.Set(stats)
for _, devResults := range scanResults {
for _, laddr := range maps.SortedKeys(devResults.FoundNodes) {
if err := ctx.Err(); err != nil {
- return btrfstree.Superblock{}, graph.Graph{}, nil, err
+ return btrfstree.Superblock{}, btrfsutil.Graph{}, nil, err
}
nodeRef, err := btrfstree.ReadNode[btrfsvol.LogicalAddr](fs, *sb, laddr, btrfstree.NodeExpectations{
LAddr: containers.Optional[btrfsvol.LogicalAddr]{OK: true, Val: laddr},
})
if err != nil {
btrfstree.FreeNodeRef(nodeRef)
- return btrfstree.Superblock{}, graph.Graph{}, nil, err
+ return btrfstree.Superblock{}, btrfsutil.Graph{}, nil, err
}
nodeGraph.InsertNode(nodeRef)
@@ -68,8 +67,9 @@ func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sca
progressWriter.Done()
dlog.Info(ctx, "... done reading node data")
+ ctx = dlog.WithField(ctx, "btrfs.inspect.rebuild-trees.read.substep", "check")
if err := nodeGraph.FinalCheck(ctx, fs, *sb); err != nil {
- return btrfstree.Superblock{}, graph.Graph{}, nil, err
+ return btrfstree.Superblock{}, btrfsutil.Graph{}, nil, err
}
keyIO.SetGraph(*nodeGraph)
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/util.go b/cmd/btrfs-rec/inspect/rebuildtrees/util.go
index 9d91f23..71caee0 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/util.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/util.go
@@ -1,16 +1,16 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package rebuildtrees
import (
"golang.org/x/exp/constraints"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
)
-func countNodes(nodeScanResults btrfsinspect.ScanDevicesResult) int {
+func countNodes(nodeScanResults rebuildmappings.ScanDevicesResult) int {
var cnt int
for _, devResults := range nodeScanResults {
cnt += len(devResults.FoundNodes)
diff --git a/cmd/btrfs-rec/inspect_dumptrees.go b/cmd/btrfs-rec/inspect_dumptrees.go
index 4dc4bb2..efdc380 100644
--- a/cmd/btrfs-rec/inspect_dumptrees.go
+++ b/cmd/btrfs-rec/inspect_dumptrees.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -10,8 +10,8 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/dumptrees"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
@@ -26,7 +26,7 @@ func init() {
const version = "6.1.3"
out := os.Stdout
textui.Fprintf(out, "btrfs-progs v%v\n", version)
- btrfsinspect.DumpTrees(cmd.Context(), out, fs)
+ dumptrees.DumpTrees(cmd.Context(), out, fs)
return nil
},
})
diff --git a/cmd/btrfs-rec/inspect_lsfiles.go b/cmd/btrfs-rec/inspect_lsfiles.go
index 7ecaaf0..4f985ff 100644
--- a/cmd/btrfs-rec/inspect_lsfiles.go
+++ b/cmd/btrfs-rec/inspect_lsfiles.go
@@ -20,7 +20,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
@@ -48,7 +48,7 @@ func init() {
ctx := cmd.Context()
printSubvol(out, "", true, "/", &btrfs.Subvolume{
- FS: btrfsutil.NewBrokenTrees(ctx, fs),
+ FS: btrfsutil.NewOldRebuiltForrest(ctx, fs),
TreeID: btrfsprim.FS_TREE_OBJECTID,
})
diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go
index 69295f0..df2473c 100644
--- a/cmd/btrfs-rec/inspect_lstrees.go
+++ b/cmd/btrfs-rec/inspect_lstrees.go
@@ -12,13 +12,13 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"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/btrfsprogs/btrfsinspect"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
@@ -36,10 +36,10 @@ func init() {
},
RunE: func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error {
ctx := cmd.Context()
- var scanResults btrfsinspect.ScanDevicesResult
+ var scanResults rebuildmappings.ScanDevicesResult
if scandevicesFilename != "" {
var err error
- scanResults, err = readJSONFile[btrfsinspect.ScanDevicesResult](ctx, scandevicesFilename)
+ scanResults, err = readJSONFile[rebuildmappings.ScanDevicesResult](ctx, scandevicesFilename)
if err != nil {
return err
}
diff --git a/cmd/btrfs-rec/inspect_mount.go b/cmd/btrfs-rec/inspect_mount.go
index cff33b6..f3fda34 100644
--- a/cmd/btrfs-rec/inspect_mount.go
+++ b/cmd/btrfs-rec/inspect_mount.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -8,8 +8,8 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/mount"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
)
func init() {
@@ -21,7 +21,7 @@ func init() {
Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)),
},
RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error {
- return btrfsinspect.MountRO(cmd.Context(), fs, args[0], skipFileSums)
+ return mount.MountRO(cmd.Context(), fs, args[0], skipFileSums)
},
}
cmd.Command.Flags().BoolVar(&skipFileSums, "skip-filesums", false,
diff --git a/cmd/btrfs-rec/inspect_rebuildmappings.go b/cmd/btrfs-rec/inspect_rebuildmappings.go
index 51f0327..005fd5d 100644
--- a/cmd/btrfs-rec/inspect_rebuildmappings.go
+++ b/cmd/btrfs-rec/inspect_rebuildmappings.go
@@ -12,9 +12,8 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildmappings"
)
func init() {
@@ -36,7 +35,7 @@ func init() {
ctx := cmd.Context()
dlog.Infof(ctx, "Reading %q...", args[0])
- scanResults, err := readJSONFile[btrfsinspect.ScanDevicesResult](ctx, args[0])
+ scanResults, err := readJSONFile[rebuildmappings.ScanDevicesResult](ctx, args[0])
if err != nil {
return err
}
diff --git a/cmd/btrfs-rec/inspect_rebuildnodes.go b/cmd/btrfs-rec/inspect_rebuildtrees.go
index ba1dcab..0b41dd9 100644
--- a/cmd/btrfs-rec/inspect_rebuildnodes.go
+++ b/cmd/btrfs-rec/inspect_rebuildtrees.go
@@ -15,9 +15,9 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildtrees"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
@@ -32,15 +32,15 @@ func init() {
// This is wrapped in a func in order to *ensure* that `nodeScanResults` goes out of scope once
// `rebuilder` has been created.
- rebuilder, err := func(ctx context.Context) (rebuildnodes.Rebuilder, error) {
+ rebuilder, err := func(ctx context.Context) (rebuildtrees.Rebuilder, error) {
dlog.Infof(ctx, "Reading %q...", args[0])
- nodeScanResults, err := readJSONFile[btrfsinspect.ScanDevicesResult](ctx, args[0])
+ nodeScanResults, err := readJSONFile[rebuildmappings.ScanDevicesResult](ctx, args[0])
if err != nil {
return nil, err
}
dlog.Infof(ctx, "... done reading %q", args[0])
- return rebuildnodes.NewRebuilder(ctx, fs, nodeScanResults)
+ return rebuildtrees.NewRebuilder(ctx, fs, nodeScanResults)
}(ctx)
if err != nil {
return err
diff --git a/cmd/btrfs-rec/inspect_scandevices.go b/cmd/btrfs-rec/inspect_scandevices.go
index 3de35d0..0542d6a 100644
--- a/cmd/btrfs-rec/inspect_scandevices.go
+++ b/cmd/btrfs-rec/inspect_scandevices.go
@@ -12,8 +12,8 @@ import (
"github.com/datawire/ocibuild/pkg/cliutil"
"github.com/spf13/cobra"
+ "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
)
func init() {
@@ -25,7 +25,7 @@ func init() {
RunE: func(fs *btrfs.FS, cmd *cobra.Command, _ []string) (err error) {
ctx := cmd.Context()
- results, err := btrfsinspect.ScanDevices(ctx, fs)
+ results, err := rebuildmappings.ScanDevices(ctx, fs)
if err != nil {
return err
}
diff --git a/cmd/btrfs-rec/inspect_spewitems.go b/cmd/btrfs-rec/inspect_spewitems.go
index 3b79e8b..4abb2b0 100644
--- a/cmd/btrfs-rec/inspect_spewitems.go
+++ b/cmd/btrfs-rec/inspect_spewitems.go
@@ -14,7 +14,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
diff --git a/cmd/btrfs-rec/main.go b/cmd/btrfs-rec/main.go
index dc00dab..bf89fbc 100644
--- a/cmd/btrfs-rec/main.go
+++ b/cmd/btrfs-rec/main.go
@@ -15,7 +15,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil"
"git.lukeshu.com/btrfs-progs-ng/lib/profile"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
diff --git a/lib/btrfs/btrfstree/root.go b/lib/btrfs/btrfstree/btree_forrest.go
index ace2b49..ace2b49 100644
--- a/lib/btrfs/btrfstree/root.go
+++ b/lib/btrfs/btrfstree/btree_forrest.go
diff --git a/lib/btrfs/btrfstree/ops.go b/lib/btrfs/btrfstree/btree_tree.go
index b01312f..b01312f 100644
--- a/lib/btrfs/btrfstree/ops.go
+++ b/lib/btrfs/btrfstree/btree_tree.go
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go b/lib/btrfscheck/graph.go
index 710030c..ea51818 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go
+++ b/lib/btrfscheck/graph.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package rebuildnodes
+package btrfscheck
import (
"context"
@@ -14,18 +14,18 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
)
-type rebuildCallbacks interface {
- fsErr(ctx context.Context, e error)
- want(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType)
- wantOff(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, off uint64)
- wantDirIndex(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, name []byte)
- wantCSum(ctx context.Context, reason string, inodeTree, inodeItem btrfsprim.ObjID, beg, end btrfsvol.LogicalAddr) // interval is [beg, end)
- wantFileExt(ctx context.Context, reason string, treeID btrfsprim.ObjID, ino btrfsprim.ObjID, size int64)
+type GraphCallbacks interface {
+ FSErr(ctx context.Context, e error)
+ Want(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType)
+ WantOff(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, off uint64)
+ WantDirIndex(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, name []byte)
+ WantCSum(ctx context.Context, reason string, inodeTree, inodeItem btrfsprim.ObjID, beg, end btrfsvol.LogicalAddr) // interval is [beg, end)
+ WantFileExt(ctx context.Context, reason string, treeID btrfsprim.ObjID, ino btrfsprim.ObjID, size int64)
}
-// handleWouldBeNoOp returns whether or not a call to handleItem for a
-// given item type would be a no-op.
-func handleWouldBeNoOp(typ btrfsprim.ItemType) bool {
+// HandleItemWouldBeNoOp returns whether or not a call to HandleItem
+// for a given item type would be a no-op.
+func HandleItemWouldBeNoOp(typ btrfsprim.ItemType) bool {
switch typ {
case // btrfsitem.Dev
btrfsprim.DEV_ITEM_KEY,
@@ -45,30 +45,30 @@ func handleWouldBeNoOp(typ btrfsprim.ItemType) bool {
}
}
-func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID, item btrfstree.Item) {
+func HandleItem(o GraphCallbacks, ctx context.Context, treeID btrfsprim.ObjID, item btrfstree.Item) {
// Notionally, just express the relationships shown in
// https://btrfs.wiki.kernel.org/index.php/File:References.png (from the page
// https://btrfs.wiki.kernel.org/index.php/Data_Structures )
switch body := item.Body.(type) {
case *btrfsitem.BlockGroup:
- o.want(ctx, "Chunk",
+ o.Want(ctx, "Chunk",
btrfsprim.CHUNK_TREE_OBJECTID,
body.ChunkObjectID,
btrfsitem.CHUNK_ITEM_KEY)
- o.wantOff(ctx, "FreeSpaceInfo",
+ o.WantOff(ctx, "FreeSpaceInfo",
btrfsprim.FREE_SPACE_TREE_OBJECTID,
item.Key.ObjectID,
btrfsitem.FREE_SPACE_INFO_KEY,
item.Key.Offset)
case *btrfsitem.Chunk:
- o.want(ctx, "owning Root",
+ o.Want(ctx, "owning Root",
btrfsprim.ROOT_TREE_OBJECTID,
body.Head.Owner,
btrfsitem.ROOT_ITEM_KEY)
case *btrfsitem.Dev:
// nothing
case *btrfsitem.DevExtent:
- o.wantOff(ctx, "Chunk",
+ o.WantOff(ctx, "Chunk",
body.ChunkTree,
body.ChunkObjectID,
btrfsitem.CHUNK_ITEM_KEY,
@@ -77,7 +77,7 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
// nothing
case *btrfsitem.DirEntry:
// containing-directory
- o.wantOff(ctx, "containing dir inode",
+ o.WantOff(ctx, "containing dir inode",
treeID,
item.Key.ObjectID,
btrfsitem.INODE_ITEM_KEY,
@@ -85,12 +85,12 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
// siblings
switch item.Key.ItemType {
case btrfsitem.DIR_ITEM_KEY:
- o.wantDirIndex(ctx, "corresponding DIR_INDEX",
+ o.WantDirIndex(ctx, "corresponding DIR_INDEX",
treeID,
item.Key.ObjectID,
body.Name)
case btrfsitem.DIR_INDEX_KEY:
- o.wantOff(ctx, "corresponding DIR_ITEM",
+ o.WantOff(ctx, "corresponding DIR_ITEM",
treeID,
item.Key.ObjectID,
btrfsitem.DIR_ITEM_KEY,
@@ -107,23 +107,23 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
if body.Location != (btrfsprim.Key{}) {
switch body.Location.ItemType {
case btrfsitem.INODE_ITEM_KEY:
- o.wantOff(ctx, "item being pointed to",
+ o.WantOff(ctx, "item being pointed to",
treeID,
body.Location.ObjectID,
body.Location.ItemType,
body.Location.Offset)
- o.wantOff(ctx, "backref from item being pointed to",
+ o.WantOff(ctx, "backref from item being pointed to",
treeID,
body.Location.ObjectID,
btrfsitem.INODE_REF_KEY,
uint64(item.Key.ObjectID))
case btrfsitem.ROOT_ITEM_KEY:
- o.want(ctx, "Root of subvolume being pointed to",
+ o.Want(ctx, "Root of subvolume being pointed to",
btrfsprim.ROOT_TREE_OBJECTID,
body.Location.ObjectID,
body.Location.ItemType)
default:
- o.fsErr(ctx, fmt.Errorf("DirEntry: unexpected .Location.ItemType=%v", body.Location.ItemType))
+ o.FSErr(ctx, fmt.Errorf("DirEntry: unexpected .Location.ItemType=%v", body.Location.ItemType))
}
}
case *btrfsitem.Empty:
@@ -141,12 +141,12 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
case nil:
// nothing
case *btrfsitem.ExtentDataRef:
- o.wantOff(ctx, "referencing Inode",
+ o.WantOff(ctx, "referencing Inode",
refBody.Root,
refBody.ObjectID,
btrfsitem.INODE_ITEM_KEY,
0)
- o.wantOff(ctx, "referencing FileExtent",
+ o.WantOff(ctx, "referencing FileExtent",
refBody.Root,
refBody.ObjectID,
btrfsitem.EXTENT_DATA_KEY,
@@ -162,22 +162,22 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
case *btrfsitem.ExtentCSum:
// nothing
case *btrfsitem.ExtentDataRef:
- o.want(ctx, "Extent being referenced",
+ o.Want(ctx, "Extent being referenced",
btrfsprim.EXTENT_TREE_OBJECTID,
item.Key.ObjectID,
btrfsitem.EXTENT_ITEM_KEY)
- o.wantOff(ctx, "referencing Inode",
+ o.WantOff(ctx, "referencing Inode",
body.Root,
body.ObjectID,
btrfsitem.INODE_ITEM_KEY,
0)
- o.wantOff(ctx, "referencing FileExtent",
+ o.WantOff(ctx, "referencing FileExtent",
body.Root,
body.ObjectID,
btrfsitem.EXTENT_DATA_KEY,
uint64(body.Offset))
case *btrfsitem.FileExtent:
- o.wantOff(ctx, "containing Inode",
+ o.WantOff(ctx, "containing Inode",
treeID,
item.Key.ObjectID,
btrfsitem.INODE_ITEM_KEY,
@@ -186,65 +186,65 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
case btrfsitem.FILE_EXTENT_INLINE:
// nothing
case btrfsitem.FILE_EXTENT_REG, btrfsitem.FILE_EXTENT_PREALLOC:
- // NB: o.wantCSum checks inodeBody.Flags.Has(btrfsitem.INODE_NODATASUM) for us.
- o.wantCSum(ctx, "data sum",
+ // NB: o.WantCSum checks inodeBody.Flags.Has(btrfsitem.INODE_NODATASUM) for us.
+ o.WantCSum(ctx, "data sum",
treeID, item.Key.ObjectID,
body.BodyExtent.DiskByteNr,
body.BodyExtent.DiskByteNr.Add(body.BodyExtent.DiskNumBytes))
default:
- o.fsErr(ctx, fmt.Errorf("FileExtent: unexpected body.Type=%v", body.Type))
+ o.FSErr(ctx, fmt.Errorf("FileExtent: unexpected body.Type=%v", body.Type))
}
case *btrfsitem.FreeSpaceBitmap:
- o.wantOff(ctx, "FreeSpaceInfo",
+ o.WantOff(ctx, "FreeSpaceInfo",
treeID,
item.Key.ObjectID,
btrfsitem.FREE_SPACE_INFO_KEY,
item.Key.Offset)
case *btrfsitem.FreeSpaceHeader:
- o.wantOff(ctx, ".Location",
+ o.WantOff(ctx, ".Location",
treeID,
body.Location.ObjectID,
body.Location.ItemType,
body.Location.Offset)
case *btrfsitem.FreeSpaceInfo:
if body.Flags.Has(btrfsitem.FREE_SPACE_USING_BITMAPS) {
- o.wantOff(ctx, "FreeSpaceBitmap",
+ o.WantOff(ctx, "FreeSpaceBitmap",
treeID,
item.Key.ObjectID,
btrfsitem.FREE_SPACE_BITMAP_KEY,
item.Key.Offset)
}
case *btrfsitem.Inode:
- o.want(ctx, "backrefs",
+ o.Want(ctx, "backrefs",
treeID, // TODO: validate the number of these against body.NLink
item.Key.ObjectID,
btrfsitem.INODE_REF_KEY)
- o.wantFileExt(ctx, "FileExtents",
+ o.WantFileExt(ctx, "FileExtents",
treeID, item.Key.ObjectID, body.Size)
if body.BlockGroup != 0 {
- o.want(ctx, "BlockGroup",
+ o.Want(ctx, "BlockGroup",
btrfsprim.EXTENT_TREE_OBJECTID,
body.BlockGroup,
btrfsitem.BLOCK_GROUP_ITEM_KEY)
}
case *btrfsitem.InodeRefs:
- o.wantOff(ctx, "child Inode",
+ o.WantOff(ctx, "child Inode",
treeID,
item.Key.ObjectID,
btrfsitem.INODE_ITEM_KEY,
0)
- o.wantOff(ctx, "parent Inode",
+ o.WantOff(ctx, "parent Inode",
treeID,
btrfsprim.ObjID(item.Key.Offset),
btrfsitem.INODE_ITEM_KEY,
0)
for _, ref := range body.Refs {
- o.wantOff(ctx, "DIR_ITEM",
+ o.WantOff(ctx, "DIR_ITEM",
treeID,
btrfsprim.ObjID(item.Key.Offset),
btrfsitem.DIR_ITEM_KEY,
btrfsitem.NameHash(ref.Name))
- o.wantOff(ctx, "DIR_INDEX",
+ o.WantOff(ctx, "DIR_INDEX",
treeID,
btrfsprim.ObjID(item.Key.Offset),
btrfsitem.DIR_INDEX_KEY,
@@ -256,12 +256,12 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
case nil:
// nothing
case *btrfsitem.ExtentDataRef:
- o.wantOff(ctx, "referencing INode",
+ o.WantOff(ctx, "referencing INode",
refBody.Root,
refBody.ObjectID,
btrfsitem.INODE_ITEM_KEY,
0)
- o.wantOff(ctx, "referencing FileExtent",
+ o.WantOff(ctx, "referencing FileExtent",
refBody.Root,
refBody.ObjectID,
btrfsitem.EXTENT_DATA_KEY,
@@ -276,7 +276,7 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
}
case *btrfsitem.Root:
if body.RootDirID != 0 {
- o.wantOff(ctx, "root directory",
+ o.WantOff(ctx, "root directory",
item.Key.ObjectID,
body.RootDirID,
btrfsitem.INODE_ITEM_KEY,
@@ -284,7 +284,7 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
}
if body.UUID != (btrfsprim.UUID{}) {
key := btrfsitem.UUIDToKey(body.UUID)
- o.wantOff(ctx, "uuid",
+ o.WantOff(ctx, "uuid",
btrfsprim.UUID_TREE_OBJECTID,
key.ObjectID,
key.ItemType,
@@ -292,7 +292,7 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
}
if body.ParentUUID != (btrfsprim.UUID{}) {
key := btrfsitem.UUIDToKey(body.ParentUUID)
- o.wantOff(ctx, "parent uuid",
+ o.WantOff(ctx, "parent uuid",
btrfsprim.UUID_TREE_OBJECTID,
key.ObjectID,
key.ItemType,
@@ -317,48 +317,48 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID,
panic(fmt.Errorf("should not happen: RootRef: unexpected ItemType=%v", item.Key.ItemType))
}
// sibling
- o.wantOff(ctx, fmt.Sprintf("corresponding %v", otherType),
+ o.WantOff(ctx, fmt.Sprintf("corresponding %v", otherType),
treeID,
btrfsprim.ObjID(item.Key.Offset),
otherType,
uint64(item.Key.ObjectID))
// parent
- o.want(ctx, "parent subvolume: Root",
+ o.Want(ctx, "parent subvolume: Root",
treeID,
parent,
btrfsitem.ROOT_ITEM_KEY)
- o.wantOff(ctx, "parent subvolume: Inode of parent dir",
+ o.WantOff(ctx, "parent subvolume: Inode of parent dir",
parent,
body.DirID,
btrfsitem.INODE_ITEM_KEY,
0)
- o.wantOff(ctx, "parent subvolume: DIR_ITEM in parent dir",
+ o.WantOff(ctx, "parent subvolume: DIR_ITEM in parent dir",
parent,
body.DirID,
btrfsitem.DIR_ITEM_KEY,
btrfsitem.NameHash(body.Name))
- o.wantOff(ctx, "parent subvolume: DIR_INDEX in parent dir",
+ o.WantOff(ctx, "parent subvolume: DIR_INDEX in parent dir",
parent,
body.DirID,
btrfsitem.DIR_INDEX_KEY,
uint64(body.Sequence))
// child
- o.want(ctx, "child subvolume: Root",
+ o.Want(ctx, "child subvolume: Root",
treeID,
child,
btrfsitem.ROOT_ITEM_KEY)
case *btrfsitem.SharedDataRef:
- o.want(ctx, "Extent",
+ o.Want(ctx, "Extent",
btrfsprim.EXTENT_TREE_OBJECTID,
item.Key.ObjectID,
btrfsitem.EXTENT_ITEM_KEY)
case *btrfsitem.UUIDMap:
- o.want(ctx, "subvolume Root",
+ o.Want(ctx, "subvolume Root",
btrfsprim.ROOT_TREE_OBJECTID,
body.ObjID,
btrfsitem.ROOT_ITEM_KEY)
case *btrfsitem.Error:
- o.fsErr(ctx, fmt.Errorf("error decoding item: %w", body.Err))
+ o.FSErr(ctx, fmt.Errorf("error decoding item: %w", body.Err))
default:
// This is a panic because the item decoder should not emit new types without this
// code also being updated.
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/graph.go b/lib/btrfsutil/graph.go
index 2a97ec8..8debe9d 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/graph.go
+++ b/lib/btrfsutil/graph.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package graph
+package btrfsutil
import (
"context"
@@ -23,7 +23,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
-type Node struct {
+type GraphNode struct {
Level uint8
Generation btrfsprim.Generation
Owner btrfsprim.ObjID
@@ -33,7 +33,7 @@ type Node struct {
Items []btrfsprim.Key
}
-func (n Node) String() string {
+func (n GraphNode) String() string {
if reflect.ValueOf(n).IsZero() {
return "{}"
}
@@ -43,9 +43,9 @@ func (n Node) String() string {
n.MaxItem.ObjectID, n.MaxItem.ItemType, n.MaxItem.Offset)
}
-type Edge struct {
+type GraphEdge struct {
// It is invalid for both 'FromRoot' and 'FromNode' to be
- // non-zero. If both are zero, then the Edge is from the
+ // non-zero. If both are zero, then the GraphEdge is from the
// superblock.
FromRoot btrfsvol.LogicalAddr
FromNode btrfsvol.LogicalAddr
@@ -59,7 +59,7 @@ type Edge struct {
ToGeneration btrfsprim.Generation
}
-func (kp Edge) String() string {
+func (kp GraphEdge) String() string {
var from string
switch {
case kp.FromRoot != 0:
@@ -80,13 +80,13 @@ func (kp Edge) String() string {
}
type Graph struct {
- Nodes map[btrfsvol.LogicalAddr]Node
+ Nodes map[btrfsvol.LogicalAddr]GraphNode
BadNodes map[btrfsvol.LogicalAddr]error
- EdgesFrom map[btrfsvol.LogicalAddr][]*Edge
- EdgesTo map[btrfsvol.LogicalAddr][]*Edge
+ EdgesFrom map[btrfsvol.LogicalAddr][]*GraphEdge
+ EdgesTo map[btrfsvol.LogicalAddr][]*GraphEdge
}
-func (g Graph) insertEdge(ptr *Edge) {
+func (g Graph) insertEdge(ptr *GraphEdge) {
if ptr.ToNode == 0 {
panic("kp.ToNode should not be zero")
}
@@ -112,7 +112,7 @@ func (g Graph) insertTreeRoot(sb btrfstree.Superblock, treeID btrfsprim.ObjID) {
if treeInfo.RootNode == 0 {
return
}
- g.insertEdge(&Edge{
+ g.insertEdge(&GraphEdge{
FromTree: treeID,
ToNode: treeInfo.RootNode,
ToLevel: treeInfo.Level,
@@ -120,12 +120,12 @@ func (g Graph) insertTreeRoot(sb btrfstree.Superblock, treeID btrfsprim.ObjID) {
})
}
-func New(sb btrfstree.Superblock) *Graph {
+func NewGraph(sb btrfstree.Superblock) *Graph {
g := &Graph{
- Nodes: make(map[btrfsvol.LogicalAddr]Node),
+ Nodes: make(map[btrfsvol.LogicalAddr]GraphNode),
BadNodes: make(map[btrfsvol.LogicalAddr]error),
- EdgesFrom: make(map[btrfsvol.LogicalAddr][]*Edge),
- EdgesTo: make(map[btrfsvol.LogicalAddr][]*Edge),
+ EdgesFrom: make(map[btrfsvol.LogicalAddr][]*GraphEdge),
+ EdgesTo: make(map[btrfsvol.LogicalAddr][]*GraphEdge),
}
// These 4 trees are mentioned directly in the superblock, so
@@ -139,7 +139,7 @@ func New(sb btrfstree.Superblock) *Graph {
}
func (g Graph) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node]) {
- nodeData := Node{
+ nodeData := GraphNode{
Level: nodeRef.Data.Head.Level,
Generation: nodeRef.Data.Head.Generation,
Owner: nodeRef.Data.Head.Owner,
@@ -155,14 +155,14 @@ func (g Graph) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.No
cnt++
}
}
- kps := make([]Edge, 0, cnt)
+ kps := make([]GraphEdge, 0, cnt)
keys := make([]btrfsprim.Key, len(nodeRef.Data.BodyLeaf))
nodeData.Items = keys
g.Nodes[nodeRef.Addr] = nodeData
for i, item := range nodeRef.Data.BodyLeaf {
keys[i] = item.Key
if itemBody, ok := item.Body.(*btrfsitem.Root); ok {
- kps = append(kps, Edge{
+ kps = append(kps, GraphEdge{
FromRoot: nodeRef.Addr,
FromItem: i,
FromTree: item.Key.ObjectID,
@@ -175,9 +175,9 @@ func (g Graph) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.No
}
} else {
g.Nodes[nodeRef.Addr] = nodeData
- kps := make([]Edge, len(nodeRef.Data.BodyInternal))
+ kps := make([]GraphEdge, len(nodeRef.Data.BodyInternal))
for i, kp := range nodeRef.Data.BodyInternal {
- kps[i] = Edge{
+ kps[i] = GraphEdge{
FromNode: nodeRef.Addr,
FromItem: i,
FromTree: nodeRef.Data.Head.Owner,
@@ -193,10 +193,8 @@ func (g Graph) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.No
func (g Graph) FinalCheck(ctx context.Context, fs diskio.File[btrfsvol.LogicalAddr], sb btrfstree.Superblock) error {
var stats textui.Portion[int]
- _ctx := ctx
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-nodes.read.substep", "check-keypointers")
- dlog.Info(_ctx, "Checking keypointers for dead-ends...")
+ dlog.Info(ctx, "Checking keypointers for dead-ends...")
progressWriter := textui.NewProgress[textui.Portion[int]](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
stats.D = len(g.EdgesTo)
progressWriter.Set(stats)
@@ -217,8 +215,7 @@ func (g Graph) FinalCheck(ctx context.Context, fs diskio.File[btrfsvol.LogicalAd
progressWriter.Done()
dlog.Info(ctx, "... done checking keypointers")
- ctx = dlog.WithField(_ctx, "btrfsinspect.rebuild-nodes.read.substep", "check-for-loops")
- dlog.Info(_ctx, "Checking for btree loops...")
+ dlog.Info(ctx, "Checking for btree loops...")
stats.D = len(g.Nodes)
stats.N = 0
progressWriter = textui.NewProgress[textui.Portion[int]](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
@@ -255,7 +252,7 @@ func (g Graph) FinalCheck(ctx context.Context, fs diskio.File[btrfsvol.LogicalAd
if numLoops > 0 {
return fmt.Errorf("%d btree loops", numLoops)
}
- dlog.Info(_ctx, "... done checking for loops")
+ dlog.Info(ctx, "... done checking for loops")
return nil
}
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/loops.go b/lib/btrfsutil/graph_loops.go
index 0e51805..3382705 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph/loops.go
+++ b/lib/btrfsutil/graph_loops.go
@@ -1,8 +1,8 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+// Copyright (C) 2022-2023 Luke Shumaker <lukeshu@lukeshu.com>
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package graph
+package btrfsutil
import (
"fmt"
@@ -42,7 +42,7 @@ func (g Graph) renderNode(node btrfsvol.LogicalAddr) []string {
}
}
-func (g Graph) renderEdge(kp Edge) []string {
+func (g Graph) renderEdge(kp GraphEdge) []string {
a := fmt.Sprintf("[%d]={", kp.FromItem)
b := strings.Repeat(" ", len(a))
ret := []string{
@@ -110,7 +110,7 @@ func (g Graph) renderLoop(stack []btrfsvol.LogicalAddr) []string {
return lines
}
-func checkNodeExpectations(kp Edge, toNode Node) error {
+func checkNodeExpectations(kp GraphEdge, toNode GraphNode) error {
var errs derror.MultiError
if toNode.Level != kp.ToLevel {
errs = append(errs, fmt.Errorf("kp.level=%v != node.level=%v",
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/nestedlock.go b/lib/btrfsutil/nestedlock.go
index c1ffa18..917b4cd 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/nestedlock.go
+++ b/lib/btrfsutil/nestedlock.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrees
+package btrfsutil
import (
"context"
diff --git a/lib/btrfsprogs/btrfsutil/broken_btree.go b/lib/btrfsutil/old_rebuilt_forrest.go
index b7663fa..2386803 100644
--- a/lib/btrfsprogs/btrfsutil/broken_btree.go
+++ b/lib/btrfsutil/old_rebuilt_forrest.go
@@ -21,60 +21,60 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
)
-type treeIndex struct {
- TreeRootErr error
- Items *containers.RBTree[treeIndexValue]
- Errors *containers.IntervalTree[btrfsprim.Key, treeIndexError]
+type oldRebuiltTree struct {
+ RootErr error
+ Items *containers.RBTree[oldRebuiltTreeValue]
+ Errors *containers.IntervalTree[btrfsprim.Key, oldRebuiltTreeError]
}
-type treeIndexError struct {
+type oldRebuiltTreeError struct {
Path SkinnyPath
Err error
}
-type treeIndexValue struct {
+type oldRebuiltTreeValue struct {
Path SkinnyPath
Key btrfsprim.Key
ItemSize uint32
}
// Compare implements containers.Ordered.
-func (a treeIndexValue) Compare(b treeIndexValue) int {
+func (a oldRebuiltTreeValue) Compare(b oldRebuiltTreeValue) int {
return a.Key.Compare(b.Key)
}
-func newTreeIndex(arena *SkinnyPathArena) treeIndex {
- return treeIndex{
- Items: new(containers.RBTree[treeIndexValue]),
- Errors: &containers.IntervalTree[btrfsprim.Key, treeIndexError]{
- MinFn: func(err treeIndexError) btrfsprim.Key {
+func newOldRebuiltTree(arena *SkinnyPathArena) oldRebuiltTree {
+ return oldRebuiltTree{
+ Items: new(containers.RBTree[oldRebuiltTreeValue]),
+ Errors: &containers.IntervalTree[btrfsprim.Key, oldRebuiltTreeError]{
+ MinFn: func(err oldRebuiltTreeError) btrfsprim.Key {
return arena.Inflate(err.Path).Node(-1).ToKey
},
- MaxFn: func(err treeIndexError) btrfsprim.Key {
+ MaxFn: func(err oldRebuiltTreeError) btrfsprim.Key {
return arena.Inflate(err.Path).Node(-1).ToMaxKey
},
},
}
}
-type brokenTrees struct {
+type OldRebuiltForrest struct {
ctx context.Context //nolint:containedctx // don't have an option while keeping the same API
inner *btrfs.FS
arena *SkinnyPathArena
// btrfsprim.ROOT_TREE_OBJECTID
- rootTreeMu sync.Mutex
- rootTreeIndex *treeIndex
+ rootTreeMu sync.Mutex
+ rootTree *oldRebuiltTree
// for all other trees
- treeMu sync.Mutex
- treeIndexes map[btrfsprim.ObjID]treeIndex
+ treesMu sync.Mutex
+ trees map[btrfsprim.ObjID]oldRebuiltTree
}
-var _ btrfstree.TreeOperator = (*brokenTrees)(nil)
+var _ btrfstree.TreeOperator = (*OldRebuiltForrest)(nil)
-// NewBrokenTrees wraps a *btrfs.FS to support looking up information
-// from broken trees.
+// NewOldRebuiltForrest wraps a *btrfs.FS to support looking up
+// information from broken trees.
//
// Of the btrfstree.TreeOperator methods:
//
@@ -87,43 +87,38 @@ var _ btrfstree.TreeOperator = (*brokenTrees)(nil)
// broken tree might not be), and a bad node may cause it to not
// return a truncated list of results.
//
-// NewBrokenTrees attempts to remedy these deficiencies by using
+// NewOldRebuiltForrest attempts to remedy these deficiencies by using
// .TreeWalk to build an out-of-FS index of all of the items in the
// tree, and re-implements TreeLookup, TreeSearch, and TreeSearchAll
// using that index.
-func NewBrokenTrees(ctx context.Context, inner *btrfs.FS) interface {
- btrfstree.TreeOperator
- Superblock() (*btrfstree.Superblock, error)
- ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error)
- Augment(treeID btrfsprim.ObjID, nodeAddr btrfsvol.LogicalAddr) ([]btrfsprim.Key, error)
-} {
- return &brokenTrees{
+func NewOldRebuiltForrest(ctx context.Context, inner *btrfs.FS) *OldRebuiltForrest {
+ return &OldRebuiltForrest{
ctx: ctx,
inner: inner,
}
}
-func (bt *brokenTrees) treeIndex(treeID btrfsprim.ObjID) treeIndex {
+func (bt *OldRebuiltForrest) RebuiltTree(treeID btrfsprim.ObjID) oldRebuiltTree {
var treeRoot *btrfstree.TreeRoot
var sb *btrfstree.Superblock
var err error
if treeID == btrfsprim.ROOT_TREE_OBJECTID {
bt.rootTreeMu.Lock()
defer bt.rootTreeMu.Unlock()
- if bt.rootTreeIndex != nil {
- return *bt.rootTreeIndex
+ if bt.rootTree != nil {
+ return *bt.rootTree
}
sb, err = bt.inner.Superblock()
if err == nil {
treeRoot, err = btrfstree.LookupTreeRoot(bt.inner, *sb, treeID)
}
} else {
- bt.treeMu.Lock()
- defer bt.treeMu.Unlock()
- if bt.treeIndexes == nil {
- bt.treeIndexes = make(map[btrfsprim.ObjID]treeIndex)
+ bt.treesMu.Lock()
+ defer bt.treesMu.Unlock()
+ if bt.trees == nil {
+ bt.trees = make(map[btrfsprim.ObjID]oldRebuiltTree)
}
- if cacheEntry, exists := bt.treeIndexes[treeID]; exists {
+ if cacheEntry, exists := bt.trees[treeID]; exists {
return cacheEntry
}
sb, err = bt.inner.Superblock()
@@ -141,23 +136,23 @@ func (bt *brokenTrees) treeIndex(treeID btrfsprim.ObjID) treeIndex {
SB: _sb,
}
}
- cacheEntry := newTreeIndex(bt.arena)
+ cacheEntry := newOldRebuiltTree(bt.arena)
if err != nil {
- cacheEntry.TreeRootErr = err
+ cacheEntry.RootErr = err
} else {
dlog.Infof(bt.ctx, "indexing tree %v...", treeID)
bt.rawTreeWalk(*treeRoot, cacheEntry, nil)
dlog.Infof(bt.ctx, "... done indexing tree %v", treeID)
}
if treeID == btrfsprim.ROOT_TREE_OBJECTID {
- bt.rootTreeIndex = &cacheEntry
+ bt.rootTree = &cacheEntry
} else {
- bt.treeIndexes[treeID] = cacheEntry
+ bt.trees[treeID] = cacheEntry
}
return cacheEntry
}
-func (bt *brokenTrees) rawTreeWalk(root btrfstree.TreeRoot, cacheEntry treeIndex, walked *[]btrfsprim.Key) {
+func (bt *OldRebuiltForrest) rawTreeWalk(root btrfstree.TreeRoot, cacheEntry oldRebuiltTree, walked *[]btrfsprim.Key) {
btrfstree.TreeOperatorImpl{NodeSource: bt.inner}.RawTreeWalk(
bt.ctx,
root,
@@ -167,20 +162,20 @@ func (bt *brokenTrees) rawTreeWalk(root btrfstree.TreeRoot, cacheEntry treeIndex
// indicates a bug in my item parser than a problem with the filesystem.
panic(fmt.Errorf("TODO: error parsing item: %w", err))
}
- cacheEntry.Errors.Insert(treeIndexError{
+ cacheEntry.Errors.Insert(oldRebuiltTreeError{
Path: bt.arena.Deflate(err.Path),
Err: err.Err,
})
},
btrfstree.TreeWalkHandler{
Item: func(path btrfstree.TreePath, item btrfstree.Item) error {
- if cacheEntry.Items.Search(func(v treeIndexValue) int { return item.Key.Compare(v.Key) }) != nil {
+ if cacheEntry.Items.Search(func(v oldRebuiltTreeValue) int { return item.Key.Compare(v.Key) }) != nil {
// This is a panic because I'm not really sure what the best way to
// handle this is, and so if this happens I want the program to crash
// and force me to figure out how to handle it.
panic(fmt.Errorf("dup key=%v in tree=%v", item.Key, root.TreeID))
}
- cacheEntry.Items.Insert(treeIndexValue{
+ cacheEntry.Items.Insert(oldRebuiltTreeValue{
Path: bt.arena.Deflate(path),
Key: item.Key,
ItemSize: item.BodySize,
@@ -194,7 +189,7 @@ func (bt *brokenTrees) rawTreeWalk(root btrfstree.TreeRoot, cacheEntry treeIndex
)
}
-func (bt *brokenTrees) TreeLookup(treeID btrfsprim.ObjID, key btrfsprim.Key) (btrfstree.Item, error) {
+func (bt *OldRebuiltForrest) TreeLookup(treeID btrfsprim.ObjID, key btrfsprim.Key) (btrfstree.Item, error) {
item, err := bt.TreeSearch(treeID, btrfstree.KeySearch(key.Compare))
if err != nil {
err = fmt.Errorf("item with key=%v: %w", key, err)
@@ -202,11 +197,11 @@ func (bt *brokenTrees) TreeLookup(treeID btrfsprim.ObjID, key btrfsprim.Key) (bt
return item, err
}
-func (bt *brokenTrees) addErrs(index treeIndex, fn func(btrfsprim.Key, uint32) int, err error) error {
+func (bt *OldRebuiltForrest) addErrs(tree oldRebuiltTree, fn func(btrfsprim.Key, uint32) int, err error) error {
var errs derror.MultiError
- index.Errors.Subrange(
+ tree.Errors.Subrange(
func(k btrfsprim.Key) int { return fn(k, 0) },
- func(v treeIndexError) bool {
+ func(v oldRebuiltTreeError) bool {
errs = append(errs, &btrfstree.TreeError{
Path: bt.arena.Inflate(v.Path),
Err: v.Err,
@@ -222,24 +217,24 @@ func (bt *brokenTrees) addErrs(index treeIndex, fn func(btrfsprim.Key, uint32) i
return errs
}
-func (bt *brokenTrees) TreeSearch(treeID btrfsprim.ObjID, fn func(btrfsprim.Key, uint32) int) (btrfstree.Item, error) {
- index := bt.treeIndex(treeID)
- if index.TreeRootErr != nil {
- return btrfstree.Item{}, index.TreeRootErr
+func (bt *OldRebuiltForrest) TreeSearch(treeID btrfsprim.ObjID, fn func(btrfsprim.Key, uint32) int) (btrfstree.Item, error) {
+ tree := bt.RebuiltTree(treeID)
+ if tree.RootErr != nil {
+ return btrfstree.Item{}, tree.RootErr
}
- indexItem := index.Items.Search(func(indexItem treeIndexValue) int {
+ indexItem := tree.Items.Search(func(indexItem oldRebuiltTreeValue) int {
return fn(indexItem.Key, indexItem.ItemSize)
})
if indexItem == nil {
- return btrfstree.Item{}, bt.addErrs(index, fn, iofs.ErrNotExist)
+ return btrfstree.Item{}, bt.addErrs(tree, fn, iofs.ErrNotExist)
}
itemPath := bt.arena.Inflate(indexItem.Value.Path)
node, err := bt.inner.ReadNode(itemPath.Parent())
defer btrfstree.FreeNodeRef(node)
if err != nil {
- return btrfstree.Item{}, bt.addErrs(index, fn, err)
+ return btrfstree.Item{}, bt.addErrs(tree, fn, err)
}
item := node.Data.BodyLeaf[itemPath.Node(-1).FromItemIdx]
@@ -250,21 +245,21 @@ func (bt *brokenTrees) TreeSearch(treeID btrfsprim.ObjID, fn func(btrfsprim.Key,
return item, nil
}
-func (bt *brokenTrees) TreeSearchAll(treeID btrfsprim.ObjID, fn func(btrfsprim.Key, uint32) int) ([]btrfstree.Item, error) {
- index := bt.treeIndex(treeID)
- if index.TreeRootErr != nil {
- return nil, index.TreeRootErr
+func (bt *OldRebuiltForrest) TreeSearchAll(treeID btrfsprim.ObjID, fn func(btrfsprim.Key, uint32) int) ([]btrfstree.Item, error) {
+ tree := bt.RebuiltTree(treeID)
+ if tree.RootErr != nil {
+ return nil, tree.RootErr
}
- var indexItems []treeIndexValue
- index.Items.Subrange(
- func(indexItem treeIndexValue) int { return fn(indexItem.Key, indexItem.ItemSize) },
- func(node *containers.RBNode[treeIndexValue]) bool {
+ var indexItems []oldRebuiltTreeValue
+ tree.Items.Subrange(
+ func(indexItem oldRebuiltTreeValue) int { return fn(indexItem.Key, indexItem.ItemSize) },
+ func(node *containers.RBNode[oldRebuiltTreeValue]) bool {
indexItems = append(indexItems, node.Value)
return true
})
if len(indexItems) == 0 {
- return nil, bt.addErrs(index, fn, iofs.ErrNotExist)
+ return nil, bt.addErrs(tree, fn, iofs.ErrNotExist)
}
ret := make([]btrfstree.Item, len(indexItems))
@@ -277,7 +272,7 @@ func (bt *brokenTrees) TreeSearchAll(treeID btrfsprim.ObjID, fn func(btrfsprim.K
node, err = bt.inner.ReadNode(itemPath.Parent())
if err != nil {
btrfstree.FreeNodeRef(node)
- return nil, bt.addErrs(index, fn, err)
+ return nil, bt.addErrs(tree, fn, err)
}
}
ret[i] = node.Data.BodyLeaf[itemPath.Node(-1).FromItemIdx]
@@ -285,23 +280,23 @@ func (bt *brokenTrees) TreeSearchAll(treeID btrfsprim.ObjID, fn func(btrfsprim.K
}
btrfstree.FreeNodeRef(node)
- return ret, bt.addErrs(index, fn, nil)
+ return ret, bt.addErrs(tree, fn, nil)
}
-func (bt *brokenTrees) TreeWalk(ctx context.Context, treeID btrfsprim.ObjID, errHandle func(*btrfstree.TreeError), cbs btrfstree.TreeWalkHandler) {
- index := bt.treeIndex(treeID)
- if index.TreeRootErr != nil {
+func (bt *OldRebuiltForrest) TreeWalk(ctx context.Context, treeID btrfsprim.ObjID, errHandle func(*btrfstree.TreeError), cbs btrfstree.TreeWalkHandler) {
+ tree := bt.RebuiltTree(treeID)
+ if tree.RootErr != nil {
errHandle(&btrfstree.TreeError{
Path: btrfstree.TreePath{{
FromTree: treeID,
ToMaxKey: btrfsprim.MaxKey,
}},
- Err: index.TreeRootErr,
+ Err: tree.RootErr,
})
return
}
var node *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node]
- index.Items.Range(func(indexItem *containers.RBNode[treeIndexValue]) bool {
+ tree.Items.Range(func(indexItem *containers.RBNode[oldRebuiltTreeValue]) bool {
if ctx.Err() != nil {
return false
}
@@ -330,22 +325,22 @@ func (bt *brokenTrees) TreeWalk(ctx context.Context, treeID btrfsprim.ObjID, err
btrfstree.FreeNodeRef(node)
}
-func (bt *brokenTrees) Superblock() (*btrfstree.Superblock, error) {
+func (bt *OldRebuiltForrest) Superblock() (*btrfstree.Superblock, error) {
return bt.inner.Superblock()
}
-func (bt *brokenTrees) ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error) {
+func (bt *OldRebuiltForrest) ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error) {
return bt.inner.ReadAt(p, off)
}
-func (bt *brokenTrees) Augment(treeID btrfsprim.ObjID, nodeAddr btrfsvol.LogicalAddr) ([]btrfsprim.Key, error) {
+func (bt *OldRebuiltForrest) Augment(treeID btrfsprim.ObjID, nodeAddr btrfsvol.LogicalAddr) ([]btrfsprim.Key, error) {
sb, err := bt.Superblock()
if err != nil {
return nil, err
}
- index := bt.treeIndex(treeID)
- if index.TreeRootErr != nil {
- return nil, index.TreeRootErr
+ tree := bt.RebuiltTree(treeID)
+ if tree.RootErr != nil {
+ return nil, tree.RootErr
}
nodeRef, err := btrfstree.ReadNode[btrfsvol.LogicalAddr](bt.inner, *sb, nodeAddr, btrfstree.NodeExpectations{})
defer btrfstree.FreeNodeRef(nodeRef)
@@ -358,6 +353,6 @@ func (bt *brokenTrees) Augment(treeID btrfsprim.ObjID, nodeAddr btrfsvol.Logical
RootNode: nodeAddr,
Level: nodeRef.Data.Head.Level,
Generation: nodeRef.Data.Head.Generation,
- }, index, &ret)
+ }, tree, &ret)
return ret, nil
}
diff --git a/lib/btrfsprogs/btrfsutil/open.go b/lib/btrfsutil/open.go
index c5ee314..c5ee314 100644
--- a/lib/btrfsprogs/btrfsutil/open.go
+++ b/lib/btrfsutil/open.go
diff --git a/lib/btrfsprogs/btrfsinspect/print_addrspace.go b/lib/btrfsutil/print_addrspace.go
index e85e055..c9c51f0 100644
--- a/lib/btrfsprogs/btrfsinspect/print_addrspace.go
+++ b/lib/btrfsutil/print_addrspace.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrfsinspect
+package btrfsutil
import (
"io"
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/forrest.go b/lib/btrfsutil/rebuilt_forrest.go
index dbbc6eb..70ece13 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/forrest.go
+++ b/lib/btrfsutil/rebuilt_forrest.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrees
+package btrfsutil
import (
"context"
@@ -13,14 +13,12 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- pkggraph "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/graph"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
)
-type Callbacks interface {
+type RebuiltForrestCallbacks interface {
AddedItem(ctx context.Context, tree btrfsprim.ObjID, key btrfsprim.Key)
AddedRoot(ctx context.Context, tree btrfsprim.ObjID, root btrfsvol.LogicalAddr)
LookupRoot(ctx context.Context, tree btrfsprim.ObjID) (offset btrfsprim.Generation, item btrfsitem.Root, ok bool)
@@ -31,23 +29,23 @@ type Callbacks interface {
// potentially broken btrees.
//
// It is conceptually a btrfstree.TreeOperator, and adds similar
-// broken-tree handling to btrfsutil.BrokenForrest. However, the API
-// is different thant btrfstree.TreeOperator, and is much more
-// efficient than btrfsutil.BrokenForrest.
+// broken-tree handling to OldRebuiltForrest. However, the API is
+// different than btrfstree.TreeOperator, and is much more efficient
+// than OldRebuiltForrest.
//
// The efficiency improvements are possible because of the API
// differences, which are necessary for how it is used in
-// rebuildnodes:
+// rebuildtrees:
//
-// - it consumes an already-read graph.Graph instead of reading the
-// graph itself
+// - it consumes an already-read Graph instead of reading the graph
+// itself
//
// - it does not use `btrfstree.TreePath`
//
// - it does not keep track of errors encountered in a tree
//
-// Additionally, it provides some functionality that
-// btrfsutil.BrokenForrest does not:
+// Additionally, it provides some functionality that OldRebuiltForrest
+// does not:
//
// - it provides a .LeafToRoots() method to advise on what
// additional roots should be added
@@ -60,9 +58,9 @@ type Callbacks interface {
type RebuiltForrest struct {
// static
sb btrfstree.Superblock
- graph pkggraph.Graph
- keyIO *keyio.Handle
- cb Callbacks
+ graph Graph
+ keyIO *KeyIO
+ cb RebuiltForrestCallbacks
// mutable
treesMu nestedMutex
@@ -74,7 +72,7 @@ type RebuiltForrest struct {
// NewRebuiltForrest returns a new RebuiltForrest instance. All of
// the callbacks must be non-nil.
-func NewRebuiltForrest(sb btrfstree.Superblock, graph pkggraph.Graph, keyIO *keyio.Handle, cb Callbacks) *RebuiltForrest {
+func NewRebuiltForrest(sb btrfstree.Superblock, graph Graph, keyIO *KeyIO, cb RebuiltForrestCallbacks) *RebuiltForrest {
return &RebuiltForrest{
sb: sb,
graph: graph,
@@ -120,7 +118,7 @@ func (ts *RebuiltForrest) addTree(ctx context.Context, treeID btrfsprim.ObjID, s
}
}()
stack = append(stack, treeID)
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.add-tree", stack)
+ ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-forrest.add-tree", stack)
dlog.Info(ctx, "adding tree...")
if slices.Contains(treeID, stack[:len(stack)-1]) {
dlog.Errorf(ctx, "failed to add tree: loop detected: %v", stack)
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio/keyio.go b/lib/btrfsutil/rebuilt_readitem.go
index 56da32d..57440cf 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio/keyio.go
+++ b/lib/btrfsutil/rebuilt_readitem.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package keyio
+package btrfsutil
import (
"context"
@@ -15,7 +15,6 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"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/btrfsprogs/btrfsinspect/rebuildnodes/graph"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
"git.lukeshu.com/btrfs-progs-ng/lib/textui"
@@ -40,10 +39,10 @@ type FlagsAndErr struct {
Err error
}
-type Handle struct {
+type KeyIO struct {
rawFile diskio.File[btrfsvol.LogicalAddr]
sb btrfstree.Superblock
- graph graph.Graph
+ graph Graph
Flags map[ItemPtr]FlagsAndErr // INODE_ITEM
Names map[ItemPtr][]byte // DIR_INDEX
@@ -53,8 +52,8 @@ type Handle struct {
cache containers.ARCache[btrfsvol.LogicalAddr, *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node]]
}
-func NewHandle(file diskio.File[btrfsvol.LogicalAddr], sb btrfstree.Superblock) *Handle {
- return &Handle{
+func NewKeyIO(file diskio.File[btrfsvol.LogicalAddr], sb btrfstree.Superblock) *KeyIO {
+ return &KeyIO{
rawFile: file,
sb: sb,
@@ -71,7 +70,7 @@ func NewHandle(file diskio.File[btrfsvol.LogicalAddr], sb btrfstree.Superblock)
}
}
-func (o *Handle) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node]) {
+func (o *KeyIO) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node]) {
for i, item := range nodeRef.Data.BodyLeaf {
ptr := ItemPtr{
Node: nodeRef.Addr,
@@ -115,11 +114,11 @@ func (o *Handle) InsertNode(nodeRef *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.
}
}
-func (o *Handle) SetGraph(graph graph.Graph) {
+func (o *KeyIO) SetGraph(graph Graph) {
o.graph = graph
}
-func (o *Handle) readNode(ctx context.Context, laddr btrfsvol.LogicalAddr) *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node] {
+func (o *KeyIO) readNode(ctx context.Context, laddr btrfsvol.LogicalAddr) *diskio.Ref[btrfsvol.LogicalAddr, btrfstree.Node] {
if cached, ok := o.cache.Load(laddr); ok {
dlog.Tracef(ctx, "cache-hit node@%v", laddr)
return cached
@@ -154,18 +153,18 @@ func (o *Handle) readNode(ctx context.Context, laddr btrfsvol.LogicalAddr) *disk
return ref
}
-func (o *Handle) ReadItem(ctx context.Context, ptr ItemPtr) btrfsitem.Item {
+func (o *KeyIO) ReadItem(ctx context.Context, ptr ItemPtr) btrfsitem.Item {
o.mu.Lock()
defer o.mu.Unlock()
if o.graph.Nodes[ptr.Node].Level != 0 {
- panic(fmt.Errorf("should not happen: keyio.Handle.ReadItem called for non-leaf node@%v", ptr.Node))
+ panic(fmt.Errorf("should not happen: btrfsutil.KeyIO.ReadItem called for non-leaf node@%v", ptr.Node))
}
if ptr.Idx < 0 {
- panic(fmt.Errorf("should not happen: keyio.Handle.ReadItem called for negative item index: %v", ptr.Idx))
+ panic(fmt.Errorf("should not happen: btrfsutil.KeyIO.ReadItem called for negative item index: %v", ptr.Idx))
}
items := o.readNode(ctx, ptr.Node).Data.BodyLeaf
if ptr.Idx >= len(items) {
- panic(fmt.Errorf("should not happen: keyio.Handle.ReadItem called for out-of-bounds item index: index=%v len=%v",
+ panic(fmt.Errorf("should not happen: btrfsutil.KeyIO.ReadItem called for out-of-bounds item index: index=%v len=%v",
ptr.Idx, len(items)))
}
return items[ptr.Idx].Body.CloneItem()
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/tree.go b/lib/btrfsutil/rebuilt_tree.go
index 39d8871..1009204 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/btrees/tree.go
+++ b/lib/btrfsutil/rebuilt_tree.go
@@ -2,7 +2,7 @@
//
// SPDX-License-Identifier: GPL-2.0-or-later
-package btrees
+package btrfsutil
import (
"context"
@@ -15,7 +15,6 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildnodes/keyio"
"git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
@@ -49,7 +48,7 @@ type RebuiltTree struct {
// .isOwnerOK, whether or not they're in the tree.
func (tree *RebuiltTree) leafToRoots(ctx context.Context) map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr] {
return containers.LoadOrElse[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]](&tree.forrest.leafs, tree.ID, func(btrfsprim.ObjID) map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr] {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.index-nodes", fmt.Sprintf("tree=%v", tree.ID))
+ ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.index-nodes", fmt.Sprintf("tree=%v", tree.ID))
nodeToRoots := make(map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr])
@@ -136,8 +135,8 @@ func (tree *RebuiltTree) isOwnerOK(owner btrfsprim.ObjID, gen btrfsprim.Generati
//
// Do not mutate the returned map; it is a pointer to the
// RebuiltTree's internal map!
-func (tree *RebuiltTree) Items(ctx context.Context) *containers.SortedMap[btrfsprim.Key, keyio.ItemPtr] {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.index-inc-items", fmt.Sprintf("tree=%v", tree.ID))
+func (tree *RebuiltTree) Items(ctx context.Context) *containers.SortedMap[btrfsprim.Key, ItemPtr] {
+ ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.index-inc-items", fmt.Sprintf("tree=%v", tree.ID))
return tree.items(ctx, &tree.forrest.incItems, tree.Roots.HasAny)
}
@@ -146,15 +145,15 @@ func (tree *RebuiltTree) Items(ctx context.Context) *containers.SortedMap[btrfsp
//
// Do not mutate the returned map; it is a pointer to the
// RebuiltTree's internal map!
-func (tree *RebuiltTree) PotentialItems(ctx context.Context) *containers.SortedMap[btrfsprim.Key, keyio.ItemPtr] {
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.index-exc-items", fmt.Sprintf("tree=%v", tree.ID))
+func (tree *RebuiltTree) PotentialItems(ctx context.Context) *containers.SortedMap[btrfsprim.Key, ItemPtr] {
+ ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.index-exc-items", fmt.Sprintf("tree=%v", tree.ID))
return tree.items(ctx, &tree.forrest.excItems,
func(roots containers.Set[btrfsvol.LogicalAddr]) bool {
return !tree.Roots.HasAny(roots)
})
}
-type itemIndex = containers.SortedMap[btrfsprim.Key, keyio.ItemPtr]
+type itemIndex = containers.SortedMap[btrfsprim.Key, ItemPtr]
type itemStats struct {
Leafs textui.Portion[int]
@@ -169,7 +168,7 @@ func (s itemStats) String() string {
func (tree *RebuiltTree) items(ctx context.Context, cache containers.Map[btrfsprim.ObjID, *itemIndex],
leafFn func(roots containers.Set[btrfsvol.LogicalAddr]) bool,
-) *containers.SortedMap[btrfsprim.Key, keyio.ItemPtr] {
+) *containers.SortedMap[btrfsprim.Key, ItemPtr] {
tree.mu.RLock()
defer tree.mu.RUnlock()
@@ -186,12 +185,12 @@ func (tree *RebuiltTree) items(ctx context.Context, cache containers.Map[btrfspr
stats.Leafs.D = len(leafs)
progressWriter := textui.NewProgress[itemStats](ctx, dlog.LogLevelInfo, textui.Tunable(1*time.Second))
- index := new(containers.SortedMap[btrfsprim.Key, keyio.ItemPtr])
+ index := new(containers.SortedMap[btrfsprim.Key, ItemPtr])
for i, leaf := range leafs {
stats.Leafs.N = i
progressWriter.Set(stats)
for j, itemKey := range tree.forrest.graph.Nodes[leaf].Items {
- newPtr := keyio.ItemPtr{
+ newPtr := ItemPtr{
Node: leaf,
Idx: j,
}
@@ -268,7 +267,7 @@ func (s rootStats) String() string {
func (tree *RebuiltTree) AddRoot(ctx context.Context, rootNode btrfsvol.LogicalAddr) {
tree.mu.Lock()
defer tree.mu.Unlock()
- ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.add-root", fmt.Sprintf("tree=%v rootNode=%v", tree.ID, rootNode))
+ ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.add-root", fmt.Sprintf("tree=%v rootNode=%v", tree.ID, rootNode))
dlog.Info(ctx, "adding root...")
leafToRoots := tree.leafToRoots(ctx)
@@ -328,7 +327,7 @@ func (tree *RebuiltTree) COWDistance(parentID btrfsprim.ObjID) (dist int, ok boo
func (tree *RebuiltTree) ReadItem(ctx context.Context, key btrfsprim.Key) btrfsitem.Item {
ptr, ok := tree.Items(ctx).Load(key)
if !ok {
- panic(fmt.Errorf("should not happen: btrees.RebuiltTree.ReadItem called for not-included key: %v", key))
+ panic(fmt.Errorf("should not happen: btrfsutil.RebuiltTree.ReadItem called for not-included key: %v", key))
}
return tree.forrest.keyIO.ReadItem(ctx, ptr)
}
diff --git a/lib/btrfsprogs/btrfsutil/skinny_paths.go b/lib/btrfsutil/skinny_paths.go
index 1695990..1695990 100644
--- a/lib/btrfsprogs/btrfsutil/skinny_paths.go
+++ b/lib/btrfsutil/skinny_paths.go
diff --git a/lib/btrfsprogs/btrfsutil/walk.go b/lib/btrfsutil/walk.go
index 355976a..355976a 100644
--- a/lib/btrfsprogs/btrfsutil/walk.go
+++ b/lib/btrfsutil/walk.go
diff --git a/lib/textui/log.go b/lib/textui/log.go
index 2a6fdd4..0a10ef6 100644
--- a/lib/textui/log.go
+++ b/lib/textui/log.go
@@ -289,57 +289,59 @@ func fieldOrd(key string) int {
case "dexec.err":
return -95
- // btrfsinspect scandevices ////////////////////////////////////////////
- case "btrfsinspect.scandevices.dev":
+ // btrfs inspect rebuild-mappings scan /////////////////////////////////
+ case "btrfs.inspect.rebuild-mappings.scan.dev":
return -1
- // btrfsinspect rebuild-mappings ///////////////////////////////////////
- case "btrfsinspect.rebuild-mappings.step":
+ // btrfs inspect rebuild-mappings process //////////////////////////////
+ case "btrfs.inspect.rebuild-mappings.process.step":
return -2
- case "btrfsinspect.rebuild-mappings.substep":
+ case "btrfs.inspect.rebuild-mappings.process.substep":
return -1
- // btrfsinspect rebuild-nodes //////////////////////////////////////////
- case "btrfsinspect.rebuild-nodes.step":
+ // btrfs inspect rebuild-trees /////////////////////////////////////////
+ case "btrfs.inspect.rebuild-trees.step":
return -50
// step=read-fs-data
- case "btrfsinspect.rebuild-nodes.read.substep":
+ case "btrfs.inspect.rebuild-trees.read.substep":
return -1
// step=rebuild
- case "btrfsinspect.rebuild-nodes.rebuild.pass":
+ case "btrfs.inspect.rebuild-trees.rebuild.pass":
return -49
- case "btrfsinspect.rebuild-nodes.rebuild.substep":
+ case "btrfs.inspect.rebuild-trees.rebuild.substep":
return -48
- case "btrfsinspect.rebuild-nodes.rebuild.substep.progress":
+ case "btrfs.inspect.rebuild-trees.rebuild.substep.progress":
return -47
// step=rebuild, substep=collect-items (1/3)
// step=rebuild, substep=settle-items (2a/3)
- case "btrfsinspect.rebuild-nodes.rebuild.settle.item":
+ case "btrfs.inspect.rebuild-trees.rebuild.settle.item":
return -25
// step=rebuild, substep=process-items (2b/3)
- case "btrfsinspect.rebuild-nodes.rebuild.process.item":
+ case "btrfs.inspect.rebuild-trees.rebuild.process.item":
return -25
// step=rebuild, substep=apply-augments (3/3)
- case "btrfsinspect.rebuild-nodes.rebuild.augment.tree":
+ case "btrfs.inspect.rebuild-trees.rebuild.augment.tree":
return -25
// step=rebuild (any substep)
- case "btrfsinspect.rebuild-nodes.rebuild.want.key":
+ case "btrfs.inspect.rebuild-trees.rebuild.want.key":
return -9
- case "btrfsinspect.rebuild-nodes.rebuild.want.reason":
+ case "btrfs.inspect.rebuild-trees.rebuild.want.reason":
return -8
- case "btrfsinspect.rebuild-nodes.rebuild.add-tree":
+
+ // btrfsutil.RebuiltForrest ////////////////////////////////////////////
+ case "btrfs.util.rebuilt-forrest.add-tree":
return -7
- case "btrfsinspect.rebuild-nodes.rebuild.add-tree.want.key":
+ case "btrfs.util.rebuilt-forrest.add-tree.want.key":
return -6
- case "btrfsinspect.rebuild-nodes.rebuild.add-tree.want.reason":
+ case "btrfs.util.rebuilt-forrest.add-tree.want.reason":
return -5
- case "btrfsinspect.rebuild-nodes.rebuild.add-root":
+ case "btrfs.util.rebuilt-tree.add-root":
return -4
- case "btrfsinspect.rebuild-nodes.rebuild.index-inc-items":
+ case "btrfs.util.rebuilt-tree.index-inc-items":
return -3
- case "btrfsinspect.rebuild-nodes.rebuild.index-exc-items":
+ case "btrfs.util.rebuilt-tree.index-exc-items":
return -2
- case "btrfsinspect.rebuild-nodes.rebuild.index-nodes":
+ case "btrfs.util.rebuilt-tree.index-nodes":
return -1
// other ///////////////////////////////////////////////////////////////
@@ -398,27 +400,37 @@ func writeField(w io.Writer, key string, val any) {
case strings.HasSuffix(name, ".pass"):
fmt.Fprintf(w, "/pass-%s", valStr)
return
- case strings.HasSuffix(name, ".substep") && name != "btrfsinspect.rebuild-nodes.rebuild.add-tree.substep":
+ case strings.HasSuffix(name, ".substep") && name != "btrfs.util.rebuilt-forrest.add-tree.substep":
fmt.Fprintf(w, "/%s", valStr)
return
- case strings.HasPrefix(name, "btrfsinspect."):
- name = strings.TrimPrefix(name, "btrfsinspect.")
+ case strings.HasPrefix(name, "btrfs."):
+ name = strings.TrimPrefix(name, "btrfs.")
switch {
- case strings.HasPrefix(name, "scandevices."):
- name = strings.TrimPrefix(name, "scandevices.")
- case strings.HasPrefix(name, "rebuild-mappings."):
- name = strings.TrimPrefix(name, "rebuild-mappings.")
- case strings.HasPrefix(name, "rebuild-nodes."):
- name = strings.TrimPrefix(name, "rebuild-nodes.")
+ case strings.HasPrefix(name, "inspect."):
+ name = strings.TrimPrefix(name, "inspect.")
switch {
- case strings.HasPrefix(name, "read."):
- name = strings.TrimPrefix(name, "read.")
- case strings.HasPrefix(name, "rebuild."):
- name = strings.TrimPrefix(name, "rebuild.")
+ case strings.HasPrefix(name, "rebuild-mappings."):
+ name = strings.TrimPrefix(name, "rebuild-mappings.")
+ switch {
+ case strings.HasPrefix(name, "scan."):
+ name = strings.TrimPrefix(name, "scan.")
+ case strings.HasPrefix(name, "process."):
+ name = strings.TrimPrefix(name, "process.")
+ }
+ case strings.HasPrefix(name, "rebuild-trees."):
+ name = strings.TrimPrefix(name, "rebuild-trees.")
+ switch {
+ case strings.HasPrefix(name, "read."):
+ name = strings.TrimPrefix(name, "read.")
+ case strings.HasPrefix(name, "rebuild."):
+ name = strings.TrimPrefix(name, "rebuild.")
+ }
}
+ case strings.HasPrefix(name, "util.rebuilt-forrest."):
+ name = strings.TrimPrefix(name, "util.rebuilt-forrest.")
+ case strings.HasPrefix(name, "util.rebuilt-tree."):
+ name = strings.TrimPrefix(name, "util.rebuilt-tree.")
}
- case strings.HasPrefix(name, "btrfs."):
- name = strings.TrimPrefix(name, "btrfs.")
}
fmt.Fprintf(w, " %s=%s", name, valStr)