summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inspect_rebuildmappings.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-rec/inspect_rebuildmappings.go')
-rw-r--r--cmd/btrfs-rec/inspect_rebuildmappings.go29
1 files changed, 27 insertions, 2 deletions
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
}