--- y/net/smc/smc_pnet.c +++ x/net/smc/smc_pnet.c @@ -306,15 +306,20 @@ static bool smc_pnetid_valid(const char static struct smc_ib_device *smc_pnet_find_ib(char *ib_name) { struct smc_ib_device *ibdev; + struct device *dev; mutex_lock(&smc_ib_devices.mutex); list_for_each_entry(ibdev, &smc_ib_devices.list, list) { - if (!strncmp(ibdev->ibdev->name, ib_name, - sizeof(ibdev->ibdev->name)) || - !strncmp(dev_name(ibdev->ibdev->dev.parent), ib_name, - IB_DEVICE_NAME_MAX - 1)) { + if (!strncmp(ibdev->ibdev->name, ib_name, sizeof(ibdev->ibdev->name))) + goto out; + dev = get_device(ibdev->ibdev->dev.parent); + if (!dev) + continue; + if (!strncmp(dev_name(dev), ib_name, IB_DEVICE_NAME_MAX - 1)) { + put_device(dev); goto out; } + put_device(dev); } ibdev = NULL; out: