summaryrefslogtreecommitdiff
path: root/pkg/btrfsmisc
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-05 22:12:51 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-05 22:12:51 -0600
commit5626918663de1d3f606850e25a5b39f940ceb7a2 (patch)
treec15d6b037078106cfa87192bbefedb944e5e466b /pkg/btrfsmisc
parent7b8cdb995ecce81e4603a31e3304f6a2b9401c4c (diff)
better error handling
Diffstat (limited to 'pkg/btrfsmisc')
-rw-r--r--pkg/btrfsmisc/fsck.go34
-rw-r--r--pkg/btrfsmisc/print_tree.go2
2 files changed, 22 insertions, 14 deletions
diff --git a/pkg/btrfsmisc/fsck.go b/pkg/btrfsmisc/fsck.go
index 8d20e6e..a771cf4 100644
--- a/pkg/btrfsmisc/fsck.go
+++ b/pkg/btrfsmisc/fsck.go
@@ -36,26 +36,37 @@ func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrf
continue
}
- // does it look like a node?
+ // parse (early)
+ nodeRef := &util.Ref[btrfs.PhysicalAddr, btrfs.Node]{
+ File: dev,
+ Addr: pos,
+ Data: btrfs.Node{
+ Size: sb.NodeSize,
+ },
+ }
var nodeHeader btrfs.NodeHeader
if _, err := binstruct.Unmarshal(nodeBuf, &nodeHeader); err != nil {
fn(nil, fmt.Errorf("sector@%d: %w", pos, err))
}
+
+ // sanity checking
+
if nodeHeader.MetadataUUID != sb.EffectiveMetadataUUID() {
//fmt.Printf("sector@%d does not look like a node\n", pos)
continue
}
- // ok, it looks like a node; go ahead and read it as a node
-
- nodeRef := &util.Ref[btrfs.PhysicalAddr, btrfs.Node]{
- File: dev,
- Addr: pos,
- Data: btrfs.Node{
- Size: sb.NodeSize,
- },
+ stored := nodeRef.Data.Head.Checksum
+ calced := btrfs.CRC32c(nodeBuf[binstruct.StaticSize(btrfs.CSum{}):])
+ if stored != calced {
+ fn(nodeRef, fmt.Errorf("sector@%d: looks like a node but is corrupt: checksum doesn't match: stored=%s calculated=%s",
+ pos, stored, calced))
+ continue
}
+
+ // parse (main)
+
if _, err := nodeRef.Data.UnmarshalBinary(nodeBuf); err != nil {
fn(nil, fmt.Errorf("sector@%d: %w", pos, err))
continue
@@ -63,11 +74,6 @@ func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrf
// finally, process the node
- if nodeRef.Data.Head.Checksum != btrfs.CRC32c(nodeBuf[0x20:]) {
- fn(nodeRef, fmt.Errorf("sector@%d looks like a node but is corrupt (checksum doesn't match)", pos))
- continue
- }
-
fn(nodeRef, nil)
pos += btrfs.PhysicalAddr(sb.NodeSize) - btrfs.PhysicalAddr(sb.SectorSize)
diff --git a/pkg/btrfsmisc/print_tree.go b/pkg/btrfsmisc/print_tree.go
index b7c3103..a771b65 100644
--- a/pkg/btrfsmisc/print_tree.go
+++ b/pkg/btrfsmisc/print_tree.go
@@ -17,6 +17,8 @@ func PrintTree(fs *btrfs.FS, root btrfs.LogicalAddr) error {
nodeRef, err := fs.ReadNode(root)
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
+ }
+ if nodeRef == nil {
return nil
}
node := nodeRef.Data