Module: Lvm2DiskIO
- Defined in:
- lib/VolumeManager/LVM/lvm2disk.rb
Overview
MiqDisk support module for LVM2 logical volumes.
Defined Under Namespace
Instance Method Summary collapse
-
#d_close ⇒ Object
def d_write.
- #d_init ⇒ Object
-
#d_read(pos, len) ⇒ Object
def d_init.
-
#d_size ⇒ Object
def d_close.
-
#d_write(_pos, _buf, _len) ⇒ Object
def d_read.
-
#logicalVolume ⇒ Object
def d_size.
- #volumeGroup ⇒ Object
Instance Method Details
#d_close ⇒ Object
def d_write
88 89 |
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 88 def d_close end |
#d_init ⇒ Object
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_size ⇒ Object
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 |
#logicalVolume ⇒ Object
def d_size
95 96 97 |
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 95 def logicalVolume @lvObj end |
#volumeGroup ⇒ Object
99 100 101 |
# File 'lib/VolumeManager/LVM/lvm2disk.rb', line 99 def volumeGroup @vgObj end |