summaryrefslogtreecommitdiffstats
path: root/storage/devicetree.py
diff options
context:
space:
mode:
authorJacek Danecki <Jacek.Danecki@intel.com>2009-06-22 18:46:44 +0200
committerHans de Goede <hdegoede@redhat.com>2009-06-22 18:46:44 +0200
commit9e4d2e76713c9c71dcdaf22767211c13be9b3668 (patch)
treec755ccbc9e2e603b640703216e9cccb5ff9a1caf /storage/devicetree.py
parentc88e9ea497d7fdc1487ab490305538d0a0dee3f0 (diff)
downloadanaconda-9e4d2e76713c9c71dcdaf22767211c13be9b3668.tar.gz
anaconda-9e4d2e76713c9c71dcdaf22767211c13be9b3668.tar.xz
anaconda-9e4d2e76713c9c71dcdaf22767211c13be9b3668.zip
Support for MD containers.
This patch adds new class MDRaidContainerDevice.
Diffstat (limited to 'storage/devicetree.py')
-rw-r--r--storage/devicetree.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/storage/devicetree.py b/storage/devicetree.py
index c7ba51da2..ddbe91750 100644
--- a/storage/devicetree.py
+++ b/storage/devicetree.py
@@ -969,6 +969,68 @@ class DeviceTree(object):
return device
+
+ def addUdevMDContainerDevice(self, info):
+ log.debug("info=%s" % info)
+ if info.has_key("MD_DEVNAME"):
+ log.debug("real MD container")
+ else:
+ log.debug("isw md member")
+ name = udev_device_get_name(info)
+ sysfs_path = udev_device_get_sysfs_path(info)
+
+ device = StorageDevice(name,
+ major=udev_device_get_major(info),
+ minor=udev_device_get_minor(info),
+ sysfsPath=sysfs_path, exists=True)
+ self._addDevice(device)
+
+ format_type = udev_device_get_format(info)
+ args = [format_type]
+ kwargs = {"mdUuid": udev_device_get_md_uuid(info),
+ "uuid": udev_device_get_uuid(info),
+ "label": udev_device_get_label(info),
+ "device": device.path,
+ "exists": True}
+
+ log.debug("uuid=%s" % kwargs["uuid"])
+ log.debug("mdUuid=%s" % kwargs["mdUuid"])
+ device.format = formats.getFormat(*args, **kwargs)
+ log.debug("format=%s mdUuid=%s" % (device.format, device.format.mdUuid))
+
+ if device.format.mdUuid:
+ md_array = self.getDeviceByUuid(device.format.mdUuid)
+ if md_array:
+ log.debug("_addDevice to array")
+ md_array._addDevice(device)
+ else:
+ try:
+ md_level = udev_device_get_md_level(info)
+ md_devices = int(udev_device_get_md_devices(info))
+ md_uuid = udev_device_get_md_uuid(info)
+ except (KeyError, ValueError) as e:
+ log.warning("invalid data for %s: %s" % (name, e))
+ return
+
+ minor = 0
+ while True:
+ if self.getDeviceByName("imsm%d" % minor):
+ minor += 1
+ else:
+ break
+ md_name = "imsm%d" % minor
+ md_array = MDRaidContainerDevice(name=md_name,
+ memberDevices=md_devices,
+ uuid=md_uuid,
+ exists=True,
+ parents=[device])
+ try:
+ md_array.addFirstDevice(device.path)
+ self._addDevice(md_array)
+ return
+ except MDRaidError as e:
+ log.warning("failed to add member to md array %s" % e)
+
def addUdevMDDevice(self, info):
name = udev_device_get_name(info)
log_method_call(self, name=name)
@@ -1164,6 +1226,14 @@ class DeviceTree(object):
if device is None:
device = self.addUdevDMDevice(info)
+ elif udev_device_is_md_container(info):
+ log.debug("%s is an md container device" % name)
+ if device is None and uuid:
+ # try to find the device by uuid
+ device = self.getDeviceByUuid(uuid)
+
+ if device is None:
+ device = self.addUdevMDContainerDevice(info)
elif udev_device_is_md(info):
log.debug("%s is an md device" % name)
if device is None and uuid: