summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btrfs-fsck/main.go10
-rw-r--r--pkg/btrfsmisc/fsck.go6
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 {