From 0b2e2713635ed0f6114acd5ee9ccc1d1fc237ba0 Mon Sep 17 00:00:00 2001 From: Varun Prakash Date: Sun, 14 Apr 2019 20:23:31 +0530 Subject: [PATCH] scsi: libcxgbi: update route finding logic To support vlan and bridge devices first find route using ifindex 0, if route is not found through net device associated with input scsi host then find route using ifindex of net device. Signed-off-by: Varun Prakash Signed-off-by: Martin K. Petersen --- drivers/scsi/cxgbi/libcxgbi.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c index d7abc7e9ec942..8b915d4ed98dc 100644 --- a/drivers/scsi/cxgbi/libcxgbi.c +++ b/drivers/scsi/cxgbi/libcxgbi.c @@ -2562,13 +2562,9 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, pr_info("shost 0x%p, priv NULL.\n", shost); goto err_out; } - - rtnl_lock(); - if (!vlan_uses_dev(hba->ndev)) - ifindex = hba->ndev->ifindex; - rtnl_unlock(); } +check_route: if (dst_addr->sa_family == AF_INET) { csk = cxgbi_check_route(dst_addr, ifindex); #if IS_ENABLED(CONFIG_IPV6) @@ -2589,6 +2585,13 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, if (!hba) hba = csk->cdev->hbas[csk->port_id]; else if (hba != csk->cdev->hbas[csk->port_id]) { + if (ifindex != hba->ndev->ifindex) { + cxgbi_sock_put(csk); + cxgbi_sock_closed(csk); + ifindex = hba->ndev->ifindex; + goto check_route; + } + pr_info("Could not connect through requested host %u" "hba 0x%p != 0x%p (%u).\n", shost->host_no, hba, -- 2.39.5