diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-07 13:17:40 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-08 00:16:03 -0600 |
commit | c93e585d97cf6129cba277c812d100e7eac0d249 (patch) | |
tree | 37de44feba03f7a15379aa9ad38bf5e4e3d386f1 | |
parent | 1bec6c5425f6df339e35d91468d4670f84020215 (diff) |
sorta fix the Level on root nodes
-rw-r--r-- | cmd/btrfs-clear-bad-nodes/main.go | 10 | ||||
-rw-r--r-- | pkg/btrfs/io3_btree.go | 2 |
2 files changed, 10 insertions, 2 deletions
diff --git a/cmd/btrfs-clear-bad-nodes/main.go b/cmd/btrfs-clear-bad-nodes/main.go index ddd8cd3..44f6697 100644 --- a/cmd/btrfs-clear-bad-nodes/main.go +++ b/cmd/btrfs-clear-bad-nodes/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "math" "os" "lukeshu.com/btrfs-tools/pkg/btrfs" @@ -58,8 +59,15 @@ func Main(imgfilenames ...string) (err error) { } origErr := err if !uuidsInited { + // TODO(lukeshu): Is there a better way to get the chunk + // tree UUID. return fmt.Errorf("cannot repair node@%v: not (yet?) sure what the chunk tree UUID is", node.Addr) } + nodeLevel := path[len(path)-1].NodeLevel + if nodeLevel == math.MaxUint8 { + // TODO(lukeshu): Use level from the superblock or whatever. + nodeLevel = 0 + } node.Data = btrfs.Node{ Size: node.Data.Size, ChecksumType: node.Data.ChecksumType, @@ -73,7 +81,7 @@ func Main(imgfilenames ...string) (err error) { Generation: 0, Owner: treeID, NumItems: 0, - Level: path[len(path)-1].NodeLevel, + Level: nodeLevel, }, } node.Data.Head.Checksum, err = node.Data.CalculateChecksum() diff --git a/pkg/btrfs/io3_btree.go b/pkg/btrfs/io3_btree.go index 3c1535b..9ba3be1 100644 --- a/pkg/btrfs/io3_btree.go +++ b/pkg/btrfs/io3_btree.go @@ -152,7 +152,7 @@ func (fs *FS) treeWalk(path TreePath, cbs TreeWalkHandler) error { } } node, err := fs.readNodeAtLevel(path[len(path)-1].NodeAddr, path[len(path)-1].NodeLevel) - if node != nil { + if node != nil && err == nil { path[len(path)-1].NodeLevel = node.Data.Head.Level } if cbs.Node != nil { |