diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/btrfs-rec/inspect_dbgsums.go | 18 | ||||
-rw-r--r-- | cmd/btrfs-rec/inspect_rebuildmappings.go | 62 | ||||
-rw-r--r-- | cmd/btrfs-rec/inspect_scandevices.go | 48 |
3 files changed, 57 insertions, 71 deletions
diff --git a/cmd/btrfs-rec/inspect_dbgsums.go b/cmd/btrfs-rec/inspect_dbgsums.go index 8e230f4..b46a305 100644 --- a/cmd/btrfs-rec/inspect_dbgsums.go +++ b/cmd/btrfs-rec/inspect_dbgsums.go @@ -18,7 +18,6 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfssum" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect" "git.lukeshu.com/btrfs-progs-ng/lib/maps" ) @@ -37,19 +36,10 @@ func init() { ctx := cmd.Context() dlog.Infof(ctx, "Reading %q...", args[0]) - scanResults, err := func() (btrfsinspect.ScanDevicesResult, error) { - fh, err := os.Open(args[0]) - if err != nil { - return nil, err - } - var scanResults btrfsinspect.ScanDevicesResult - buf := bufio.NewReader(fh) - if err := lowmemjson.DecodeThenEOF(buf, &scanResults); err != nil { - return nil, err - } - _ = fh.Close() - return scanResults, nil - }() + scanResults, err := readScanResults(args[0]) + if err != nil { + return err + } dlog.Infof(ctx, "... done reading %q", args[0]) dlog.Info(ctx, "Mapping the logical address space...") diff --git a/cmd/btrfs-rec/inspect_rebuildmappings.go b/cmd/btrfs-rec/inspect_rebuildmappings.go index 5b252d5..ce90139 100644 --- a/cmd/btrfs-rec/inspect_rebuildmappings.go +++ b/cmd/btrfs-rec/inspect_rebuildmappings.go @@ -5,19 +5,17 @@ package main import ( - "encoding/json" - "fmt" + "bufio" "io" "os" + "git.lukeshu.com/go/lowmemjson" "github.com/datawire/dlib/dlog" "github.com/datawire/ocibuild/pkg/cliutil" "github.com/spf13/cobra" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect" - "git.lukeshu.com/btrfs-progs-ng/lib/maps" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/rebuildmappings" ) func init() { @@ -38,25 +36,15 @@ func init() { RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() - scanResultsBytes, err := os.ReadFile(args[0]) + dlog.Infof(ctx, "Reading %q...", args[0]) + scanResults, err := readScanResults(args[0]) if err != nil { return err } - var scanResults map[btrfsvol.DeviceID]btrfsinspect.ScanOneDeviceResult - if err := json.Unmarshal(scanResultsBytes, &scanResults); err != nil { - return err - } + dlog.Infof(ctx, "... done reading %q", args[0]) - devices := fs.LV.PhysicalVolumes() - for _, devID := range maps.SortedKeys(scanResults) { - dev, ok := devices[devID] - if !ok { - return fmt.Errorf("device ID %v mentioned in %q is not part of the filesystem", - devID, args[0]) - } - dlog.Infof(ctx, "Rebuilding mappings from results on device %v...", - dev.Name()) - scanResults[devID].AddToLV(ctx, fs, dev) + if err := rebuildmappings.RebuildMappings(ctx, fs, scanResults); err != nil { + return err } dlog.Infof(ctx, "Writing reconstructed mappings to stdout...") @@ -69,26 +57,18 @@ func init() { }) } -func writeMappingsJSON(w io.Writer, fs *btrfs.FS) error { - mappings := fs.LV.Mappings() - if _, err := io.WriteString(w, "[\n"); err != nil { - return err - } - for i, mapping := range mappings { - suffix := "," - if i == len(mappings)-1 { - suffix = "" +func writeMappingsJSON(w io.Writer, fs *btrfs.FS) (err error) { + buffer := bufio.NewWriter(w) + defer func() { + if _err := buffer.Flush(); err == nil && _err != nil { + err = _err } - bs, err := json.Marshal(mapping) - if err != nil { - return err - } - if _, err := fmt.Printf(" %s%s\n", bs, suffix); err != nil { - return err - } - } - if _, err := io.WriteString(w, "]\n"); err != nil { - return err - } - return nil + }() + return lowmemjson.Encode(&lowmemjson.ReEncoder{ + Out: buffer, + + Indent: "\t", + ForceTrailingNewlines: true, + CompactIfUnder: 120, + }, fs.LV.Mappings()) } diff --git a/cmd/btrfs-rec/inspect_scandevices.go b/cmd/btrfs-rec/inspect_scandevices.go index a7a7fb2..37bafe4 100644 --- a/cmd/btrfs-rec/inspect_scandevices.go +++ b/cmd/btrfs-rec/inspect_scandevices.go @@ -6,6 +6,7 @@ package main import ( "bufio" + "io" "os" "git.lukeshu.com/go/lowmemjson" @@ -24,11 +25,6 @@ func init() { Args: cliutil.WrapPositionalArgs(cobra.NoArgs), }, RunE: func(fs *btrfs.FS, cmd *cobra.Command, _ []string) (err error) { - maybeSetErr := func(_err error) { - if err == nil && _err != nil { - err = _err - } - } ctx := cmd.Context() results, err := btrfsinspect.ScanDevices(ctx, fs) @@ -37,17 +33,37 @@ func init() { } dlog.Info(ctx, "Writing scan results to stdout...") - buffer := bufio.NewWriter(os.Stdout) - defer func() { - maybeSetErr(buffer.Flush()) - }() - return lowmemjson.Encode(&lowmemjson.ReEncoder{ - Out: buffer, - - Indent: "\t", - ForceTrailingNewlines: true, - CompactIfUnder: 16, - }, results) + return writeScanResults(os.Stdout, results) }, }) } + +func writeScanResults(w io.Writer, results btrfsinspect.ScanDevicesResult) (err error) { + buffer := bufio.NewWriter(w) + defer func() { + if _err := buffer.Flush(); err == nil && _err != nil { + err = _err + } + }() + return lowmemjson.Encode(&lowmemjson.ReEncoder{ + Out: buffer, + + Indent: "\t", + ForceTrailingNewlines: true, + CompactIfUnder: 16, + }, results) +} + +func readScanResults(filename string) (btrfsinspect.ScanDevicesResult, error) { + fh, err := os.Open(filename) + if err != nil { + return nil, err + } + var scanResults btrfsinspect.ScanDevicesResult + buf := bufio.NewReader(fh) + if err := lowmemjson.DecodeThenEOF(buf, &scanResults); err != nil { + return nil, err + } + _ = fh.Close() + return scanResults, nil +} |