summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-17 20:20:51 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-17 20:20:51 -0600
commit08f36346efae090737ff70b33b73e360d41a5856 (patch)
tree82614dc1207ecc5db2ab0b9de3b7864c591e672f /lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
parent1793ed01f3d4a25d2144d3c766d917bc06f8be83 (diff)
Make sure there's enough free space for gaps at the beginning or end of bgs
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/scanforextents/scan.go')
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/scan.go16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go b/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
index ca3036a..9219787 100644
--- a/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
+++ b/lib/btrfsprogs/btrfsinspect/scanforextents/scan.go
@@ -23,6 +23,10 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
bgSums := make(map[btrfsvol.LogicalAddr]SumRunWithGaps[btrfsvol.LogicalAddr])
for i, bgLAddr := range maps.SortedKeys(blockgroups) {
blockgroup := blockgroups[bgLAddr]
+ runs := SumRunWithGaps[btrfsvol.LogicalAddr]{
+ Addr: blockgroup.LAddr,
+ Size: blockgroup.Size,
+ }
for laddr := blockgroup.LAddr; laddr < blockgroup.LAddr.Add(blockgroup.Size); {
run, next, ok := sums.RunForLAddr(laddr)
if !ok {
@@ -34,15 +38,16 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
blockgroup.Size-laddr.Sub(blockgroup.LAddr),
btrfsvol.AddrDelta((len(run.Sums)-off)/run.ChecksumSize)*CSumBlockSize)
deltaOff := int(deltaAddr/CSumBlockSize) * run.ChecksumSize
- bgSums[blockgroup.LAddr] = append(bgSums[blockgroup.LAddr], SumRun[btrfsvol.LogicalAddr]{
+ runs.Runs = append(runs.Runs, SumRun[btrfsvol.LogicalAddr]{
ChecksumSize: run.ChecksumSize,
Addr: laddr,
Sums: run.Sums[off : off+deltaOff],
})
laddr = laddr.Add(deltaAddr)
}
- dlog.Infof(ctx, "... (%v/%v) blockgroup[laddr=%v] has %v runs",
- i+1, len(blockgroups), bgLAddr, len(bgSums[blockgroup.LAddr]))
+ bgSums[blockgroup.LAddr] = runs
+ dlog.Infof(ctx, "... (%v/%v) blockgroup[laddr=%v] has %v runs covering %v%%",
+ i+1, len(blockgroups), bgLAddr, len(runs.Runs), int(runs.PctFull()))
}
dlog.Info(ctx, "... done pairing")
@@ -50,13 +55,12 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockgroups map[btrfsvol.
gaps := ListPhysicalGaps(fs)
bgMatches := make(map[btrfsvol.LogicalAddr][]btrfsvol.QualifiedPhysicalAddr)
for i, bgLAddr := range maps.SortedKeys(blockgroups) {
- bgRuns := bgSums[bgLAddr]
- if len(bgRuns) == 0 {
+ bgRun := bgSums[bgLAddr]
+ if len(bgRun.Runs) == 0 {
dlog.Errorf(ctx, "... (%v/%v) blockgroup[laddr=%v] can't be matched because it has 0 runs",
i+1, len(bgSums), bgLAddr)
continue
}
- bgRun := bgRuns[0]
if err := WalkGaps(ctx, sums, gaps, func(devID btrfsvol.DeviceID, gap SumRun[btrfsvol.PhysicalAddr]) error {
matches, err := diskio.IndexAll[int64, ShortSum](gap, bgRun)