diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/scanforextents/csums.go | 15 | ||||
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/scanforextents/scan.go | 10 |
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") |