For RoCEs ib_query_gid() takes a reference count on the net_device.
This reference count must be decreased by the caller.

Signed-off-by: Ursula Braun <[email protected]>
Reported-by: Parav Pandit <[email protected]>
Reviewed-by: Parav Pandit <[email protected]>
Fixes: 0cfdd8f92cac ("smc: connection and link group creation")
---
 net/smc/smc_core.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
index 20b66e79c5d6..5f6a20084157 100644
--- a/net/smc/smc_core.c
+++ b/net/smc/smc_core.c
@@ -380,10 +380,14 @@ static int smc_link_determine_gid(struct smc_link_group 
*lgr)
                if (ib_query_gid(lnk->smcibdev->ibdev, lnk->ibport, i, &gid,
                                 &gattr))
                        continue;
-               if (gattr.ndev &&
-                   (vlan_dev_vlan_id(gattr.ndev) == lgr->vlan_id)) {
-                       lnk->gid = gid;
-                       return 0;
+               if (gattr.ndev) {
+                       if (is_vlan_dev(gattr.ndev) &&
+                           vlan_dev_vlan_id(gattr.ndev) == lgr->vlan_id) {
+                               lnk->gid = gid;
+                               dev_put(gattr.ndev);
+                               return 0;
+                       }
+                       dev_put(gattr.ndev);
                }
        }
        return -ENODEV;
-- 
2.13.5

Reply via email to