diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-08-28 16:55:06 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-08-30 21:28:11 -0600 |
commit | 8aea2c35c9475293c89293a148134c0e6d5c4e7b (patch) | |
tree | 36f5290e2e7f0c05526d5b7e4306c37c0e65ca8e /lib/btrfs/btrfstree/readnode.go | |
parent | 8758b0e2000f0892e487afc376a6d75bb08ffb9b (diff) |
wip
Diffstat (limited to 'lib/btrfs/btrfstree/readnode.go')
-rw-r--r-- | lib/btrfs/btrfstree/readnode.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/btrfs/btrfstree/readnode.go b/lib/btrfs/btrfstree/readnode.go new file mode 100644 index 0000000..bb80d20 --- /dev/null +++ b/lib/btrfs/btrfstree/readnode.go @@ -0,0 +1,54 @@ +// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com> +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package btrfstree + +import ( + "fmt" + + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/containers" + "git.lukeshu.com/btrfs-progs-ng/lib/diskio" +) + +// FSReadNode is a utility function to help with implementing the +// 'NodeSource' interface. +func FSReadNode( + fs interface { + diskio.File[btrfsvol.LogicalAddr] + Superblock() (*Superblock, error) + ParentTree(btrfsprim.ObjID) (btrfsprim.ObjID, bool) + }, + path TreePath, +) (*diskio.Ref[btrfsvol.LogicalAddr, Node], error) { + sb, err := fs.Superblock() + if err != nil { + return nil, fmt.Errorf("btrfs.FS.ReadNode: %w", err) + } + + var treeParents []btrfsprim.ObjID + checkOwner := func(owner btrfsprim.ObjID) error { + exp := path.Node(-1).FromTree + for { + if owner == exp { + return nil + } + treeParents = append(treeParents, exp) + var ok bool + exp, ok = fs.ParentTree(exp) + if !ok { + return fmt.Errorf("expected owner in %v but claims to have owner=%v", + treeParents, owner) + } + } + } + + return ReadNode[btrfsvol.LogicalAddr](fs, *sb, path.Node(-1).ToNodeAddr, NodeExpectations{ + LAddr: containers.Optional[btrfsvol.LogicalAddr]{OK: true, Val: path.Node(-1).ToNodeAddr}, + Level: containers.Optional[uint8]{OK: true, Val: path.Node(-1).ToNodeLevel}, + MaxGeneration: containers.Optional[btrfsprim.Generation]{OK: true, Val: path.Node(-1).FromGeneration}, + Owner: checkOwner, + }) +} |