summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-rec/inspect/rebuildtrees/scan.go')
-rw-r--r--cmd/btrfs-rec/inspect/rebuildtrees/scan.go43
1 files changed, 33 insertions, 10 deletions
diff --git a/cmd/btrfs-rec/inspect/rebuildtrees/scan.go b/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
index b1469ff..72557ea 100644
--- a/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
+++ b/cmd/btrfs-rec/inspect/rebuildtrees/scan.go
@@ -31,14 +31,21 @@ type FlagsAndErr struct {
Err error
}
-type ScanDevicesResult struct {
- Superblock btrfstree.Superblock
+// ExtentDataRefPtr is a pointer to a *btrfsitem.ExtentDataRef,
+// whether it be to an EXTENT_DATA_REF item proper, or to an inline
+// ref inside of another EXTENT_ITEM or METADATA_ITEM.
+type ExtentDataRefPtr struct {
+ btrfsutil.ItemPtr
+ RefNum int // Only for EXTENT_ITEM and METADATA_ITEM
+}
+type ScanDevicesResult struct {
Graph btrfsutil.Graph
- Flags map[btrfsutil.ItemPtr]FlagsAndErr // INODE_ITEM
- Names map[btrfsutil.ItemPtr][]byte // DIR_INDEX
- Sizes map[btrfsutil.ItemPtr]SizeAndErr // EXTENT_CSUM and EXTENT_DATA
+ Flags map[btrfsutil.ItemPtr]FlagsAndErr // INODE_ITEM
+ Names map[btrfsutil.ItemPtr][]byte // DIR_INDEX
+ Sizes map[btrfsutil.ItemPtr]SizeAndErr // EXTENT_CSUM and EXTENT_DATA
+ DataBackrefs map[btrfsutil.ItemPtr][]btrfsprim.ObjID // EXTENT_DATA_REF, EXTENT_ITEM, and METADATA_ITEM
}
func ScanDevices(_ctx context.Context, fs *btrfs.FS, nodeList []btrfsvol.LogicalAddr) (ScanDevicesResult, error) {
@@ -53,12 +60,12 @@ func ScanDevices(_ctx context.Context, fs *btrfs.FS, nodeList []btrfsvol.Logical
// read-roots //////////////////////////////////////////////////////////////////
ctx = dlog.WithField(_ctx, "btrfs.inspect.rebuild-trees.read.substep", "read-roots")
ret := ScanDevicesResult{
- Superblock: *sb,
-
Graph: btrfsutil.NewGraph(ctx, *sb),
- Flags: make(map[btrfsutil.ItemPtr]FlagsAndErr),
- Names: make(map[btrfsutil.ItemPtr][]byte),
- Sizes: make(map[btrfsutil.ItemPtr]SizeAndErr),
+
+ Flags: make(map[btrfsutil.ItemPtr]FlagsAndErr),
+ Names: make(map[btrfsutil.ItemPtr][]byte),
+ Sizes: make(map[btrfsutil.ItemPtr]SizeAndErr),
+ DataBackrefs: make(map[btrfsutil.ItemPtr][]btrfsprim.ObjID),
}
// read-nodes //////////////////////////////////////////////////////////////////
@@ -132,6 +139,22 @@ func (o *ScanDevicesResult) insertNode(node *btrfstree.Node) {
Size: uint64(size),
Err: err,
}
+ case *btrfsitem.Extent:
+ o.DataBackrefs[ptr] = make([]btrfsprim.ObjID, len(itemBody.Refs))
+ for i, ref := range itemBody.Refs {
+ if refBody, ok := ref.Body.(*btrfsitem.ExtentDataRef); ok {
+ o.DataBackrefs[ptr][i] = refBody.Root
+ }
+ }
+ case *btrfsitem.Metadata:
+ o.DataBackrefs[ptr] = make([]btrfsprim.ObjID, len(itemBody.Refs))
+ for i, ref := range itemBody.Refs {
+ if refBody, ok := ref.Body.(*btrfsitem.ExtentDataRef); ok {
+ o.DataBackrefs[ptr][i] = refBody.Root
+ }
+ }
+ case *btrfsitem.ExtentDataRef:
+ o.DataBackrefs[ptr] = []btrfsprim.ObjID{itemBody.Root}
case *btrfsitem.Error:
switch item.Key.ItemType {
case btrfsprim.INODE_ITEM_KEY: