From c42e8ea5d77a39d096d97600359bd91657da2f05 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 15 Mar 2023 21:03:46 -0600 Subject: btrfsprim: Move Key to a separate file --- lib/btrfs/btrfsprim/key.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 lib/btrfs/btrfsprim/key.go (limited to 'lib/btrfs/btrfsprim/key.go') diff --git a/lib/btrfs/btrfsprim/key.go b/lib/btrfs/btrfsprim/key.go new file mode 100644 index 0000000..55f7c05 --- /dev/null +++ b/lib/btrfs/btrfsprim/key.go @@ -0,0 +1,81 @@ +// Copyright (C) 2022-2023 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package btrfsprim + +import ( + "fmt" + "math" + + "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" + "git.lukeshu.com/btrfs-progs-ng/lib/containers" +) + +type Key struct { + ObjectID ObjID `bin:"off=0x0, siz=0x8"` // Each tree has its own set of Object IDs. + ItemType ItemType `bin:"off=0x8, siz=0x1"` + Offset uint64 `bin:"off=0x9, siz=0x8"` // The meaning depends on the item type. + 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 key.Format(0) +} + +var MaxKey = Key{ + ObjectID: math.MaxUint64, + ItemType: math.MaxUint8, + Offset: math.MaxUint64, +} + +func (key Key) Mm() Key { + switch { + case key.Offset > 0: + key.Offset-- + case key.ItemType > 0: + key.ItemType-- + case key.ObjectID > 0: + key.ObjectID-- + } + return key +} + +func (a Key) Compare(b Key) int { + if d := containers.NativeCompare(a.ObjectID, b.ObjectID); d != 0 { + return d + } + if d := containers.NativeCompare(a.ItemType, b.ItemType); d != 0 { + return d + } + return containers.NativeCompare(a.Offset, b.Offset) +} + +var _ containers.Ordered[Key] = Key{} -- cgit v1.2.3-2-g168b From 0cc16b8d1da61c0bfb8743c8b68888b0ba73d4bb Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 15 Mar 2023 21:38:56 -0600 Subject: btrfsprim: Add "max" constants for ObjID, ItemType, and offset --- lib/btrfs/btrfsprim/key.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/btrfs/btrfsprim/key.go') diff --git a/lib/btrfs/btrfsprim/key.go b/lib/btrfs/btrfsprim/key.go index 55f7c05..7a3cc5c 100644 --- a/lib/btrfs/btrfsprim/key.go +++ b/lib/btrfs/btrfsprim/key.go @@ -19,6 +19,8 @@ type Key struct { binstruct.End `bin:"off=0x11"` } +const MaxOffset uint64 = math.MaxUint64 + // mimics print-tree.c:btrfs_print_key() func (key Key) Format(tree ObjID) string { switch tree { -- cgit v1.2.3-2-g168b From 17833fa13d5a7dcd79ad507fe4abf96b4a4a898b Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 15 Mar 2023 21:38:56 -0600 Subject: btrfsprim: Fix Key.Mm(), and add Key.Pp() --- lib/btrfs/btrfsprim/key.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'lib/btrfs/btrfsprim/key.go') diff --git a/lib/btrfs/btrfsprim/key.go b/lib/btrfs/btrfsprim/key.go index 7a3cc5c..b07cc8c 100644 --- a/lib/btrfs/btrfsprim/key.go +++ b/lib/btrfs/btrfsprim/key.go @@ -64,8 +64,26 @@ func (key Key) Mm() Key { key.Offset-- case key.ItemType > 0: key.ItemType-- + key.Offset = MaxOffset case key.ObjectID > 0: key.ObjectID-- + key.ItemType = MAX_KEY + key.Offset = MaxOffset + } + return key +} + +func (key Key) Pp() Key { + switch { + case key.Offset < MaxOffset: + key.Offset++ + case key.ItemType < MAX_KEY: + key.ItemType++ + key.Offset = 0 + case key.ObjectID < MAX_OBJECTID: + key.ObjectID++ + key.ItemType = 0 + key.Offset = 0 } return key } -- cgit v1.2.3-2-g168b