From 7c9de305d3dd364d6d76c8869d55a09bf80b28a8 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 2 Mar 2023 16:02:42 -0700 Subject: btrfs: Migrate to the new btrfstree.Forrest API --- cmd/btrfs-rec/inspect/lsfiles/lsfiles.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'cmd/btrfs-rec') diff --git a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go index af8f690..dec472d 100644 --- a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go +++ b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go @@ -21,8 +21,6 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" - "git.lukeshu.com/btrfs-progs-ng/lib/diskio" "git.lukeshu.com/btrfs-progs-ng/lib/maps" "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) @@ -32,8 +30,7 @@ func LsFiles( out io.Writer, fs interface { btrfstree.TreeOperator - Superblock() (*btrfstree.Superblock, error) - diskio.ReaderAt[btrfsvol.LogicalAddr] + btrfs.ReadableFS }, ) (err error) { defer func() { -- cgit v1.2.3-2-g168b From f9fd200f70d5746e6e5b64e1c6e7ed2474081964 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 2 Mar 2023 16:02:42 -0700 Subject: btrfsutil, cmd: Migrate to the new btrfstree.Forrest API --- cmd/btrfs-rec/inspect/dumptrees/print_tree.go | 96 +++++++++++++-------------- cmd/btrfs-rec/inspect/lsfiles/lsfiles.go | 6 +- cmd/btrfs-rec/inspect_lstrees.go | 4 +- cmd/btrfs-rec/inspect_spewitems.go | 7 +- 4 files changed, 54 insertions(+), 59 deletions(-) (limited to 'cmd/btrfs-rec') diff --git a/cmd/btrfs-rec/inspect/dumptrees/print_tree.go b/cmd/btrfs-rec/inspect/dumptrees/print_tree.go index 75797a8..735a50b 100644 --- a/cmd/btrfs-rec/inspect/dumptrees/print_tree.go +++ b/cmd/btrfs-rec/inspect/dumptrees/print_tree.go @@ -23,7 +23,7 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) -func DumpTrees(ctx context.Context, out io.Writer, fs *btrfs.FS) { +func DumpTrees(ctx context.Context, out io.Writer, fs btrfs.ReadableFS) { superblock, err := fs.Superblock() if err != nil { dlog.Error(ctx, err) @@ -46,45 +46,44 @@ func DumpTrees(ctx context.Context, out io.Writer, fs *btrfs.FS) { textui.Fprintf(out, "block group tree\n") printTree(ctx, out, fs, btrfsprim.BLOCK_GROUP_TREE_OBJECTID) } - fs.TreeWalk( - ctx, - btrfsprim.ROOT_TREE_OBJECTID, - func(err *btrfstree.TreeError) { - dlog.Error(ctx, err) - }, - btrfstree.TreeWalkHandler{ - Item: func(_ btrfstree.Path, item btrfstree.Item) { - if item.Key.ItemType != btrfsitem.ROOT_ITEM_KEY { - return - } - treeName, ok := map[btrfsprim.ObjID]string{ - btrfsprim.ROOT_TREE_OBJECTID: "root", - btrfsprim.EXTENT_TREE_OBJECTID: "extent", - btrfsprim.CHUNK_TREE_OBJECTID: "chunk", - btrfsprim.DEV_TREE_OBJECTID: "device", - btrfsprim.FS_TREE_OBJECTID: "fs", - btrfsprim.ROOT_TREE_DIR_OBJECTID: "directory", - btrfsprim.CSUM_TREE_OBJECTID: "checksum", - btrfsprim.ORPHAN_OBJECTID: "orphan", - btrfsprim.TREE_LOG_OBJECTID: "log", - btrfsprim.TREE_LOG_FIXUP_OBJECTID: "log fixup", - btrfsprim.TREE_RELOC_OBJECTID: "reloc", - btrfsprim.DATA_RELOC_TREE_OBJECTID: "data reloc", - btrfsprim.EXTENT_CSUM_OBJECTID: "extent checksum", - btrfsprim.QUOTA_TREE_OBJECTID: "quota", - btrfsprim.UUID_TREE_OBJECTID: "uuid", - btrfsprim.FREE_SPACE_TREE_OBJECTID: "free space", - btrfsprim.MULTIPLE_OBJECTIDS: "multiple", - btrfsprim.BLOCK_GROUP_TREE_OBJECTID: "block group", - }[item.Key.ObjectID] - if !ok { - treeName = "file" - } - textui.Fprintf(out, "%v tree key %v \n", treeName, item.Key.Format(btrfsprim.ROOT_TREE_OBJECTID)) - printTree(ctx, out, fs, item.Key.ObjectID) - }, - }, - ) + rootTree, err := fs.ForrestLookup(ctx, btrfsprim.ROOT_TREE_OBJECTID) + if err != nil { + dlog.Errorf(ctx, "root tree: %v", err) + } else { + if err := rootTree.TreeRange(ctx, func(item btrfstree.Item) bool { + if item.Key.ItemType != btrfsitem.ROOT_ITEM_KEY { + return true + } + treeName, ok := map[btrfsprim.ObjID]string{ + btrfsprim.ROOT_TREE_OBJECTID: "root", + btrfsprim.EXTENT_TREE_OBJECTID: "extent", + btrfsprim.CHUNK_TREE_OBJECTID: "chunk", + btrfsprim.DEV_TREE_OBJECTID: "device", + btrfsprim.FS_TREE_OBJECTID: "fs", + btrfsprim.ROOT_TREE_DIR_OBJECTID: "directory", + btrfsprim.CSUM_TREE_OBJECTID: "checksum", + btrfsprim.ORPHAN_OBJECTID: "orphan", + btrfsprim.TREE_LOG_OBJECTID: "log", + btrfsprim.TREE_LOG_FIXUP_OBJECTID: "log fixup", + btrfsprim.TREE_RELOC_OBJECTID: "reloc", + btrfsprim.DATA_RELOC_TREE_OBJECTID: "data reloc", + btrfsprim.EXTENT_CSUM_OBJECTID: "extent checksum", + btrfsprim.QUOTA_TREE_OBJECTID: "quota", + btrfsprim.UUID_TREE_OBJECTID: "uuid", + btrfsprim.FREE_SPACE_TREE_OBJECTID: "free space", + btrfsprim.MULTIPLE_OBJECTIDS: "multiple", + btrfsprim.BLOCK_GROUP_TREE_OBJECTID: "block group", + }[item.Key.ObjectID] + if !ok { + treeName = "file" + } + textui.Fprintf(out, "%v tree key %v \n", treeName, item.Key.Format(btrfsprim.ROOT_TREE_OBJECTID)) + printTree(ctx, out, fs, item.Key.ObjectID) + return true + }); err != nil { + dlog.Errorf(ctx, "iterating over root tree: %v", err) + } + } textui.Fprintf(out, "total bytes %v\n", superblock.TotalBytes) textui.Fprintf(out, "bytes used %v\n", superblock.BytesUsed) textui.Fprintf(out, "uuid %v\n", superblock.FSUUID) @@ -95,7 +94,7 @@ var nodeHeaderSize = binstruct.StaticSize(btrfstree.NodeHeader{}) // printTree mimics btrfs-progs // kernel-shared/print-tree.c:btrfs_print_tree() and // kernel-shared/print-tree.c:btrfs_print_leaf() -func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfsprim.ObjID) { +func printTree(ctx context.Context, out io.Writer, fs btrfs.ReadableFS, treeID btrfsprim.ObjID) { var itemOffset uint32 handlers := btrfstree.TreeWalkHandler{ Node: func(path btrfstree.Path, node *btrfstree.Node) { @@ -357,14 +356,13 @@ func printTree(ctx context.Context, out io.Writer, fs *btrfs.FS, treeID btrfspri }, } handlers.BadItem = handlers.Item - fs.TreeWalk( - ctx, - treeID, - func(err *btrfstree.TreeError) { - dlog.Error(ctx, err) - }, - handlers, - ) + + tree, err := fs.ForrestLookup(ctx, treeID) + if err != nil { + dlog.Errorf(ctx, "tree %v: %v", treeID, err) + return + } + tree.TreeWalk(ctx, handlers) } // printHeaderInfo mimics btrfs-progs kernel-shared/print-tree.c:print_header_info() diff --git a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go index dec472d..d172e2e 100644 --- a/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go +++ b/cmd/btrfs-rec/inspect/lsfiles/lsfiles.go @@ -20,7 +20,6 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" "git.lukeshu.com/btrfs-progs-ng/lib/maps" "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) @@ -28,10 +27,7 @@ import ( func LsFiles( ctx context.Context, out io.Writer, - fs interface { - btrfstree.TreeOperator - btrfs.ReadableFS - }, + fs btrfs.ReadableFS, ) (err error) { defer func() { if _err := derror.PanicToError(recover()); _err != nil { diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go index 5887983..0eb45ba 100644 --- a/cmd/btrfs-rec/inspect_lstrees.go +++ b/cmd/btrfs-rec/inspect_lstrees.go @@ -71,10 +71,10 @@ func init() { treeItemCnt = make(map[btrfsitem.Type]int) textui.Fprintf(os.Stdout, "tree id=%v name=%q\n", treeID, name) }, - Err: func(_ *btrfsutil.WalkError) { + BadTree: func(_ string, _ btrfsprim.ObjID, _ error) { treeErrCnt++ }, - TreeWalkHandler: btrfstree.TreeWalkHandler{ + Tree: btrfstree.TreeWalkHandler{ Node: func(path btrfstree.Path, node *btrfstree.Node) { visitedNodes.Insert(node.Head.Addr) }, diff --git a/cmd/btrfs-rec/inspect_spewitems.go b/cmd/btrfs-rec/inspect_spewitems.go index c3a1e6b..94d34d9 100644 --- a/cmd/btrfs-rec/inspect_spewitems.go +++ b/cmd/btrfs-rec/inspect_spewitems.go @@ -13,6 +13,7 @@ import ( "github.com/spf13/cobra" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfstree" "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil" "git.lukeshu.com/btrfs-progs-ng/lib/textui" @@ -30,10 +31,10 @@ func init() { spew.DisablePointerAddresses = true btrfsutil.WalkAllTrees(ctx, fs, btrfsutil.WalkAllTreesHandler{ - Err: func(err *btrfsutil.WalkError) { - dlog.Error(ctx, err) + BadTree: func(name string, id btrfsprim.ObjID, err error) { + dlog.Errorf(ctx, "%v: %v", name, err) }, - TreeWalkHandler: btrfstree.TreeWalkHandler{ + Tree: btrfstree.TreeWalkHandler{ Item: func(path btrfstree.Path, item btrfstree.Item) { textui.Fprintf(os.Stdout, "%s = ", path) spew.Dump(item) -- cgit v1.2.3-2-g168b From c7b6460ee9b3c07c13c973cbc8c8f690560fefc6 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 2 Mar 2023 16:02:42 -0700 Subject: tree-wide: Drop the old btrfstree.TreeOperator API --- cmd/btrfs-rec/inspect/mount/mount.go | 2 +- cmd/btrfs-rec/inspect_lsfiles.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'cmd/btrfs-rec') diff --git a/cmd/btrfs-rec/inspect/mount/mount.go b/cmd/btrfs-rec/inspect/mount/mount.go index 143131a..28363ed 100644 --- a/cmd/btrfs-rec/inspect/mount/mount.go +++ b/cmd/btrfs-rec/inspect/mount/mount.go @@ -54,7 +54,7 @@ func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string, noChecksums b rootSubvol := &subvolume{ Subvolume: btrfs.NewSubvolume( ctx, - btrfsutil.NewOldRebuiltForrest(ctx, fs), + btrfsutil.NewOldRebuiltForrest(fs), btrfsprim.FS_TREE_OBJECTID, noChecksums, ), diff --git a/cmd/btrfs-rec/inspect_lsfiles.go b/cmd/btrfs-rec/inspect_lsfiles.go index 00a4873..abc73bc 100644 --- a/cmd/btrfs-rec/inspect_lsfiles.go +++ b/cmd/btrfs-rec/inspect_lsfiles.go @@ -32,7 +32,7 @@ func init() { return lsfiles.LsFiles( cmd.Context(), out, - btrfsutil.NewOldRebuiltForrest(cmd.Context(), fs)) + btrfsutil.NewOldRebuiltForrest(fs)) }), }) } -- cgit v1.2.3-2-g168b