summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-16 00:41:23 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-16 00:41:23 -0600
commit42d7bab041ea3556872f10d653281c9c48533bed (patch)
treecaa89b0e3d95aa2f8fa238f26b9292d243c0098a
parent014543ac56e5ed54c901600438697e118a0aafe5 (diff)
wip
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/csum.go12
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go17
2 files changed, 21 insertions, 8 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/csum.go b/lib/btrfsprogs/btrfsinspect/scanforextents/csum.go
index 7944497..ec46833 100644
--- a/lib/btrfsprogs/btrfsinspect/scanforextents/csum.go
+++ b/lib/btrfsprogs/btrfsinspect/scanforextents/csum.go
@@ -100,7 +100,7 @@ func readCSumTree(ctx context.Context, fs btrfs.Trees) map[shortSum][]btrfsvol.L
return sum2laddrs
}
-func LookupCSum(fs btrfs.Trees, alg btrfssum.CSumType, laddr btrfsvol.LogicalAddr) (btrfssum.CSum, error) {
+func LookupCSum(fs btrfs.Trees, alg btrfssum.CSumType, laddr btrfsvol.LogicalAddr) (map[btrfsvol.LogicalAddr]btrfssum.CSum, error) {
item, err := fs.TreeSearch(btrfs.CSUM_TREE_OBJECTID, func(key btrfs.Key, size uint32) int {
itemBeg := btrfsvol.LogicalAddr(key.ObjectID)
numSums := int64(size) / int64(alg.Size())
@@ -115,11 +115,15 @@ func LookupCSum(fs btrfs.Trees, alg btrfssum.CSumType, laddr btrfsvol.LogicalAdd
}
})
if err != nil {
- return btrfssum.CSum{}, err
+ return nil, err
}
body, ok := item.Body.(btrfsitem.ExtentCSum)
if !ok {
- return btrfssum.CSum{}, fmt.Errorf("item body is %T not ExtentCSum", item.Body)
+ return nil, fmt.Errorf("item body is %T not ExtentCSum", item.Body)
+ }
+ ret := make(map[btrfsvol.LogicalAddr]btrfssum.CSum, len(body.Sums))
+ for i, sum := range body.Sums {
+ ret[btrfsvol.LogicalAddr(item.Key.ObjectID)+(btrfsvol.LogicalAddr(i)*csumBlockSize)] = sum
}
- return body.Sums[int(laddr-btrfsvol.LogicalAddr(item.Key.ObjectID))/csumBlockSize], nil
+ return ret, nil
}
diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go b/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go
index 5e7792e..72c9201 100644
--- a/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go
+++ b/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go
@@ -29,6 +29,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockGroups *BlockGroupTr
return nil
}
runtime.GC()
+ dlog.Info(ctx, "...GC'd")
devs := fs.LV.PhysicalVolumes()
gaps := ListPhysicalGaps(fs)
@@ -122,10 +123,18 @@ func (em *ExtentMappings) init() error {
func (em *ExtentMappings) logicalSum(laddr btrfsvol.LogicalAddr) (shortSum, error) {
entry, ok := em.cacheLogical.Get(laddr)
if !ok {
- sum, err := LookupCSum(em.InFS, em.alg, laddr)
- entry.Sum = shortSum(sum[:em.alg.Size()])
- entry.Err = err
- em.cacheLogical.Add(laddr, entry)
+ sums, err := LookupCSum(em.InFS, em.alg, laddr)
+ if err != nil {
+ entry.Err = err
+ em.cacheLogical.Add(laddr, entry)
+ } else {
+ for laddr, sum := range sums {
+ entry.Sum = shortSum(sum[:em.alg.Size()])
+ em.cacheLogical.Add(laddr, entry)
+ }
+ sum := sums[laddr]
+ entry.Sum = shortSum(sum[:em.alg.Size()])
+ }
}
return entry.Sum, entry.Err
}