diff options
Diffstat (limited to 'lib/btrfs/btrfstree/types_node.go')
-rw-r--r-- | lib/btrfs/btrfstree/types_node.go | 66 |
1 files changed, 8 insertions, 58 deletions
diff --git a/lib/btrfs/btrfstree/types_node.go b/lib/btrfs/btrfstree/types_node.go index bfcbbf4..e29431f 100644 --- a/lib/btrfs/btrfstree/types_node.go +++ b/lib/btrfs/btrfstree/types_node.go @@ -10,7 +10,6 @@ import ( "fmt" "git.lukeshu.com/go/typedsync" - "github.com/datawire/dlib/derror" "git.lukeshu.com/btrfs-progs-ng/lib/binstruct" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" @@ -104,10 +103,13 @@ type NodeHeader struct { Generation btrfsprim.Generation `bin:"off=0x50, siz=0x8"` Owner btrfsprim.ObjID `bin:"off=0x58, siz=0x8"` // The ID of the tree that contains this node NumItems uint32 `bin:"off=0x60, siz=0x4"` // [ignored-when-writing] - Level uint8 `bin:"off=0x64, siz=0x1"` // 0 for leaf nodes, >=1 for interior nodes + Level uint8 `bin:"off=0x64, siz=0x1"` // 0 for leaf nodes, >=1 for interior nodes (max 8) binstruct.End `bin:"off=0x65"` } +// MaxLevel is the maximum valid NodeHeader.Level. +const MaxLevel = 8 + // MaxItems returns the maximum possible valid value of // .Head.NumItems. func (node Node) MaxItems() uint32 { @@ -306,7 +308,9 @@ type ItemHeader struct { var itemPool containers.SlicePool[Item] -func (node *Node) Free() { +// RawFree is for low-level use by caches; don't use .RawFree, use +// ReleaseNode. +func (node *Node) RawFree() { if node == nil { return } @@ -412,17 +416,6 @@ func (node *Node) LeafFreeSpace() uint32 { var ErrNotANode = errors.New("does not look like a node") -type NodeExpectations struct { - LAddr containers.Optional[btrfsvol.LogicalAddr] - // Things knowable from the parent. - Level containers.Optional[uint8] - Generation containers.Optional[btrfsprim.Generation] - Owner func(btrfsprim.ObjID, btrfsprim.Generation) error - MinItem containers.Optional[btrfsprim.Key] - // Things knowable from the structure of the tree. - MaxItem containers.Optional[btrfsprim.Key] -} - type NodeError[Addr ~int64] struct { Op string NodeAddr Addr @@ -455,7 +448,7 @@ var nodePool = typedsync.Pool[*Node]{ // returned. The error returned (if non-nil) is always of type // *NodeError[Addr]. Notable errors that may be inside of the // NodeError are ErrNotANode and *IOError. -func ReadNode[Addr ~int64](fs diskio.ReaderAt[Addr], sb Superblock, addr Addr, exp NodeExpectations) (*Node, error) { +func ReadNode[Addr ~int64](fs diskio.ReaderAt[Addr], sb Superblock, addr Addr) (*Node, error) { if int(sb.NodeSize) < nodeHeaderSize { return nil, &NodeError[Addr]{ Op: "btrfstree.ReadNode", NodeAddr: addr, @@ -521,50 +514,7 @@ func ReadNode[Addr ~int64](fs diskio.ReaderAt[Addr], sb Superblock, addr Addr, e bytePool.Put(nodeBuf) - // sanity checking (that doesn't prevent parsing) - - if err := exp.Check(node); err != nil { - return node, &NodeError[Addr]{Op: "btrfstree.ReadNode", NodeAddr: addr, Err: err} - } - // return return node, nil } - -func (exp NodeExpectations) Check(node *Node) error { - var errs derror.MultiError - if exp.LAddr.OK && node.Head.Addr != exp.LAddr.Val { - errs = append(errs, fmt.Errorf("read from laddr=%v but claims to be at laddr=%v", - exp.LAddr.Val, node.Head.Addr)) - } - if exp.Level.OK && node.Head.Level != exp.Level.Val { - errs = append(errs, fmt.Errorf("expected level=%v but claims to be level=%v", - exp.Level.Val, node.Head.Level)) - } - if exp.Generation.OK && node.Head.Generation != exp.Generation.Val { - errs = append(errs, fmt.Errorf("expected generation=%v but claims to be generation=%v", - exp.Generation.Val, node.Head.Generation)) - } - if exp.Owner != nil { - if err := exp.Owner(node.Head.Owner, node.Head.Generation); err != nil { - errs = append(errs, err) - } - } - if node.Head.NumItems == 0 { - errs = append(errs, fmt.Errorf("has no items")) - } else { - if minItem, _ := node.MinItem(); exp.MinItem.OK && exp.MinItem.Val.Compare(minItem) > 0 { - errs = append(errs, fmt.Errorf("expected minItem>=%v but node has minItem=%v", - exp.MinItem, minItem)) - } - if maxItem, _ := node.MaxItem(); exp.MaxItem.OK && exp.MaxItem.Val.Compare(maxItem) < 0 { - errs = append(errs, fmt.Errorf("expected maxItem<=%v but node has maxItem=%v", - exp.MaxItem, maxItem)) - } - } - if len(errs) > 0 { - return errs - } - return nil -} |