summaryrefslogtreecommitdiff
path: root/pkg/btrfsmisc
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-06 21:24:23 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-06 21:24:23 -0600
commit7151acadd5efd7e2ad18b07f9e51cf4e203b9c8b (patch)
tree0755d0ac8c94389bf24b4a33f26630a367134385 /pkg/btrfsmisc
parent9c1afdeecd3412b40c0b4973cb375cb9c71adbb1 (diff)
better node reading/writing
Diffstat (limited to 'pkg/btrfsmisc')
-rw-r--r--pkg/btrfsmisc/fsck.go49
1 files changed, 4 insertions, 45 deletions
diff --git a/pkg/btrfsmisc/fsck.go b/pkg/btrfsmisc/fsck.go
index 28b93ba..1334900 100644
--- a/pkg/btrfsmisc/fsck.go
+++ b/pkg/btrfsmisc/fsck.go
@@ -1,9 +1,9 @@
package btrfsmisc
import (
+ "errors"
"fmt"
- "lukeshu.com/btrfs-tools/pkg/binstruct"
"lukeshu.com/btrfs-tools/pkg/btrfs"
"lukeshu.com/btrfs-tools/pkg/util"
)
@@ -22,7 +22,6 @@ func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrf
sb.NodeSize, sb.SectorSize)
}
- nodeBuf := make([]byte, sb.NodeSize)
for pos := btrfs.PhysicalAddr(0); pos+btrfs.PhysicalAddr(sb.NodeSize) < devSize; pos += btrfs.PhysicalAddr(sb.SectorSize) {
if util.InSlice(pos, btrfs.SuperblockAddrs) {
//fmt.Printf("sector@%d is a superblock\n", pos)
@@ -33,51 +32,11 @@ func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrf
prog(pos)
}
- // read
-
- if _, err := dev.ReadAt(nodeBuf, pos); err != nil {
- fn(nil, fmt.Errorf("sector@%d: %w", pos, err))
- continue
- }
-
- // parse (early)
-
- nodeRef := &util.Ref[btrfs.PhysicalAddr, btrfs.Node]{
- File: dev,
- Addr: pos,
- Data: btrfs.Node{
- Size: sb.NodeSize,
- },
- }
- if _, err := binstruct.Unmarshal(nodeBuf, &nodeRef.Data.Head); err != nil {
- fn(nil, fmt.Errorf("sector@%d: %w", pos, err))
- }
-
- // sanity checking
-
- if nodeRef.Data.Head.MetadataUUID != sb.EffectiveMetadataUUID() {
- //fmt.Printf("sector@%d does not look like a node\n", pos)
+ nodeRef, err := btrfs.ReadNode[btrfs.PhysicalAddr](dev, sb, pos, nil)
+ if err != nil && errors.Is(err, btrfs.ErrNotANode) {
continue
}
-
- 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
- }
-
- // finally, process the node
-
- fn(nodeRef, nil)
+ fn(nodeRef, err)
pos += btrfs.PhysicalAddr(sb.NodeSize) - btrfs.PhysicalAddr(sb.SectorSize)
}