summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-30 23:42:51 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-30 23:42:51 -0600
commitdf3e7ef9c5fd0ceb2e89d5afd4e981652f9a8bdd (patch)
tree685ed21576bf364e277246dea20e61e1020493a9
parent4e617e029a5041c693b439742df2526923eaa00b (diff)
better
-rw-r--r--cmd/btrfs-fsck/pass1.go33
-rw-r--r--cmd/btrfs-fsck/pass2.go2
2 files changed, 25 insertions, 10 deletions
diff --git a/cmd/btrfs-fsck/pass1.go b/cmd/btrfs-fsck/pass1.go
index 630174c..2cb58bf 100644
--- a/cmd/btrfs-fsck/pass1.go
+++ b/cmd/btrfs-fsck/pass1.go
@@ -155,25 +155,40 @@ func (found pass1ScanOneDevResult) AddToLV(fs *btrfs.FS, dev *btrfs.Device) {
// Use block groups to add missing flags (and as a hint to
// combine node entries).
+ //
+ // First dedup them, because they change for allocations and
+ // CoW means that they'll bounce around a lot, so you likely
+ // have oodles of duplicates?
+ type blockgroup struct {
+ LAddr btrfsvol.LogicalAddr
+ Size btrfsvol.AddrDelta
+ Flags btrfsvol.BlockGroupFlags
+ }
+ blockgroups := make(map[blockgroup]struct{})
for _, bg := range found.FoundBlockGroups {
- laddr := btrfsvol.LogicalAddr(bg.Key.ObjectID)
- size := btrfsvol.AddrDelta(bg.Key.Offset)
-
- otherLAddr, otherPAddr := fs.LV.ResolveAny(laddr, size)
+ blockgroups[blockgroup{
+ LAddr: btrfsvol.LogicalAddr(bg.Key.ObjectID),
+ Size: btrfsvol.AddrDelta(bg.Key.Offset),
+ Flags: bg.BG.Flags,
+ }] = struct{}{}
+ }
+ for bg := range blockgroups {
+ otherLAddr, otherPAddr := fs.LV.ResolveAny(bg.LAddr, bg.Size)
if otherLAddr < 0 || otherPAddr.Addr < 0 {
- fmt.Printf("Pass 1: ... error: could not pair blockgroup laddr=%v (size=%v) with a mapping\n", laddr, size)
+ fmt.Printf("Pass 1: ... error: could not pair blockgroup laddr=%v (size=%v flags=%v) with a mapping\n",
+ bg.LAddr, bg.Size, bg.Flags)
continue
}
- offsetWithinChunk := otherLAddr.Sub(laddr)
- flags := bg.BG.Flags
+ offsetWithinChunk := otherLAddr.Sub(bg.LAddr)
+ flags := bg.Flags
mapping := btrfsvol.Mapping{
- LAddr: laddr,
+ LAddr: bg.LAddr,
PAddr: btrfsvol.QualifiedPhysicalAddr{
Dev: otherPAddr.Dev,
Addr: otherPAddr.Addr.Add(-offsetWithinChunk),
},
- Size: size,
+ Size: bg.Size,
SizeLocked: true,
Flags: &flags,
}
diff --git a/cmd/btrfs-fsck/pass2.go b/cmd/btrfs-fsck/pass2.go
index 14516f8..d496d13 100644
--- a/cmd/btrfs-fsck/pass2.go
+++ b/cmd/btrfs-fsck/pass2.go
@@ -60,7 +60,7 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
sort.Slice(orphanedRootsOrdered, func(i, j int) bool {
return orphanedRootsOrdered[i] < orphanedRootsOrdered[j]
})
- for _, node := range orphanedRoots {
+ for _, node := range orphanedRootsOrdered {
fmt.Printf("Pass 2: orphaned root: %v\n", node)
}
}