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/btrfsprogs/btrfsutil | |
parent | a0daaacdd61f196fbc0ca90ed996e7eeb4d4fcdd (diff) |
Don't let TreeWalk bail early, add TreeID in to TreePath
Diffstat (limited to 'lib/btrfsprogs/btrfsutil')
-rw-r--r-- | lib/btrfsprogs/btrfsutil/open.go | 4 | ||||
-rw-r--r-- | lib/btrfsprogs/btrfsutil/walk.go | 49 |
2 files changed, 14 insertions, 39 deletions
diff --git a/lib/btrfsprogs/btrfsutil/open.go b/lib/btrfsprogs/btrfsutil/open.go index 80bfe7a..c237b54 100644 --- a/lib/btrfsprogs/btrfsutil/open.go +++ b/lib/btrfsprogs/btrfsutil/open.go @@ -23,8 +23,8 @@ func Open(ctx context.Context, flag int, filenames ...string) (*btrfs.FS, error) _ = fs.Close() return nil, fmt.Errorf("device file %q: %w", filename, err) } - if err := fs.AddDevice(&btrfs.Device{File: fh}); err != nil { - dlog.Errorf(ctx, "device file %q: %v", filename, err) + if err := fs.AddDevice(ctx, &btrfs.Device{File: fh}); err != nil { + return nil, fmt.Errorf("device file %q: %w", filename, err) } } return fs, nil diff --git a/lib/btrfsprogs/btrfsutil/walk.go b/lib/btrfsprogs/btrfsutil/walk.go index 0c54384..d2322b2 100644 --- a/lib/btrfsprogs/btrfsutil/walk.go +++ b/lib/btrfsprogs/btrfsutil/walk.go @@ -9,47 +9,33 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsitem" - "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" - "git.lukeshu.com/btrfs-progs-ng/lib/util" ) -type WalkErr struct { +type WalkError struct { TreeName string - Path btrfs.TreePath - Err error + Err *btrfs.TreeError } -func (e WalkErr) Unwrap() error { return e.Err } +func (e *WalkError) Unwrap() error { return e.Err } -func (e WalkErr) Error() string { - if len(e.Path) == 0 { - return fmt.Sprintf("%v: %v", e.TreeName, e.Err) - } - return fmt.Sprintf("%v: %v: %v", e.TreeName, e.Path, e.Err) +func (e *WalkError) Error() string { + return fmt.Sprintf("%v: %v", e.TreeName, e.Err) } type WalkAllTreesHandler struct { - Err func(error) + Err func(*WalkError) // Callbacks for entire trees PreTree func(name string, id btrfs.ObjID) PostTree func(name string, id btrfs.ObjID) // Callbacks for nodes or smaller - UnsafeNodes bool btrfs.TreeWalkHandler } // WalkAllTrees walks all trees in a *btrfs.FS. Rather than returning // an error, it calls errCb each time an error is encountered. The -// error will always be of type WalkErr. +// error will always be of type WalkError. func WalkAllTrees(fs *btrfs.FS, cbs WalkAllTreesHandler) { var treeName string - handleErr := func(path btrfs.TreePath, err error) { - cbs.Err(WalkErr{ - TreeName: treeName, - Path: path, - Err: err, - }) - } trees := []struct { Name string @@ -90,28 +76,17 @@ func WalkAllTrees(fs *btrfs.FS, cbs WalkAllTreesHandler) { return nil } - if !cbs.UnsafeNodes { - origNode := cbs.Node - cbs.Node = func(path btrfs.TreePath, node *util.Ref[btrfsvol.LogicalAddr, btrfs.Node], err error) error { - if err != nil { - handleErr(path, err) - } - if node != nil && origNode != nil { - return origNode(path, node, nil) - } - return nil - } - } - for i := 0; i < len(trees); i++ { tree := trees[i] treeName = tree.Name if cbs.PreTree != nil { cbs.PreTree(treeName, tree.ID) } - if err := fs.TreeWalk(tree.ID, cbs.TreeWalkHandler); err != nil { - handleErr(nil, err) - } + fs.TreeWalk( + tree.ID, + func(err *btrfs.TreeError) { cbs.Err(&WalkError{TreeName: treeName, Err: err}) }, + cbs.TreeWalkHandler, + ) if cbs.PostTree != nil { cbs.PostTree(treeName, tree.ID) } |