From 6f73ced9a723aa68694593ebc1bb4e1e621b2f2d Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Tue, 23 Aug 2022 23:43:50 -0600
Subject: Factor out SumsForLogicalRegion

---
 .../btrfsinspect/rebuildmappings/csumitems.go      | 27 ++++++++++++++++++++++
 1 file changed, 27 insertions(+)

(limited to 'lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go')

diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go
index 90a15b0..eaa6f06 100644
--- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go
+++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go
@@ -15,6 +15,7 @@ import (
 	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
 	"git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect"
 	"git.lukeshu.com/btrfs-progs-ng/lib/maps"
+	"git.lukeshu.com/btrfs-progs-ng/lib/slices"
 )
 
 func MapLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevicesResult) btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr] {
@@ -90,3 +91,29 @@ func MapLogicalSums(ctx context.Context, scanResults btrfsinspect.ScanDevicesRes
 
 	return flattened
 }
+
+func SumsForLogicalRegion(sums btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr], beg btrfsvol.LogicalAddr, size btrfsvol.AddrDelta) btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr] {
+	runs := btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr]{
+		Addr: beg,
+		Size: size,
+	}
+	for laddr := beg; laddr < beg.Add(size); {
+		run, next, ok := sums.RunForAddr(laddr)
+		if !ok {
+			laddr = next
+			continue
+		}
+		off := int((laddr-run.Addr)/btrfssum.BlockSize) * run.ChecksumSize
+		deltaAddr := slices.Min[btrfsvol.AddrDelta](
+			size-laddr.Sub(beg),
+			btrfsvol.AddrDelta((len(run.Sums)-off)/run.ChecksumSize)*btrfssum.BlockSize)
+		deltaOff := int(deltaAddr/btrfssum.BlockSize) * run.ChecksumSize
+		runs.Runs = append(runs.Runs, btrfssum.SumRun[btrfsvol.LogicalAddr]{
+			ChecksumSize: run.ChecksumSize,
+			Addr:         laddr,
+			Sums:         run.Sums[off : off+deltaOff],
+		})
+		laddr = laddr.Add(deltaAddr)
+	}
+	return runs
+}
-- 
cgit v1.2.3-2-g168b