{
        int rc;
 
-       virtfn->physfn = pci_dev_get(pdev);
        rc = pci_iov_sysfs_link(pdev, virtfn, vfid);
-       if (rc) {
-               pci_dev_put(pdev);
-               virtfn->physfn = NULL;
+       if (rc)
                return rc;
-       }
+
+       virtfn->is_virtfn = 1;
+       virtfn->multifunction = 0;
+       virtfn->physfn = pci_dev_get(pdev);
+
        return 0;
 }
 
        int vfid = vfn - 1; /* Linux' vfid's start at 0 vfn at 1*/
        int rc = 0;
 
-       virtfn->is_virtfn = 1;
-       virtfn->multifunction = 0;
-       WARN_ON(vfid < 0);
+       if (!zbus->multifunction)
+               return 0;
+
        /* If the parent PF for the given VF is also configured in the
         * instance, it must be on the same zbus.
         * We can then identify the parent PF by checking what
                zdev = zbus->function[i];
                if (zdev && zdev->is_physfn) {
                        pdev = pci_get_slot(zbus->bus, zdev->devfn);
+                       if (!pdev)
+                               continue;
                        cand_devfn = pci_iov_virtfn_devfn(pdev, vfid);
                        if (cand_devfn == virtfn->devfn) {
                                rc = zpci_bus_link_virtfn(pdev, virtfn, vfid);
+                               /* balance pci_get_slot() */
+                               pci_dev_put(pdev);
                                break;
                        }
+                       /* balance pci_get_slot() */
+                       pci_dev_put(pdev);
                }
        }
        return rc;
 static inline int zpci_bus_setup_virtfn(struct zpci_bus *zbus,
                struct pci_dev *virtfn, int vfn)
 {
-       virtfn->is_virtfn = 1;
-       virtfn->multifunction = 0;
        return 0;
 }
 #endif