From 81e8155ff1c16dbf70206fbf239f99cf37c49432 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 31 Jan 2023 19:30:09 -0700 Subject: btrfsvol: Read: Avoid allocations for non-RAID reads --- lib/btrfs/btrfsvol/lvm.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'lib/btrfs/btrfsvol') 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 } -- cgit v1.2.3-2-g168b