summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsutil/broken_btree.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-10-06 01:26:27 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-10-06 09:11:18 -0600
commitfc06704c55e82818b652210dde3b7b6902fac10a (patch)
tree1a9d65d95d78e797a1ffbbb43522208fed1c7538 /lib/btrfsprogs/btrfsutil/broken_btree.go
parentf0a73ec8d2742da62c09c824cf4b001f05e4a717 (diff)
let skinny paths get evicted
Diffstat (limited to 'lib/btrfsprogs/btrfsutil/broken_btree.go')
-rw-r--r--lib/btrfsprogs/btrfsutil/broken_btree.go17
1 files changed, 13 insertions, 4 deletions
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 {