summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect_rebuildmappings.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-03-07 12:10:42 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-03-14 21:31:45 -0600
commit3949bd3ff240bc6d06dd08f6e3183e72571e0e1d (patch)
tree08a3de7f9b043e3f7aee37cf25e827a87c762111 /cmd/btrfs-rec/inspect_rebuildmappings.go
parentd8f9c4d091f6c2554251941c933e4549502d2e84 (diff)
Expose node-lists as a thing on the CLI
Diffstat (limited to 'cmd/btrfs-rec/inspect_rebuildmappings.go')
-rw-r--r--cmd/btrfs-rec/inspect_rebuildmappings.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/cmd/btrfs-rec/inspect_rebuildmappings.go b/cmd/btrfs-rec/inspect_rebuildmappings.go
index 9c6b1cc..b215e7a 100644
--- a/cmd/btrfs-rec/inspect_rebuildmappings.go
+++ b/cmd/btrfs-rec/inspect_rebuildmappings.go
@@ -14,6 +14,9 @@ import (
"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/btrfsvol"
+ "git.lukeshu.com/btrfs-progs-ng/lib/containers"
+ "git.lukeshu.com/btrfs-progs-ng/lib/maps"
)
func init() {
@@ -118,5 +121,46 @@ func init() {
}),
})
+ cmd.AddCommand(&cobra.Command{
+ Use: "list-nodes",
+ Short: "Produce a listing of btree nodes from previously read data",
+ Long: "" +
+ "This is a variant of `btrfs-rec inspect list-nodes` that takes " +
+ "advantage of using previously read data from " +
+ "`btrfs-rec inspect rebuild-nodes scan`.",
+ Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)),
+ RunE: func(cmd *cobra.Command, args []string) error {
+ ctx := cmd.Context()
+
+ scanResults, err := readJSONFile[rebuildmappings.ScanDevicesResult](ctx, args[0])
+ if err != nil {
+ return err
+ }
+
+ var cnt int
+ for _, devResults := range scanResults {
+ cnt += len(devResults.FoundNodes)
+ }
+ set := make(containers.Set[btrfsvol.LogicalAddr], cnt)
+ for _, devResults := range scanResults {
+ for laddr := range devResults.FoundNodes {
+ set.Insert(laddr)
+ }
+ }
+ nodeList := maps.SortedKeys(set)
+
+ dlog.Infof(ctx, "Writing nodes to stdout...")
+ if err := writeJSONFile(os.Stdout, nodeList, lowmemjson.ReEncoderConfig{
+ Indent: "\t",
+ ForceTrailingNewlines: true,
+ }); err != nil {
+ return err
+ }
+ dlog.Info(ctx, "... done writing")
+
+ return nil
+ },
+ })
+
inspectors.AddCommand(cmd)
}