summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-08-23 21:28:00 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-08-23 21:28:00 -0600
commitbdbf9c6fa89a0e76b48cc695baeb93652513f34d (patch)
tree0006a281cefeef91d9839629016ef42de0dfc2c9
parent9c46c8d8b447ff5e0a5ee688b15ef23034e6ce30 (diff)
Combine duplicated code
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/blockgroups.go31
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go30
2 files changed, 18 insertions, 43 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
}
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go
index ce3b7ed..05aff72 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/rebuildmappings.go
@@ -7,7 +7,6 @@ package rebuildmappings
import (
"context"
"fmt"
- "sort"
"github.com/datawire/dlib/dlog"
@@ -26,30 +25,6 @@ func getNodeSize(fs *btrfs.FS) (btrfsvol.AddrDelta, error) {
return btrfsvol.AddrDelta(sb.NodeSize), nil
}
-type blockgroup struct {
- LAddr btrfsvol.LogicalAddr
- Size btrfsvol.AddrDelta
- Flags btrfsvol.BlockGroupFlags
-}
-
-func dedupBlockGroups(scanResults btrfsinspect.ScanDevicesResult) []blockgroup {
- 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,
- }] = struct{}{}
- }
- }
- bgsOrdered := maps.Keys(bgsSet)
- sort.Slice(bgsOrdered, func(i, j int) bool {
- return bgsOrdered[i].LAddr < bgsOrdered[j].LAddr
- })
- return bgsOrdered
-}
-
func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.ScanDevicesResult) error {
nodeSize, err := getNodeSize(fs)
if err != nil {
@@ -133,7 +108,10 @@ func RebuildMappings(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect
// First dedup them, because they change for allocations and
// CoW means that they'll bounce around a lot, so you likely
// have oodles of duplicates?
- bgsOrdered := dedupBlockGroups(scanResults)
+ bgsOrdered, err := DedupBlockGroups(scanResults)
+ if err != nil {
+ return err
+ }
for _, bg := range bgsOrdered {
otherLAddr, otherPAddr := fs.LV.ResolveAny(bg.LAddr, bg.Size)
if otherLAddr < 0 || otherPAddr.Addr < 0 {