summaryrefslogtreecommitdiff
path: root/lib/btrfs/btrfsvol
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-01-31 19:30:09 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-12 16:16:53 -0700
commit81e8155ff1c16dbf70206fbf239f99cf37c49432 (patch)
treeee5ff01af9acd387ed97cf5d0fd77c1572bdfc91 /lib/btrfs/btrfsvol
parentf6d5cc3e1ea4a9bb67b86e561f23e609f00727ec (diff)
btrfsvol: Read: Avoid allocations for non-RAID reads
Diffstat (limited to 'lib/btrfs/btrfsvol')
-rw-r--r--lib/btrfs/btrfsvol/lvm.go10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/btrfs/btrfsvol/lvm.go b/lib/btrfs/btrfsvol/lvm.go
index 93ec438..51e2263 100644
--- a/lib/btrfs/btrfsvol/lvm.go
+++ b/lib/btrfs/btrfsvol/lvm.go
@@ -345,21 +345,23 @@ func (lv *LogicalVolume[PhysicalVolume]) maybeShortReadAt(dat []byte, laddr Logi
dat = dat[:maxlen]
}
- buf := make([]byte, len(dat))
+ buf := dat
first := true
for paddr := range paddrs {
dev, ok := lv.id2pv[paddr.Dev]
if !ok {
return 0, fmt.Errorf("device=%v does not exist", paddr.Dev)
}
+ if !first {
+ buf = make([]byte, len(buf))
+ }
if _, err := dev.ReadAt(buf, paddr.Addr); err != nil {
return 0, fmt.Errorf("read device=%v paddr=%v: %w", paddr.Dev, paddr.Addr, err)
}
- if first {
- copy(dat, buf)
- } else if !bytes.Equal(dat, buf) {
+ if !first && !bytes.Equal(dat, buf) {
return 0, fmt.Errorf("inconsistent stripes at laddr=%v len=%v", laddr, len(dat))
}
+ first = false
}
return len(dat), nil
}