From 47f66c084291040fb11212956df9033bf263a892 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Fri, 3 Feb 2023 19:06:22 -0700
Subject: btrfssum: Split shortsum.go in to several files

---
 lib/btrfs/btrfssum/csum.go           |   2 +
 lib/btrfs/btrfssum/shortsum.go       | 201 -----------------------------------
 lib/btrfs/btrfssum/sumrun.go         |  58 ++++++++++
 lib/btrfs/btrfssum/sumrunwithgaps.go | 160 ++++++++++++++++++++++++++++
 4 files changed, 220 insertions(+), 201 deletions(-)
 create mode 100644 lib/btrfs/btrfssum/sumrun.go
 create mode 100644 lib/btrfs/btrfssum/sumrunwithgaps.go

(limited to 'lib/btrfs')

diff --git a/lib/btrfs/btrfssum/csum.go b/lib/btrfs/btrfssum/csum.go
index 6df9efd..f436e2c 100644
--- a/lib/btrfs/btrfssum/csum.go
+++ b/lib/btrfs/btrfssum/csum.go
@@ -14,6 +14,8 @@ import (
 	"git.lukeshu.com/btrfs-progs-ng/lib/fmtutil"
 )
 
+const BlockSize = 4 * 1024
+
 type CSum [0x20]byte
 
 var (
diff --git a/lib/btrfs/btrfssum/shortsum.go b/lib/btrfs/btrfssum/shortsum.go
index e3441ae..754a79d 100644
--- a/lib/btrfs/btrfssum/shortsum.go
+++ b/lib/btrfs/btrfssum/shortsum.go
@@ -5,22 +5,14 @@
 package btrfssum
 
 import (
-	"context"
 	"fmt"
 	"io"
 	"math"
 	"strings"
 
 	"git.lukeshu.com/go/lowmemjson"
-
-	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
-	"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
 )
 
-const BlockSize = 4 * 1024
-
-// ShortSum //////////////////////////////////////////////////////////
-
 type ShortSum string
 
 var (
@@ -105,196 +97,3 @@ func (sum *ShortSum) DecodeJSON(r io.RuneScanner) error {
 	*sum = ShortSum(out.String())
 	return nil
 }
-
-// SumRun ////////////////////////////////////////////////////////////
-
-type SumRun[Addr btrfsvol.IntAddr[Addr]] struct {
-	// How big a ShortSum is in this Run.
-	ChecksumSize int `json:",omitempty"`
-	// Base address where this run starts.
-	Addr Addr `json:",omitempty"`
-	// All of the ShortSums in this run, concatenated together.
-	Sums ShortSum
-}
-
-func (run SumRun[Addr]) NumSums() int {
-	return len(run.Sums) / run.ChecksumSize
-}
-
-func (run SumRun[Addr]) Size() btrfsvol.AddrDelta {
-	return btrfsvol.AddrDelta(run.NumSums()) * BlockSize
-}
-
-// Get implements diskio.Sequence[int, ShortSum]
-func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) {
-	if sumIdx < 0 || int(sumIdx) >= run.NumSums() {
-		return "", io.EOF
-	}
-	off := int(sumIdx) * run.ChecksumSize
-	return run.Sums[off : off+run.ChecksumSize], nil
-}
-
-func (run SumRun[Addr]) SumForAddr(addr Addr) (ShortSum, bool) {
-	if addr < run.Addr || addr >= run.Addr.Add(run.Size()) {
-		return "", false
-	}
-	off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize
-	return run.Sums[off : off+run.ChecksumSize], true
-}
-
-func (run SumRun[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) error {
-	for addr, off := run.Addr, 0; off < len(run.Sums); addr, off = addr+BlockSize, off+run.ChecksumSize {
-		if err := ctx.Err(); err != nil {
-			return err
-		}
-		if err := fn(addr, run.Sums[off:off+run.ChecksumSize]); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// SumRunWithGaps ////////////////////////////////////////////////////
-
-type SumRunWithGaps[Addr btrfsvol.IntAddr[Addr]] struct {
-	// Store the start address and size, in order to facilitate
-	// leading and trailing gaps.
-	Addr Addr
-	Size btrfsvol.AddrDelta
-
-	Runs []SumRun[Addr]
-}
-
-var (
-	_ lowmemjson.Encodable = SumRunWithGaps[btrfsvol.LogicalAddr]{}
-	_ lowmemjson.Decodable = (*SumRunWithGaps[btrfsvol.LogicalAddr])(nil)
-)
-
-func (sg SumRunWithGaps[Addr]) NumSums() int {
-	return int(sg.Size / BlockSize)
-}
-
-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]) 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
-	}
-	for _, run := range sg.Runs {
-		if run.Addr > addr {
-			return "", diskio.ErrWildcard
-		}
-		if run.Addr.Add(run.Size()) <= addr {
-			continue
-		}
-		off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize
-		return run.Sums[off : off+run.ChecksumSize], nil
-	}
-	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)
-	return sg.SumForAddr(addr)
-}
-
-func (sg SumRunWithGaps[Addr]) EncodeJSON(w io.Writer) error {
-	if _, err := fmt.Fprintf(w, `{"Addr":%d,"Size":%d,"Runs":[`, sg.Addr, sg.Size); err != nil {
-		return err
-	}
-	cur := sg.Addr
-	for i, run := range sg.Runs {
-		if i > 0 {
-			if _, err := w.Write([]byte{','}); err != nil {
-				return err
-			}
-		}
-		switch {
-		case run.Addr < cur:
-			return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, run.Addr, cur)
-		case run.Addr > cur:
-			if _, err := fmt.Fprintf(w, `{"Gap":%d},`, run.Addr.Sub(cur)); err != nil {
-				return err
-			}
-			fallthrough
-		default:
-			if err := lowmemjson.NewEncoder(w).Encode(run); err != nil {
-				return err
-			}
-			cur = run.Addr.Add(run.Size())
-		}
-	}
-	end := sg.Addr.Add(sg.Size)
-	switch {
-	case end < cur:
-		return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, end, cur)
-	case end > cur:
-		if _, err := fmt.Fprintf(w, `,{"Gap":%d}`, end.Sub(cur)); err != nil {
-			return err
-		}
-	}
-	if _, err := w.Write([]byte("]}")); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (sg *SumRunWithGaps[Addr]) DecodeJSON(r io.RuneScanner) error {
-	*sg = SumRunWithGaps[Addr]{}
-	var name string
-	return lowmemjson.DecodeObject(r,
-		func(r io.RuneScanner) error {
-			return lowmemjson.NewDecoder(r).Decode(&name)
-		},
-		func(r io.RuneScanner) error {
-			switch name {
-			case "Addr":
-				return lowmemjson.NewDecoder(r).Decode(&sg.Addr)
-			case "Size":
-				return lowmemjson.NewDecoder(r).Decode(&sg.Size)
-			case "Runs":
-				return lowmemjson.DecodeArray(r, func(r io.RuneScanner) error {
-					var run SumRun[Addr]
-					if err := lowmemjson.NewDecoder(r).Decode(&run); err != nil {
-						return err
-					}
-					if run.ChecksumSize > 0 {
-						sg.Runs = append(sg.Runs, run)
-					}
-					return nil
-				})
-			default:
-				return fmt.Errorf("unknown key %q", name)
-			}
-		})
-}
diff --git a/lib/btrfs/btrfssum/sumrun.go b/lib/btrfs/btrfssum/sumrun.go
new file mode 100644
index 0000000..1000e7a
--- /dev/null
+++ b/lib/btrfs/btrfssum/sumrun.go
@@ -0,0 +1,58 @@
+// Copyright (C) 2022-2023  Luke Shumaker <lukeshu@lukeshu.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package btrfssum
+
+import (
+	"context"
+	"io"
+
+	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
+)
+
+type SumRun[Addr btrfsvol.IntAddr[Addr]] struct {
+	// How big a ShortSum is in this Run.
+	ChecksumSize int `json:",omitempty"`
+	// Base address where this run starts.
+	Addr Addr `json:",omitempty"`
+	// All of the ShortSums in this run, concatenated together.
+	Sums ShortSum
+}
+
+func (run SumRun[Addr]) NumSums() int {
+	return len(run.Sums) / run.ChecksumSize
+}
+
+func (run SumRun[Addr]) Size() btrfsvol.AddrDelta {
+	return btrfsvol.AddrDelta(run.NumSums()) * BlockSize
+}
+
+// Get implements diskio.Sequence[int, ShortSum]
+func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) {
+	if sumIdx < 0 || int(sumIdx) >= run.NumSums() {
+		return "", io.EOF
+	}
+	off := int(sumIdx) * run.ChecksumSize
+	return run.Sums[off : off+run.ChecksumSize], nil
+}
+
+func (run SumRun[Addr]) SumForAddr(addr Addr) (ShortSum, bool) {
+	if addr < run.Addr || addr >= run.Addr.Add(run.Size()) {
+		return "", false
+	}
+	off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize
+	return run.Sums[off : off+run.ChecksumSize], true
+}
+
+func (run SumRun[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) error {
+	for addr, off := run.Addr, 0; off < len(run.Sums); addr, off = addr+BlockSize, off+run.ChecksumSize {
+		if err := ctx.Err(); err != nil {
+			return err
+		}
+		if err := fn(addr, run.Sums[off:off+run.ChecksumSize]); err != nil {
+			return err
+		}
+	}
+	return nil
+}
diff --git a/lib/btrfs/btrfssum/sumrunwithgaps.go b/lib/btrfs/btrfssum/sumrunwithgaps.go
new file mode 100644
index 0000000..8362a49
--- /dev/null
+++ b/lib/btrfs/btrfssum/sumrunwithgaps.go
@@ -0,0 +1,160 @@
+// Copyright (C) 2022-2023  Luke Shumaker <lukeshu@lukeshu.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package btrfssum
+
+import (
+	"context"
+	"fmt"
+	"io"
+	"math"
+
+	"git.lukeshu.com/go/lowmemjson"
+
+	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
+	"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
+)
+
+type SumRunWithGaps[Addr btrfsvol.IntAddr[Addr]] struct {
+	// Store the start address and size, in order to facilitate
+	// leading and trailing gaps.
+	Addr Addr
+	Size btrfsvol.AddrDelta
+
+	Runs []SumRun[Addr]
+}
+
+var (
+	_ lowmemjson.Encodable = SumRunWithGaps[btrfsvol.LogicalAddr]{}
+	_ lowmemjson.Decodable = (*SumRunWithGaps[btrfsvol.LogicalAddr])(nil)
+)
+
+func (sg SumRunWithGaps[Addr]) NumSums() int {
+	return int(sg.Size / BlockSize)
+}
+
+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]) 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
+	}
+	for _, run := range sg.Runs {
+		if run.Addr > addr {
+			return "", diskio.ErrWildcard
+		}
+		if run.Addr.Add(run.Size()) <= addr {
+			continue
+		}
+		off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize
+		return run.Sums[off : off+run.ChecksumSize], nil
+	}
+	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)
+	return sg.SumForAddr(addr)
+}
+
+func (sg SumRunWithGaps[Addr]) EncodeJSON(w io.Writer) error {
+	if _, err := fmt.Fprintf(w, `{"Addr":%d,"Size":%d,"Runs":[`, sg.Addr, sg.Size); err != nil {
+		return err
+	}
+	cur := sg.Addr
+	for i, run := range sg.Runs {
+		if i > 0 {
+			if _, err := w.Write([]byte{','}); err != nil {
+				return err
+			}
+		}
+		switch {
+		case run.Addr < cur:
+			return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, run.Addr, cur)
+		case run.Addr > cur:
+			if _, err := fmt.Fprintf(w, `{"Gap":%d},`, run.Addr.Sub(cur)); err != nil {
+				return err
+			}
+			fallthrough
+		default:
+			if err := lowmemjson.NewEncoder(w).Encode(run); err != nil {
+				return err
+			}
+			cur = run.Addr.Add(run.Size())
+		}
+	}
+	end := sg.Addr.Add(sg.Size)
+	switch {
+	case end < cur:
+		return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, end, cur)
+	case end > cur:
+		if _, err := fmt.Fprintf(w, `,{"Gap":%d}`, end.Sub(cur)); err != nil {
+			return err
+		}
+	}
+	if _, err := w.Write([]byte("]}")); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (sg *SumRunWithGaps[Addr]) DecodeJSON(r io.RuneScanner) error {
+	*sg = SumRunWithGaps[Addr]{}
+	var name string
+	return lowmemjson.DecodeObject(r,
+		func(r io.RuneScanner) error {
+			return lowmemjson.NewDecoder(r).Decode(&name)
+		},
+		func(r io.RuneScanner) error {
+			switch name {
+			case "Addr":
+				return lowmemjson.NewDecoder(r).Decode(&sg.Addr)
+			case "Size":
+				return lowmemjson.NewDecoder(r).Decode(&sg.Size)
+			case "Runs":
+				return lowmemjson.DecodeArray(r, func(r io.RuneScanner) error {
+					var run SumRun[Addr]
+					if err := lowmemjson.NewDecoder(r).Decode(&run); err != nil {
+						return err
+					}
+					if run.ChecksumSize > 0 {
+						sg.Runs = append(sg.Runs, run)
+					}
+					return nil
+				})
+			default:
+				return fmt.Errorf("unknown key %q", name)
+			}
+		})
+}
-- 
cgit v1.2.3-2-g168b


