@@ -522,6 +522,11 @@ static int srpt_refresh_port(struct srpt_port *sport)
if (ret)
goto err_query_port;
+ snprintf(sport->port_guid, sizeof(sport->port_guid),
+ "0x%016llx%016llx",
+ be64_to_cpu(sport->gid.global.subnet_prefix),
+ be64_to_cpu(sport->gid.global.interface_id));
+
if (!sport->mad_agent) {
memset(®_req, 0, sizeof(reg_req));
reg_req.mgmt_class = IB_MGMT_CLASS_DEVICE_MGMT;
@@ -2548,10 +2553,6 @@ static void srpt_add_one(struct ib_device *device)
sdev->device->name, i);
goto err_ring;
}
- snprintf(sport->port_guid, sizeof(sport->port_guid),
- "0x%016llx%016llx",
- be64_to_cpu(sport->gid.global.subnet_prefix),
- be64_to_cpu(sport->gid.global.interface_id));
}
spin_lock(&srpt_dev_lock);
If port_guid is set with the default subnet_prefix, then we get a change event and run a port refresh, we don't update the port_guid. As a result, attempts to create a target device that uses the new subnet_prefix in the wwn will fail to find a match and be rejected by the ib_srpt driver. This makes it impossible to configure a port if it was initialized with a default subnet_prefix and later changed to any non-default subnet-prefix. Updating the port refresh task to always update the wwn based upon the current subnext_prefix solves this problem. Cc: Bart Van Assche <bart.vanassche@sandisk.com> Cc: nab@linux-iscsi.org Signed-off-by: Doug Ledford <dledford@redhat.com> --- Bart, Nicholas; This doesn't entirely resolve the problem I'm seeing here. It only fixes one part of it, the ability to set the config once the right subnet_prefix is known. There still is the problem of a race condition between the attempt to configure the target subsystem and the subnet_prefix becoming known. It seems what is needed is the ability to enter srpt configuration even if it doesn't match any known WWNs at the moment, and on a port refresh, if the WWN changes, we should drop the current config and reload any other config that the new WWN matches. But I have no idea how to make this happen in the target core. The other option would be to have a user space dispatcher that reloaded the target config on subnet_prefix changes, but the lio code would need modified to be able to restrict the reload to a specific interface or else if the user had changed the config on another port, then a subnet_prefix change occurred, the lio code might wipe out the user's custom changes. --- drivers/infiniband/ulp/srpt/ib_srpt.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)