From ca4a23bc3c088b6a0222f7bf2c2bae5a3d7f9959 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 4 Mar 2023 09:42:44 -0700 Subject: btrfsutil: RebuiltForrest: Naively implement the new btrfs.ReadableFS API --- lib/btrfsutil/rebuilt_forrest.go | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'lib/btrfsutil/rebuilt_forrest.go') diff --git a/lib/btrfsutil/rebuilt_forrest.go b/lib/btrfsutil/rebuilt_forrest.go index a4ae727..b935d85 100644 --- a/lib/btrfsutil/rebuilt_forrest.go +++ b/lib/btrfsutil/rebuilt_forrest.go @@ -12,6 +12,7 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" "git.lukeshu.com/btrfs-progs-ng/lib/containers" "git.lukeshu.com/btrfs-progs-ng/lib/maps" @@ -172,7 +173,7 @@ func (ts *RebuiltForrest) rebuildTree(ctx context.Context, treeID btrfsprim.ObjI default: rootOff, rootItem, ok := ts.cb.LookupRoot(ctx, treeID) if !ok { - ts.trees[treeID].rootErr = fmt.Errorf("failed to look up ROOT_ITEM") + ts.trees[treeID].rootErr = btrfstree.ErrNoTree return } root = rootItem.ByteNr @@ -228,3 +229,40 @@ func (ts *RebuiltForrest) RebuiltListRoots(ctx context.Context) map[btrfsprim.Ob } return ret } + +// btrfs.ReadableFS interface ////////////////////////////////////////////////////////////////////////////////////////// + +var _ btrfs.ReadableFS = (*RebuiltForrest)(nil) + +// Name implements btrfs.ReadableFS. +func (ts *RebuiltForrest) Name() string { + return ts.inner.Name() +} + +// ForrestLookup implements btrfstree.Forrest (and btrfs.ReadableFS). +// +// It is identical to .RebuiltTree(), but returns an interface rather +// than a concrete type. +func (ts *RebuiltForrest) ForrestLookup(ctx context.Context, treeID btrfsprim.ObjID) (btrfstree.Tree, error) { + return ts.RebuiltTree(ctx, treeID) +} + +// Superblock implements btrfstree.NodeSource (and btrfs.ReadableFS). +func (ts *RebuiltForrest) Superblock() (*btrfstree.Superblock, error) { + return ts.inner.Superblock() +} + +// AcquireNode implements btrfstree.NodeSource (and btrfs.ReadableFS). +func (ts *RebuiltForrest) AcquireNode(ctx context.Context, addr btrfsvol.LogicalAddr, exp btrfstree.NodeExpectations) (*btrfstree.Node, error) { + return ts.inner.AcquireNode(ctx, addr, exp) +} + +// ReleaseNode implements btrfstree.NodeSource (and btrfs.ReadableFS). +func (ts *RebuiltForrest) ReleaseNode(node *btrfstree.Node) { + ts.inner.ReleaseNode(node) +} + +// ReadAt implements diskio.ReaderAt[btrfsvol.LogicalAddr] (and btrfs.ReadableFS). +func (ts *RebuiltForrest) ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error) { + return ts.inner.ReadAt(p, off) +} -- cgit v1.2.3-2-g168b