diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-01-05 19:48:27 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-01-05 19:48:27 -0700 |
commit | cd01485ec126c103fa9ab718685d184b70d0e1ff (patch) | |
tree | 0c003455bf0795a04e4fb198d2e85e2c7b63ffb3 /lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go | |
parent | f416f777b2c2cac095e851e6799020f91e34aed1 (diff) | |
parent | 3b385f26973e45b4c2e2f3ebf9d52ab0131cff5e (diff) |
Merge branch 'lukeshu/rebuild-nodes-take4'
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go')
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go index bf4c95d..9e40465 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild_graph.go @@ -7,11 +7,9 @@ package rebuildnodes import ( "context" "fmt" - "reflect" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" ) @@ -20,11 +18,33 @@ type rebuildCallbacks interface { fsErr(ctx context.Context, e error) want(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType) wantOff(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, off uint64) - wantFunc(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, typ btrfsprim.ItemType, fn func(btrfsitem.Item) bool) - wantCSum(ctx context.Context, reason string, beg, end btrfsvol.LogicalAddr) // interval is [beg, end) + wantDirIndex(ctx context.Context, reason string, treeID btrfsprim.ObjID, objID btrfsprim.ObjID, name []byte) + wantCSum(ctx context.Context, reason string, inodeTree, inodeItem btrfsprim.ObjID, beg, end btrfsvol.LogicalAddr) // interval is [beg, end) 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 @@ -65,13 +85,10 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID, // siblings switch item.Key.ItemType { case btrfsitem.DIR_ITEM_KEY: - o.wantFunc(ctx, "corresponding DIR_INDEX", + o.wantDirIndex(ctx, "corresponding DIR_INDEX", treeID, item.Key.ObjectID, - btrfsitem.DIR_INDEX_KEY, - func(peerItem btrfsitem.Item) bool { - return reflect.DeepEqual(item, peerItem) - }) + body.Name) case btrfsitem.DIR_INDEX_KEY: o.wantOff(ctx, "corresponding DIR_ITEM", treeID, @@ -169,10 +186,11 @@ func handleItem(o rebuildCallbacks, ctx context.Context, treeID btrfsprim.ObjID, case btrfsitem.FILE_EXTENT_INLINE: // nothing case btrfsitem.FILE_EXTENT_REG, btrfsitem.FILE_EXTENT_PREALLOC: - // TODO: Check if inodeBody.Flags.Has(btrfsitem.INODE_NODATASUM) + // NB: o.wantCSum checks inodeBody.Flags.Has(btrfsitem.INODE_NODATASUM) for us. o.wantCSum(ctx, "data sum", - roundDown(body.BodyExtent.DiskByteNr, btrfssum.BlockSize), - roundUp(body.BodyExtent.DiskByteNr.Add(body.BodyExtent.DiskNumBytes), btrfssum.BlockSize)) + treeID, item.Key.ObjectID, + body.BodyExtent.DiskByteNr, + body.BodyExtent.DiskByteNr.Add(body.BodyExtent.DiskNumBytes)) default: o.fsErr(ctx, fmt.Errorf("FileExtent: unexpected body.Type=%v", body.Type)) } |