summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-11 22:40:40 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-12 16:17:27 -0700
commit1f3a1a474ac41f427e4c5b0d27d2c85a3cfaa65e (patch)
treeffbdcba3e17ba4a5bd8947c3830626c0d9fae145
parent28549f676e040c96bfae575535dea7e0ecdf0f41 (diff)
btrfsprim: Have ObjID.Format() take the tree ID, not the item type
-rw-r--r--lib/btrfs/btrfsprim/misc.go29
-rw-r--r--lib/btrfs/btrfsprim/objid.go44
-rw-r--r--lib/btrfs/btrfstree/path.go3
-rw-r--r--lib/btrfsprogs/btrfsinspect/print_tree.go53
-rwxr-xr-xscripts/diff-dump-tree.sh2
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 \