From 7151acadd5efd7e2ad18b07f9e51cf4e203b9c8b Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 6 Jun 2022 21:24:23 -0600 Subject: better node reading/writing --- pkg/btrfsmisc/fsck.go | 49 ++++--------------------------------------------- 1 file changed, 4 insertions(+), 45 deletions(-) (limited to 'pkg/btrfsmisc') 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) } -- cgit v1.2.3-54-g00ecf