summaryrefslogtreecommitdiff
path: root/lib/btrfs/io2_lv.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-12 11:30:13 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-12 11:43:25 -0600
commit68555944f694e941b9cac3f8349364ec965db2fb (patch)
tree3b966ca9c633a1cf9740c8ca17904cf31121eda3 /lib/btrfs/io2_lv.go
parenta0daaacdd61f196fbc0ca90ed996e7eeb4d4fcdd (diff)
Don't let TreeWalk bail early, add TreeID in to TreePath
Diffstat (limited to 'lib/btrfs/io2_lv.go')
-rw-r--r--lib/btrfs/io2_lv.go37
1 files changed, 23 insertions, 14 deletions
diff --git a/lib/btrfs/io2_lv.go b/lib/btrfs/io2_lv.go
index dce6e27..aac902b 100644
--- a/lib/btrfs/io2_lv.go
+++ b/lib/btrfs/io2_lv.go
@@ -5,10 +5,12 @@
package btrfs
import (
+ "context"
"fmt"
"io"
"github.com/datawire/dlib/derror"
+ "github.com/datawire/dlib/dlog"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
@@ -26,7 +28,7 @@ type FS struct {
var _ util.File[btrfsvol.LogicalAddr] = (*FS)(nil)
-func (fs *FS) AddDevice(dev *Device) error {
+func (fs *FS) AddDevice(ctx context.Context, dev *Device) error {
sb, err := dev.Superblock()
if err != nil {
return err
@@ -37,7 +39,7 @@ func (fs *FS) AddDevice(dev *Device) error {
fs.cacheSuperblocks = nil
fs.cacheSuperblock = nil
if err := fs.initDev(sb); err != nil {
- return err
+ dlog.Errorf(ctx, "error: AddDevice: %q: %v", dev.Name(), err)
}
return nil
}
@@ -157,20 +159,27 @@ func (fs *FS) initDev(sb *util.Ref[btrfsvol.PhysicalAddr, Superblock]) error {
}
}
}
- if err := fs.TreeWalk(CHUNK_TREE_OBJECTID, TreeWalkHandler{
- Item: func(_ TreePath, item Item) error {
- if item.Head.Key.ItemType != btrfsitem.CHUNK_ITEM_KEY {
- return nil
- }
- for _, mapping := range item.Body.(btrfsitem.Chunk).Mappings(item.Head.Key) {
- if err := fs.LV.AddMapping(mapping); err != nil {
- return err
+ var errs derror.MultiError
+ fs.TreeWalk(CHUNK_TREE_OBJECTID,
+ func(err *TreeError) {
+ errs = append(errs, err)
+ },
+ TreeWalkHandler{
+ Item: func(_ TreePath, item Item) error {
+ if item.Head.Key.ItemType != btrfsitem.CHUNK_ITEM_KEY {
+ return nil
}
- }
- return nil
+ for _, mapping := range item.Body.(btrfsitem.Chunk).Mappings(item.Head.Key) {
+ if err := fs.LV.AddMapping(mapping); err != nil {
+ return err
+ }
+ }
+ return nil
+ },
},
- }); err != nil {
- return err
+ )
+ if len(errs) > 0 {
+ return errs
}
return nil
}