From f9fd200f70d5746e6e5b64e1c6e7ed2474081964 Mon Sep 17 00:00:00 2001 From: Luke Shumaker 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') 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