diff options
-rw-r--r-- | cmd/btrfs-fsck/main.go | 10 | ||||
-rw-r--r-- | 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 { |