summaryrefslogtreecommitdiff
path: root/cmd/btrfs-clear-bad-nodes/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-clear-bad-nodes/main.go')
-rw-r--r--cmd/btrfs-clear-bad-nodes/main.go84
1 files changed, 4 insertions, 80 deletions
diff --git a/cmd/btrfs-clear-bad-nodes/main.go b/cmd/btrfs-clear-bad-nodes/main.go
index 88c148c..f4b25f1 100644
--- a/cmd/btrfs-clear-bad-nodes/main.go
+++ b/cmd/btrfs-clear-bad-nodes/main.go
@@ -5,14 +5,11 @@
package main
import (
- "errors"
"fmt"
"os"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
- "git.lukeshu.com/btrfs-progs-ng/lib/btrfsmisc"
- "git.lukeshu.com/btrfs-progs-ng/lib/util"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsrepair"
+ "git.lukeshu.com/btrfs-progs-ng/lib/btrfsprogs/btrfsutil"
)
func main() {
@@ -29,7 +26,7 @@ func Main(imgfilenames ...string) (err error) {
}
}
- fs, err := btrfsmisc.Open(os.O_RDWR, imgfilenames...)
+ fs, err := btrfsutil.Open(os.O_RDWR, imgfilenames...)
if err != nil {
return err
}
@@ -37,78 +34,5 @@ func Main(imgfilenames ...string) (err error) {
maybeSetErr(fs.Close())
}()
- var uuidsInited bool
- var metadataUUID, chunkTreeUUID btrfs.UUID
-
- var treeName string
- var treeID btrfs.ObjID
- btrfsmisc.WalkAllTrees(fs, btrfsmisc.WalkAllTreesHandler{
- PreTree: func(name string, id btrfs.ObjID) {
- treeName = name
- treeID = id
- },
- Err: func(err error) {
- fmt.Printf("error: %v\n", err)
- },
- UnsafeNodes: true,
- TreeWalkHandler: btrfs.TreeWalkHandler{
- Node: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
- if err == nil {
- if !uuidsInited {
- metadataUUID = node.Data.Head.MetadataUUID
- chunkTreeUUID = node.Data.Head.ChunkTreeUUID
- uuidsInited = true
- }
- return nil
- }
- if !errors.Is(err, btrfs.ErrNotANode) {
- err = btrfsmisc.WalkErr{
- TreeName: treeName,
- Path: path,
- Err: err,
- }
- fmt.Printf("error: %v\n", err)
- return nil
- }
- 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)
- }
- node.Data = btrfs.Node{
- Size: node.Data.Size,
- ChecksumType: node.Data.ChecksumType,
- Head: btrfs.NodeHeader{
- //Checksum: filled below,
- MetadataUUID: metadataUUID,
- Addr: node.Addr,
- Flags: btrfs.NodeWritten,
- BackrefRev: btrfs.MixedBackrefRev,
- ChunkTreeUUID: chunkTreeUUID,
- Generation: 0,
- Owner: treeID,
- NumItems: 0,
- Level: path[len(path)-1].NodeLevel,
- },
- }
- node.Data.Head.Checksum, err = node.Data.CalculateChecksum()
- if err != nil {
- return btrfsmisc.WalkErr{
- TreeName: treeName,
- Path: path,
- Err: err,
- }
- }
- if err := node.Write(); err != nil {
- return err
- }
-
- fmt.Printf("fixed node@%v (err was %v)\n", node.Addr, origErr)
- return nil
- },
- },
- })
-
- return nil
+ return btrfsrepair.ClearBadNodes(fs)
}