diff options
-rw-r--r-- | lib/btrfs/btrfsprim/misc.go | 29 | ||||
-rw-r--r-- | lib/btrfs/btrfsprim/objid.go | 44 | ||||
-rw-r--r-- | lib/btrfs/btrfstree/path.go | 3 | ||||
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/print_tree.go | 53 | ||||
-rwxr-xr-x | scripts/diff-dump-tree.sh | 2 |
5 files changed, 60 insertions, 71 deletions
diff --git a/lib/btrfs/btrfsprim/misc.go b/lib/btrfs/btrfsprim/misc.go index da661f6..ca2e313 100644 --- a/lib/btrfs/btrfsprim/misc.go +++ b/lib/btrfs/btrfsprim/misc.go @@ -22,8 +22,35 @@ type Key struct { binstruct.End `bin:"off=0x11"` } +// mimics print-tree.c:btrfs_print_key() +func (key Key) Format(tree ObjID) string { + switch tree { + case UUID_TREE_OBJECTID: + return fmt.Sprintf("(%v %v %#08x)", + key.ObjectID.Format(tree), + key.ItemType, + key.Offset) + case ROOT_TREE_OBJECTID, QUOTA_TREE_OBJECTID: + return fmt.Sprintf("(%v %v %v)", + key.ObjectID.Format(tree), + key.ItemType, + ObjID(key.Offset).Format(tree)) + default: + if key.Offset == math.MaxUint64 { + return fmt.Sprintf("(%v %v -1)", + key.ObjectID.Format(tree), + key.ItemType) + } else { + return fmt.Sprintf("(%v %v %v)", + key.ObjectID.Format(tree), + key.ItemType, + key.Offset) + } + } +} + func (key Key) String() string { - return fmt.Sprintf("{%v %v %v}", key.ObjectID, key.ItemType, key.Offset) + return key.Format(0) } var MaxKey = Key{ diff --git a/lib/btrfs/btrfsprim/objid.go b/lib/btrfs/btrfsprim/objid.go index 5896030..8ca1fbb 100644 --- a/lib/btrfs/btrfsprim/objid.go +++ b/lib/btrfs/btrfsprim/objid.go @@ -46,18 +46,17 @@ const ( FIRST_FREE_OBJECTID ObjID = 256 LAST_FREE_OBJECTID ObjID = maxUint64pp - 256 - FIRST_CHUNK_TREE_OBJECTID ObjID = 256 - // Objects in the CHUNK_TREE - DEV_ITEMS_OBJECTID ObjID = 1 + DEV_ITEMS_OBJECTID ObjID = 1 + FIRST_CHUNK_TREE_OBJECTID ObjID = 256 // ??? EMPTY_SUBVOL_DIR_OBJECTID ObjID = 2 ) -func (id ObjID) Format(typ ItemType) string { - switch typ { - case PERSISTENT_ITEM_KEY: +func (id ObjID) Format(tree ObjID) string { + switch tree { + case DEV_TREE_OBJECTID: names := map[ObjID]string{ DEV_STATS_OBJECTID: "DEV_STATS", } @@ -65,35 +64,17 @@ func (id ObjID) Format(typ ItemType) string { return name } return fmt.Sprintf("%d", int64(id)) - case DEV_EXTENT_KEY: - return fmt.Sprintf("%d", int64(id)) - case QGROUP_RELATION_KEY: + case QUOTA_TREE_OBJECTID: + if id == 0 { + return "0" + } //nolint:gomnd // The left 48 bits are the "qgroup level", and the right 16 bits are the subvolume ID. return fmt.Sprintf("%d/%d", uint64(id)>>48, uint64(id)&((1<<48)-1)) - case UUID_SUBVOL_KEY, UUID_RECEIVED_SUBVOL_KEY: + case UUID_TREE_OBJECTID: return fmt.Sprintf("%#016x", uint64(id)) - case DEV_ITEM_KEY: - names := map[ObjID]string{ - BALANCE_OBJECTID: "BALANCE", - ORPHAN_OBJECTID: "ORPHAN", - TREE_LOG_OBJECTID: "TREE_LOG", - TREE_LOG_FIXUP_OBJECTID: "TREE_LOG_FIXUP", - TREE_RELOC_OBJECTID: "TREE_RELOC", - DATA_RELOC_TREE_OBJECTID: "DATA_RELOC_TREE", - EXTENT_CSUM_OBJECTID: "EXTENT_CSUM", - FREE_SPACE_OBJECTID: "FREE_SPACE", - FREE_INO_OBJECTID: "FREE_INO", - MULTIPLE_OBJECTIDS: "MULTIPLE", - - DEV_ITEMS_OBJECTID: "DEV_ITEMS", - } - if name, ok := names[id]; ok { - return name - } - return fmt.Sprintf("%d", int64(id)) - case CHUNK_ITEM_KEY: + case CHUNK_TREE_OBJECTID: names := map[ObjID]string{ BALANCE_OBJECTID: "BALANCE", ORPHAN_OBJECTID: "ORPHAN", @@ -106,6 +87,7 @@ func (id ObjID) Format(typ ItemType) string { FREE_INO_OBJECTID: "FREE_INO", MULTIPLE_OBJECTIDS: "MULTIPLE", + DEV_ITEMS_OBJECTID: "DEV_ITEMS", FIRST_CHUNK_TREE_OBJECTID: "FIRST_CHUNK_TREE", } if name, ok := names[id]; ok { @@ -145,5 +127,5 @@ func (id ObjID) Format(typ ItemType) string { } func (id ObjID) String() string { - return id.Format(UNTYPED_KEY) + return id.Format(0) } diff --git a/lib/btrfs/btrfstree/path.go b/lib/btrfs/btrfstree/path.go index d9bf216..dd2cb74 100644 --- a/lib/btrfs/btrfstree/path.go +++ b/lib/btrfs/btrfstree/path.go @@ -9,7 +9,6 @@ import ( "io" "strings" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" ) @@ -104,7 +103,7 @@ func (path TreePath) String() string { return "(empty-path)" } else { var ret strings.Builder - fmt.Fprintf(&ret, "%s->", path[0].FromTree.Format(btrfsitem.ROOT_ITEM_KEY)) + fmt.Fprintf(&ret, "%s->", path[0].FromTree.Format(btrfsprim.ROOT_TREE_OBJECTID)) if len(path) == 1 && path[0] == (TreePathElem{FromTree: path[0].FromTree, FromItemIdx: -1}) { ret.WriteString("(empty-path)") } else { diff --git a/lib/btrfsprogs/btrfsinspect/print_tree.go b/lib/btrfsprogs/btrfsinspect/print_tree.go index 8acf9cc..240c72f 100644 --- a/lib/btrfsprogs/btrfsinspect/print_tree.go +++ b/lib/btrfsprogs/btrfsinspect/print_tree.go @@ -7,8 +7,6 @@ package btrfsinspect import ( "context" "io" - "math" - "strings" "github.com/datawire/dlib/dlog" @@ -81,7 +79,7 @@ func DumpTrees(ctx context.Context, out io.Writer, fs *btrfs.FS) { if !ok { treeName = "file" } - textui.Fprintf(out, "%v tree %v \n", treeName, fmtKey(item.Key)) + textui.Fprintf(out, "%v tree key %v \n", treeName, item.Key.Format(btrfsprim.ROOT_TREE_OBJECTID)) printTree(ctx, out, fs, item.Key.ObjectID) return nil }, @@ -105,26 +103,28 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri itemOffset = nodeRef.Data.Size - uint32(nodeHeaderSize) return nil }, - PreKeyPointer: func(_ btrfstree.TreePath, item btrfstree.KeyPointer) error { - textui.Fprintf(out, "\t%v block %v gen %v\n", - fmtKey(item.Key), + PreKeyPointer: func(path btrfstree.TreePath, item btrfstree.KeyPointer) error { + treeID := path[0].FromTree + textui.Fprintf(out, "\tkey %v block %v gen %v\n", + item.Key.Format(treeID), item.BlockPtr, item.Generation) return nil }, Item: func(path btrfstree.TreePath, item btrfstree.Item) error { + treeID := path[0].FromTree i := path.Node(-1).FromItemIdx bs, _ := binstruct.Marshal(item.Body) itemSize := uint32(len(bs)) itemOffset -= itemSize - textui.Fprintf(out, "\titem %v %v itemoff %v itemsize %v\n", + textui.Fprintf(out, "\titem %v key %v itemoff %v itemsize %v\n", i, - fmtKey(item.Key), + item.Key.Format(treeID), itemOffset, itemSize) switch body := item.Body.(type) { case *btrfsitem.FreeSpaceHeader: - textui.Fprintf(out, "\t\tlocation %v\n", fmtKey(body.Location)) + textui.Fprintf(out, "\t\tlocation key %v\n", body.Location.Format(treeID)) textui.Fprintf(out, "\t\tcache generation %v entries %v bitmaps %v\n", body.Generation, body.NumEntries, body.NumBitmaps) case *btrfsitem.Inode: @@ -147,8 +147,8 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri // case btrfsitem.INODE_EXTREF_KEY: // // TODO case *btrfsitem.DirEntry: - textui.Fprintf(out, "\t\tlocation %v type %v\n", - fmtKey(body.Location), body.Type) + textui.Fprintf(out, "\t\tlocation key %v type %v\n", + body.Location.Format(treeID), body.Type) textui.Fprintf(out, "\t\ttransid %v data_len %v name_len %v\n", body.TransID, body.DataLen, body.NameLen) textui.Fprintf(out, "\t\tname: %s\n", body.Name) @@ -162,8 +162,8 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri body.Generation, body.RootDirID, body.ByteNr, body.ByteLimit, body.BytesUsed) textui.Fprintf(out, "\t\tlast_snapshot %v flags %v refs %v\n", body.LastSnapshot, body.Flags, body.Refs) - textui.Fprintf(out, "\t\tdrop_progress %v drop_level %v\n", - fmtKey(body.DropProgress), body.DropLevel) + textui.Fprintf(out, "\t\tdrop_progress key %v drop_level %v\n", + body.DropProgress.Format(treeID), body.DropLevel) textui.Fprintf(out, "\t\tlevel %v generation_v2 %v\n", body.Level, body.GenerationV2) if body.Generation == body.GenerationV2 { @@ -193,8 +193,8 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri textui.Fprintf(out, "\t\trefs %v gen %v flags %v\n", body.Head.Refs, body.Head.Generation, body.Head.Flags) if body.Head.Flags.Has(btrfsitem.EXTENT_FLAG_TREE_BLOCK) { - textui.Fprintf(out, "\t\ttree block %v level %v\n", - fmtKey(body.Info.Key), body.Info.Level) + textui.Fprintf(out, "\t\ttree block key %v level %v\n", + body.Info.Key.Format(treeID), body.Info.Level) } printExtentInlineRefs(out, body.Refs) case *btrfsitem.Metadata: @@ -319,7 +319,7 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri // // TODO case *btrfsitem.DevStats: textui.Fprintf(out, "\t\tpersistent item objectid %v offset %v\n", - item.Key.ObjectID.Format(item.Key.ItemType), item.Key.Offset) + item.Key.ObjectID.Format(treeID), item.Key.Offset) switch item.Key.ObjectID { case btrfsprim.DEV_STATS_OBJECTID: textui.Fprintf(out, "\t\tdevice stats\n") @@ -437,27 +437,6 @@ func printExtentInlineRefs(out io.Writer, refs []btrfsitem.ExtentInlineRef) { } } -// mimics print-tree.c:btrfs_print_key() -func fmtKey(key btrfsprim.Key) string { - var out strings.Builder - textui.Fprintf(&out, "key (%v %v", key.ObjectID.Format(key.ItemType), key.ItemType) - switch key.ItemType { - case btrfsitem.QGROUP_RELATION_KEY, btrfsitem.QGROUP_INFO_KEY, btrfsitem.QGROUP_LIMIT_KEY: - textui.Fprintf(&out, " %v)", btrfsprim.ObjID(key.Offset).Format(btrfsprim.QGROUP_RELATION_KEY)) - case btrfsitem.UUID_SUBVOL_KEY, btrfsitem.UUID_RECEIVED_SUBVOL_KEY: - textui.Fprintf(&out, " %#08x)", key.Offset) - case btrfsitem.ROOT_ITEM_KEY: - textui.Fprintf(&out, " %v)", btrfsprim.ObjID(key.Offset)) - default: - if key.Offset == math.MaxUint64 { - textui.Fprintf(&out, " -1)") - } else { - textui.Fprintf(&out, " %v)", key.Offset) - } - } - return out.String() -} - func fmtTime(t btrfsprim.Time) string { return textui.Sprintf("%v.%v (%v)", t.Sec, t.NSec, t.ToStd().Format("2006-01-02 15:04:05")) diff --git a/scripts/diff-dump-tree.sh b/scripts/diff-dump-tree.sh index 60ab4d3..3d560d9 100755 --- a/scripts/diff-dump-tree.sh +++ b/scripts/diff-dump-tree.sh @@ -16,6 +16,8 @@ diff -u \ <(../btrfs-progs/btrfs inspect dump-tree --noscan --csum-items ../scratch/new.img | sed -e 's/ UNKNOWN.0 / UNTYPED /g' \ -e 's/\b18446744073709551615\b/-1/g' \ + -e 's/INODE_REF 6)/INODE_REF ROOT_TREE_DIR)/g' \ + -e 's/ROOT_BACKREF 5)/ROOT_BACKREF FS_TREE)/g' \ ) \ <(go run ./cmd/btrfs-rec/ inspect dump-trees --pv=../scratch/new.img | sed -E \ |