diff --git a/patches/openstack/cinder/sep-sp-iscsi.patch b/patches/openstack/cinder/sep-sp-iscsi.patch
index a7dbea7..90af1b2 100644
--- a/patches/openstack/cinder/sep-sp-iscsi.patch
+++ b/patches/openstack/cinder/sep-sp-iscsi.patch
@@ -1,4 +1,4 @@
-From f15732ac9c326996b418aaaf40aece68912f038b Mon Sep 17 00:00:00 2001
+From 98e9487ad99ac6969e5ae58601ab5550b947202b Mon Sep 17 00:00:00 2001
 From: Peter Penchev <openstack-dev@storpool.com>
 Date: Mon, 12 Mar 2018 12:00:10 +0200
 Subject: [PATCH] Add iSCSI export support to the StorPool driver
@@ -26,29 +26,30 @@
 Change-Id: I9de64306e0e6976268df782053b0651dd1cca96f
 ---
  .../unit/volume/drivers/test_storpool.py      | 441 +++++++++++++++++-
- cinder/volume/drivers/storpool.py             | 381 ++++++++++++++-
+ cinder/volume/drivers/storpool.py             | 386 ++++++++++++++-
  .../drivers/storpool-volume-driver.rst        |  68 ++-
  .../storpool-iscsi-cefcfe590a07c5c7.yaml      |  15 +
- 4 files changed, 889 insertions(+), 16 deletions(-)
+ 4 files changed, 895 insertions(+), 15 deletions(-)
  create mode 100644 releasenotes/notes/storpool-iscsi-cefcfe590a07c5c7.yaml
 
 diff --git a/cinder/tests/unit/volume/drivers/test_storpool.py b/cinder/tests/unit/volume/drivers/test_storpool.py
-index 2015c734d..440740a56 100644
+index 2015c734d..b21f1582d 100644
 --- a/cinder/tests/unit/volume/drivers/test_storpool.py
 +++ b/cinder/tests/unit/volume/drivers/test_storpool.py
-@@ -13,9 +13,10 @@
+@@ -13,9 +13,12 @@
  #    License for the specific language governing permissions and limitations
  #    under the License.
  
--
++from __future__ import annotations
+ 
 +import dataclasses
  import itertools
  import re
-+from typing import Any, NamedTuple, TYPE_CHECKING  # noqa: H301
++from typing import Any, NamedTuple  # noqa: H301
  from unittest import mock
  
  import ddt
-@@ -23,6 +24,7 @@ from os_brick.initiator import storpool_utils
+@@ -23,6 +26,7 @@ from os_brick.initiator import storpool_utils
  from os_brick.tests.initiator import test_storpool_utils
  from oslo_utils import units
  
@@ -56,7 +57,7 @@
  from cinder import exception
  from cinder.tests.unit import fake_constants
  from cinder.tests.unit import test
-@@ -30,6 +32,13 @@ from cinder.volume import configuration as conf
+@@ -30,6 +34,13 @@ from cinder.volume import configuration as conf
  from cinder.volume.drivers import storpool as driver
  
  
@@ -70,7 +71,7 @@
  volume_types = {
      fake_constants.VOLUME_TYPE_ID: {},
      fake_constants.VOLUME_TYPE2_ID: {'storpool_template': 'ssd'},
-@@ -67,6 +76,10 @@ def snapshotName(vtype, vid, more=None):
+@@ -67,6 +78,10 @@ def snapshotName(vtype, vid, more=None):
      )
  
  
@@ -81,7 +82,7 @@
  class MockAPI(object):
      def __init__(self, *args):
          self._disks = {}
-@@ -162,6 +175,242 @@ class MockAPI(object):
+@@ -162,6 +177,242 @@ class MockAPI(object):
          volumes[name] = dict(snapshots[snapname])
  
  
@@ -152,7 +153,6 @@
 +        }
 +
 +
-+
 +class MockIscsiAPI:
 +    """Mock only the iSCSI-related calls of the StorPool API bindings."""
 +
@@ -182,7 +182,8 @@
 +                'volumeName': volumeName(fake_constants.VOLUME_ID),
 +            },
 +        )
