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

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