diff options
Diffstat (limited to 'cmd/btrfs-dump-tree/main.go')
-rw-r--r-- | cmd/btrfs-dump-tree/main.go | 72 |
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) } |