[PATCH 02/13] Keep lvm and md metadata separate from udev info.

David Lehman dlehman at redhat.com
Wed May 27 18:16:03 UTC 2015


We can't inject data into pyudev.Device instances like we could when
the udev db entries were plain dicts.

(cherry picked from commit fd6d5ebf3f12d4cb2e82f848e6ce7d1c9a840efa)
---
 blivet/devicetree.py | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/blivet/devicetree.py b/blivet/devicetree.py
index 4ba4640..38b729a 100644
--- a/blivet/devicetree.py
+++ b/blivet/devicetree.py
@@ -1505,11 +1505,13 @@ class DeviceTree(object):
                         lv_dev.logSize, lv_dev.vgSpaceUsed)
 
     def handleUdevLVMPVFormat(self, info, device):
+        # pylint: disable=unused-argument
         log_method_call(self, name=device.name, type=device.format.type)
+        pv_info = self.pvInfo.get(device.path, {})
         # lookup/create the VG and LVs
         try:
-            vg_name = udev.device_get_vg_name(info)
-            vg_uuid = udev.device_get_vg_uuid(info)
+            vg_name = udev.device_get_vg_name(pv_info)
+            vg_uuid = udev.device_get_vg_uuid(pv_info)
         except KeyError:
             # no vg name means no vg -- we're done with this pv
             return
@@ -1523,12 +1525,12 @@ class DeviceTree(object):
             vg_device.parents.append(device)
         else:
             try:
-                vg_size = udev.device_get_vg_size(info)
-                vg_free = udev.device_get_vg_free(info)
-                pe_size = udev.device_get_vg_extent_size(info)
-                pe_count = udev.device_get_vg_extent_count(info)
-                pe_free = udev.device_get_vg_free_extents(info)
-                pv_count = udev.device_get_vg_pv_count(info)
+                vg_size = udev.device_get_vg_size(pv_info)
+                vg_free = udev.device_get_vg_free(pv_info)
+                pe_size = udev.device_get_vg_extent_size(pv_info)
+                pe_count = udev.device_get_vg_extent_count(pv_info)
+                pe_free = udev.device_get_vg_free_extents(pv_info)
+                pv_count = udev.device_get_vg_pv_count(pv_info)
             except (KeyError, ValueError) as e:
                 log.warning("invalid data for %s: %s", device.name, e)
                 return
@@ -1548,8 +1550,9 @@ class DeviceTree(object):
         self.handleVgLvs(vg_device)
 
     def handleUdevMDMemberFormat(self, info, device):
+        # pylint: disable=unused-argument
         log_method_call(self, name=device.name, type=device.format.type)
-
+        md_info = mdraid.mdexamine(device.path)
         md_array = self.getDeviceByUuid(device.format.mdUuid, incomplete=True)
         if device.format.mdUuid and md_array:
             md_array.parents.append(device)
@@ -1557,9 +1560,9 @@ class DeviceTree(object):
             # create the array with just this one member
             try:
                 # level is reported as, eg: "raid1"
-                md_level = udev.device_get_md_level(info)
-                md_devices = udev.device_get_md_devices(info)
-                md_uuid = udev.device_get_md_uuid(info)
+                md_level = udev.device_get_md_level(md_info)
+                md_devices = udev.device_get_md_devices(md_info)
+                md_uuid = udev.device_get_md_uuid(md_info)
             except (KeyError, ValueError) as e:
                 log.warning("invalid data for %s: %s", device.name, e)
                 return
@@ -1602,10 +1605,10 @@ class DeviceTree(object):
 
             # mdexamine yields MD_METADATA only for metadata version > 0.90
             # if MD_METADATA is missing, assume metadata version is 0.90
-            md_metadata = md_metadata or udev.device_get_md_metadata(info) or "0.90"
+            md_metadata = md_metadata or udev.device_get_md_metadata(md_info) or "0.90"
 
             if not md_name:
-                md_path = info.get("DEVICE", "")
+                md_path = md_info.get("DEVICE", "")
                 if md_path:
                     md_name = devicePathToName(md_path)
                     if re.match(r'md\d+$', md_name):
@@ -1808,8 +1811,6 @@ class DeviceTree(object):
             # luks/dmcrypt
             kwargs["name"] = "luks-%s" % uuid
         elif format_type in formats.mdraid.MDRaidMember._udevTypes:
-            info.update(mdraid.mdexamine(device.path))
-
             # mdraid
             try:
                 kwargs["mdUuid"] = udev.device_get_md_uuid(info)
@@ -1823,18 +1824,18 @@ class DeviceTree(object):
             kwargs["biosraid"] = udev.device_is_biosraid_member(info)
         elif format_type == "LVM2_member":
             # lvm
-            info.update(self.pvInfo.get(device.path, {}))
+            pv_info = self.pvInfo.get(device.path, {})
 
             try:
-                kwargs["vgName"] = udev.device_get_vg_name(info)
+                kwargs["vgName"] = udev.device_get_vg_name(pv_info)
             except KeyError:
                 log.warning("PV %s has no vg_name", name)
             try:
-                kwargs["vgUuid"] = udev.device_get_vg_uuid(info)
+                kwargs["vgUuid"] = udev.device_get_vg_uuid(pv_info)
             except KeyError:
                 log.warning("PV %s has no vg_uuid", name)
             try:
-                kwargs["peStart"] = udev.device_get_pv_pe_start(info)
+                kwargs["peStart"] = udev.device_get_pv_pe_start(pv_info)
             except KeyError:
                 log.warning("PV %s has no pe_start", name)
         elif format_type == "vfat":
-- 
2.1.0



More information about the anaconda-patches mailing list