summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btrfs-fsck/pass1.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/cmd/btrfs-fsck/pass1.go b/cmd/btrfs-fsck/pass1.go
index 378c88d..f880ac9 100644
--- a/cmd/btrfs-fsck/pass1.go
+++ b/cmd/btrfs-fsck/pass1.go
@@ -1,7 +1,11 @@
package main
import (
+ "encoding/json"
+ "errors"
"fmt"
+ iofs "io/fs"
+ "os"
"sort"
"lukeshu.com/btrfs-tools/pkg/btrfs"
@@ -86,6 +90,46 @@ func pass1ScanOneDev(
lostAndFoundChunks []btrfs.SysChunk,
err error,
) {
+ type rec struct {
+ DevFoundNodes map[btrfs.LogicalAddr][]btrfs.PhysicalAddr
+ DevLostAndFoundChunks []btrfs.SysChunk
+ }
+ var obj rec
+
+ const jsonFilename = "/home/lukeshu/btrfs/pass1.json"
+
+ bs, err := os.ReadFile(jsonFilename)
+ if err != nil {
+ if errors.Is(err, iofs.ErrNotExist) {
+ obj.DevFoundNodes, obj.DevLostAndFoundChunks, err = pass1ScanOneDev_x(dev, superblock, visitedChunkNodes)
+ if err != nil {
+ panic(err)
+ }
+ bs, err := json.Marshal(obj)
+ if err != nil {
+ panic(err)
+ }
+ if err := os.WriteFile(jsonFilename, bs, 0600); err != nil {
+ panic(err)
+ }
+ }
+ return nil, nil, err
+ }
+ if err := json.Unmarshal(bs, &obj); err != nil {
+ return nil, nil, err
+ }
+ return obj.DevFoundNodes, obj.DevLostAndFoundChunks, nil
+}
+
+func pass1ScanOneDev_x(
+ dev *btrfs.Device,
+ superblock btrfs.Superblock,
+ visitedChunkNodes map[btrfs.LogicalAddr]struct{},
+) (
+ foundNodes map[btrfs.LogicalAddr][]btrfs.PhysicalAddr,
+ lostAndFoundChunks []btrfs.SysChunk,
+ err error,
+) {
foundNodes = make(map[btrfs.LogicalAddr][]btrfs.PhysicalAddr)
devSize, _ := dev.Size()