diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-08-23 23:43:50 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-08-23 23:43:50 -0600 |
commit | 6f73ced9a723aa68694593ebc1bb4e1e621b2f2d (patch) | |
tree | 9c44158750eb7b26d0807e35e8c15ade6ca06fc5 /lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go | |
parent | 98c01381ed6dfc9085c946c2f0c720abad24ad10 (diff) |
Factor out SumsForLogicalRegion
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go')
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/rebuildmappings/csumitems.go | 27 |
1 files changed, 27 insertions, 0 deletions
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 +} |