From 08f36346efae090737ff70b33b73e360d41a5856 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 17 Jul 2022 20:20:51 -0600 Subject: Make sure there's enough free space for gaps at the beginning or end of bgs --- .../btrfsinspect/scanforextents/csums.go | 36 ++++++++++------------ 1 file changed, 16 insertions(+), 20 deletions(-) (limited to 'lib/btrfsprogs/btrfsinspect/scanforextents/csums.go') diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go b/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go index c1a1597..0ab933e 100644 --- a/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go +++ b/lib/btrfsprogs/btrfsinspect/scanforextents/csums.go @@ -84,31 +84,30 @@ func (run SumRun[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) // SumRunWithGaps //////////////////////////////////////////////////// -type SumRunWithGaps[Addr btrfsvol.IntAddr[Addr]] []SumRun[Addr] - -func (sg SumRunWithGaps[Addr]) end() Addr { - return sg[len(sg)-1].Addr.Add(sg[len(sg)-1].Size()) +type SumRunWithGaps[Addr btrfsvol.IntAddr[Addr]] struct { + Addr Addr + Size btrfsvol.AddrDelta + Runs []SumRun[Addr] } -func (sg SumRunWithGaps[Addr]) Size() btrfsvol.AddrDelta { - if len(sg) == 0 { - return 0 - } - return sg.end().Sub(sg[0].Addr) +func (sg SumRunWithGaps[Addr]) NumSums() int { + return int(sg.Size / CSumBlockSize) } -func (sg SumRunWithGaps[Addr]) NumSums() int { - return int(sg.Size() / CSumBlockSize) +func (sg SumRunWithGaps[Addr]) PctFull() float64 { + total := sg.NumSums() + var full int + for _, run := range sg.Runs { + full += run.NumSums() + } + return float64(full) / float64(total) } func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) { - if len(sg) == 0 { - return "", io.EOF - } - if addr < sg[0].Addr || addr >= sg.end() { + if addr < sg.Addr || addr >= sg.Addr.Add(sg.Size) { return "", io.EOF } - for _, run := range sg { + for _, run := range sg.Runs { if run.Addr > addr { return "", diskio.ErrWildcard } @@ -123,10 +122,7 @@ func (sg SumRunWithGaps[Addr]) SumForAddr(addr Addr) (ShortSum, error) { // Get implements diskio.Sequence[int, ShortSum] func (sg SumRunWithGaps[Addr]) Get(sumIdx int64) (ShortSum, error) { - if len(sg) == 0 { - return "", io.EOF - } - addr := sg[0].Addr.Add(btrfsvol.AddrDelta(sumIdx) * CSumBlockSize) + addr := sg.Addr.Add(btrfsvol.AddrDelta(sumIdx) * CSumBlockSize) return sg.SumForAddr(addr) } -- cgit v1.2.3-2-g168b