]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/network/networkd-sriov.c
Merge pull request #33377 from yuwata/strbuf-cleanups
[thirdparty/systemd.git] / src / network / networkd-sriov.c
index 1f205b7468e7384de33ef883b867f31bb9c66132..78d8cefe7cf6801937e798d25aa51b216251a00a 100644 (file)
@@ -194,29 +194,18 @@ static int manager_update_sr_iov_ifindices(Manager *manager, int phys_port_ifind
         return 0;
 }
 
-static int link_set_sr_iov_phys_port(Link *link) {
+static int link_set_sr_iov_phys_port(Link *link, sd_device *pci_dev, const char *dev_port) {
         _cleanup_(sd_device_unrefp) sd_device *pci_physfn_dev = NULL;
-        const char *dev_port;
-        sd_device *pci_dev;
         int r;
 
         assert(link);
         assert(link->manager);
+        assert(pci_dev);
+        assert(dev_port);
 
         if (link->sr_iov_phys_port_ifindex > 0)
                 return 0;
 
-        if (!link->dev)
-                return -ENODEV;
-
-        r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port);
-        if (r < 0)
-                return r;
-
-        r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev);
-        if (r < 0)
-                return r;
-
         r = sd_device_new_child(&pci_physfn_dev, pci_dev, "physfn");
         if (r < 0)
                 return r;
@@ -228,27 +217,17 @@ static int link_set_sr_iov_phys_port(Link *link) {
         return manager_update_sr_iov_ifindices(link->manager, r, link->ifindex);
 }
 
-static int link_set_sr_iov_virt_ports(Link *link) {
-        const char *dev_port, *name;
-        sd_device *pci_dev;
+static int link_set_sr_iov_virt_ports(Link *link, sd_device *pci_dev, const char *dev_port) {
+        const char *name;
         int r;
 
         assert(link);
         assert(link->manager);
+        assert(pci_dev);
+        assert(dev_port);
 
         set_clear(link->sr_iov_virt_port_ifindices);
 
-        if (!link->dev)
-                return -ENODEV;
-
-        r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port);
-        if (r < 0)
-                return r;
-
-        r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev);
-        if (r < 0)
-                return r;
-
         FOREACH_DEVICE_CHILD_WITH_SUFFIX(pci_dev, child, name) {
                 const char *n;
 
@@ -269,17 +248,36 @@ static int link_set_sr_iov_virt_ports(Link *link) {
 }
 
 int link_set_sr_iov_ifindices(Link *link) {
+        const char *dev_port;
+        sd_device *pci_dev;
         int r;
 
         assert(link);
 
-        r = link_set_sr_iov_phys_port(link);
+        if (!link->dev)
+                return -ENODEV;
+
+        r = sd_device_get_parent_with_subsystem_devtype(link->dev, "pci", NULL, &pci_dev);
+        if (ERRNO_IS_NEG_DEVICE_ABSENT(r))
+                return 0;
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to get parent PCI device: %m");
+
+        /* This may return -EINVAL or -ENODEV, instead of -ENOENT, if the device has been removed or is being
+         * removed. Let's ignore the error codes here. */
+        r = sd_device_get_sysattr_value(link->dev, "dev_port", &dev_port);
+        if (ERRNO_IS_NEG_DEVICE_ABSENT(r) || r == -EINVAL)
+                return 0;
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to get 'dev_port' sysfs attribute: %m");
+
+        r = link_set_sr_iov_phys_port(link, pci_dev, dev_port);
         if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
-                return r;
+                return log_link_debug_errno(link, r, "Failed to set SR-IOV physical port: %m");
 
-        r = link_set_sr_iov_virt_ports(link);
+        r = link_set_sr_iov_virt_ports(link, pci_dev, dev_port);
         if (r < 0 && !ERRNO_IS_DEVICE_ABSENT(r))
-                return r;
+                return log_link_debug_errno(link, r, "Failed to set SR-IOV virtual ports: %m");
 
         return 0;
 }