summaryrefslogtreecommitdiff
path: root/lib/btrfsprogs/btrfsrepair
diff options
context:
space:
mode:
Diffstat (limited to 'lib/btrfsprogs/btrfsrepair')
-rw-r--r--lib/btrfsprogs/btrfsrepair/clearnodes.go53
1 files changed, 19 insertions, 34 deletions
diff --git a/lib/btrfsprogs/btrfsrepair/clearnodes.go b/lib/btrfsprogs/btrfsrepair/clearnodes.go
index e9cd879..dbe1c3a 100644
--- a/lib/btrfsprogs/btrfsrepair/clearnodes.go
+++ b/lib/btrfsprogs/btrfsrepair/clearnodes.go
@@ -5,9 +5,11 @@
package btrfsrepair
import (
+ "context"
"errors"
"fmt"
- "io"
+
+ "github.com/datawire/dlib/dlog"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
@@ -15,39 +17,26 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/util"
)
-func ClearBadNodes(out, errout io.Writer, fs *btrfs.FS) error {
+func ClearBadNodes(ctx context.Context, fs *btrfs.FS) error {
var uuidsInited bool
var metadataUUID, chunkTreeUUID btrfs.UUID
- var treeName string
- var treeID btrfs.ObjID
btrfsutil.WalkAllTrees(fs, btrfsutil.WalkAllTreesHandler{
- PreTree: func(name string, id btrfs.ObjID) {
- treeName = name
- treeID = id
- },
- Err: func(err error) {
- fmt.Fprintf(errout, "error: %v\n", err)
+ Err: func(err *btrfsutil.WalkError) {
+ dlog.Error(ctx, 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
+ Node: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node]) error {
+ if !uuidsInited {
+ metadataUUID = node.Data.Head.MetadataUUID
+ chunkTreeUUID = node.Data.Head.ChunkTreeUUID
+ uuidsInited = true
}
+ return nil
+ },
+ BadNode: func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error {
if !errors.Is(err, btrfs.ErrNotANode) {
- err = btrfsutil.WalkErr{
- TreeName: treeName,
- Path: path,
- Err: err,
- }
- fmt.Fprintf(errout, "error: %v\n", err)
- return nil
+ return err
}
origErr := err
if !uuidsInited {
@@ -66,24 +55,20 @@ func ClearBadNodes(out, errout io.Writer, fs *btrfs.FS) error {
BackrefRev: btrfs.MixedBackrefRev,
ChunkTreeUUID: chunkTreeUUID,
Generation: 0,
- Owner: treeID,
+ Owner: path.TreeID,
NumItems: 0,
- Level: path[len(path)-1].NodeLevel,
+ Level: path.Nodes[len(path.Nodes)-1].NodeLevel,
},
}
node.Data.Head.Checksum, err = node.Data.CalculateChecksum()
if err != nil {
- return btrfsutil.WalkErr{
- TreeName: treeName,
- Path: path,
- Err: err,
- }
+ return err
}
if err := node.Write(); err != nil {
return err
}
- fmt.Fprintf(out, "fixed node@%v (err was %v)\n", node.Addr, origErr)
+ dlog.Infof(ctx, "fixed node@%v (err was %v)\n", node.Addr, origErr)
return nil
},
},