diff options
-rw-r--r-- | cmd/btrfs-fsck/pass1.go | 33 | ||||
-rw-r--r-- | cmd/btrfs-fsck/pass2.go | 2 |
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) } } |