summaryrefslogtreecommitdiff
path: root/lib/btrfs/btrfstree
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-03-29 10:00:18 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-03-30 10:03:50 -0600
commit94aa0ec3e9f7145cdf177ad6f6d3d8b7d5bdbef7 (patch)
tree2e0bafd99a433d7271bf42e68ab1b5c1eba99e2b /lib/btrfs/btrfstree
parent2eb7033431866cb05d235eb10c280a4810bf88a7 (diff)
btrfstree: Change the NodeSource API so that it can do caching
Diffstat (limited to 'lib/btrfs/btrfstree')
-rw-r--r--lib/btrfs/btrfstree/btree.go3
-rw-r--r--lib/btrfs/btrfstree/btree_tree.go4
-rw-r--r--lib/btrfs/btrfstree/types_node.go4
3 files changed, 7 insertions, 4 deletions
diff --git a/lib/btrfs/btrfstree/btree.go b/lib/btrfs/btrfstree/btree.go
index dde485a..4f5d21b 100644
--- a/lib/btrfs/btrfstree/btree.go
+++ b/lib/btrfs/btrfstree/btree.go
@@ -97,5 +97,6 @@ func (e *TreeError) Error() string {
type NodeSource interface {
Superblock() (*Superblock, error)
- ReadNode(ctx context.Context, addr btrfsvol.LogicalAddr, exp NodeExpectations) (*Node, error)
+ AcquireNode(ctx context.Context, addr btrfsvol.LogicalAddr, exp NodeExpectations) (*Node, error)
+ ReleaseNode(*Node)
}
diff --git a/lib/btrfs/btrfstree/btree_tree.go b/lib/btrfs/btrfstree/btree_tree.go
index a6311f9..86eab11 100644
--- a/lib/btrfs/btrfstree/btree_tree.go
+++ b/lib/btrfs/btrfstree/btree_tree.go
@@ -46,8 +46,8 @@ func (tree *RawTree) walk(ctx context.Context, path Path, cbs TreeWalkHandler) {
if !ok {
return
}
- node, err := tree.Forrest.NodeSource.ReadNode(ctx, nodeAddr, nodeExp)
- defer node.Free()
+ node, err := tree.Forrest.NodeSource.AcquireNode(ctx, nodeAddr, nodeExp)
+ defer tree.Forrest.NodeSource.ReleaseNode(node)
if ctx.Err() != nil {
return
}
diff --git a/lib/btrfs/btrfstree/types_node.go b/lib/btrfs/btrfstree/types_node.go
index 082be2c..e29431f 100644
--- a/lib/btrfs/btrfstree/types_node.go
+++ b/lib/btrfs/btrfstree/types_node.go
@@ -308,7 +308,9 @@ type ItemHeader struct {
var itemPool containers.SlicePool[Item]
-func (node *Node) Free() {
+// RawFree is for low-level use by caches; don't use .RawFree, use
+// ReleaseNode.
+func (node *Node) RawFree() {
if node == nil {
return
}