New patch submitted by Federico Simoncelli (fsimonce(a)redhat.com)
You can review this change at:
http://gerrit.usersys.redhat.com/855
commit 00475aaf5591a23cf5c3215dd9c659503bc3d979
Author: Federico Simoncelli <fsimonce(a)redhat.com>
Date: Fri Aug 26 15:16:15 2011 +0000
[WIP] BZ#732980 Handle 4K block size LUN properly
Change-Id: If303fac85a29bed7b989b0b6302fc4c83075f500
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index f83316c..c7b3288 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -757,6 +757,7 @@ class HSM:
'devtype': dev.get("devtype", ""),
'pathstatus': dev.get("paths", []),
'pathlist': dev.get("connections", []),
+ 'blocksize': dev.get("blocksize",
""),
'partitioned': partitioned}
for path in devInfo["pathstatus"]:
path["lun"] = path["hbtl"].lun
@@ -838,14 +839,20 @@ class HSM:
knowndevs = list(multipath.getMPDevNamesIter())
devices = []
devSizes = []
+ devBlkSz = set()
for dev in devlist:
if dev in knowndevs:
devices.append(dev)
devSizes.append(multipath.getDeviceSize(devicemapper.getDmId(dev)))
+ devBlkSz.add(multipath.getDeviceBlockSizes(devicemapper.getDmId(dev)))
else:
raise se.InvalidPhysDev(dev)
+ # Block size check
+ if len(devBlkSz) != 1:
+ raise se.VolumeGroupBlockSizeError("VG devices must have the same block
size")
+
#Minimal size check
size = sum(devSizes)
if size < MINIMALVGSIZE:
diff --git a/vdsm/storage/multipath.py b/vdsm/storage/multipath.py
index 269e0e3..6a026c9 100644
--- a/vdsm/storage/multipath.py
+++ b/vdsm/storage/multipath.py
@@ -226,6 +226,7 @@ def pathListIter(filterGuids=None):
"vendor" : "",
"product" :"",
"fwrev" : "",
+ "blocksize" : "",
}
@@ -252,6 +253,13 @@ def pathListIter(filterGuids=None):
except Exception:
log.warn("Problem getting fwrev from device `%s`", slave,
exc_info=True)
+ if not devInfo["blocksize"]:
+ try:
+ logBlkSize, phyBlkSize = getDeviceBlockSizes(slave)
+ devInfo["blocksize"] = "%i:%i" % (logBlkSize,
phyBlkSize)
+ except Exception:
+ log.warn("Problem getting blocksize from device `%s`",
slave, exc_info=True)
+
pathInfo = {}
pathInfo["physdev"] = slave
pathInfo["state"] = pathStatuses.get(slave, "failed")
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 421737b..2b6c586 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -999,6 +999,10 @@ class VolumeGroupReplaceTagError(StorageException):
code = 516
message = "Replace Volume Group tag error"
+class VolumeGroupBlockSizeError(StorageException):
+ code = 517
+ message = "Volume Group block size error"
+
class CannotCreateLogicalVolume(StorageException):
code = 550
message = "Cannot create Logical Volume"