New patch submitted by Federico Simoncelli (fsimonce(a)redhat.com)
You can review this change at:
http://gerrit.usersys.redhat.com/920
commit 1483a9dc59fcad9cd66f3e07cf143f1fd74ea001
Author: Federico Simoncelli <fsimonce(a)redhat.com>
Date: Thu Sep 8 13:38:18 2011 +0000
BZ#732980 Check block size on VG commands
Change-Id: Ie106491328f12f650b6bb234a92238d6c0aa70c8
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 81c9e5b..9d9cfde 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -37,6 +37,7 @@ import lvm
import safelease
import blockVolume
import multipath
+import devicemapper
import resourceFactories
from resourceFactories import LVM_ACTIVATION_NAMESPACE
from persistentDict import PersistentDict, DictValidator
@@ -504,6 +505,8 @@ class BlockStorageDomain(sd.StorageDomain):
if len(mapping) + len(devlist) > MAX_PVS:
raise se.StorageDomainIsMadeFromTooManyPVs()
+ domBlockSizes = lvm.getVGBlockSizes(self.sdUUID)
+
self._extendlock.acquire()
try:
@@ -511,11 +514,18 @@ class BlockStorageDomain(sd.StorageDomain):
devices = []
for dev in devlist:
- if dev in knowndevs:
- devices.append(dev)
- else:
+ if dev not in knowndevs:
raise se.InvalidPhysDev(dev)
+ dmId = devicemapper.getDmId(dev)
+ devBlockSizes = multipath.getDeviceBlockSizes(dmId)
+
+ if devBlockSizes != domBlockSizes:
+ raise se.VolumeGroupBlockSizeError(
+ domBlockSizes, devBlockSizes)
+
+ devices.append(dev)
+
lvm.extendVG(self.sdUUID, devices)
self.updateMapping()
newsize = self.metaSize(self.sdUUID)
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index aa4d6aa..a58639f 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -839,17 +839,28 @@ class HSM:
#getSharedLock(connectionsResource...)
knowndevs = list(multipath.getMPDevNamesIter())
devices = []
- devSizes = []
+ size = 0
+ domBlockSizes = None
for dev in devlist:
if dev in knowndevs:
+ dmId = devicemapper.getDmId(dev)
+ blkSize = multipath.getDeviceBlockSizes(dmId)
+
+ # Setting the domain block size to the first device found
+ if domBlockSizes == None:
+ domBlockSizes = blkSize
+
+ # Checking device block size
+ if blkSize != domBlockSizes:
+ raise se.VolumeGroupBlockSizeError(domBlockSizes, blkSize)
+
+ size += multipath.getDeviceSize(dmId)
devices.append(dev)
- devSizes.append(multipath.getDeviceSize(devicemapper.getDmId(dev)))
else:
raise se.InvalidPhysDev(dev)
#Minimal size check
- size = sum(devSizes)
if size < MINIMALVGSIZE:
raise se.VolumeGroupSizeError("VG size must be more than %s MiB" %
str(MINIMALVGSIZE / constants.MEGAB))
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 0a0ab22..7bb3f1c 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -1001,6 +1001,15 @@ class VolumeGroupReplaceTagError(StorageException):
code = 516
message = "Replace Volume Group tag error"
+class VolumeGroupBlockSizeError(StorageException):
+ def __init__(self, domsizes, devsizes):
+ self.value = "domlogblksize=%s domphyblksize=%s " \
+ "devlogblksize=%s devphyblksize=%s" % (
+ domsizes[0], domsizes[1],
+ devsizes[0], devsizes[1])
+ code = 517
+ message = "All devices in domain must have the same block size"
+
class CannotCreateLogicalVolume(StorageException):
code = 550
message = "Cannot create Logical Volume"