summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-03-02 16:02:42 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-03-30 10:06:52 -0600
commitf9fd200f70d5746e6e5b64e1c6e7ed2474081964 (patch)
tree9342bf684bed4d4ea558c3d9c6cd09d0c75c95a7 /lib
parent7c9de305d3dd364d6d76c8869d55a09bf80b28a8 (diff)
btrfsutil, cmd: Migrate to the new btrfstree.Forrest API
Diffstat (limited to 'lib')
-rw-r--r--lib/btrfsutil/walk.go53
1 files changed, 22 insertions, 31 deletions
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)
}
}
}