summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsinspect/rebuildnodes
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-01-02 17:32:23 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-01-05 19:48:17 -0700
commit06157a3a8259bb0fc5f806aac3bbde79e95a54fd (patch)
treefbd5098150ff41fbd968cd447d069d6159696af5 /lib/btrfsprogs/btrfsinspect/rebuildnodes
parentc3d08003a7fbffea3b2b95600ddbf5a1be4fde83 (diff)
rebuildnodes: Avoid i/o reading items for which handleItem is a no-op
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildnodes')
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go3
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go22
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go
index 0116abb..80db817 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go
@@ -259,6 +259,9 @@ func (o *rebuilder) enqueueRetry() {
}
func (o *rebuilder) cbAddedItem(ctx context.Context, tree btrfsprim.ObjID, key btrfsprim.Key) {
+ if handleWouldBeNoOp(key.ItemType) {
+ return
+ }
o.itemQueue.Insert(keyAndTree{
TreeID: tree,
Key: key,
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go
index 294f391..9e40465 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go
@@ -23,6 +23,28 @@ type rebuildCallbacks interface {
wantFileExt(ctx context.Context, reason string, treeID btrfsprim.ObjID, ino btrfsprim.ObjID, size int64)
}
+// handleWouldBeNoOp returns whether or not a call to handleItem for a
+// given item type would be a no-op.
+func handleWouldBeNoOp(typ btrfsprim.ItemType) bool {
+ switch typ {
+ case // btrfsitem.Dev
+ btrfsprim.DEV_ITEM_KEY,
+ // btrfsitem.DevStats
+ btrfsprim.PERSISTENT_ITEM_KEY,
+ // btrfsitem.Empty
+ btrfsprim.ORPHAN_ITEM_KEY,
+ btrfsprim.TREE_BLOCK_REF_KEY,
+ btrfsprim.SHARED_BLOCK_REF_KEY,
+ btrfsprim.FREE_SPACE_EXTENT_KEY,
+ btrfsprim.QGROUP_RELATION_KEY,
+ // btrfsite.ExtentCSum
+ btrfsprim.EXTENT_CSUM_KEY:
+ return true
+ default:
+ return false
+ }
+}
+
func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID, item btrfstree.Item) {
// Notionally, just express the relationships shown in
// https://btrfs.wiki.kernel.org/index.php/File:References.png (from the page