summaryrefslogtreecommitdiff
path: root/cmd/btrfs-rec/inpsect_dbg.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-rec/inpsect_dbg.go')
-rw-r--r--cmd/btrfs-rec/inpsect_dbg.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/cmd/btrfs-rec/inpsect_dbg.go b/cmd/btrfs-rec/inpsect_dbg.go
new file mode 100644
index 0000000..a0dd92e
--- /dev/null
+++ b/cmd/btrfs-rec/inpsect_dbg.go
@@ -0,0 +1,73 @@
+// Copyright (C) 2022 Luke Shumaker <lukeshu@lukeshu.com>
+//
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+
+ "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/btrfsitem"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsinspect/scanforextents"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
+)
+
+func init() {
+ inspectors = append(inspectors, subcommand{
+ Command: cobra.Command{
+ Use: "dbg DUMPSUMS.gob",
+ Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)),
+ },
+ RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error {
+ ctx := cmd.Context()
+
+ dlog.Infof(ctx, "Reading %q...", args[0])
+ sums, err := scanforextents.ReadAllSums(args[0])
+ if err != nil {
+ return err
+ }
+ dlog.Infof(ctx, "... done reading %q", args[0])
+
+ out := bufio.NewWriter(os.Stdout)
+
+ dlog.Info(ctx, "Walking sum tree...")
+ btrfsutil.NewBrokenTrees(ctx, fs).TreeWalk(ctx, btrfs.CSUM_TREE_OBJECTID,
+ func(err *btrfs.TreeError) {
+ dlog.Error(ctx, err)
+ },
+ btrfs.TreeWalkHandler{
+ Item: func(path btrfs.TreePath, item btrfs.Item) error {
+ if item.Key.ItemType != btrfsitem.EXTENT_CSUM_KEY {
+ return nil
+ }
+ body := item.Body.(btrfsitem.ExtentCSum)
+
+ for i, sum := range body.Sums {
+ laddr := btrfsvol.LogicalAddr(item.Key.Offset) + (btrfsvol.LogicalAddr(i) * scanforextents.CSumBlockSize)
+ fmt.Fprintf(out, "walk: %v=%q\n",
+ laddr, scanforextents.ShortSum(sum[:body.ChecksumSize]))
+ }
+ return nil
+ },
+ },
+ )
+
+ dlog.Info(ctx, "Dumping gob...")
+ _ = sums.WalkLogical(ctx, func(laddr btrfsvol.LogicalAddr, sum scanforextents.ShortSum) error {
+ fmt.Fprintf(out, "gob: %v=%q\n",
+ laddr, sum)
+ return nil
+ })
+
+ return out.Flush()
+ },
+ })
+}