From 42d7bab041ea3556872f10d653281c9c48533bed Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 16 Jul 2022 00:41:23 -0600 Subject: wip --- lib/btrfsprogs/btrfsinspect/scanforextents/csum.go | 12 ++++++++---- .../btrfsinspect/scanforextents/scanforextents.go | 17 +++++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'lib/btrfsprogs/btrfsinspect') 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 } -- cgit v1.2.3-2-g168b