summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go')
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go41
1 files changed, 13 insertions, 28 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go
index 3575534..5c2d0fd 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/scan.go
@@ -16,17 +16,11 @@ import (
"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/uuidmap"
+ "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/textui"
)
-type scanResult struct {
- uuidMap *uuidmap.UUIDMap
- nodeGraph *graph.Graph
-}
-
type scanStats struct {
N, D int
}
@@ -37,12 +31,12 @@ func (s scanStats) String() string {
s.N, s.D)
}
-func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) (*scanResult, error) {
+func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) (graph.Graph, *keyio.Handle, error) {
dlog.Infof(ctx, "Reading node data from FS...")
sb, err := fs.Superblock()
if err != nil {
- return nil, err
+ return graph.Graph{}, nil, err
}
total := countNodes(scanResults)
@@ -52,10 +46,8 @@ func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sca
progressWriter.Set(scanStats{N: done, D: total})
}
- ret := &scanResult{
- uuidMap: uuidmap.New(),
- nodeGraph: graph.New(*sb),
- }
+ nodeGraph := graph.New(*sb)
+ keyIO := keyio.NewHandle(fs, *sb)
progress(done, total)
for _, devResults := range scanResults {
@@ -64,14 +56,11 @@ func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sca
LAddr: containers.Optional[btrfsvol.LogicalAddr]{OK: true, Val: laddr},
})
if err != nil {
- return nil, err
- }
-
- if err := ret.uuidMap.InsertNode(nodeRef); err != nil {
- return nil, err
+ return graph.Graph{}, nil, err
}
- ret.nodeGraph.InsertNode(nodeRef)
+ nodeGraph.InsertNode(nodeRef)
+ keyIO.InsertNode(nodeRef)
done++
progress(done, total)
@@ -81,21 +70,17 @@ func ScanDevices(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sca
panic("should not happen")
}
progressWriter.Done()
-
- missing := ret.uuidMap.MissingRootItems()
- if len(missing) > 0 {
- dlog.Errorf(ctx, "... could not find root items for %d trees: %v", len(missing), maps.SortedKeys(missing))
- }
-
dlog.Info(ctx, "... done reading node data")
progressWriter = textui.NewProgress[scanStats](ctx, dlog.LogLevelInfo, 1*time.Second)
dlog.Infof(ctx, "Checking keypointers for dead-ends...")
- if err := ret.nodeGraph.FinalCheck(fs, *sb, progress); err != nil {
- return nil, err
+ if err := nodeGraph.FinalCheck(fs, *sb, progress); err != nil {
+ return graph.Graph{}, nil, err
}
progressWriter.Done()
dlog.Info(ctx, "... done checking keypointers")
- return ret, nil
+ keyIO.SetGraph(*nodeGraph)
+
+ return *nodeGraph, keyIO, nil
}