From d36dec9dc7019d67e0acf12c52607110cc0edc62 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Fri, 3 Feb 2023 19:10:08 -0700
Subject: Move sumrunwithgaps.go from btrfssum to rebuildmappings

---
 lib/btrfs/btrfssum/sumrunwithgaps.go | 160 -----------------------------------
 1 file changed, 160 deletions(-)
 delete mode 100644 lib/btrfs/btrfssum/sumrunwithgaps.go

(limited to 'lib/btrfs')

diff --git a/lib/btrfs/btrfssum/sumrunwithgaps.go b/lib/btrfs/btrfssum/sumrunwithgaps.go
deleted file mode 100644
index 8362a49..0000000
--- a/lib/btrfs/btrfssum/sumrunwithgaps.go
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (C) 2022-2023  Luke Shumaker <lukeshu@lukeshu.com>
-//
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-package btrfssum
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"math"
-
-	"git.lukeshu.com/go/lowmemjson"
-
-	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
-	"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
-)
-
-type SumRunWithGaps[Addr btrfsvol.IntAddr[Addr]] struct {
-	// Store the start address and size, in order to facilitate
-	// leading and trailing gaps.
-	Addr Addr
-	Size btrfsvol.AddrDelta
-
-	Runs []SumRun[Addr]
-}
-
-var (
-	_ lowmemjson.Encodable = SumRunWithGaps[btrfsvol.LogicalAddr]{}
-	_ lowmemjson.Decodable = (*SumRunWithGaps[btrfsvol.LogicalAddr])(nil)
-)
-
-func (sg SumRunWithGaps[Addr]) NumSums() int {
-	return int(sg.Size / BlockSize)
-}
-
-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]) 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
-	}
-	for _, run := range sg.Runs {
-		if run.Addr > addr {
-			return "", diskio.ErrWildcard
-		}
-		if run.Addr.Add(run.Size()) <= addr {
-			continue
-		}
-		off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize
-		return run.Sums[off : off+run.ChecksumSize], nil
-	}
-	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)
-	return sg.SumForAddr(addr)
-}
-
-func (sg SumRunWithGaps[Addr]) EncodeJSON(w io.Writer) error {
-	if _, err := fmt.Fprintf(w, `{"Addr":%d,"Size":%d,"Runs":[`, sg.Addr, sg.Size); err != nil {
-		return err
-	}
-	cur := sg.Addr
-	for i, run := range sg.Runs {
-		if i > 0 {
-			if _, err := w.Write([]byte{','}); err != nil {
-				return err
-			}
-		}
-		switch {
-		case run.Addr < cur:
-			return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, run.Addr, cur)
-		case run.Addr > cur:
-			if _, err := fmt.Fprintf(w, `{"Gap":%d},`, run.Addr.Sub(cur)); err != nil {
-				return err
-			}
-			fallthrough
-		default:
-			if err := lowmemjson.NewEncoder(w).Encode(run); err != nil {
-				return err
-			}
-			cur = run.Addr.Add(run.Size())
-		}
-	}
-	end := sg.Addr.Add(sg.Size)
-	switch {
-	case end < cur:
-		return fmt.Errorf("invalid %T: addr went backwards: %v < %v", sg, end, cur)
-	case end > cur:
-		if _, err := fmt.Fprintf(w, `,{"Gap":%d}`, end.Sub(cur)); err != nil {
-			return err
-		}
-	}
-	if _, err := w.Write([]byte("]}")); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (sg *SumRunWithGaps[Addr]) DecodeJSON(r io.RuneScanner) error {
-	*sg = SumRunWithGaps[Addr]{}
-	var name string
-	return lowmemjson.DecodeObject(r,
-		func(r io.RuneScanner) error {
-			return lowmemjson.NewDecoder(r).Decode(&name)
-		},
-		func(r io.RuneScanner) error {
-			switch name {
-			case "Addr":
-				return lowmemjson.NewDecoder(r).Decode(&sg.Addr)
-			case "Size":
-				return lowmemjson.NewDecoder(r).Decode(&sg.Size)
-			case "Runs":
-				return lowmemjson.DecodeArray(r, func(r io.RuneScanner) error {
-					var run SumRun[Addr]
-					if err := lowmemjson.NewDecoder(r).Decode(&run); err != nil {
-						return err
-					}
-					if run.ChecksumSize > 0 {
-						sg.Runs = append(sg.Runs, run)
-					}
-					return nil
-				})
-			default:
-				return fmt.Errorf("unknown key %q", name)
-			}
-		})
-}
-- 
cgit v1.2.3-2-g168b


