diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-12 11:30:13 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-12 11:43:25 -0600 |
commit | 68555944f694e941b9cac3f8349364ec965db2fb (patch) | |
tree | 3b966ca9c633a1cf9740c8ca17904cf31121eda3 /lib/btrfs/io2_lv.go | |
parent | a0daaacdd61f196fbc0ca90ed996e7eeb4d4fcdd (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.go | 37 |
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 } |