From 5f45fa7d378edae2fac73517384749fc73d24e89 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 28 Feb 2023 20:33:28 -0700 Subject: tree-wide: Don't pass around a full rebuildmappings.ScanDevicesResult when a simple list of nodes will do --- cmd/btrfs-rec/inspect_lstrees.go | 43 +++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'cmd/btrfs-rec/inspect_lstrees.go') diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go index df2473c..0c82fe0 100644 --- a/cmd/btrfs-rec/inspect_lstrees.go +++ b/cmd/btrfs-rec/inspect_lstrees.go @@ -12,7 +12,6 @@ import ( "github.com/datawire/ocibuild/pkg/cliutil" "github.com/spf13/cobra" - "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings" "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" @@ -36,13 +35,9 @@ func init() { }, RunE: func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error { ctx := cmd.Context() - var scanResults rebuildmappings.ScanDevicesResult - if scandevicesFilename != "" { - var err error - scanResults, err = readJSONFile[rebuildmappings.ScanDevicesResult](ctx, scandevicesFilename) - if err != nil { - return err - } + nodeList, err := readNodeList(ctx, scandevicesFilename) + if err != nil { + return err } var treeErrCnt int @@ -98,23 +93,21 @@ func init() { treeItemCnt = make(map[btrfsitem.Type]int) textui.Fprintf(os.Stdout, "lost+found\n") sb, _ := fs.Superblock() - for _, devResults := range scanResults { - for laddr := range devResults.FoundNodes { - if visitedNodes.Has(laddr) { - continue - } - visitedNodes.Insert(laddr) - node, err := btrfstree.ReadNode[btrfsvol.LogicalAddr](fs, *sb, laddr, btrfstree.NodeExpectations{ - LAddr: containers.Optional[btrfsvol.LogicalAddr]{OK: true, Val: laddr}, - }) - if err != nil { - treeErrCnt++ - continue - } - for _, item := range node.Data.BodyLeaf { - typ := item.Key.ItemType - treeItemCnt[typ]++ - } + for _, laddr := range nodeList { + if visitedNodes.Has(laddr) { + continue + } + visitedNodes.Insert(laddr) + node, err := btrfstree.ReadNode[btrfsvol.LogicalAddr](fs, *sb, laddr, btrfstree.NodeExpectations{ + LAddr: containers.Optional[btrfsvol.LogicalAddr]{OK: true, Val: laddr}, + }) + if err != nil { + treeErrCnt++ + continue + } + for _, item := range node.Data.BodyLeaf { + typ := item.Key.ItemType + treeItemCnt[typ]++ } } flush() -- cgit v1.2.3-2-g168b From 058f8c36f6bf9ae2600bf7da33d680ced41eae9a Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 6 Mar 2023 10:42:51 -0700 Subject: cmd/btrfs-rec: Have each subcommand call runWithRawFS itself --- cmd/btrfs-rec/inspect_lstrees.go | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'cmd/btrfs-rec/inspect_lstrees.go') diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go index 0c82fe0..be72860 100644 --- a/cmd/btrfs-rec/inspect_lstrees.go +++ b/cmd/btrfs-rec/inspect_lstrees.go @@ -27,13 +27,11 @@ import ( func init() { var scandevicesFilename string - cmd := subcommand{ - Command: cobra.Command{ - Use: "ls-trees", - Short: "A brief view what types of items are in each tree", - Args: cliutil.WrapPositionalArgs(cobra.NoArgs), - }, - RunE: func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error { + cmd := &cobra.Command{ + Use: "ls-trees", + Short: "A brief view what types of items are in each tree", + Args: cliutil.WrapPositionalArgs(cobra.NoArgs), + RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error { ctx := cmd.Context() nodeList, err := readNodeList(ctx, scandevicesFilename) if err != nil { @@ -114,11 +112,10 @@ func init() { } return nil - }, + }), } - cmd.Command.Flags().StringVar(&scandevicesFilename, "scandevices", "", "Output of 'scandevices' to use for a lost+found tree") - if err := cmd.Command.MarkFlagFilename("scandevices"); err != nil { - panic(err) - } - inspectors = append(inspectors, cmd) + cmd.Flags().StringVar(&scandevicesFilename, "scandevices", "", "Output of 'scandevices' to use for a lost+found tree") + noError(cmd.MarkFlagFilename("scandevices")) + + inspectors.AddCommand(cmd) } -- cgit v1.2.3-2-g168b From 4278c185aafb0fb197e52cdb9eb9bd9d36b61c4d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 7 Mar 2023 01:35:08 -0700 Subject: cmd/btrfs-rec: Smash scandevices and rebuild-mappings together --- cmd/btrfs-rec/inspect_lstrees.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'cmd/btrfs-rec/inspect_lstrees.go') diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go index be72860..1ff7671 100644 --- a/cmd/btrfs-rec/inspect_lstrees.go +++ b/cmd/btrfs-rec/inspect_lstrees.go @@ -114,7 +114,7 @@ func init() { return nil }), } - cmd.Flags().StringVar(&scandevicesFilename, "scandevices", "", "Output of 'scandevices' to use for a lost+found tree") + cmd.Flags().StringVar(&scandevicesFilename, "scandevices", "", "Output of 'btrfs-recs inspect rebuild-mappings scan' to use for a lost+found tree") noError(cmd.MarkFlagFilename("scandevices")) inspectors.AddCommand(cmd) -- cgit v1.2.3-2-g168b From 3949bd3ff240bc6d06dd08f6e3183e72571e0e1d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 7 Mar 2023 12:10:42 -0700 Subject: Expose node-lists as a thing on the CLI --- cmd/btrfs-rec/inspect_lstrees.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'cmd/btrfs-rec/inspect_lstrees.go') diff --git a/cmd/btrfs-rec/inspect_lstrees.go b/cmd/btrfs-rec/inspect_lstrees.go index 1ff7671..05c3a57 100644 --- a/cmd/btrfs-rec/inspect_lstrees.go +++ b/cmd/btrfs-rec/inspect_lstrees.go @@ -26,14 +26,24 @@ import ( ) func init() { - var scandevicesFilename string + var nodeListFilename string cmd := &cobra.Command{ Use: "ls-trees", Short: "A brief view what types of items are in each tree", - Args: cliutil.WrapPositionalArgs(cobra.NoArgs), + Long: "" + + "If no --node-list is given, then a slow sector-by-sector scan " + + "will be used to find all lost+found nodes.", + Args: cliutil.WrapPositionalArgs(cobra.NoArgs), RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error { ctx := cmd.Context() - nodeList, err := readNodeList(ctx, scandevicesFilename) + + var nodeList []btrfsvol.LogicalAddr + var err error + if nodeListFilename != "" { + nodeList, err = readJSONFile[[]btrfsvol.LogicalAddr](ctx, nodeListFilename) + } else { + nodeList, err = btrfsutil.ListNodes(ctx, fs) + } if err != nil { return err } @@ -86,7 +96,7 @@ func init() { }, }) - if scandevicesFilename != "" { + { treeErrCnt = 0 treeItemCnt = make(map[btrfsitem.Type]int) textui.Fprintf(os.Stdout, "lost+found\n") @@ -114,8 +124,9 @@ func init() { return nil }), } - cmd.Flags().StringVar(&scandevicesFilename, "scandevices", "", "Output of 'btrfs-recs inspect rebuild-mappings scan' to use for a lost+found tree") - noError(cmd.MarkFlagFilename("scandevices")) + cmd.Flags().StringVar(&nodeListFilename, "node-list", "", + "Output of 'btrfs-recs inspect [rebuild-mappings] list-nodes' to use for a lost+found tree") + noError(cmd.MarkFlagFilename("node-list")) inspectors.AddCommand(cmd) } -- cgit v1.2.3-2-g168b