summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-08-23 23:41:24 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-08-23 23:42:55 -0600
commit98c01381ed6dfc9085c946c2f0c720abad24ad10 (patch)
tree0b385b1e77207d66dd4603a5883a81abbd24ea52
parent8608bd1db4c855e9f25f34f443802864859c14b6 (diff)
Begone with allsums.go
-rw-r--r--lib/btrfs/btrfssum/shortsum.go23
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go56
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go13
-rw-r--r--lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go11
4 files changed, 38 insertions, 65 deletions
diff --git a/lib/btrfs/btrfssum/shortsum.go b/lib/btrfs/btrfssum/shortsum.go
index 2d995b5..537e0ce 100644
--- a/lib/btrfs/btrfssum/shortsum.go
+++ b/lib/btrfs/btrfssum/shortsum.go
@@ -8,6 +8,7 @@ import (
"context"
"fmt"
"io"
+ "math"
"strings"
"git.lukeshu.com/go/lowmemjson"
@@ -175,6 +176,19 @@ func (sg SumRunWithGaps[Addr]) PctFull() float64 {
return float64(full) / float64(total)
}
+func (sg SumRunWithGaps[Addr]) RunForAddr(addr Addr) (SumRun[Addr], Addr, bool) {
+ for _, run := range sg.Runs {
+ if run.Addr > addr {
+ return SumRun[Addr]{}, run.Addr, false
+ }
+ if run.Addr.Add(run.Size()) <= addr {
+ continue
+ }
+ return run, 0, true
+ }
+ return SumRun[Addr]{}, math.MaxInt64, false
+}
+
func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) {
if addr < sg.Addr || addr >= sg.Addr.Add(sg.Size) {
return "", io.EOF
@@ -192,6 +206,15 @@ func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) {
return "", diskio.ErrWildcard
}
+func (sg SumRunWithGaps[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) error {
+ for _, run := range sg.Runs {
+ if err := run.Walk(ctx, fn); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
// Get implements diskio.Sequence[int, ShortSum]
func (sg SumRunWithGaps[Addr]) Get(sumIdx int64) (ShortSum, error) {
addr := sg.Addr.Add(btrfsvol.AddrDelta(sumIdx) * BlockSize)
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go
deleted file mode 100644
index 58ba018..0000000
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
-//
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-package rebuildmappings
-
-import (
- "context"
- "math"
-
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
-)
-
-type AllSums struct {
- Logical []btrfssum.SumRun[btrfsvol.LogicalAddr]
- Physical map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr]
-}
-
-func (as AllSums) SumForPAddr(paddr btrfsvol.QualifiedPhysicalAddr) (btrfssum.ShortSum, bool) {
- run, ok := as.Physical[paddr.Dev]
- if !ok {
- return "", false
- }
- return run.SumForAddr(paddr.Addr)
-}
-
-func (as AllSums) RunForLAddr(laddr btrfsvol.LogicalAddr) (btrfssum.SumRun[btrfsvol.LogicalAddr], btrfsvol.LogicalAddr, bool) {
- for _, run := range as.Logical {
- if run.Addr > laddr {
- return btrfssum.SumRun[btrfsvol.LogicalAddr]{}, run.Addr, false
- }
- if run.Addr.Add(run.Size()) <= laddr {
- continue
- }
- return run, 0, true
- }
- return btrfssum.SumRun[btrfsvol.LogicalAddr]{}, math.MaxInt64, false
-}
-
-func (as AllSums) SumForLAddr(laddr btrfsvol.LogicalAddr) (btrfssum.ShortSum, bool) {
- run, _, ok := as.RunForLAddr(laddr)
- if !ok {
- return "", false
- }
- return run.SumForAddr(laddr)
-}
-
-func (as AllSums) WalkLogical(ctx context.Context, fn func(btrfsvol.LogicalAddr, btrfssum.ShortSum) error) error {
- for _, run := range as.Logical {
- if err := run.Walk(ctx, fn); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go
index 6b4cbe7..5915e12 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go
@@ -19,7 +19,12 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
)
-func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.LogicalAddr]BlockGroup, sums AllSums) error {
+func ScanForExtents(ctx context.Context,
+ fs *btrfs.FS,
+ blockgroups map[btrfsvol.LogicalAddr]BlockGroup,
+ physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr],
+ logicalSums btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr],
+) error {
dlog.Info(ctx, "Pairing up blockgroups and sums...")
bgSums := make(map[btrfsvol.LogicalAddr]btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr])
for i, bgLAddr := range maps.SortedKeys(blockgroups) {
@@ -29,7 +34,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
Size: blockgroup.Size,
}
for laddr := blockgroup.LAddr; laddr < blockgroup.LAddr.Add(blockgroup.Size); {
- run, next, ok := sums.RunForLAddr(laddr)
+ run, next, ok := logicalSums.RunForAddr(laddr)
if !ok {
laddr = next
continue
@@ -63,7 +68,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
continue
}
- if err := WalkUnmappedPhysicalRegions(ctx, sums, gaps, func(devID btrfsvol.DeviceID, gap btrfssum.SumRun[btrfsvol.PhysicalAddr]) error {
+ if err := WalkUnmappedPhysicalRegions(ctx, physicalSums, gaps, func(devID btrfsvol.DeviceID, gap btrfssum.SumRun[btrfsvol.PhysicalAddr]) error {
matches, err := diskio.IndexAll[int64, btrfssum.ShortSum](gap, bgRun)
if err != nil {
return err
@@ -114,7 +119,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
dlog.Info(ctx, "Reverse-indexing remaining unmapped logical sums...")
sum2laddrs := make(map[btrfssum.ShortSum][]btrfsvol.LogicalAddr)
var numUnmappedBlocks int64
- if err := sums.WalkLogical(ctx, func(laddr btrfsvol.LogicalAddr, sum btrfssum.ShortSum) error {
+ if err := logicalSums.Walk(ctx, func(laddr btrfsvol.LogicalAddr, sum btrfssum.ShortSum) error {
var dat [btrfssum.BlockSize]byte
if _, err := fs.ReadAt(dat[:], laddr); err != nil {
if errors.Is(err, btrfsvol.ErrCouldNotMap) {
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go
index 79a14bf..1bac127 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go
@@ -55,7 +55,8 @@ func roundUp[T constraints.Integer](x, multiple T) T {
}
func WalkUnmappedPhysicalRegions(ctx context.Context,
- sums AllSums, gaps map[btrfsvol.DeviceID][]PhysicalRegion,
+ physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr],
+ gaps map[btrfsvol.DeviceID][]PhysicalRegion,
fn func(btrfsvol.DeviceID, btrfssum.SumRun[btrfsvol.PhysicalAddr]) error,
) error {
for _, devID := range maps.SortedKeys(gaps) {
@@ -64,12 +65,12 @@ func WalkUnmappedPhysicalRegions(ctx context.Context,
return err
}
begAddr := roundUp(gap.Beg, btrfssum.BlockSize)
- begOff := int(begAddr/btrfssum.BlockSize) * sums.Physical[devID].ChecksumSize
- endOff := int(gap.End/btrfssum.BlockSize) * sums.Physical[devID].ChecksumSize
+ begOff := int(begAddr/btrfssum.BlockSize) * physicalSums[devID].ChecksumSize
+ endOff := int(gap.End/btrfssum.BlockSize) * physicalSums[devID].ChecksumSize
if err := fn(devID, btrfssum.SumRun[btrfsvol.PhysicalAddr]{
- ChecksumSize: sums.Physical[devID].ChecksumSize,
+ ChecksumSize: physicalSums[devID].ChecksumSize,
Addr: begAddr,
- Sums: sums.Physical[devID].Sums[begOff:endOff],
+ Sums: physicalSums[devID].Sums[begOff:endOff],
}); err != nil {
return err
}