diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-16 20:13:13 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-16 20:13:13 -0600 |
commit | 2be1697ef0ec7ce1f364986a22ecdc404a6e7574 (patch) | |
tree | 6691db87343f432ca663c7284faed010136b0d51 /lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go | |
parent | 8edb8ab9ac42e9bfb851b3bc41509e782555f053 (diff) |
better algo
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go')
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/scanforextents/gaps.go | 30 |
1 files changed, 13 insertions, 17 deletions
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 } |