From 933220af61abd26cb660febac15ed214479e2ba7 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Sat, 18 Mar 2023 00:49:01 -0400
Subject: btrfsutil: OldRebuiltForrest: Implement the new btrfstree.Forrest

---
 lib/btrfsutil/old_rebuilt_forrest.go | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

(limited to 'lib/btrfsutil')

diff --git a/lib/btrfsutil/old_rebuilt_forrest.go b/lib/btrfsutil/old_rebuilt_forrest.go
index e853be7..a462a60 100644
--- a/lib/btrfsutil/old_rebuilt_forrest.go
+++ b/lib/btrfsutil/old_rebuilt_forrest.go
@@ -96,7 +96,10 @@ type OldRebuiltForrest struct {
 	trees   map[btrfsprim.ObjID]oldRebuiltTree
 }
 
-var _ btrfstree.TreeOperator = (*OldRebuiltForrest)(nil)
+var (
+	_ btrfstree.TreeOperator = (*OldRebuiltForrest)(nil)
+	_ btrfs.ReadableFS       = (*OldRebuiltForrest)(nil)
+)
 
 // NewOldRebuiltForrest wraps a *btrfs.FS to support looking up
 // information from broken trees.
@@ -123,8 +126,18 @@ func NewOldRebuiltForrest(ctx context.Context, inner *btrfs.FS) *OldRebuiltForre
 	}
 }
 
-// RebuiltTree returns a handle for an individual tree.  An error is
-// indicated by the ret.RootErr member.
+// ForrestLookup implements btrfstree.Forrest.
+func (bt *OldRebuiltForrest) ForrestLookup(ctx context.Context, treeID btrfsprim.ObjID) (btrfstree.Tree, error) {
+	tree := bt.RebuiltTree(ctx, treeID)
+	if tree.RootErr != nil {
+		return nil, tree.RootErr
+	}
+	return tree, nil
+}
+
+// RebuiltTree is a variant of ForrestLookup that returns a concrete
+// type instead of an interface.  An error is indicated by the
+// ret.RootErr member.
 func (bt *OldRebuiltForrest) RebuiltTree(ctx context.Context, treeID btrfsprim.ObjID) oldRebuiltTree {
 	if treeID == btrfsprim.ROOT_TREE_OBJECTID {
 		bt.rootTreeMu.Lock()
@@ -439,6 +452,11 @@ func (bt *OldRebuiltForrest) ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, er
 	return bt.inner.ReadAt(p, off)
 }
 
+// Name implements btrfs.ReadableFS.
+func (bt *OldRebuiltForrest) Name() string {
+	return bt.inner.Name()
+}
+
 // TreeCheckOwner implements btrfstree.Tree.
 func (tree oldRebuiltTree) TreeCheckOwner(ctx context.Context, failOpen bool, owner btrfsprim.ObjID, gen btrfsprim.Generation) error {
 	var uuidTree oldRebuiltTree
-- 
cgit v1.2.3-2-g168b