From 98c01381ed6dfc9085c946c2f0c720abad24ad10 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 23 Aug 2022 23:41:24 -0600 Subject: Begone with allsums.go --- lib/btrfs/btrfssum/shortsum.go | 23 +++++++++ .../btrfsinspect/rebuildmappings/allsums.go | 56 ---------------------- .../btrfsinspect/rebuildmappings/scan.go | 13 +++-- .../rebuildmappings/unmappedregions.go | 11 +++-- 4 files changed, 38 insertions(+), 65 deletions(-) delete mode 100644 lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go diff --git a/lib/btrfs/btrfssum/shortsum.go b/lib/btrfs/btrfssum/shortsum.go index 2d995b5..537e0ce 100644 --- a/lib/btrfs/btrfssum/shortsum.go +++ b/lib/btrfs/btrfssum/shortsum.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "io" + "math" "strings" "git.lukeshu.com/go/lowmemjson" @@ -175,6 +176,19 @@ func (sg SumRunWithGaps[Addr]) PctFull() float64 { return float64(full) / float64(total) } +func (sg SumRunWithGaps[Addr]) RunForAddr(addr Addr) (SumRun[Addr], Addr, bool) { + for _, run := range sg.Runs { + if run.Addr > addr { + return SumRun[Addr]{}, run.Addr, false + } + if run.Addr.Add(run.Size()) <= addr { + continue + } + return run, 0, true + } + return SumRun[Addr]{}, math.MaxInt64, false +} + func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) { if addr < sg.Addr || addr >= sg.Addr.Add(sg.Size) { return "", io.EOF @@ -192,6 +206,15 @@ func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) { return "", diskio.ErrWildcard } +func (sg SumRunWithGaps[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) error { + for _, run := range sg.Runs { + if err := run.Walk(ctx, fn); err != nil { + return err + } + } + return nil +} + // Get implements diskio.Sequence[int, ShortSum] func (sg SumRunWithGaps[Addr]) Get(sumIdx int64) (ShortSum, error) { addr := sg.Addr.Add(btrfsvol.AddrDelta(sumIdx) * BlockSize) diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go deleted file mode 100644 index 58ba018..0000000 --- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/allsums.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2022 Luke Shumaker -// -// SPDX-License-Identifier: GPL-2.0-or-later - -package rebuildmappings - -import ( - "context" - "math" - - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" -) - -type AllSums struct { - Logical []btrfssum.SumRun[btrfsvol.LogicalAddr] - Physical map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr] -} - -func (as AllSums) SumForPAddr(paddr btrfsvol.QualifiedPhysicalAddr) (btrfssum.ShortSum, bool) { - run, ok := as.Physical[paddr.Dev] - if !ok { - return "", false - } - return run.SumForAddr(paddr.Addr) -} - -func (as AllSums) RunForLAddr(laddr btrfsvol.LogicalAddr) (btrfssum.SumRun[btrfsvol.LogicalAddr], btrfsvol.LogicalAddr, bool) { - for _, run := range as.Logical { - if run.Addr > laddr { - return btrfssum.SumRun[btrfsvol.LogicalAddr]{}, run.Addr, false - } - if run.Addr.Add(run.Size()) <= laddr { - continue - } - return run, 0, true - } - return btrfssum.SumRun[btrfsvol.LogicalAddr]{}, math.MaxInt64, false -} - -func (as AllSums) SumForLAddr(laddr btrfsvol.LogicalAddr) (btrfssum.ShortSum, bool) { - run, _, ok := as.RunForLAddr(laddr) - if !ok { - return "", false - } - return run.SumForAddr(laddr) -} - -func (as AllSums) WalkLogical(ctx context.Context, fn func(btrfsvol.LogicalAddr, btrfssum.ShortSum) error) error { - for _, run := range as.Logical { - if err := run.Walk(ctx, fn); err != nil { - return err - } - } - return nil -} diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go index 6b4cbe7..5915e12 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/scan.go @@ -19,7 +19,12 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/slices" ) -func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.LogicalAddr]BlockGroup, sums AllSums) error { +func ScanForExtents(ctx context.Context, + fs *btrfs.FS, + blockgroups map[btrfsvol.LogicalAddr]BlockGroup, + physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr], + logicalSums btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr], +) error { dlog.Info(ctx, "Pairing up blockgroups and sums...") bgSums := make(map[btrfsvol.LogicalAddr]btrfssum.SumRunWithGaps[btrfsvol.LogicalAddr]) for i, bgLAddr := range maps.SortedKeys(blockgroups) { @@ -29,7 +34,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol. Size: blockgroup.Size, } for laddr := blockgroup.LAddr; laddr < blockgroup.LAddr.Add(blockgroup.Size); { - run, next, ok := sums.RunForLAddr(laddr) + run, next, ok := logicalSums.RunForAddr(laddr) if !ok { laddr = next continue @@ -63,7 +68,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol. continue } - if err := WalkUnmappedPhysicalRegions(ctx, sums, gaps, func(devID btrfsvol.DeviceID, gap btrfssum.SumRun[btrfsvol.PhysicalAddr]) error { + if err := WalkUnmappedPhysicalRegions(ctx, physicalSums, gaps, func(devID btrfsvol.DeviceID, gap btrfssum.SumRun[btrfsvol.PhysicalAddr]) error { matches, err := diskio.IndexAll[int64, btrfssum.ShortSum](gap, bgRun) if err != nil { return err @@ -114,7 +119,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol. dlog.Info(ctx, "Reverse-indexing remaining unmapped logical sums...") sum2laddrs := make(map[btrfssum.ShortSum][]btrfsvol.LogicalAddr) var numUnmappedBlocks int64 - if err := sums.WalkLogical(ctx, func(laddr btrfsvol.LogicalAddr, sum btrfssum.ShortSum) error { + if err := logicalSums.Walk(ctx, func(laddr btrfsvol.LogicalAddr, sum btrfssum.ShortSum) error { var dat [btrfssum.BlockSize]byte if _, err := fs.ReadAt(dat[:], laddr); err != nil { if errors.Is(err, btrfsvol.ErrCouldNotMap) { diff --git a/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go b/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go index 79a14bf..1bac127 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildmappings/unmappedregions.go @@ -55,7 +55,8 @@ func roundUp[T constraints.Integer](x, multiple T) T { } func WalkUnmappedPhysicalRegions(ctx context.Context, - sums AllSums, gaps map[btrfsvol.DeviceID][]PhysicalRegion, + physicalSums map[btrfsvol.DeviceID]btrfssum.SumRun[btrfsvol.PhysicalAddr], + gaps map[btrfsvol.DeviceID][]PhysicalRegion, fn func(btrfsvol.DeviceID, btrfssum.SumRun[btrfsvol.PhysicalAddr]) error, ) error { for _, devID := range maps.SortedKeys(gaps) { @@ -64,12 +65,12 @@ func WalkUnmappedPhysicalRegions(ctx context.Context, return err } begAddr := roundUp(gap.Beg, btrfssum.BlockSize) - begOff := int(begAddr/btrfssum.BlockSize) * sums.Physical[devID].ChecksumSize - endOff := int(gap.End/btrfssum.BlockSize) * sums.Physical[devID].ChecksumSize + begOff := int(begAddr/btrfssum.BlockSize) * physicalSums[devID].ChecksumSize + endOff := int(gap.End/btrfssum.BlockSize) * physicalSums[devID].ChecksumSize if err := fn(devID, btrfssum.SumRun[btrfsvol.PhysicalAddr]{ - ChecksumSize: sums.Physical[devID].ChecksumSize, + ChecksumSize: physicalSums[devID].ChecksumSize, Addr: begAddr, - Sums: sums.Physical[devID].Sums[begOff:endOff], + Sums: physicalSums[devID].Sums[begOff:endOff], }); err != nil { return err } -- cgit v1.2.3-2-g168b