Merge "NVME-oF: Fix to support new "address" in sysfs"

This commit is contained in:
Zuul 2024-01-10 14:09:05 +00:00 committed by Gerrit Code Review
commit 6dec29040d
3 changed files with 28 additions and 5 deletions

View File

@ -398,8 +398,9 @@ class Target(object):
# Unlike "nvme list-subsys -o json" sysfs addr is separated by a comma
sysfs_portals: list[tuple[Optional[str],
Optional[str],
Optional[Union[str, utils.Anything]],
Optional[Union[str, utils.Anything]]]] = [
(f'traddr={p.address},trsvcid={p.port}', p.transport, hostnqn)
(p.address, p.port, p.transport, hostnqn)
for p in self.portals
]
known_names: list[str] = [p.controller for p in self.portals
@ -421,7 +422,19 @@ class Target(object):
# The right subsystem, but must also be the right portal
ctrl_transport = sysfs_property('transport', ctrl_path)
ctrl_addr = sysfs_property('address', ctrl_path)
# Address in sysfs may contain src_addr in some systems. Parse and
# only use destination addr and port
address = sysfs_property('address', ctrl_path)
if not address:
LOG.error("Couldn't read address for %s", ctrl_path)
continue
ctrl_address = dict((x.split('=')
for x in address.split(',')))
ctrl_addr = ctrl_address['traddr']
ctrl_port = ctrl_address['trsvcid']
# hostnqn value not present in all OSs. Ignore when not present
ctrl_hostnqn = sysfs_property('hostnqn', ctrl_path) or utils.ANY
# Warn once per target for OS not presenting the hostnqn on sysfs
@ -430,7 +443,7 @@ class Target(object):
"Controller may be incorrectly matched.")
warned = True
ctrl_portal = (ctrl_addr, ctrl_transport, ctrl_hostnqn)
ctrl_portal = (ctrl_addr, ctrl_port, ctrl_transport, ctrl_hostnqn)
try:
index = sysfs_portals.index(ctrl_portal)

View File

@ -469,9 +469,11 @@ class TargetTestCase(test_base.TestCase):
self.target.set_portals_controllers()
mock_glob.assert_not_called()
@ddt.data('traddr=portal2,trsvcid=port2',
'traddr=portal2,trsvcid=port2,src_addr=myip')
@mock.patch.object(nvmeof, 'sysfs_property')
@mock.patch('glob.glob')
def test_set_portals_controllers(self, mock_glob, mock_sysfs):
def test_set_portals_controllers(self, addr, mock_glob, mock_sysfs):
"""Look in sysfs for the device paths."""
portal = nvmeof.Portal(self.target, 'portal4', 'port4', 'tcp')
portal.controller = 'nvme0'
@ -494,7 +496,7 @@ class TargetTestCase(test_base.TestCase):
# nvme3 matches first portal but not the host_nqn
self.target.nqn, 'rdma', 'traddr=portal2,trsvcid=port2', 'badnqn',
# nvme4 matches first portal
self.target.nqn, 'tcp', 'traddr=portal2,trsvcid=port2', 'nqn',
self.target.nqn, 'tcp', addr, 'nqn',
# nvme5 simulates OS doesn't have the hostnqn attribute
self.target.nqn, 'tcp', 'traddr=portal5,trsvcid=port5', None,
]

View File

@ -0,0 +1,8 @@
---
fixes:
- |
NVMe-oF connector `bug #2035811
<https://bugs.launchpad.net/os-brick/+bug/2035811>`_: Fixed
attaching volumes on systems using newer NVMe kernel modules that present
additional information in ``/sys/class/nvme/nvme#/address``.