提交 d6ee56d7 编写于 作者: L Laine Stump

util: change virPCIGetNetName() to not return error if device has no net name

...and cleanup the callers to report it when it *is* an error.

In many cases It's useful for virPCIGetNetName() to not log an error
and simply return a NULL pointer when the given device isn't bound to
a net driver (e.g. we're looking at a VF that is permanently bound to
vfio-pci). The existing code would silently return an error in this
case, which could eventually lead to the dreaded "An error occurred
but the cause is unknown" log message.

This patch changes virPCIGetNetName() to still return success if the
device simply isn't bound to a net driver, and adjusts all the callers
that require a non-null netname to check for that condition and log an
error when it happens.
上级 30b07a42
...@@ -317,8 +317,21 @@ virHostdevNetDevice(virDomainHostdevDefPtr hostdev, char **linkdev, ...@@ -317,8 +317,21 @@ virHostdevNetDevice(virDomainHostdevDefPtr hostdev, char **linkdev,
vf) < 0) vf) < 0)
goto cleanup; goto cleanup;
} else { } else {
/* In practice this should never happen, since we currently
* only support assigning SRIOV VFs via <interface
* type='hostdev'>, and it is only those devices that should
* end up calling this function.
*/
if (virPCIGetNetName(sysfs_path, linkdev) < 0) if (virPCIGetNetName(sysfs_path, linkdev) < 0)
goto cleanup; goto cleanup;
if (!linkdev) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("The device at %s has no network device name"),
sysfs_path);
goto cleanup;
}
*vf = -1; *vf = -1;
} }
......
...@@ -1231,6 +1231,9 @@ virNetDevGetVirtualFunctions(const char *pfname, ...@@ -1231,6 +1231,9 @@ virNetDevGetVirtualFunctions(const char *pfname,
} }
if (virPCIGetNetName(pci_sysfs_device_link, &((*vfname)[i])) < 0) if (virPCIGetNetName(pci_sysfs_device_link, &((*vfname)[i])) < 0)
goto cleanup;
if (!(*vfname)[i])
VIR_INFO("VF does not have an interface name"); VIR_INFO("VF does not have an interface name");
} }
...@@ -1327,10 +1330,22 @@ virNetDevGetPhysicalFunction(const char *ifname, char **pfname) ...@@ -1327,10 +1330,22 @@ virNetDevGetPhysicalFunction(const char *ifname, char **pfname)
if (virNetDevSysfsDeviceFile(&physfn_sysfs_path, ifname, "physfn") < 0) if (virNetDevSysfsDeviceFile(&physfn_sysfs_path, ifname, "physfn") < 0)
return ret; return ret;
ret = virPCIGetNetName(physfn_sysfs_path, pfname); if (virPCIGetNetName(physfn_sysfs_path, pfname) < 0)
goto cleanup;
VIR_FREE(physfn_sysfs_path); if (!*pfname) {
/* this shouldn't be possible. A VF can't exist unless its
* PF device is bound to a network driver
*/
virReportError(VIR_ERR_INTERNAL_ERROR,
_("The PF device for VF %s has no network device name"),
ifname);
goto cleanup;
}
ret = 0;
cleanup:
VIR_FREE(physfn_sysfs_path);
return ret; return ret;
} }
......
...@@ -2854,8 +2854,11 @@ virPCIGetNetName(char *device_link_sysfs_path, char **netname) ...@@ -2854,8 +2854,11 @@ virPCIGetNetName(char *device_link_sysfs_path, char **netname)
return -1; return -1;
} }
if (virDirOpenQuiet(&dir, pcidev_sysfs_net_path) < 0) if (virDirOpenQuiet(&dir, pcidev_sysfs_net_path) < 0) {
/* this *isn't* an error - caller needs to check for netname == NULL */
ret = 0;
goto out; goto out;
}
while (virDirRead(dir, &entry, pcidev_sysfs_net_path) > 0) { while (virDirRead(dir, &entry, pcidev_sysfs_net_path) > 0) {
/* Assume a single directory entry */ /* Assume a single directory entry */
...@@ -2881,24 +2884,35 @@ virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path, ...@@ -2881,24 +2884,35 @@ virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path,
int ret = -1; int ret = -1;
if (virPCIGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0) if (virPCIGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0)
return ret; goto cleanup;
if (!pf_config_address) if (!pf_config_address)
return ret; goto cleanup;
if (virPCIDeviceAddressGetSysfsFile(pf_config_address, if (virPCIDeviceAddressGetSysfsFile(pf_config_address,
&pf_sysfs_device_path) < 0) { &pf_sysfs_device_path) < 0) {
goto cleanup;
}
VIR_FREE(pf_config_address); if (virPCIGetVirtualFunctionIndex(pf_sysfs_device_path,
return ret; vf_sysfs_device_path, vf_index) < 0) {
goto cleanup;
} }
if (virPCIGetVirtualFunctionIndex(pf_sysfs_device_path, vf_sysfs_device_path, if (virPCIGetNetName(pf_sysfs_device_path, pfname) < 0)
vf_index) < 0)
goto cleanup; goto cleanup;
ret = virPCIGetNetName(pf_sysfs_device_path, pfname); if (!*pfname) {
/* this shouldn't be possible. A VF can't exist unless its
* PF device is bound to a network driver
*/
virReportError(VIR_ERR_INTERNAL_ERROR,
_("The PF device for VF %s has no network device name"),
vf_sysfs_device_path);
goto cleanup;
}
ret = 0;
cleanup: cleanup:
VIR_FREE(pf_config_address); VIR_FREE(pf_config_address);
VIR_FREE(pf_sysfs_device_path); VIR_FREE(pf_sysfs_device_path);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册