From a0daaacdd61f196fbc0ca90ed996e7eeb4d4fcdd Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 11 Jul 2022 22:48:35 -0600 Subject: move chunk reconstruction to btrfsinspect, add --mappings --- lib/btrfsprogs/btrfsinspect/print_addrspace.go | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/btrfsprogs/btrfsinspect/print_addrspace.go (limited to 'lib/btrfsprogs/btrfsinspect/print_addrspace.go') diff --git a/lib/btrfsprogs/btrfsinspect/print_addrspace.go b/lib/btrfsprogs/btrfsinspect/print_addrspace.go new file mode 100644 index 0000000..d291b7c --- /dev/null +++ b/lib/btrfsprogs/btrfsinspect/print_addrspace.go @@ -0,0 +1,77 @@ +// Copyright (C) 2022 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package btrfsinspect + +import ( + "fmt" + "io" + "sort" + + "golang.org/x/text/message" + + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" +) + +func PrintLogicalSpace(out io.Writer, fs *btrfs.FS) { + mappings := fs.LV.Mappings() + var prevBeg, prevEnd btrfsvol.LogicalAddr + var sumHole, sumChunk btrfsvol.AddrDelta + for _, mapping := range mappings { + if mapping.LAddr > prevEnd { + size := mapping.LAddr.Sub(prevEnd) + fmt.Fprintf(out, "logical_hole laddr=%v size=%v\n", prevEnd, size) + sumHole += size + } + if mapping.LAddr != prevBeg { + if mapping.Flags == nil { + fmt.Fprintf(out, "chunk laddr=%v size=%v flags=(missing)\n", + mapping.LAddr, mapping.Size) + } else { + fmt.Fprintf(out, "chunk laddr=%v size=%v flags=%v\n", + mapping.LAddr, mapping.Size, *mapping.Flags) + } + } + fmt.Fprintf(out, "\tstripe dev_id=%v paddr=%v\n", + mapping.PAddr.Dev, mapping.PAddr.Addr) + sumChunk += mapping.Size + prevBeg = mapping.LAddr + prevEnd = mapping.LAddr.Add(mapping.Size) + } + p := message.NewPrinter(message.MatchLanguage("en")) + p.Fprintf(out, "total logical holes = %v (%d)\n", sumHole, int64(sumHole)) + p.Fprintf(out, "total logical chunks = %v (%d)\n", sumChunk, int64(sumChunk)) + p.Fprintf(out, "total logical addr space = %v (%d)\n", prevEnd, int64(prevEnd)) +} + +func PrintPhysicalSpace(out io.Writer, fs *btrfs.FS) { + mappings := fs.LV.Mappings() + sort.Slice(mappings, func(i, j int) bool { + return mappings[i].PAddr.Cmp(mappings[j].PAddr) < 0 + }) + + var prevDev btrfsvol.DeviceID = 0 + var prevEnd btrfsvol.PhysicalAddr + var sumHole, sumExt btrfsvol.AddrDelta + for _, mapping := range mappings { + if mapping.PAddr.Dev != prevDev { + prevDev = mapping.PAddr.Dev + prevEnd = 0 + } + if mapping.PAddr.Addr > prevEnd { + size := mapping.PAddr.Addr.Sub(prevEnd) + fmt.Fprintf(out, "physical_hole paddr=%v size=%v\n", prevEnd, size) + sumHole += size + } + fmt.Fprintf(out, "devext dev=%v paddr=%v size=%v laddr=%v\n", + mapping.PAddr.Dev, mapping.PAddr.Addr, mapping.Size, mapping.LAddr) + sumExt += mapping.Size + prevEnd = mapping.PAddr.Addr.Add(mapping.Size) + } + p := message.NewPrinter(message.MatchLanguage("en")) + p.Fprintf(out, "total physical holes = %v (%d)\n", sumHole, int64(sumHole)) + p.Fprintf(out, "total physical extents = %v (%d)\n", sumExt, int64(sumExt)) + p.Fprintf(out, "total physical addr space = %v (%d)\n", prevEnd, int64(prevEnd)) +} -- cgit v1.2.3-2-g168b