summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go')
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go31
1 files changed, 14 insertions, 17 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go
index a98bf3f..bd390e0 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go
@@ -8,7 +8,6 @@ import (
"fmt"
"sort"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
@@ -20,12 +19,12 @@ type BlockGroup struct {
Flags btrfsvol.BlockGroupFlags
}
-func ReduceScanResults(fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) (map[btrfsvol.LogicalAddr]BlockGroup, error) {
- // Reduce
- bgSet := make(map[BlockGroup]struct{})
- for _, found := range scanResults {
- for _, bg := range found.FoundBlockGroups {
- bgSet[BlockGroup{
+func DedupBlockGroups(scanResults btrfsinspect.ScanDevicesResult) ([]BlockGroup, error) {
+ // Dedup
+ bgsSet := make(map[BlockGroup]struct{})
+ for _, devResults := range scanResults {
+ for _, bg := range devResults.FoundBlockGroups {
+ bgsSet[BlockGroup{
LAddr: btrfsvol.LogicalAddr(bg.Key.ObjectID),
Size: btrfsvol.AddrDelta(bg.Key.Offset),
Flags: bg.BG.Flags,
@@ -33,13 +32,15 @@ func ReduceScanResults(fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult)
}
}
- // Sanity check
- bgList := maps.Keys(bgSet)
- sort.Slice(bgList, func(i, j int) bool {
- return bgList[i].LAddr < bgList[j].LAddr
+ // Sort
+ bgsOrdered := maps.Keys(bgsSet)
+ sort.Slice(bgsOrdered, func(i, j int) bool {
+ return bgsOrdered[i].LAddr < bgsOrdered[j].LAddr
})
+
+ // Sanity check
var pos btrfsvol.LogicalAddr
- for _, bg := range bgList {
+ for _, bg := range bgsOrdered {
if bg.LAddr < pos || bg.Size < 0 {
return nil, fmt.Errorf("found block groups are inconsistent")
}
@@ -47,9 +48,5 @@ func ReduceScanResults(fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult)
}
// Return
- bgMap := make(map[btrfsvol.LogicalAddr]BlockGroup, len(bgSet))
- for bg := range bgSet {
- bgMap[bg.LAddr] = bg
- }
- return bgMap, nil
+ return bgsOrdered, nil
}