diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-14 21:31:51 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-14 21:31:51 -0600 |
commit | 697d79fb12b79b65a501ec90dbb45ea165b3457d (patch) | |
tree | 7b8275fe12a2f2d7c57f1e9419b97e693b715f36 /cmd/btrfs-rec/inspect_rebuildtrees.go | |
parent | 9e9b4e8ac67052d667f6e7fae0a6620b6dbc50c7 (diff) | |
parent | afd2fe91ec604491bd8978b1880c6482e7394240 (diff) |
Merge branch 'lukeshu/reorg-cli'
Diffstat (limited to 'cmd/btrfs-rec/inspect_rebuildtrees.go')
-rw-r--r-- | cmd/btrfs-rec/inspect_rebuildtrees.go | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/cmd/btrfs-rec/inspect_rebuildtrees.go b/cmd/btrfs-rec/inspect_rebuildtrees.go index 0b41dd9..676533a 100644 --- a/cmd/btrfs-rec/inspect_rebuildtrees.go +++ b/cmd/btrfs-rec/inspect_rebuildtrees.go @@ -5,7 +5,6 @@ package main import ( - "context" "os" "runtime" "time" @@ -15,33 +14,41 @@ 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/cmd/btrfs-rec/inspect/rebuildtrees" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil" "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) func init() { - inspectors = append(inspectors, subcommand{ - Command: cobra.Command{ - Use: "rebuild-nodes NODESCAN.json", - Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)), - }, - RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { + var nodeListFilename string + cmd := &cobra.Command{ + Use: "rebuild-trees", + Long: "" + + "Rebuild broken btrees based on missing items that are implied " + + "by present items. This requires functioning " + + "chunk/dev-extent/blockgroup trees, which can be rebuilt " + + "separately with `btrfs-rec inspect rebuild-mappings`.\n" + + "\n" + + "If no --node-list is given, then a slow sector-by-sector scan " + + "will be used to find all nodes.", + Args: cliutil.WrapPositionalArgs(cobra.NoArgs), + RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() - // This is wrapped in a func in order to *ensure* that `nodeScanResults` goes out of scope once - // `rebuilder` has been created. - rebuilder, err := func(ctx context.Context) (rebuildtrees.Rebuilder, error) { - dlog.Infof(ctx, "Reading %q...", args[0]) - nodeScanResults, err := readJSONFile[rebuildmappings.ScanDevicesResult](ctx, args[0]) - if err != nil { - return nil, err - } - dlog.Infof(ctx, "... done reading %q", args[0]) + 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 + } - return rebuildtrees.NewRebuilder(ctx, fs, nodeScanResults) - }(ctx) + rebuilder, err := rebuildtrees.NewRebuilder(ctx, fs, nodeList) if err != nil { return err } @@ -70,6 +77,11 @@ func init() { dlog.Info(ctx, "... done writing") return rebuildErr - }, - }) + }), + } + cmd.Flags().StringVar(&nodeListFilename, "node-list", "", + "Output of 'btrfs-recs inspect [rebuild-mappings] list-nodes' to use for the node list") + noError(cmd.MarkFlagFilename("node-list")) + + inspectors.AddCommand(cmd) } |