diff --git a/ironic_python_agent/extensions/image.py b/ironic_python_agent/extensions/image.py
index 6cd51ccc6..cd1a57e5e 100644
--- a/ironic_python_agent/extensions/image.py
+++ b/ironic_python_agent/extensions/image.py
@@ -44,6 +44,7 @@ def _get_partition(device, uuid):
         try:
             utils.execute('partx', '-u', device, attempts=3,
                           delay_on_retry=True)
+            utils.execute('udevadm', 'settle')
         except processutils.ProcessExecutionError:
             LOG.warning("Couldn't re-read the partition table "
                         "on device %s" % device)
diff --git a/ironic_python_agent/tests/extensions/image.py b/ironic_python_agent/tests/extensions/image.py
index 76712c94a..aa21ca0f8 100644
--- a/ironic_python_agent/tests/extensions/image.py
+++ b/ironic_python_agent/tests/extensions/image.py
@@ -215,13 +215,14 @@ class TestImageExtension(test_base.BaseTestCase):
         lsblk_output = ('''KNAME="test" UUID="" TYPE="disk"
         KNAME="test1" UUID="256a39e3-ca3c-4fb8-9cc2-b32eec441f47" TYPE="part"
         KNAME="test2" UUID="%s" TYPE="part"''' % self.fake_root_uuid)
-        mock_execute.side_effect = (None, [lsblk_output])
+        mock_execute.side_effect = (None, None, [lsblk_output])
 
         root_part = image._get_partition(self.fake_dev,
                                               self.fake_root_uuid)
         self.assertEqual('/dev/test2', root_part)
         expected = [mock.call('partx', '-u', self.fake_dev, attempts=3,
                               delay_on_retry=True),
+                    mock.call('udevadm', 'settle'),
                     mock.call('lsblk', '-PbioKNAME,UUID,TYPE', self.fake_dev)]
         mock_execute.assert_has_calls(expected)
         self.assertFalse(mock_dispatch.called)
@@ -231,20 +232,21 @@ class TestImageExtension(test_base.BaseTestCase):
         lsblk_output = ('''KNAME="test" UUID="" TYPE="disk"
         KNAME="test1" UUID="256a39e3-ca3c-4fb8-9cc2-b32eec441f47" TYPE="part"
         KNAME="test2" UUID="" TYPE="part"''')
-        mock_execute.side_effect = (None, [lsblk_output])
+        mock_execute.side_effect = (None, None, [lsblk_output])
 
         self.assertRaises(errors.DeviceNotFound,
                           image._get_partition, self.fake_dev,
                           self.fake_root_uuid)
         expected = [mock.call('partx', '-u', self.fake_dev, attempts=3,
                               delay_on_retry=True),
+                    mock.call('udevadm', 'settle'),
                     mock.call('lsblk', '-PbioKNAME,UUID,TYPE', self.fake_dev)]
         mock_execute.assert_has_calls(expected)
         self.assertFalse(mock_dispatch.called)
 
     def test__get_partition_command_fail(self, mock_execute,
                                               mock_dispatch):
-        mock_execute.side_effect = (None,
+        mock_execute.side_effect = (None, None,
                                     processutils.ProcessExecutionError('boom'))
         self.assertRaises(errors.CommandExecutionError,
                           image._get_partition, self.fake_dev,
@@ -252,6 +254,7 @@ class TestImageExtension(test_base.BaseTestCase):
 
         expected = [mock.call('partx', '-u', self.fake_dev, attempts=3,
                               delay_on_retry=True),
+                    mock.call('udevadm', 'settle'),
                     mock.call('lsblk', '-PbioKNAME,UUID,TYPE', self.fake_dev)]
         mock_execute.assert_has_calls(expected)
         self.assertFalse(mock_dispatch.called)