diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-23 21:33:19 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-23 21:33:19 -0600 |
commit | bf5eed5af5c34b8cf9dc2985a7c4475602929bb1 (patch) | |
tree | 9cb910940a1e16982f5c5012a4fbeb37ba172f82 /lib/btrfs/io3_btree.go | |
parent | f0a9faf21dbe508d57da3b18be9121559c70876a (diff) | |
parent | 418553acc64567ebc95122e28b07657526c92923 (diff) |
Merge branch 'lukeshu/tree-api-pt1-changes'
Diffstat (limited to 'lib/btrfs/io3_btree.go')
-rw-r--r-- | lib/btrfs/io3_btree.go | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/lib/btrfs/io3_btree.go b/lib/btrfs/io3_btree.go index 6df88f5..b60f54a 100644 --- a/lib/btrfs/io3_btree.go +++ b/lib/btrfs/io3_btree.go @@ -25,13 +25,18 @@ var _ btrfstree.NodeSource = (*FS)(nil) // btrfstree.NodeFile ////////////////////////////////////////////////////////// +type treeInfo struct { + UUID btrfsprim.UUID + ParentUUID btrfsprim.UUID + ParentGen btrfsprim.Generation +} + func (fs *FS) populateTreeUUIDs(ctx context.Context) { - if fs.cacheObjID2UUID != nil && fs.cacheUUID2ObjID != nil && fs.cacheTreeParent != nil { + if fs.cacheObjID2All != nil && fs.cacheUUID2ObjID != nil { return } - fs.cacheObjID2UUID = make(map[btrfsprim.ObjID]btrfsprim.UUID) + fs.cacheObjID2All = make(map[btrfsprim.ObjID]treeInfo) fs.cacheUUID2ObjID = make(map[btrfsprim.UUID]btrfsprim.ObjID) - fs.cacheTreeParent = make(map[btrfsprim.ObjID]btrfsprim.UUID) fs.TreeWalk(ctx, btrfsprim.ROOT_TREE_OBJECTID, func(err *btrfstree.TreeError) { // do nothing @@ -42,8 +47,11 @@ func (fs *FS) populateTreeUUIDs(ctx context.Context) { if !ok { return } - fs.cacheObjID2UUID[item.Key.ObjectID] = itemBody.UUID - fs.cacheTreeParent[item.Key.ObjectID] = itemBody.ParentUUID + fs.cacheObjID2All[item.Key.ObjectID] = treeInfo{ + UUID: itemBody.UUID, + ParentUUID: itemBody.ParentUUID, + ParentGen: btrfsprim.Generation(item.Key.Offset), + } fs.cacheUUID2ObjID[itemBody.UUID] = item.Key.ObjectID }, }, @@ -51,27 +59,28 @@ func (fs *FS) populateTreeUUIDs(ctx context.Context) { } // ParentTree implements btrfstree.NodeFile. -func (fs *FS) ParentTree(tree btrfsprim.ObjID) (btrfsprim.ObjID, bool) { +func (fs *FS) ParentTree(tree btrfsprim.ObjID) (btrfsprim.ObjID, btrfsprim.Generation, bool) { if tree < btrfsprim.FIRST_FREE_OBJECTID || tree > btrfsprim.LAST_FREE_OBJECTID { // no parent - return 0, true + return 0, 0, true } fs.populateTreeUUIDs(context.TODO()) - parentUUID, ok := fs.cacheTreeParent[tree] + + all, ok := fs.cacheObjID2All[tree] if !ok { // could not look up parent info - return 0, false + return 0, 0, false } - if parentUUID == (btrfsprim.UUID{}) { + if all.ParentUUID == (btrfsprim.UUID{}) { // no parent - return 0, true + return 0, 0, true } - parentObjID, ok := fs.cacheUUID2ObjID[parentUUID] + parentObjID, ok := fs.cacheUUID2ObjID[all.ParentUUID] if !ok { // could not look up parent info - return 0, false + return 0, 0, false } - return parentObjID, true + return parentObjID, all.ParentGen, true } var _ btrfstree.NodeFile = (*FS)(nil) |