summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-11 22:04:32 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-11 22:34:30 -0600
commitf1a212cddb8dc051c510327c365da42e30b23ab9 (patch)
treeb83f1e9ed0effb995bc3ff04092c60dd9ecbfc93
parent2aa95c4e8748027c30dec3e89bb069dae14dfd3f (diff)
dbg
-rw-r--r--cmd/btrfs-fsck/pass2.go2
-rw-r--r--pkg/btrfs/io2_fs.go21
2 files changed, 21 insertions, 2 deletions
diff --git a/cmd/btrfs-fsck/pass2.go b/cmd/btrfs-fsck/pass2.go
index 2ffca0a..1f9e3c2 100644
--- a/cmd/btrfs-fsck/pass2.go
+++ b/cmd/btrfs-fsck/pass2.go
@@ -48,6 +48,8 @@ func walkFS(fs *btrfs.FS, cbs btrfs.WalkTreeHandler, errCb func(error)) {
func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
fmt.Printf("\nPass 2: orphaned nodes\n")
+ btrfs.Dbg = true
+
visitedNodes := make(map[btrfs.LogicalAddr]struct{})
walkFS(fs, btrfs.WalkTreeHandler{
Node: func(node *util.Ref[btrfs.LogicalAddr, btrfs.Node], err error) error {
diff --git a/pkg/btrfs/io2_fs.go b/pkg/btrfs/io2_fs.go
index dea8537..a59fec4 100644
--- a/pkg/btrfs/io2_fs.go
+++ b/pkg/btrfs/io2_fs.go
@@ -150,12 +150,22 @@ type QualifiedPhysicalAddr struct {
Addr PhysicalAddr
}
+var Dbg = false
+var dbg2 = false
+
func (fs *FS) Resolve(laddr LogicalAddr) (paddrs map[QualifiedPhysicalAddr]struct{}, maxlen uint64) {
paddrs = make(map[QualifiedPhysicalAddr]struct{})
maxlen = math.MaxUint64
for _, chunk := range fs.chunks {
- if chunk.Key.Offset <= uint64(laddr) && uint64(laddr) < chunk.Key.Offset+uint64(chunk.Chunk.Head.Size) {
+ low := chunk.Key.Offset
+ high := chunk.Key.Offset + uint64(chunk.Chunk.Head.Size)
+ match := low <= uint64(laddr) && uint64(laddr) < high
+ if dbg2 {
+ fmt.Printf("DBG: 0x%0x <= 0x%0x < 0x%0x : %v\n",
+ low, uint64(laddr), high, match)
+ }
+ if match {
offsetWithinChunk := uint64(laddr) - chunk.Key.Offset
maxlen = util.Min(maxlen, chunk.Chunk.Head.Size-offsetWithinChunk)
for _, stripe := range chunk.Chunk.Stripes {
@@ -166,6 +176,11 @@ func (fs *FS) Resolve(laddr LogicalAddr) (paddrs map[QualifiedPhysicalAddr]struc
}
}
}
+ if Dbg && len(paddrs) == 0 {
+ dbg2 = true
+ fs.Resolve(laddr)
+ panic(fmt.Errorf("could not resolve %v", laddr))
+ }
return paddrs, maxlen
}
@@ -185,7 +200,9 @@ func (fs *FS) ReadAt(dat []byte, laddr LogicalAddr) (int, error) {
func (fs *FS) maybeShortReadAt(dat []byte, laddr LogicalAddr) (int, error) {
paddrs, maxlen := fs.Resolve(laddr)
if len(paddrs) == 0 {
- return 0, fmt.Errorf("read: could not map logical address %v", laddr)
+ err := fmt.Errorf("read: could not map logical address %v", laddr)
+ panic(err)
+ //return 0, err
}
if uint64(len(dat)) > maxlen {
dat = dat[:maxlen]