From f9fd200f70d5746e6e5b64e1c6e7ed2474081964 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Thu, 2 Mar 2023 16:02:42 -0700
Subject: btrfsutil, cmd: Migrate to the new btrfstree.Forrest API

---
 lib/btrfsutil/walk.go | 53 +++++++++++++++++++++------------------------------
 1 file changed, 22 insertions(+), 31 deletions(-)

(limited to 'lib/btrfsutil')

diff --git a/lib/btrfsutil/walk.go b/lib/btrfsutil/walk.go
index b05218c..caa1e4c 100644
--- a/lib/btrfsutil/walk.go
+++ b/lib/btrfsutil/walk.go
@@ -8,35 +8,23 @@ import (
 	"context"
 	"fmt"
 
+	"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"
 )
 
-type WalkError struct {
-	TreeName string
-	Err      *btrfstree.TreeError
-}
-
-func (e *WalkError) Unwrap() error { return e.Err }
-
-func (e *WalkError) Error() string {
-	return fmt.Sprintf("%v: %v", e.TreeName, e.Err)
-}
-
 type WalkAllTreesHandler struct {
-	Err func(*WalkError)
-	// Callbacks for entire trees
 	PreTree  func(name string, id btrfsprim.ObjID)
+	BadTree  func(name string, id btrfsprim.ObjID, err error)
+	Tree     btrfstree.TreeWalkHandler
 	PostTree func(name string, id btrfsprim.ObjID)
-	// Callbacks for nodes or smaller
-	btrfstree.TreeWalkHandler
 }
 
-// WalkAllTrees walks all trees in a *btrfs.FS.  Rather than returning
-// an error, it calls errCb each time an error is encountered.  The
-// error will always be of type WalkError.
-func WalkAllTrees(ctx context.Context, fs btrfstree.TreeOperator, cbs WalkAllTreesHandler) {
+// WalkAllTrees walks all trees in a btrfs.ReadableFS.  Rather than
+// returning an error, it calls the appropriate "BadXXX" callback
+// (BadTree, BadNode, BadItem) each time an error is encountered.
+func WalkAllTrees(ctx context.Context, fs btrfs.ReadableFS, cbs WalkAllTreesHandler) {
 	var treeName string
 
 	trees := []struct {
@@ -60,8 +48,8 @@ func WalkAllTrees(ctx context.Context, fs btrfstree.TreeOperator, cbs WalkAllTre
 			ID:   btrfsprim.BLOCK_GROUP_TREE_OBJECTID,
 		},
 	}
-	origItem := cbs.Item
-	cbs.Item = func(path btrfstree.Path, item btrfstree.Item) {
+	origItem := cbs.Tree.Item
+	cbs.Tree.Item = func(path btrfstree.Path, item btrfstree.Item) {
 		if item.Key.ItemType == btrfsitem.ROOT_ITEM_KEY {
 			trees = append(trees, struct {
 				Name string
@@ -78,19 +66,22 @@ func WalkAllTrees(ctx context.Context, fs btrfstree.TreeOperator, cbs WalkAllTre
 	}
 
 	for i := 0; i < len(trees); i++ {
-		tree := trees[i]
-		treeName = tree.Name
+		treeInfo := trees[i]
+		treeName = treeInfo.Name
 		if cbs.PreTree != nil {
-			cbs.PreTree(treeName, tree.ID)
+			cbs.PreTree(treeName, treeInfo.ID)
+		}
+		tree, err := fs.ForrestLookup(ctx, treeInfo.ID)
+		switch {
+		case err != nil:
+			if cbs.BadTree != nil {
+				cbs.BadTree(treeName, treeInfo.ID, err)
+			}
+		default:
+			tree.TreeWalk(ctx, cbs.Tree)
 		}
-		fs.TreeWalk(
-			ctx,
-			tree.ID,
-			func(err *btrfstree.TreeError) { cbs.Err(&WalkError{TreeName: treeName, Err: err}) },
-			cbs.TreeWalkHandler,
-		)
 		if cbs.PostTree != nil {
-			cbs.PostTree(treeName, tree.ID)
+			cbs.PostTree(treeName, treeInfo.ID)
 		}
 	}
 }
-- 
cgit v1.2.3-2-g168b