summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsinspect
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-16 21:43:41 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-16 21:43:41 -0600
commit35e80a0c76be663f5ba710c2884e9508afa58ce2 (patch)
tree555607919a5679b8c68a2d2c5800fa687bd5c05a /lib/btrfsprogs/btrfsinspect
parent2be1697ef0ec7ce1f364986a22ecdc404a6e7574 (diff)
fix, sorta
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect')
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/csums.go15
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/scan.go10
2 files changed, 14 insertions, 11 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go b/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go
index 10b70aa..3a3192d 100644
--- a/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go
+++ b/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go
@@ -8,6 +8,7 @@ import (
"context"
"encoding/gob"
"io"
+ "math"
"os"
"runtime"
"strings"
@@ -53,7 +54,7 @@ func (run SumRun[Addr]) Size() btrfsvol.AddrDelta {
// Get implements diskio.Sequence[int, ShortSum]
func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) {
- if sumIdx < 0 || int(sumIdx) > run.NumSums() {
+ if sumIdx < 0 || int(sumIdx) >= run.NumSums() {
return "", io.EOF
}
off := int(sumIdx) * run.ChecksumSize
@@ -95,21 +96,21 @@ func (as AllSums) SumForPAddr(paddr btrfsvol.QualifiedPhysicalAddr) (ShortSum, b
return run.SumForAddr(paddr.Addr)
}
-func (as AllSums) RunForLAddr(laddr btrfsvol.LogicalAddr) (SumRun[btrfsvol.LogicalAddr], bool) {
+func (as AllSums) RunForLAddr(laddr btrfsvol.LogicalAddr) (SumRun[btrfsvol.LogicalAddr], btrfsvol.LogicalAddr, bool) {
for _, run := range as.Logical {
if run.Addr > laddr {
- return SumRun[btrfsvol.LogicalAddr]{}, false
+ return SumRun[btrfsvol.LogicalAddr]{}, run.Addr, false
}
if run.Addr.Add(run.Size()) <= laddr {
continue
}
- return run, true
+ return run, 0, true
}
- return SumRun[btrfsvol.LogicalAddr]{}, false
+ return SumRun[btrfsvol.LogicalAddr]{}, math.MaxInt64, false
}
func (as AllSums) SumForLAddr(laddr btrfsvol.LogicalAddr) (ShortSum, bool) {
- run, ok := as.RunForLAddr(laddr)
+ run, _, ok := as.RunForLAddr(laddr)
if !ok {
return "", false
}
@@ -180,7 +181,7 @@ func SumEverything(ctx context.Context, fs *btrfs.FS) (AllSums, error) {
for i, sum := range body.Sums {
laddr := btrfsvol.LogicalAddr(item.Key.Offset) + (btrfsvol.LogicalAddr(i) * csumBlockSize)
- if laddr != curAddr {
+ if laddr != curAddr+(btrfsvol.LogicalAddr(curSums.Len()/csumSize)*csumBlockSize) {
if curSums.Len() > 0 {
ret.Logical = append(ret.Logical, SumRun[btrfsvol.LogicalAddr]{
ChecksumSize: csumSize,
diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go b/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
index 12ade04..3aeb05a 100644
--- a/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
+++ b/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
@@ -21,11 +21,12 @@ import (
func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.LogicalAddr]BlockGroup, sums AllSums) error {
dlog.Info(ctx, "Pairing up blockgroups and sums...")
bgSums := make(map[btrfsvol.LogicalAddr][]SumRun[btrfsvol.LogicalAddr])
- for _, blockgroup := range blockgroups {
+ for i, bgLAddr := range maps.SortedKeys(blockgroups) {
+ blockgroup := blockgroups[bgLAddr]
for laddr := blockgroup.LAddr; laddr < blockgroup.LAddr.Add(blockgroup.Size); {
- run, ok := sums.RunForLAddr(laddr)
+ run, next, ok := sums.RunForLAddr(laddr)
if !ok {
- laddr += csumBlockSize
+ laddr = next
continue
}
off := int((laddr-run.Addr)/csumBlockSize) * run.ChecksumSize
@@ -40,7 +41,8 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
})
laddr = laddr.Add(deltaAddr)
}
- return nil
+ dlog.Infof(ctx, "... (%v/%v) blockgroup[laddr=%v] has %v runs",
+ i+1, len(blockgroups), bgLAddr, len(bgSums[blockgroup.LAddr]))
}
dlog.Info(ctx, "... done pairing")