From 68555944f694e941b9cac3f8349364ec965db2fb Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 12 Jul 2022 11:30:13 -0600 Subject: Don't let TreeWalk bail early, add TreeID in to TreePath --- lib/btrfs/io2_lv.go | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'lib/btrfs/io2_lv.go') 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 } -- cgit v1.2.3-2-g168b