diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-26 23:05:57 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-26 23:05:57 -0600 |
commit | 00f0caa1c3c0d236aeb74705caa9c71ebe58963e (patch) | |
tree | fbd30182b2c0687345fcbb1f3aed2eaec71b0064 /pkg/btrfs/btrfsvol | |
parent | 8463b2bff37978124e5210a59590f1ac33e453c0 (diff) |
use the LV itself to reconstruct the mappings
Diffstat (limited to 'pkg/btrfs/btrfsvol')
-rw-r--r-- | pkg/btrfs/btrfsvol/lvm.go | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/pkg/btrfs/btrfsvol/lvm.go b/pkg/btrfs/btrfsvol/lvm.go index c0264b3..a145f3e 100644 --- a/pkg/btrfs/btrfsvol/lvm.go +++ b/pkg/btrfs/btrfsvol/lvm.go @@ -95,12 +95,10 @@ func (lv *LogicalVolume[PhysicalVolume]) AddMapping(m Mapping) error { break } } - if len(logicalOverlaps) > 0 { - var err error - newChunk, err = newChunk.union(logicalOverlaps...) - if err != nil { - return fmt.Errorf("(%p).AddMapping: %w", lv, err) - } + var err error + newChunk, err = newChunk.union(logicalOverlaps...) + if err != nil { + return fmt.Errorf("(%p).AddMapping: %w", lv, err) } // physical2logical @@ -119,12 +117,9 @@ func (lv *LogicalVolume[PhysicalVolume]) AddMapping(m Mapping) error { break } } - if len(physicalOverlaps) > 0 { - var err error - newExt, err = newExt.union(physicalOverlaps...) - if err != nil { - return fmt.Errorf("(%p).AddMapping: %w", lv, err) - } + newExt, err = newExt.union(physicalOverlaps...) + if err != nil { + return fmt.Errorf("(%p).AddMapping: %w", lv, err) } // logical2physical @@ -189,6 +184,26 @@ func (lv *LogicalVolume[PhysicalVolume]) fsck() error { return nil } +func (lv *LogicalVolume[PhysicalVolume]) Mappings() []Mapping { + var ret []Mapping + for _, chunk := range lv.logical2physical { + var flags *BlockGroupFlags + if chunk.Flags != nil { + val := *chunk.Flags + flags = &val + } + for _, slice := range chunk.PAddrs { + ret = append(ret, Mapping{ + LAddr: chunk.LAddr, + PAddr: slice, + Size: chunk.Size, + Flags: flags, + }) + } + } + return ret +} + func (lv *LogicalVolume[PhysicalVolume]) Resolve(laddr LogicalAddr) (paddrs map[QualifiedPhysicalAddr]struct{}, maxlen AddrDelta) { paddrs = make(map[QualifiedPhysicalAddr]struct{}) maxlen = math.MaxInt64 |