Module: Lvm2DiskIO

Defined in:
lib/VolumeManager/LVM/lvm2disk.rb

Overview

MiqDisk support module for LVM2 logical volumes.

Defined Under Namespace

Classes: Segment, Stripe

Instance Method Summary collapse

Instance Method Details

#d_closeObject

def d_write



88
89
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 88

def d_close
end

#d_initObject



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 5

def d_init
  @lvObj = dInfo.lvObj
  raise "Logical volume object not present in disk info." unless @lvObj
  @vgObj = @lvObj.vgObj
  self.diskType = "#{@vgObj.lvmType} Logical Volume"
  self.blockSize = 512

  @extentSize = @vgObj.extentSize * blockSize    # extent size in bytes

  @lvSize = 0
  @segments = []
  @lvObj.segments.each do |lvSeg|
    seg = Segment.new(lvSeg.startExtent * @extentSize, ((lvSeg.startExtent + lvSeg.extentCount) * @extentSize) - 1, lvSeg.type)
    seg.lvSeg = lvSeg
    @lvSize += (seg.segSize / blockSize)

    #
    # Each slice is defined by a physical volume name and the extent
    # number of where the stripe starts on that physical volume.
    #
    lvSeg.stripes.each_slice(2) do |pvn, ext|
      pvObj = @vgObj.physicalVolumes[pvn]
      raise "Physical volume object (name=<#{pvn}>) not found in volume group (id=<#{@vgObj.vgId}> name=<#{@vgObj.vgName}>) of logical volume (id=<#{@lvObj.lvId}> name=<#{@lvObj.lvName}>)" if pvObj.nil?
      #
      # Compute the byte address of the start of the stripe on the physical volume.
      #
      ba = (pvObj.peStart * blockSize) + (ext * @extentSize)
      seg.stripes << Stripe.new(pvObj.diskObj, ba)
    end
    @segments << seg
  end
end

#d_read(pos, len) ⇒ Object

def d_init



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 38

def d_read(pos, len)
  retStr = ''
  return retStr if len == 0

  if logicalVolume.thin?
    device_id = logicalVolume.thin_segment.device_id
    thin_pool = logicalVolume.thin_pool_volume
    data_blks = thin_pool..superblock.device_to_data(device_id, pos, len)

    data_blks.each do |_device_blk, data_blk, blk_offset, blk_len|
      if data_blk.nil?
        # fill in unallactored data
        retStr << Array.new(blk_len, 0).pack("C*")

      else
        thin_pool.data_volume.disk.seek(blk_offset)
        retStr << thin_pool.data_volume.disk.read(blk_len)
      end
    end

    return retStr
  end

  endPos = pos + len - 1
  startSeg, endSeg = getSegs(pos, endPos)

  (startSeg..endSeg).each do |si|
    seg = @segments[si]
    srs = seg.startByteAddr     # segment read start
    srl = seg.segSize           # segment read length

    if si == startSeg
      srs = pos
      srl = seg.segSize - (pos - seg.startByteAddr)
    end

    if si == endSeg
      srl = endPos - srs + 1
    end

    retStr << readSeg(seg, srs, srl)
  end

  retStr
end

#d_sizeObject

def d_close



91
92
93
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 91

def d_size
  @lvSize
end

#d_write(_pos, _buf, _len) ⇒ Object

def d_read



84
85
86
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 84

def d_write(_pos, _buf, _len)
  raise "Write operation not yet supported for logical volumes"
end

#logicalVolumeObject

def d_size



95
96
97
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 95

def logicalVolume
  @lvObj
end

#volumeGroupObject



99
100
101
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 99

def volumeGroup
  @vgObj
end