summaryrefslogtreecommitdiff
path: root/lib/btrfs/btrfsvol
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-15 14:36:47 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-15 15:51:32 -0600
commit5627aaea2c15a6fa8cca202614119f72972be37f (patch)
tree45e6199cb43fc0e64ca7714872cffd86a37d4959 /lib/btrfs/btrfsvol
parentd9cb7963948cfb1d705c35653f5237a5e8fee3f3 (diff)
tidy up
Diffstat (limited to 'lib/btrfs/btrfsvol')
-rw-r--r--lib/btrfs/btrfsvol/addr.go7
-rw-r--r--lib/btrfs/btrfsvol/chunk.go19
-rw-r--r--lib/btrfs/btrfsvol/devext.go14
-rw-r--r--lib/btrfs/btrfsvol/lvm.go16
4 files changed, 26 insertions, 30 deletions
diff --git a/lib/btrfs/btrfsvol/addr.go b/lib/btrfs/btrfsvol/addr.go
index 640a3e8..76b531d 100644
--- a/lib/btrfs/btrfsvol/addr.go
+++ b/lib/btrfs/btrfsvol/addr.go
@@ -43,6 +43,13 @@ type QualifiedPhysicalAddr struct {
Addr PhysicalAddr
}
+func (a QualifiedPhysicalAddr) Add(b AddrDelta) QualifiedPhysicalAddr {
+ return QualifiedPhysicalAddr{
+ Dev: a.Dev,
+ Addr: a.Addr.Add(b),
+ }
+}
+
func (a QualifiedPhysicalAddr) Cmp(b QualifiedPhysicalAddr) int {
if d := int(a.Dev - b.Dev); d != 0 {
return d
diff --git a/lib/btrfs/btrfsvol/chunk.go b/lib/btrfs/btrfsvol/chunk.go
index 9c77a49..8a2d439 100644
--- a/lib/btrfs/btrfsvol/chunk.go
+++ b/lib/btrfs/btrfsvol/chunk.go
@@ -8,6 +8,7 @@ import (
"fmt"
"sort"
+ "git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/maps"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
)
@@ -18,7 +19,7 @@ type chunkMapping struct {
PAddrs []QualifiedPhysicalAddr
Size AddrDelta
SizeLocked bool
- Flags *BlockGroupFlags
+ Flags containers.Optional[BlockGroupFlags]
}
type ChunkMapping = chunkMapping
@@ -73,10 +74,7 @@ func (a chunkMapping) union(rest ...chunkMapping) (chunkMapping, error) {
for _, chunk := range chunks {
offsetWithinRet := chunk.LAddr.Sub(ret.LAddr)
for _, stripe := range chunk.PAddrs {
- paddrs[QualifiedPhysicalAddr{
- Dev: stripe.Dev,
- Addr: stripe.Addr.Add(-offsetWithinRet),
- }] = struct{}{}
+ paddrs[stripe.Add(-offsetWithinRet)] = struct{}{}
}
}
ret.PAddrs = maps.Keys(paddrs)
@@ -85,15 +83,14 @@ func (a chunkMapping) union(rest ...chunkMapping) (chunkMapping, error) {
})
// figure out the flags (.Flags)
for _, chunk := range chunks {
- if chunk.Flags == nil {
+ if !chunk.Flags.OK {
continue
}
- if ret.Flags == nil {
- val := *chunk.Flags
- ret.Flags = &val
+ if !ret.Flags.OK {
+ ret.Flags = chunk.Flags
}
- if *ret.Flags != *chunk.Flags {
- return ret, fmt.Errorf("mismatch flags: %v != %v", *ret.Flags, *chunk.Flags)
+ if ret.Flags != chunk.Flags {
+ return ret, fmt.Errorf("mismatch flags: %v != %v", ret.Flags.Val, chunk.Flags.Val)
}
}
// done
diff --git a/lib/btrfs/btrfsvol/devext.go b/lib/btrfs/btrfsvol/devext.go
index 83ece99..e8e5446 100644
--- a/lib/btrfs/btrfsvol/devext.go
+++ b/lib/btrfs/btrfsvol/devext.go
@@ -7,6 +7,7 @@ package btrfsvol
import (
"fmt"
+ "git.lukeshu.com/btrfs-progs-ng/lib/containers"
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
)
@@ -16,7 +17,7 @@ type devextMapping struct {
LAddr LogicalAddr
Size AddrDelta
SizeLocked bool
- Flags *BlockGroupFlags
+ Flags containers.Optional[BlockGroupFlags]
}
// return -1 if 'a' is wholly to the left of 'b'
@@ -77,15 +78,14 @@ func (a devextMapping) union(rest ...devextMapping) (devextMapping, error) {
}
// figure out the flags (.Flags)
for _, ext := range exts {
- if ext.Flags == nil {
+ if !ext.Flags.OK {
continue
}
- if ret.Flags == nil {
- val := *ext.Flags
- ret.Flags = &val
+ if !ret.Flags.OK {
+ ret.Flags = ext.Flags
}
- if *ret.Flags != *ext.Flags {
- return ret, fmt.Errorf("mismatch flags: %v != %v", *ret.Flags, *ext.Flags)
+ if ret.Flags != ext.Flags {
+ return ret, fmt.Errorf("mismatch flags: %v != %v", ret.Flags.Val, ext.Flags.Val)
}
}
// done
diff --git a/lib/btrfs/btrfsvol/lvm.go b/lib/btrfs/btrfsvol/lvm.go
index 149c8cd..9b16e10 100644
--- a/lib/btrfs/btrfsvol/lvm.go
+++ b/lib/btrfs/btrfsvol/lvm.go
@@ -113,8 +113,8 @@ type Mapping struct {
LAddr LogicalAddr
PAddr QualifiedPhysicalAddr
Size AddrDelta
- SizeLocked bool `json:",omitempty"`
- Flags *BlockGroupFlags `json:",omitempty"`
+ SizeLocked bool `json:",omitempty"`
+ Flags containers.Optional[BlockGroupFlags] `json:",omitempty"`
}
func (lv *LogicalVolume[PhysicalVolume]) AddMapping(m Mapping) error {
@@ -232,17 +232,12 @@ func (lv *LogicalVolume[PhysicalVolume]) Mappings() []Mapping {
var ret []Mapping
_ = lv.logical2physical.Walk(func(node *containers.RBNode[chunkMapping]) error {
chunk := node.Value
- 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,
+ Flags: chunk.Flags,
})
}
return nil
@@ -264,10 +259,7 @@ func (lv *LogicalVolume[PhysicalVolume]) Resolve(laddr LogicalAddr) (paddrs map[
paddrs = make(map[QualifiedPhysicalAddr]struct{})
maxlen = chunk.Size - offsetWithinChunk
for _, stripe := range chunk.PAddrs {
- paddrs[QualifiedPhysicalAddr{
- Dev: stripe.Dev,
- Addr: stripe.Addr.Add(offsetWithinChunk),
- }] = struct{}{}
+ paddrs[stripe.Add(offsetWithinChunk)] = struct{}{}
}
return paddrs, maxlen