From fc06704c55e82818b652210dde3b7b6902fac10a Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 6 Oct 2022 01:26:27 -0600 Subject: let skinny paths get evicted --- lib/btrfsprogs/btrfsutil/broken_btree.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'lib/btrfsprogs/btrfsutil/broken_btree.go') diff --git a/lib/btrfsprogs/btrfsutil/broken_btree.go b/lib/btrfsprogs/btrfsutil/broken_btree.go index c636b8e..8d1c333 100644 --- a/lib/btrfsprogs/btrfsutil/broken_btree.go +++ b/lib/btrfsprogs/btrfsutil/broken_btree.go @@ -67,7 +67,7 @@ type brokenTrees struct { ctx context.Context inner *btrfs.FS - arena SkinnyPathArena + arena *SkinnyPathArena // btrfsprim.ROOT_TREE_OBJECTID rootTreeMu sync.Mutex @@ -110,6 +110,7 @@ func NewBrokenTrees(ctx context.Context, inner *btrfs.FS) interface { func (bt *brokenTrees) treeIndex(treeID btrfsprim.ObjID) treeIndex { var treeRoot *btrfstree.TreeRoot + var sb *btrfstree.Superblock var err error if treeID == btrfsprim.ROOT_TREE_OBJECTID { bt.rootTreeMu.Lock() @@ -117,7 +118,6 @@ func (bt *brokenTrees) treeIndex(treeID btrfsprim.ObjID) treeIndex { if bt.rootTreeIndex != nil { return *bt.rootTreeIndex } - var sb *btrfstree.Superblock sb, err = bt.inner.Superblock() if err == nil { treeRoot, err = btrfstree.LookupTreeRoot(bt.inner, *sb, treeID) @@ -131,13 +131,22 @@ func (bt *brokenTrees) treeIndex(treeID btrfsprim.ObjID) treeIndex { if cacheEntry, exists := bt.treeIndexes[treeID]; exists { return cacheEntry } - var sb *btrfstree.Superblock sb, err = bt.inner.Superblock() if err == nil { treeRoot, err = btrfstree.LookupTreeRoot(bt, *sb, treeID) } } - cacheEntry := newTreeIndex(&bt.arena) + if bt.arena == nil { + var _sb btrfstree.Superblock + if sb != nil { + _sb = *sb + } + bt.arena = &SkinnyPathArena{ + FS: bt.inner, + SB: _sb, + } + } + cacheEntry := newTreeIndex(bt.arena) if err != nil { cacheEntry.TreeRootErr = err } else { -- cgit v1.2.3-2-g168b