diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-10-06 01:26:27 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-10-06 09:11:18 -0600 |
commit | fc06704c55e82818b652210dde3b7b6902fac10a (patch) | |
tree | 1a9d65d95d78e797a1ffbbb43522208fed1c7538 /lib/btrfsprogs/btrfsutil/broken_btree.go | |
parent | f0a73ec8d2742da62c09c824cf4b001f05e4a717 (diff) |
let skinny paths get evicted
Diffstat (limited to 'lib/btrfsprogs/btrfsutil/broken_btree.go')
-rw-r--r-- | lib/btrfsprogs/btrfsutil/broken_btree.go | 17 |
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 { |