diff options
author | Jacek Danecki <Jacek.Danecki@intel.com> | 2009-06-22 18:46:44 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2009-06-22 18:46:44 +0200 |
commit | 9e4d2e76713c9c71dcdaf22767211c13be9b3668 (patch) | |
tree | c755ccbc9e2e603b640703216e9cccb5ff9a1caf /storage/devicetree.py | |
parent | c88e9ea497d7fdc1487ab490305538d0a0dee3f0 (diff) | |
download | anaconda-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.py | 70 |
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: |