From 933220af61abd26cb660febac15ed214479e2ba7 Mon Sep 17 00:00:00 2001 From: Luke Shumaker 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/old_rebuilt_forrest.go') 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-54-g00ecf