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