-+        self._asrt.assertEqual(cfg['initiators']['1']['name'], cmd['initiator'])
++        self._asrt.assertEqual(cfg['initiators']['1']['name'],
++                               cmd['initiator'])
 +        self._asrt.assertListEqual(cfg['initiators']['1']['exports'], [])
 +
 +        cfg['initiators'] = {
@@ -209,11 +210,12 @@
 +                'volumeName': volumeName(fake_constants.VOLUME_ID),
 +            },
 +        )
-+        self._asrt.assertEqual(cfg['initiators']['1']['name'], cmd['initiator'])
++        self._asrt.assertEqual(cfg['initiators']['1']['name'],
++                               cmd['initiator'])
 +        self._asrt.assertListEqual(
 +            cfg['initiators']['1']['exports'],
 +            [{'portalGroup': ISCSI_PORTAL_GROUP,
-+                             'target': cfg['targets']['1']['name']}])
++              'target': cfg['targets']['1']['name']}])
 +
 +        del cfg['initiators']['1']
 +        return cfg
@@ -240,7 +242,6 @@
 +        }
 +        return cfg
 +
-+
 +    def _handle_create_target(self, cfg: dict, cmd: dict[str, Any]) -> dict:
 +        """Add a target for a volume so that it may be exported."""
 +        self._asrt.assertDictEqual(
@@ -324,7 +325,7 @@
  class MockVolumeDB(object):
      """Simulate a Cinder database with a volume_get() method."""
  
-@@ -198,7 +447,15 @@ class StorPoolTestCase(test.TestCase):
+@@ -198,7 +449,15 @@ class StorPoolTestCase(test.TestCase):
          self.cfg.volume_backend_name = 'storpool_test'
          self.cfg.storpool_template = None
          self.cfg.storpool_replication = 3
@@ -332,15 +333,15 @@
 +        self.cfg.storpool_iscsi_export_to = ''
 +        self.cfg.storpool_iscsi_learn_initiator_iqns = True
 +        self.cfg.storpool_iscsi_portal_group = ISCSI_PORTAL_GROUP
-+
-+        self._setup_test_driver()
  
++        self._setup_test_driver()
++
 +    def _setup_test_driver(self):
 +        """Initialize a StorPool driver as per the current configuration."""
          mock_exec = mock.Mock()
          mock_exec.return_value = ('', '')
  
-@@ -216,7 +473,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -216,7 +475,7 @@ class StorPoolTestCase(test.TestCase):
              self.driver.check_for_setup_error()
  
      @ddt.data(
@@ -349,7 +350,7 @@
          ({'no-host': None}, KeyError),
          ({'host': 'sbad'}, driver.StorPoolConfigurationInvalid),
          ({'host': 's01'}, None),
-@@ -232,7 +489,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -232,7 +491,7 @@ class StorPoolTestCase(test.TestCase):
                                conn)
  
      @ddt.data(
@@ -358,7 +359,7 @@
          ({'no-host': None}, KeyError),
          ({'host': 'sbad'}, driver.StorPoolConfigurationInvalid),
      )
-@@ -271,7 +528,7 @@ class StorPoolTestCase(test.TestCase):
+@@ -271,7 +530,7 @@ class StorPoolTestCase(test.TestCase):
              self.assertEqual(21, pool['total_capacity_gb'])
              self.assertEqual(5, int(pool['free_capacity_gb']))
  
@@ -367,7 +368,7 @@
              self.assertFalse(pool['QoS_support'])
              self.assertFalse(pool['thick_provisioning_support'])
              self.assertTrue(pool['thin_provisioning_support'])
-@@ -690,3 +947,179 @@ class StorPoolTestCase(test.TestCase):
+@@ -690,3 +949,179 @@ class StorPoolTestCase(test.TestCase):
                                 'No such volume',
                                 self.driver.revert_to_snapshot, None,
                                 {'id': vol_id}, {'id': snap_id})
@@ -548,7 +549,7 @@
 +        self.assertFalse(
 +            _export_exists(iapi.get_iscsi_config()['iscsi'], tcase.volume))
 diff --git a/cinder/volume/drivers/storpool.py b/cinder/volume/drivers/storpool.py
-index 2dc7bb6be..d9e607552 100644
+index 2dc7bb6be..acfabccd6 100644
 --- a/cinder/volume/drivers/storpool.py
 +++ b/cinder/volume/drivers/storpool.py
 @@ -15,6 +15,7 @@
@@ -613,7 +614,7 @@
  
      @staticmethod
      def get_driver_options():
