summaryrefslogtreecommitdiff
path: root/cmd/btrfs-dump-tree/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-dump-tree/main.go')
-rw-r--r--cmd/btrfs-dump-tree/main.go72
1 files changed, 55 insertions, 17 deletions
diff --git a/cmd/btrfs-dump-tree/main.go b/cmd/btrfs-dump-tree/main.go
index 1b3b993..bdfd339 100644
--- a/cmd/btrfs-dump-tree/main.go
+++ b/cmd/btrfs-dump-tree/main.go
@@ -4,8 +4,6 @@ import (
"fmt"
"os"
- "github.com/davecgh/go-spew/spew"
-
"lukeshu.com/btrfs-tools/pkg/btrfs"
)
@@ -16,6 +14,8 @@ func main() {
}
}
+const version = "5.17"
+
func Main(imgfilename string) (err error) {
maybeSetErr := func(_err error) {
if _err != nil && err == nil {
@@ -38,30 +38,68 @@ func Main(imgfilename string) (err error) {
},
}
- superblocks, err := fs.Devices[0].Superblocks()
+ superblock, err := fs.Superblock()
if err != nil {
return err
}
- spew := spew.NewDefaultConfig()
- spew.DisablePointerAddresses = true
-
- sum, err := superblocks[0].Data.CalculateChecksum()
- if err != nil {
- return err
+ fmt.Printf("btrfs-progs v%s \n", version)
+ if superblock.Data.RootTree != 0 && false { // XXX
+ fmt.Printf("root tree\n")
+ printTree(fs, superblock.Data.RootTree)
+ }
+ if superblock.Data.ChunkTree != 0 {
+ fmt.Printf("chunk tree\n")
+ printTree(fs, superblock.Data.ChunkTree)
+ }
+ if superblock.Data.LogTree != 0 {
+ fmt.Printf("log root tree\n")
+ printTree(fs, superblock.Data.LogTree)
+ }
+ if superblock.Data.BlockGroupRoot != 0 {
+ fmt.Printf("block group tree\n")
+ printTree(fs, superblock.Data.BlockGroupRoot)
}
- fmt.Printf("superblock checksum: %x\n", sum)
- spew.Dump(superblocks[0].Data)
- syschunks, err := superblocks[0].Data.ParseSysChunkArray()
+ return nil
+}
+
+// printTree mimics btrfs-progs kernel-shared/print-tree.c:btrfs_print_tree()
+func printTree(fs *btrfs.FS, root btrfs.LogicalAddr) {
+ node, err := fs.ReadNode(root)
if err != nil {
- return err
+ fmt.Printf("error: %v\n", err)
+ return
}
- spew.Dump(syschunks)
+ printHeaderInfo(node)
+ // TODO
+}
- if err := btrfs.ScanForNodes(fs.Devices[0], superblocks[0].Data); err != nil {
- return err
+// printHeaderInfo mimics btrfs-progs kernel-shared/print-tree.c:print_header_info()
+func printHeaderInfo(node btrfs.Node) {
+ var typename string
+ switch node := node.(type) {
+ case *btrfs.InternalNode:
+ typename = "node"
+ fmt.Printf("node %d level %d items %d free space %d",
+ node.Header.Addr,
+ node.Header.Data.Level,
+ node.Header.Data.NumItems,
+ node.Header.Data.MaxItems-node.Header.Data.NumItems)
+ case *btrfs.LeafNode:
+ typename = "leaf"
+ fmt.Printf("leaf %d items %d free space %d",
+ node.Header.Addr,
+ node.Header.Data.NumItems,
+ node.FreeSpace())
}
+ fmt.Printf(" generation %d owner %v\n",
+ node.GetNodeHeader().Data.Generation,
+ node.GetNodeHeader().Data.Owner)
- return nil
+ fmt.Printf("%s %d flags %s backref revision %d\n",
+ typename,
+ node.GetNodeHeader().Addr,
+ node.GetNodeHeader().Data.Flags,
+ node.GetNodeHeader().Data.BackrefRev)
}