summaryrefslogtreecommitdiff
path: root/cmd/btrfs-fsck
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-30 05:34:10 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-30 05:34:33 -0600
commit4e617e029a5041c693b439742df2526923eaa00b (patch)
tree528c6f79664200874bd9c1685eca02a745eb4b67 /cmd/btrfs-fsck
parent44a5c07562d1650c85ed7e2135a3af51141c5aae (diff)
work on pass2
Diffstat (limited to 'cmd/btrfs-fsck')
-rw-r--r--cmd/btrfs-fsck/pass2.go33
1 files changed, 16 insertions, 17 deletions
diff --git a/cmd/btrfs-fsck/pass2.go b/cmd/btrfs-fsck/pass2.go
index 8195737..14516f8 100644
--- a/cmd/btrfs-fsck/pass2.go
+++ b/cmd/btrfs-fsck/pass2.go
@@ -23,10 +23,6 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
fmt.Printf("Pass 2: walk FS: error: %v\n", err)
})
- if true {
- return
- }
-
orphanedNodes := make(map[btrfs.LogicalAddr]int)
for foundNode := range foundNodes {
if _, visited := visitedNodes[foundNode]; !visited {
@@ -34,10 +30,17 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
}
}
- for nodeAddr := range orphanedNodes {
- if err := fs.WalkTree(nodeAddr, btrfs.WalkTreeHandler{
- Node: func(path btrfs.WalkTreePath, node *util.Ref[btrfs.LogicalAddr, btrfs.Node], err error) error {
+ orphanedRoots := make(map[btrfs.LogicalAddr]struct{}, len(orphanedNodes))
+ for node := range orphanedNodes {
+ orphanedRoots[node] = struct{}{}
+ }
+ for potentialRoot := range orphanedRoots {
+ if err := fs.WalkTree(potentialRoot, btrfs.WalkTreeHandler{
+ Node: func(path btrfs.WalkTreePath, _ *util.Ref[btrfs.LogicalAddr, btrfs.Node], _ error) error {
nodeAddr := path[len(path)-1].NodeAddr
+ if nodeAddr != potentialRoot {
+ delete(orphanedRoots, nodeAddr)
+ }
orphanedNodes[nodeAddr] = orphanedNodes[nodeAddr] + 1
visitCnt := orphanedNodes[nodeAddr]
if visitCnt > 1 {
@@ -49,17 +52,13 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
fmt.Printf("Pass 2: walk orphans: error: %v\n", err)
}
}
- var orphanedRoots []btrfs.LogicalAddr
- for node, cnt := range orphanedNodes {
- switch cnt {
- case 0:
- panic("x")
- case 1:
- orphanedRoots = append(orphanedRoots, node)
- }
+
+ var orphanedRootsOrdered []btrfs.LogicalAddr
+ for root := range orphanedRoots {
+ orphanedRootsOrdered = append(orphanedRootsOrdered, root)
}
- sort.Slice(orphanedRoots, func(i, j int) bool {
- return orphanedRoots[i] < orphanedRoots[j]
+ sort.Slice(orphanedRootsOrdered, func(i, j int) bool {
+ return orphanedRootsOrdered[i] < orphanedRootsOrdered[j]
})
for _, node := range orphanedRoots {
fmt.Printf("Pass 2: orphaned root: %v\n", node)