From 2be1697ef0ec7ce1f364986a22ecdc404a6e7574 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 16 Jul 2022 20:13:13 -0600 Subject: better algo --- lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go | 30 ++++++++++------------ 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go') diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go b/lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go index f67b498..5963e53 100644 --- a/lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go +++ b/lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go @@ -12,6 +12,7 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/maps" ) type PhysicalGap struct { @@ -53,30 +54,25 @@ func roundUp[T constraints.Integer](x, multiple T) T { } func WalkGaps(ctx context.Context, - gaps []PhysicalGap, blockSize btrfsvol.PhysicalAddr, - progress func(cur, total int64), - main func(btrfsvol.PhysicalAddr) error, + sums AllSums, gaps map[btrfsvol.DeviceID][]PhysicalGap, + fn func(btrfsvol.DeviceID, SumRun[btrfsvol.PhysicalAddr]) error, ) error { - var totalBlocks int64 - for _, gap := range gaps { - for paddr := roundUp(gap.Beg, blockSize); paddr+blockSize <= gap.End; paddr += blockSize { - totalBlocks++ - } - } - - var curBlock int64 - for _, gap := range gaps { - for paddr := roundUp(gap.Beg, blockSize); paddr+blockSize <= gap.End; paddr += blockSize { + for _, devID := range maps.SortedKeys(gaps) { + for _, gap := range gaps[devID] { if err := ctx.Err(); err != nil { return err } - progress(curBlock, totalBlocks) - curBlock++ - if err := main(paddr); err != nil { + begAddr := roundUp(gap.Beg, csumBlockSize) + begOff := int(begAddr/csumBlockSize) * sums.Physical[devID].ChecksumSize + endOff := int(gap.End/csumBlockSize) * sums.Physical[devID].ChecksumSize + if err := fn(devID, SumRun[btrfsvol.PhysicalAddr]{ + ChecksumSize: sums.Physical[devID].ChecksumSize, + Addr: begAddr, + Sums: sums.Physical[devID].Sums[begOff:endOff], + }); err != nil { return err } } } - progress(curBlock, totalBlocks) return nil } -- cgit v1.2.3-2-g168b