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 22:41:26 -0600
commit0057ac685125aea5cf06dfd8eeaa7c7d52e64dfa (patch)
treeaaefe94dee6bde955bbbe9c21d515efb85b7096c /lib/btrfs/btrfsvol
parente1c2606daa740d70efc4e1bfade0513708ceed65 (diff)
wip
Diffstat (limited to 'lib/btrfs/btrfsvol')
-rw-r--r--lib/btrfs/btrfsvol/lvm.go17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/btrfs/btrfsvol/lvm.go b/lib/btrfs/btrfsvol/lvm.go
index 9b16e10..8003466 100644
--- a/lib/btrfs/btrfsvol/lvm.go
+++ b/lib/btrfs/btrfsvol/lvm.go
@@ -6,6 +6,7 @@ package btrfsvol
import (
"bytes"
+ "errors"
"fmt"
"os"
"reflect"
@@ -117,7 +118,13 @@ type Mapping struct {
Flags containers.Optional[BlockGroupFlags] `json:",omitempty"`
}
+func (lv *LogicalVolume[PhysicalVolume]) CouldAddMapping(m Mapping) bool {
+ return lv.addMapping(m, true) == nil
+}
func (lv *LogicalVolume[PhysicalVolume]) AddMapping(m Mapping) error {
+ return lv.addMapping(m, false)
+}
+func (lv *LogicalVolume[PhysicalVolume]) addMapping(m Mapping, dryRun bool) error {
lv.init()
// sanity check
if _, haveDev := lv.id2pv[m.PAddr.Dev]; !haveDev {
@@ -154,6 +161,10 @@ func (lv *LogicalVolume[PhysicalVolume]) AddMapping(m Mapping) error {
return fmt.Errorf("(%p).AddMapping: %w", lv, err)
}
+ if dryRun {
+ return nil
+ }
+
// optimize
if len(logicalOverlaps) == 1 && reflect.DeepEqual(newChunk, logicalOverlaps[0]) &&
len(physicalOverlaps) == 1 && reflect.DeepEqual(newExt, physicalOverlaps[0]) {
@@ -301,10 +312,12 @@ func (lv *LogicalVolume[PhysicalVolume]) ReadAt(dat []byte, laddr LogicalAddr) (
return done, nil
}
+var ErrCouldNotMap = errors.New("could not map logical address")
+
func (lv *LogicalVolume[PhysicalVolume]) maybeShortReadAt(dat []byte, laddr LogicalAddr) (int, error) {
paddrs, maxlen := lv.Resolve(laddr)
if len(paddrs) == 0 {
- return 0, fmt.Errorf("read: could not map logical address %v", laddr)
+ return 0, fmt.Errorf("read: %w %v", ErrCouldNotMap, laddr)
}
if AddrDelta(len(dat)) > maxlen {
dat = dat[:maxlen]
@@ -346,7 +359,7 @@ func (lv *LogicalVolume[PhysicalVolume]) WriteAt(dat []byte, laddr LogicalAddr)
func (lv *LogicalVolume[PhysicalVolume]) maybeShortWriteAt(dat []byte, laddr LogicalAddr) (int, error) {
paddrs, maxlen := lv.Resolve(laddr)
if len(paddrs) == 0 {
- return 0, fmt.Errorf("write: could not map logical address %v", laddr)
+ return 0, fmt.Errorf("write: %w %v", ErrCouldNotMap, laddr)
}
if AddrDelta(len(dat)) > maxlen {
dat = dat[:maxlen]