-@@ -158,10 +186,322 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -158,10 +186,327 @@ class StorPoolDriver(driver.VolumeDriver):
              raise StorPoolConfigurationInvalid(
                  section=hostname, param='SP_OURID', error=e)
  
@@ -676,7 +677,8 @@
 +
 +        pg_name = self.configuration.storpool_iscsi_portal_group
 +        pg_found = [
-+            pg for pg in cfg['iscsi']['portalGroups'].values() if pg['name'] == pg_name
++            pg for pg in
++            cfg['iscsi']['portalGroups'].values() if pg['name'] == pg_name
 +        ]
 +        if not pg_found:
 +            raise Exception('StorPool Cinder iSCSI configuration error: '
@@ -685,7 +687,8 @@
 +
 +        # Do we know about this initiator?
 +        i_found = [
-+            init for init in cfg['iscsi']['initiators'].values() if init['name'] == iqn
++            init for init in
++            cfg['iscsi']['initiators'].values() if init['name'] == iqn
 +        ]
 +        if i_found:
 +            initiator = i_found[0]
@@ -693,9 +696,11 @@
 +            initiator = None
 +
 +        # Is this volume already being exported?
-+        volname = storpool_utils.os_to_sp_volume_name(volume_id)
++        volname = storpool_utils.os_to_sp_volume_name(
++            self._volume_prefix, volume_id)
 +        t_found = [
-+            tgt for tgt in cfg['iscsi']['targets'].values() if tgt['volume'] == volname
++            tgt for tgt in
++            cfg['iscsi']['targets'].values() if tgt['volume'] == volname
 +        ]
 +        if t_found:
 +            target = t_found[0]
@@ -707,7 +712,8 @@
 +        if initiator is not None and target is not None:
 +            e_found = [
 +                exp for exp in initiator['exports']
-+                if exp['portalGroup'] == pg['name'] and exp['target'] == target['name']
++                if (exp['portalGroup'] == pg['name'] and
++                    exp['target'] == target['name'])
 +            ]
 +            if e_found:
 +                export = e_found[0]
@@ -936,7 +942,7 @@
          return {'driver_volume_type': 'storpool',
                  'data': {
                      'client_id': self._storpool_client_id(connector),
-@@ -170,6 +510,9 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -170,6 +515,9 @@ class StorPoolDriver(driver.VolumeDriver):
                  }}
  
      def terminate_connection(self, volume, connector, **kwargs):
@@ -946,7 +952,7 @@
          pass
  
      def create_snapshot(self, snapshot):
-@@ -278,11 +621,20 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -278,11 +626,20 @@ class StorPoolDriver(driver.VolumeDriver):
                      )
  
      def create_export(self, context, volume, connector):
@@ -968,7 +974,7 @@
      def delete_volume(self, volume):
          name = storpool_utils.os_to_sp_volume_name(
              self._volume_prefix, volume['id'])
-@@ -321,6 +673,17 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -321,6 +678,17 @@ class StorPoolDriver(driver.VolumeDriver):
              LOG.error("StorPoolDriver API initialization failed: %s", e)
              raise
  
@@ -986,7 +992,7 @@
      def _update_volume_stats(self):
          try:
              dl = self._sp_api.disks_list()
-@@ -346,7 +709,7 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -346,7 +714,7 @@ class StorPoolDriver(driver.VolumeDriver):
              'total_capacity_gb': total / units.Gi,
              'free_capacity_gb': free / units.Gi,
              'reserved_percentage': 0,
@@ -995,7 +1001,7 @@
              'QoS_support': False,
              'thick_provisioning_support': False,
              'thin_provisioning_support': True,
-@@ -365,7 +728,9 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -365,7 +733,9 @@ class StorPoolDriver(driver.VolumeDriver):
                  'volume_backend_name') or 'storpool',
              'vendor_name': 'StorPool',
              'driver_version': self.VERSION,
@@ -1006,7 +1012,7 @@
              # Driver capabilities
              'clone_across_pools': True,
              'sparse_copy_volume': True,
-@@ -452,15 +817,15 @@ class StorPoolDriver(driver.VolumeDriver):
+@@ -452,15 +822,15 @@ class StorPoolDriver(driver.VolumeDriver):
              LOG.debug('Trying to swap volume names, intermediate "%(int)s"',
                        {'int': int_name})
              try:
