From cbb2379d822bf391e4f9d1ed7dab8fca0aa85c6d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 22 Jul 2023 21:18:40 -0600 Subject: wip: rebuildmappings process: Don't require --pv --- cmd/btrfs-rec/inspect_rebuildmappings.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'cmd/btrfs-rec/inspect_rebuildmappings.go') diff --git a/cmd/btrfs-rec/inspect_rebuildmappings.go b/cmd/btrfs-rec/inspect_rebuildmappings.go index e883b93..4c194c7 100644 --- a/cmd/btrfs-rec/inspect_rebuildmappings.go +++ b/cmd/btrfs-rec/inspect_rebuildmappings.go @@ -5,6 +5,7 @@ package main import ( + "fmt" "os" "git.lukeshu.com/go/lowmemjson" @@ -37,7 +38,7 @@ func init() { "\tbtrfs-rec inspect rebuild-mappings scan > SCAN.json # read\n" + "\tbtrfs-rec inspect rebuild-mappings process SCAN.json # CPU\n", Args: cliutil.WrapPositionalArgs(cobra.NoArgs), - RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { + RunE: runWithRawFS(nil, func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() scanResults, err := rebuildmappings.ScanDevices(ctx, fs) @@ -67,7 +68,7 @@ func init() { Use: "scan", Short: "Read from the filesystem all data nescessary to rebuild the mappings", Args: cliutil.WrapPositionalArgs(cobra.NoArgs), - RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, _ []string) (err error) { + RunE: runWithRawFS(nil, func(fs *btrfs.FS, cmd *cobra.Command, _ []string) (err error) { ctx := cmd.Context() devResults, err := rebuildmappings.ScanDevices(ctx, fs) @@ -94,6 +95,7 @@ func init() { }), }) + var scanResults rebuildmappings.ScanResult cmd.AddCommand(&cobra.Command{ Use: "process", Short: "Rebuild the mappings based on previously read data", @@ -108,6 +110,29 @@ func init() { } dlog.Infof(ctx, "... done reading %q", args[0]) + pvDevices := fs.LV.PhysicalVolumes() + for _, devID := range maps.SortedKeys(scanResults.Devices) { + if maps.HasKey(pvDevices, devID) { + continue + } + devFile := &btrfs.Device{ + File: rebuildmappings.NewPhonyFile( + scanResults.Devices[devID].Size, + scanResults.Devices[devID].Superblock.Val), + } + if err := fs.AddDevice(ctx, devFile); err != nil { + return fmt.Errorf("device file: %q: %w", devFile.Name(), err) + } + } + for _, mapping := range scanResults.Mappings { + if err := fs.LV.AddMapping(mapping); err != nil { + return err + } + } + return nil + }, func(fs *btrfs.FS, cmd *cobra.Command, _ []string) error { + ctx := cmd.Context() + if err := rebuildmappings.RebuildMappings(ctx, fs, scanResults.Devices); err != nil { return err } -- cgit v1.2.3-2-g168b