[NEW PATCH] BZ#732980 Check block size on VG commands (via gerrit-bot)

Federico Simoncelli fsimonce at redhat.com
Thu Sep 15 16:10:27 UTC 2011


New patch submitted by Federico Simoncelli (fsimonce at redhat.com)

You can review this change at: http://gerrit.usersys.redhat.com/920

commit 2130ecda49226b275d8caed80075b0c294df03ea
Author: Federico Simoncelli <fsimonce at 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 ff021e7..94480ca 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
@@ -243,6 +244,17 @@ class BlockStorageDomain(sd.StorageDomain):
         self.logBlkSize = self.getMetaParam(DMDK_LOGBLKSIZE)
         self.phyBlkSize = self.getMetaParam(DMDK_PHYBLKSIZE)
 
+        # Checking that the block size of each device in the VG has the same
+        # logical and physical size.
+        domBlkSizes = (self.logBlkSize, self.phyBlkSize)
+
+        for pv in lvm.listPVNames(sdUUID):
+            dmId = devicemapper.getDmId(os.path.basename(pv))
+            devBlkSizes = multipath.getDeviceBlockSizes(dmId)
+
+            if devBlkSizes != domBlkSizes:
+                raise se.VolumeGroupBlockSizeError(domBlkSizes, devBlkSizes)
+
         # _extendlock is used to prevent race between
         # VG extend and LV extend.
         self._extendlock = threading.Lock()
@@ -515,6 +527,8 @@ class BlockStorageDomain(sd.StorageDomain):
             if len(mapping) + len(devlist) > MAX_PVS:
                 raise se.StorageDomainIsMadeFromTooManyPVs()
 
+        domBlkSizes = (self.logBlkSize, self.phyBlkSize)
+
         self._extendlock.acquire()
         try:
 
@@ -522,11 +536,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)
+                devBlkSizes = multipath.getDeviceBlockSizes(dmId)
+
+                if devBlkSizes != domBlkSizes:
+                    raise se.VolumeGroupBlockSizeError(
+                                    domBlkSizes, devBlkSizes)
+
+                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 b0ee212..50e2510 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -843,17 +843,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"




More information about the vdsm-patches mailing list