Blame SOURCES/0008-Fix-resolving-devices-with-names-that-look-like-BIOS.patch

1a21aa
From 344e624f91010b6041c22ee8a24c9305b82af969 Mon Sep 17 00:00:00 2001
1a21aa
From: Vojtech Trefny <vtrefny@redhat.com>
1a21aa
Date: Tue, 18 May 2021 12:54:02 +0200
1a21aa
Subject: [PATCH] Fix resolving devices with names that look like BIOS drive
1a21aa
 number
1a21aa
1a21aa
A RAID array named "10" will not be resolved because we try to
1a21aa
resolve it using EDD data and after this lookup fails, we don't
1a21aa
try the name.
1a21aa
1a21aa
Resolves: rhbz#1960798
1a21aa
---
1a21aa
 blivet/devicetree.py     | 18 +++++++++---------
1a21aa
 tests/devicetree_test.py |  4 ++++
1a21aa
 2 files changed, 13 insertions(+), 9 deletions(-)
1a21aa
1a21aa
diff --git a/blivet/devicetree.py b/blivet/devicetree.py
1a21aa
index 88e9f0e5..f4ae1968 100644
1a21aa
--- a/blivet/devicetree.py
1a21aa
+++ b/blivet/devicetree.py
1a21aa
@@ -634,20 +634,20 @@ class DeviceTreeBase(object):
1a21aa
                     (label.startswith("'") and label.endswith("'"))):
1a21aa
                 label = label[1:-1]
1a21aa
             device = self.labels.get(label)
1a21aa
-        elif re.match(r'(0x)?[A-Fa-f0-9]{2}(p\d+)?$', devspec):
1a21aa
-            # BIOS drive number
1a21aa
-            (drive, _p, partnum) = devspec.partition("p")
1a21aa
-            spec = int(drive, 16)
1a21aa
-            for (edd_name, edd_number) in self.edd_dict.items():
1a21aa
-                if edd_number == spec:
1a21aa
-                    device = self.get_device_by_name(edd_name + partnum)
1a21aa
-                    break
1a21aa
         elif options and "nodev" in options.split(","):
1a21aa
             device = self.get_device_by_name(devspec)
1a21aa
             if not device:
1a21aa
                 device = self.get_device_by_path(devspec)
1a21aa
         else:
1a21aa
-            if not devspec.startswith("/dev/"):
1a21aa
+            if re.match(r'(0x)?[A-Fa-f0-9]{2}(p\d+)?$', devspec):
1a21aa
+                # BIOS drive number
1a21aa
+                (drive, _p, partnum) = devspec.partition("p")
1a21aa
+                spec = int(drive, 16)
1a21aa
+                for (edd_name, edd_number) in self.edd_dict.items():
1a21aa
+                    if edd_number == spec:
1a21aa
+                        device = self.get_device_by_name(edd_name + partnum)
1a21aa
+                        break
1a21aa
+            if not device and not devspec.startswith("/dev/"):
1a21aa
                 device = self.get_device_by_name(devspec)
1a21aa
                 if not device:
1a21aa
                     devspec = "/dev/" + devspec
1a21aa
diff --git a/tests/devicetree_test.py b/tests/devicetree_test.py
1a21aa
index 11f8469d..b033343d 100644
1a21aa
--- a/tests/devicetree_test.py
1a21aa
+++ b/tests/devicetree_test.py
1a21aa
@@ -49,6 +49,9 @@ class DeviceTreeTestCase(unittest.TestCase):
1a21aa
         dev3 = StorageDevice("sdp2", exists=True)
1a21aa
         dt._add_device(dev3)
1a21aa
 
1a21aa
+        dev4 = StorageDevice("10", exists=True)
1a21aa
+        dt._add_device(dev4)
1a21aa
+
1a21aa
         dt.edd_dict.update({"dev1": 0x81,
1a21aa
                             "dev2": 0x82})
1a21aa
 
1a21aa
@@ -62,6 +65,7 @@ class DeviceTreeTestCase(unittest.TestCase):
1a21aa
         self.assertEqual(dt.resolve_device("0x82"), dev2)
1a21aa
 
1a21aa
         self.assertEqual(dt.resolve_device(dev3.name), dev3)
1a21aa
+        self.assertEqual(dt.resolve_device(dev4.name), dev4)
1a21aa
 
1a21aa
     def test_device_name(self):
1a21aa
         # check that devicetree.names property contains all device's names
1a21aa
-- 
1a21aa
2.31.1
1a21aa