From bbabc9ab42accbd37072735419cc0552dc8917ee Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 20 Mar 2023 12:29:20 -0400 Subject: btrfs: Subvolume: Use LookupTreeRoot --- cmd/btrfs-rec/inspect/lsfiles/lsfiles.go | 3 +++ cmd/btrfs-rec/inspect/mount/mount.go | 1 + cmd/btrfs-rec/inspect_lsfiles.go | 1 + lib/btrfs/btrfstree/btree_forrest.go | 3 +++ lib/btrfs/io4_fs.go | 31 ++++++++++++++++--------------- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go index a713b8a..e42050f 100644 --- a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go +++ b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go @@ -8,6 +8,7 @@ package lsfiles import ( + "context" "errors" "fmt" "io" @@ -27,6 +28,7 @@ import ( ) func LsFiles( + ctx context.Context, out io.Writer, fs interface { btrfstree.TreeOperator @@ -42,6 +44,7 @@ func LsFiles( }() printSubvol(out, "", true, "/", btrfs.NewSubvolume( + ctx, fs, btrfsprim.FS_TREE_OBJECTID, false, diff --git a/cmd/btrfs-rec/inspect/mount/mount.go b/cmd/btrfs-rec/inspect/mount/mount.go index 4049393..d4d2e0a 100644 --- a/cmd/btrfs-rec/inspect/mount/mount.go +++ b/cmd/btrfs-rec/inspect/mount/mount.go @@ -53,6 +53,7 @@ func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string, noChecksums b rootSubvol := &subvolume{ Subvolume: btrfs.NewSubvolume( + ctx, btrfsutil.NewOldRebuiltForrest(ctx, fs), btrfsprim.FS_TREE_OBJECTID, noChecksums, diff --git a/cmd/btrfs-rec/inspect_lsfiles.go b/cmd/btrfs-rec/inspect_lsfiles.go index 04b5ec5..00a4873 100644 --- a/cmd/btrfs-rec/inspect_lsfiles.go +++ b/cmd/btrfs-rec/inspect_lsfiles.go @@ -30,6 +30,7 @@ func init() { }() return lsfiles.LsFiles( + cmd.Context(), out, btrfsutil.NewOldRebuiltForrest(cmd.Context(), fs)) }), diff --git a/lib/btrfs/btrfstree/btree_forrest.go b/lib/btrfs/btrfstree/btree_forrest.go index 197edc2..38a2721 100644 --- a/lib/btrfs/btrfstree/btree_forrest.go +++ b/lib/btrfs/btrfstree/btree_forrest.go @@ -21,6 +21,8 @@ type TreeRoot struct { RootNode btrfsvol.LogicalAddr Level uint8 Generation btrfsprim.Generation + + RootInode btrfsprim.ObjID // only for subvolume trees } // LookupTreeRoot is a utility function to help with implementing the @@ -70,6 +72,7 @@ func LookupTreeRoot(_ context.Context, fs TreeOperator, sb Superblock, treeID bt RootNode: rootItemBody.ByteNr, Level: rootItemBody.Level, Generation: rootItemBody.Generation, + RootInode: rootItemBody.RootDirID, }, nil case *btrfsitem.Error: return nil, fmt.Errorf("malformed ROOT_ITEM for tree %v: %w", treeID, rootItemBody.Err) diff --git a/lib/btrfs/io4_fs.go b/lib/btrfs/io4_fs.go index 0445441..4a68695 100644 --- a/lib/btrfs/io4_fs.go +++ b/lib/btrfs/io4_fs.go @@ -5,6 +5,7 @@ package btrfs import ( + "context" "fmt" "io" "path/filepath" @@ -62,7 +63,8 @@ type File struct { } type Subvolume struct { - fs interface { + ctx context.Context //nolint:containedctx // don't have an option while keeping the same API + fs interface { btrfstree.TreeOperator Superblock() (*btrfstree.Superblock, error) diskio.ReaderAt[btrfsvol.LogicalAddr] @@ -70,8 +72,8 @@ type Subvolume struct { TreeID btrfsprim.ObjID noChecksums bool - rootVal btrfsitem.Root - rootErr error + rootInfo btrfstree.TreeRoot + rootErr error bareInodeCache containers.ARCache[btrfsprim.ObjID, *BareInode] fullInodeCache containers.ARCache[btrfsprim.ObjID, *FullInode] @@ -80,6 +82,7 @@ type Subvolume struct { } func NewSubvolume( + ctx context.Context, fs interface { btrfstree.TreeOperator Superblock() (*btrfstree.Superblock, error) @@ -94,19 +97,17 @@ func NewSubvolume( noChecksums: noChecksums, } - root, err := sv.fs.TreeSearch(btrfsprim.ROOT_TREE_OBJECTID, btrfstree.SearchRootItem(sv.TreeID)) + sb, err := sv.fs.Superblock() if err != nil { sv.rootErr = err - } else { - switch rootBody := root.Body.(type) { - case *btrfsitem.Root: - sv.rootVal = rootBody.Clone() - case *btrfsitem.Error: - sv.rootErr = fmt.Errorf("FS_TREE ROOT_ITEM has malformed body: %w", rootBody.Err) - default: - panic(fmt.Errorf("should not happen: ROOT_ITEM has unexpected item type: %T", rootBody)) - } + return sv + } + rootInfo, err := btrfstree.LookupTreeRoot(ctx, sv.fs, *sb, sv.TreeID) + if err != nil { + sv.rootErr = err + return sv } + sv.rootInfo = *rootInfo sv.bareInodeCache.MaxLen = textui.Tunable(128) sv.fullInodeCache.MaxLen = textui.Tunable(128) @@ -117,11 +118,11 @@ func NewSubvolume( } func (sv *Subvolume) NewChildSubvolume(childID btrfsprim.ObjID) *Subvolume { - return NewSubvolume(sv.fs, childID, sv.noChecksums) + return NewSubvolume(sv.ctx, sv.fs, childID, sv.noChecksums) } func (sv *Subvolume) GetRootInode() (btrfsprim.ObjID, error) { - return sv.rootVal.RootDirID, sv.rootErr + return sv.rootInfo.RootInode, sv.rootErr } func (sv *Subvolume) LoadBareInode(inode btrfsprim.ObjID) (*BareInode, error) { -- cgit v1.2.3-2-g168b