summaryrefslogtreecommitdiff
path: root/lib/btrfs
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
parentd9cb7963948cfb1d705c35653f5237a5e8fee3f3 (diff)
tidy up
Diffstat (limited to 'lib/btrfs')
-rw-r--r--lib/btrfs/btrfsitem/item_chunk.go6
-rw-r--r--lib/btrfs/btrfsitem/item_devextent.go1
-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
-rw-r--r--lib/btrfs/io2_lv.go4
7 files changed, 31 insertions, 36 deletions
diff --git a/lib/btrfs/btrfsitem/item_chunk.go b/lib/btrfs/btrfsitem/item_chunk.go
index 754d650..fe2637d 100644
--- a/lib/btrfs/btrfsitem/item_chunk.go
+++ b/lib/btrfs/btrfsitem/item_chunk.go
@@ -8,6 +8,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/binstruct"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol"
"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/internal"
+ "git.lukeshu.com/btrfs-progs-ng/lib/containers"
)
// Maps logical address to physical.
@@ -50,7 +51,10 @@ func (chunk Chunk) Mappings(key internal.Key) []btrfsvol.Mapping {
},
Size: chunk.Head.Size,
SizeLocked: true,
- Flags: &chunk.Head.Type,
+ Flags: containers.Optional[btrfsvol.BlockGroupFlags]{
+ OK: true,
+ Val: chunk.Head.Type,
+ },
})
}
return ret
diff --git a/lib/btrfs/btrfsitem/item_devextent.go b/lib/btrfs/btrfsitem/item_devextent.go
index 8eca935..4f26b27 100644
--- a/lib/btrfs/btrfsitem/item_devextent.go
+++ b/lib/btrfs/btrfsitem/item_devextent.go
@@ -30,6 +30,5 @@ func (devext DevExtent) Mapping(key internal.Key) btrfsvol.Mapping {
},
Size: devext.Length,
SizeLocked: true,
- Flags: nil,
}
}
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
diff --git a/lib/btrfs/io2_lv.go b/lib/btrfs/io2_lv.go
index 9316e27..facd88c 100644
--- a/lib/btrfs/io2_lv.go
+++ b/lib/btrfs/io2_lv.go
@@ -68,10 +68,6 @@ func (fs *FS) WriteAt(p []byte, off btrfsvol.LogicalAddr) (int, error) {
return fs.LV.WriteAt(p, off)
}
-func (fs *FS) Resolve(laddr btrfsvol.LogicalAddr) (paddrs map[btrfsvol.QualifiedPhysicalAddr]struct{}, maxlen btrfsvol.AddrDelta) {
- return fs.LV.Resolve(laddr)
-}
-
func (fs *FS) Superblocks() ([]*diskio.Ref[btrfsvol.PhysicalAddr, Superblock], error) {
if fs.cacheSuperblocks != nil {
return fs.cacheSuperblocks, nil