From 68555944f694e941b9cac3f8349364ec965db2fb Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Tue, 12 Jul 2022 11:30:13 -0600
Subject: Don't let TreeWalk bail early, add TreeID in to TreePath

---
 lib/btrfsprogs/btrfsutil/open.go |  4 ++--
 lib/btrfsprogs/btrfsutil/walk.go | 49 ++++++++++------------------------------
 2 files changed, 14 insertions(+), 39 deletions(-)

(limited to 'lib/btrfsprogs/btrfsutil')

diff --git a/lib/btrfsprogs/btrfsutil/open.go b/lib/btrfsprogs/btrfsutil/open.go
index 80bfe7a..c237b54 100644
--- a/lib/btrfsprogs/btrfsutil/open.go
+++ b/lib/btrfsprogs/btrfsutil/open.go
@@ -23,8 +23,8 @@ func Open(ctx context.Context, flag int, filenames ...string) (*btrfs.FS, error)
 			_ = fs.Close()
 			return nil, fmt.Errorf("device file %q: %w", filename, err)
 		}
-		if err := fs.AddDevice(&btrfs.Device{File: fh}); err != nil {
-			dlog.Errorf(ctx, "device file %q: %v", filename, err)
+		if err := fs.AddDevice(ctx, &btrfs.Device{File: fh}); err != nil {
+			return nil, fmt.Errorf("device file %q: %w", filename, err)
 		}
 	}
 	return fs, nil
diff --git a/lib/btrfsprogs/btrfsutil/walk.go b/lib/btrfsprogs/btrfsutil/walk.go
index 0c54384..d2322b2 100644
--- a/lib/btrfsprogs/btrfsutil/walk.go
+++ b/lib/btrfsprogs/btrfsutil/walk.go
@@ -9,47 +9,33 @@ import (
 
 	"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/btrfsvol"
-	"git.lukeshu.com/btrfs-progs-ng/lib/util"
 )
 
-type WalkErr struct {
+type WalkError struct {
 	TreeName string
-	Path     btrfs.TreePath
-	Err      error
+	Err      *btrfs.TreeError
 }
 
-func (e WalkErr) Unwrap() error { return e.Err }
+func (e *WalkError) Unwrap() error { return e.Err }
 
-func (e WalkErr) Error() string {
-	if len(e.Path) == 0 {
-		return fmt.Sprintf("%v: %v", e.TreeName, e.Err)
-	}
-	return fmt.Sprintf("%v: %v: %v", e.TreeName, e.Path, e.Err)
+func (e *WalkError) Error() string {
+	return fmt.Sprintf("%v: %v", e.TreeName, e.Err)
 }
 
 type WalkAllTreesHandler struct {
-	Err func(error)
+	Err func(*WalkError)
 	// Callbacks for entire trees
 	PreTree  func(name string, id btrfs.ObjID)
 	PostTree func(name string, id btrfs.ObjID)
 	// Callbacks for nodes or smaller
-	UnsafeNodes bool
 	btrfs.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 WalkErr.
+// error will always be of type WalkError.
 func WalkAllTrees(fs *btrfs.FS, cbs WalkAllTreesHandler) {
 	var treeName string
-	handleErr := func(path btrfs.TreePath, err error) {
-		cbs.Err(WalkErr{
-			TreeName: treeName,
-			Path:     path,
-			Err:      err,
-		})
-	}
 
 	trees := []struct {
 		Name string
@@ -90,28 +76,17 @@ func WalkAllTrees(fs *btrfs.FS, cbs WalkAllTreesHandler) {
 		return nil
 	}
 
-	if !cbs.UnsafeNodes {
-		origNode := cbs.Node
-		cbs.Node = func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
-			if err != nil {
-				handleErr(path, err)
-			}
-			if node != nil && origNode != nil {
-				return origNode(path, node, nil)
-			}
-			return nil
-		}
-	}
-
 	for i := 0; i < len(trees); i++ {
 		tree := trees[i]
 		treeName = tree.Name
 		if cbs.PreTree != nil {
 			cbs.PreTree(treeName, tree.ID)
 		}
-		if err := fs.TreeWalk(tree.ID, cbs.TreeWalkHandler); err != nil {
-			handleErr(nil, err)
-		}
+		fs.TreeWalk(
+			tree.ID,
+			func(err *btrfs.TreeError) { cbs.Err(&WalkError{TreeName: treeName, Err: err}) },
+			cbs.TreeWalkHandler,
+		)
 		if cbs.PostTree != nil {
 			cbs.PostTree(treeName, tree.ID)
 		}
-- 
cgit v1.2.3-2-g168b