diff -Nru python-os-brick-1.6.1/debian/changelog python-os-brick-1.6.1/debian/changelog --- python-os-brick-1.6.1/debian/changelog 2017-02-03 10:50:10.000000000 +0800 +++ python-os-brick-1.6.1/debian/changelog 2017-03-22 18:06:17.000000000 +0800 @@ -1,3 +1,10 @@ +python-os-brick (1.6.1-0ubuntu1.2) yakkety; urgency=medium + + * d/p/stop-calling-multipath-r-when-attaching-detaching-iS.patch + Backport fix for stopping calling 'multipath -r' (LP: #1623700) + + -- Hua Zhang Wed, 22 Mar 2017 18:04:15 +0800 + python-os-brick (1.6.1-0ubuntu1.1) yakkety; urgency=medium * d/p/s390-fc-device-path.patch: Patch added to fix LUN attachment error diff -Nru python-os-brick-1.6.1/debian/patches/series python-os-brick-1.6.1/debian/patches/series --- python-os-brick-1.6.1/debian/patches/series 2017-02-03 10:48:36.000000000 +0800 +++ python-os-brick-1.6.1/debian/patches/series 2017-03-22 18:04:00.000000000 +0800 @@ -1,3 +1,4 @@ drop-reno-sphinxext.patch removes-privacy-breach-in-docs.patch s390-fc-device-path.patch +stop-calling-multipath-r-when-attaching-detaching-iS.patch diff -Nru python-os-brick-1.6.1/debian/patches/stop-calling-multipath-r-when-attaching-detaching-iS.patch python-os-brick-1.6.1/debian/patches/stop-calling-multipath-r-when-attaching-detaching-iS.patch --- python-os-brick-1.6.1/debian/patches/stop-calling-multipath-r-when-attaching-detaching-iS.patch 1970-01-01 08:00:00.000000000 +0800 +++ python-os-brick-1.6.1/debian/patches/stop-calling-multipath-r-when-attaching-detaching-iS.patch 2017-03-22 18:03:42.000000000 +0800 @@ -0,0 +1,187 @@ +From b6bd0ca37f0d6a3d26b371dc610b50b9d59bddb5 Mon Sep 17 00:00:00 2001 +From: Patrick East +Date: Wed, 21 Sep 2016 15:05:48 -0700 +Subject: [PATCH] Stop calling multipath -r when attaching/detaching iSCSI + volumes + +Looking into this more there isn't any documented reason why we do this, +and on Ubuntu 16.04 there are issues with timing and devices/symlinks +getting messed up when we do the reload of device maps. We shouldn't +need to be forcing multipathd to do this, it loads devices on its own. + +We'll leave in the one in 'wait_for_rw(..)' for now because there is +some evidence that you may need to call it to update the rw state of +the multipath devices, see: +https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise +_Linux/6/html/Storage_Administration_Guide/ch37s04s02.html + +Change-Id: Iec58284abdc9bcbf99df5d07289bb9d60a3554d7 +Closes-Bug: #1623700 +(cherry picked from commit e591bc78cc01c1171060dc15399a46ff800b49c3) +--- + os_brick/initiator/connectors/iscsi.py | 6 ------ + os_brick/tests/initiator/connectors/test_iscsi.py | 26 ++++++++--------------- + 2 files changed, 9 insertions(+), 23 deletions(-) + +diff --git a/os_brick/initiator/connectors/iscsi.py b/os_brick/initiator/connectors/iscsi.py +index 9d24be9..d23b120 100644 +--- a/os_brick/initiator/connectors/iscsi.py ++++ b/os_brick/initiator/connectors/iscsi.py +@@ -467,7 +467,6 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector): + target_lun(s) - LUN id of the volume + """ + if self.use_multipath: +- self._rescan_multipath() + host_device = multipath_device = None + host_devices = self._get_device_path(connection_properties) + # Choose an accessible host device +@@ -771,8 +770,6 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector): + props['target_iqn'] = iqn + self._disconnect_from_iscsi_portal(props) + +- self._rescan_multipath() +- + def _get_multipath_iqns(self, multipath_devices, mpath_map): + entries = self._get_iscsi_devices() + iqns = [] +@@ -839,6 +836,3 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector): + check_exit_code=[0, 1, 21, 255]) + self._run_iscsiadm_bare(('-m', 'session', '--rescan'), + check_exit_code=[0, 1, 21, 255]) +- +- def _rescan_multipath(self): +- self._run_multipath(['-r'], check_exit_code=[0, 1, 21]) +diff --git a/os_brick/tests/initiator/connectors/test_iscsi.py b/os_brick/tests/initiator/connectors/test_iscsi.py +index 8f09d71..2ca448f 100644 +--- a/os_brick/tests/initiator/connectors/test_iscsi.py ++++ b/os_brick/tests/initiator/connectors/test_iscsi.py +@@ -407,12 +407,11 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(os.path, 'exists', return_value=True) + @mock.patch.object(base.BaseLinuxConnector, '_discover_mpath_device') + def test_connect_volume_with_multipath( + self, mock_discover_mpath_device, exists_mock, +- rescan_multipath_mock, rescan_iscsi_mock, connect_to_mock, ++ rescan_iscsi_mock, connect_to_mock, + portals_mock, iscsiadm_mock, mock_iscsi_wwn): + mock_iscsi_wwn.return_value = test_connector.FAKE_SCSI_WWN + location = '10.0.2.15:3260' +@@ -587,7 +586,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, '_get_multipath_device_map', + return_value={}) + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_run_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_get_multipath_iqns') + @mock.patch.object(iscsi.ISCSIConnector, '_run_iscsiadm') +@@ -596,8 +594,8 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + def test_connect_volume_with_multiple_portals_primary_error( + self, mock_process_lun_id, mock_discover_mpath_device, + mock_iscsiadm, mock_get_iqn, mock_run_multipath, +- mock_rescan_multipath, mock_iscsi_devices, +- mock_get_multipath_device_map, mock_devices, mock_exists, ++ mock_iscsi_devices, mock_get_multipath_device_map, ++ mock_devices, mock_exists, + mock_scsi_wwn): + mock_scsi_wwn.return_value = test_connector.FAKE_SCSI_WWN + location1 = '10.0.2.15:3260' +@@ -668,12 +666,11 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_run_multipath') + @mock.patch.object(base.BaseLinuxConnector, '_discover_mpath_device') + def test_connect_volume_with_multipath_connecting( + self, mock_discover_mpath_device, mock_run_multipath, +- mock_rescan_multipath, mock_iscsi_devices, mock_devices, ++ mock_iscsi_devices, mock_devices, + mock_connect, mock_portals, mock_exists, mock_scsi_wwn): + mock_scsi_wwn.return_value = test_connector.FAKE_SCSI_WWN + location1 = '10.0.2.15:3260' +@@ -715,10 +712,9 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_run_multipath') + def test_connect_volume_multipath_failed_iscsi_login( +- self, mock_run_multipath, mock_rescan_multipath, ++ self, mock_run_multipath, + mock_iscsi_devices, mock_devices, + mock_connect, mock_portals, mock_exists): + location1 = '10.0.2.15:3260' +@@ -819,7 +815,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(iscsi.ISCSIConnector, +@@ -829,7 +824,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + def test_disconnect_volume_multipath_iscsi( + self, exists_mock, multipath_iqn_mock, disconnect_mock, + get_all_devices_mock, get_iscsi_devices_mock, +- rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock, ++ rescan_iscsi_mock, get_portals_mock, + get_multipath_device_map_mock): + iqn1 = 'iqn.2013-01.ro.com.netapp:node.netapp01' + iqn2 = 'iqn.2013-01.ro.com.netapp:node.netapp02' +@@ -852,7 +847,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(iscsi.ISCSIConnector, +@@ -863,7 +857,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + def test_disconnect_volume_multipath_iscsi_other_targets( + self, exists_mock, multipath_iqn_mock, get_multipath_map_mock, + disconnect_mock, get_all_devices_mock, get_iscsi_devices_mock, +- rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock): ++ rescan_iscsi_mock, get_portals_mock): + iqn1 = 'iqn.2010-10.org.openstack:target-1' + iqn2 = 'iqn.2010-10.org.openstack:target-2' + portal = '10.0.0.1:3260' +@@ -888,7 +882,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices', + return_value=[]) + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices', +@@ -898,7 +891,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(os.path, 'exists', return_value=True) + def test_disconnect_volume_multipath_iscsi_without_other_mp_devices( + self, exists_mock, disconnect_mock, get_all_devices_mock, +- get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock, ++ get_iscsi_devices_mock, rescan_iscsi_mock, + get_portals_mock, get_multipath_device_map_mock): + portal = '10.0.2.15:3260' + name = 'volume-00000001' +@@ -917,7 +910,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(iscsi.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(iscsi.ISCSIConnector, +@@ -925,7 +917,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase): + @mock.patch.object(os.path, 'exists', return_value=False) + def test_disconnect_volume_multipath_iscsi_with_invalid_symlink( + self, exists_mock, disconnect_mock, get_all_devices_mock, +- get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock, ++ get_iscsi_devices_mock, rescan_iscsi_mock, + get_portals_mock, get_multipath_device_map_mock): + # Simulate a broken symlink by returning False for os.path.exists(dev) + portal = '10.0.0.1:3260' +-- +2.7.4 +