From ef60daef395b20b67042c011f5b2a1131049e275 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <lukeshu@lukeshu.com>
Date: Fri, 3 Feb 2023 19:50:35 -0700
Subject: rebuildmappings: Optimize the KMP search

---
 lib/btrfs/btrfssum/sumrun.go | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

(limited to 'lib/btrfs')

diff --git a/lib/btrfs/btrfssum/sumrun.go b/lib/btrfs/btrfssum/sumrun.go
index 1000e7a..bc2db3f 100644
--- a/lib/btrfs/btrfssum/sumrun.go
+++ b/lib/btrfs/btrfssum/sumrun.go
@@ -6,9 +6,9 @@ package btrfssum
 
 import (
 	"context"
-	"io"
 
 	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
+	"git.lukeshu.com/btrfs-progs-ng/lib/diskio"
 )
 
 type SumRun[Addr btrfsvol.IntAddr[Addr]] struct {
@@ -20,21 +20,21 @@ type SumRun[Addr btrfsvol.IntAddr[Addr]] struct {
 	Sums ShortSum
 }
 
-func (run SumRun[Addr]) NumSums() int {
+var _ diskio.Sequence[int, ShortSum] = SumRun[btrfsvol.LogicalAddr]{}
+
+// SeqLen implements diskio.Sequence[int, ShortSum].
+func (run SumRun[Addr]) SeqLen() int {
 	return len(run.Sums) / run.ChecksumSize
 }
 
 func (run SumRun[Addr]) Size() btrfsvol.AddrDelta {
-	return btrfsvol.AddrDelta(run.NumSums()) * BlockSize
+	return btrfsvol.AddrDelta(run.SeqLen()) * BlockSize
 }
 
-// Get implements diskio.Sequence[int, ShortSum]
-func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) {
-	if sumIdx < 0 || int(sumIdx) >= run.NumSums() {
-		return "", io.EOF
-	}
-	off := int(sumIdx) * run.ChecksumSize
-	return run.Sums[off : off+run.ChecksumSize], nil
+// SeqGet implements diskio.Sequence[int, ShortSum].
+func (run SumRun[Addr]) SeqGet(sumIdx int) ShortSum {
+	off := sumIdx * run.ChecksumSize
+	return run.Sums[off : off+run.ChecksumSize]
 }
 
 func (run SumRun[Addr]) SumForAddr(addr Addr) (ShortSum, bool) {
-- 
cgit v1.2.3-2-g168b