summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-06-11 23:45:00 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-06-11 23:45:00 -0600
commit515dfcbef2002aacf49b92aa16843eb8d7232db3 (patch)
tree6704c74785b67d5cdd2f91af18f51b4636e06644
parent6fc5d416a289235dd4bb56d29fb96c5a003ea89f (diff)
more?
-rw-r--r--cmd/btrfs-fsck/pass2.go18
-rw-r--r--pkg/btrfs/io2_fs.go19
2 files changed, 10 insertions, 27 deletions
diff --git a/cmd/btrfs-fsck/pass2.go b/cmd/btrfs-fsck/pass2.go
index 1f9e3c2..c1ec61b 100644
--- a/cmd/btrfs-fsck/pass2.go
+++ b/cmd/btrfs-fsck/pass2.go
@@ -16,7 +16,7 @@ func walkFS(fs *btrfs.FS, cbs btrfs.WalkTreeHandler, errCb func(error)) {
if !ok {
errCb(fmt.Errorf("ROOT_ITEM_KEY is a %T, not a btrfsitem.Root", body))
} else if err := fs.WalkTree(root.ByteNr, cbs); err != nil {
- errCb(err)
+ errCb(fmt.Errorf("tree %v: %w", key.ObjectID.Format(0), err))
}
}
if origItem != nil {
@@ -27,34 +27,32 @@ func walkFS(fs *btrfs.FS, cbs btrfs.WalkTreeHandler, errCb func(error)) {
superblock, err := fs.Superblock()
if err != nil {
- errCb(err)
+ errCb(fmt.Errorf("superblock: %w", err))
return
}
if err := fs.WalkTree(superblock.Data.RootTree, cbs); err != nil {
- errCb(err)
+ errCb(fmt.Errorf("root tree: %w", err))
}
if err := fs.WalkTree(superblock.Data.ChunkTree, cbs); err != nil {
- errCb(err)
+ errCb(fmt.Errorf("chunk tree: %w", err))
}
if err := fs.WalkTree(superblock.Data.LogTree, cbs); err != nil {
- errCb(err)
+ errCb(fmt.Errorf("log tree: %w", err))
}
if err := fs.WalkTree(superblock.Data.BlockGroupRoot, cbs); err != nil {
- errCb(err)
+ errCb(fmt.Errorf("block group tree: %w", err))
}
}
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 {
if err != nil {
- fmt.Printf("Pass 2: error: %v\n", err)
+ fmt.Printf("Pass 2: node error: %v\n", err)
}
if node != nil {
visitedNodes[node.Addr] = struct{}{}
@@ -62,7 +60,7 @@ func pass2(fs *btrfs.FS, foundNodes map[btrfs.LogicalAddr]struct{}) {
return nil
},
}, func(err error) {
- fmt.Printf("Pass 2: error: %v\n", err)
+ fmt.Printf("Pass 2: walk error: %v\n", err)
})
orphanedNodes := make(map[btrfs.LogicalAddr]struct{})
diff --git a/pkg/btrfs/io2_fs.go b/pkg/btrfs/io2_fs.go
index cb99d14..1a3a9df 100644
--- a/pkg/btrfs/io2_fs.go
+++ b/pkg/btrfs/io2_fs.go
@@ -150,9 +150,6 @@ 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
@@ -160,12 +157,7 @@ func (fs *FS) Resolve(laddr LogicalAddr) (paddrs map[QualifiedPhysicalAddr]struc
for _, chunk := range fs.chunks {
low := LogicalAddr(chunk.Key.Offset)
high := low + LogicalAddr(chunk.Chunk.Head.Size)
- match := low <= laddr && laddr < high
- if dbg2 {
- fmt.Printf("DBG: %v <= %v < %v : %v\n",
- low, laddr, high, match)
- }
- if match {
+ if low <= laddr && laddr < high {
offsetWithinChunk := uint64(laddr) - chunk.Key.Offset
maxlen = util.Min(maxlen, chunk.Chunk.Head.Size-offsetWithinChunk)
for _, stripe := range chunk.Chunk.Stripes {
@@ -176,11 +168,6 @@ 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
}
@@ -200,9 +187,7 @@ 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 {
- err := fmt.Errorf("read: could not map logical address %v", laddr)
- panic(err)
- //return 0, err
+ return 0, fmt.Errorf("read: could not map logical address %v", laddr)
}
if uint64(len(dat)) > maxlen {
dat = dat[:maxlen]