From b35032f7aa821ec48612ccc78bc36f30c589c9b9 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 6 Jun 2022 12:35:02 -0600 Subject: show progress --- cmd/btrfs-fsck/main.go | 10 +++++++++- pkg/btrfsmisc/fsck.go | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/btrfs-fsck/main.go b/cmd/btrfs-fsck/main.go index be9f313..bb67556 100644 --- a/cmd/btrfs-fsck/main.go +++ b/cmd/btrfs-fsck/main.go @@ -78,10 +78,12 @@ func Main(imgfilename string) (err error) { } reconstructedChunks := make(map[btrfs.LogicalAddr][]reconstructedStripe) for _, dev := range fs.Devices { - fmt.Printf("Pass 1: ... dev[%q] scanning for nodes\n", dev.Name()) + fmt.Printf("Pass 1: ... dev[%q] scanning for nodes...\n", dev.Name()) superblock, _ := dev.Superblock() foundNodes := make(map[btrfs.LogicalAddr][]btrfs.PhysicalAddr) var lostAndFoundChunks []btrfs.SysChunk + devSize, _ := dev.Size() + lastProgress := -1 if err := btrfsmisc.ScanForNodes(dev, superblock.Data, func(nodeRef *util.Ref[btrfs.PhysicalAddr, btrfs.Node], err error) { if err != nil { fmt.Printf("Pass 1: ... dev[%q] error: %v\n", dev.Name(), err) @@ -108,6 +110,12 @@ func Main(imgfilename string) (err error) { }) } } + }, func(pos btrfs.PhysicalAddr) { + pct := int(100 * float64(pos) / float64(devSize)) + if pct != lastProgress { + fmt.Printf("Pass 1: ... dev[%q] scanned %v%%\n", dev.Name(), pct) + lastProgress = pct + } }); err != nil { return err } diff --git a/pkg/btrfsmisc/fsck.go b/pkg/btrfsmisc/fsck.go index e44dcb6..81317ce 100644 --- a/pkg/btrfsmisc/fsck.go +++ b/pkg/btrfsmisc/fsck.go @@ -11,7 +11,7 @@ import ( // ScanForNodes mimics btrfs-progs // cmds/rescue-chunk-recover.c:scan_one_device(), except it doesn't do // anything but log when it finds a node. -func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrfs.PhysicalAddr, btrfs.Node], error)) error { +func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrfs.PhysicalAddr, btrfs.Node], error), prog func(btrfs.PhysicalAddr)) error { devSize, err := dev.Size() if err != nil { return err @@ -29,6 +29,10 @@ func ScanForNodes(dev *btrfs.Device, sb btrfs.Superblock, fn func(*util.Ref[btrf continue } + if prog != nil { + prog(pos) + } + // read if _, err := dev.ReadAt(nodeBuf, pos); err != nil { -- cgit v1.2.3-2-g168b