mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
util: allow ignoring SIOCSIFHWADDR when errno is EPERM
Commitf4ef3a71
made a variation of virNetDevSetMAC that would return without logging an error message if errno was set to EADDRNOTAVAIL. This errno is set by some SRIOV VF drivers (in particular igbvf) when they fail to set the device's MAC address due to the PF driver refusing the request. This is useful if we want to try a different method of setting the VF MAC address before giving up (Commit86556e16
actually does this, setting the desired MAC address to the "admin MAC in the PF, then detaching and reattaching the VF netdev driver to force a reinit of the MAC address). During testing of Bug 1442040 t was discovered that the ixgbe driver returns EPERM in this situation, so this patch changes the exception case for silent+non-terminal failure to account for this difference. Completes resolution to: https://bugzilla.redhat.com/1415609 (RHEL 7.4) https://bugzilla.redhat.com/1442040 (RHEL 7.3.z)
This commit is contained in:
parent
e6625ed410
commit
997134fb8b
@ -226,7 +226,8 @@ int virNetDevExists(const char *ifname)
|
||||
* virNetDevSetMACInternal:
|
||||
* @ifname: interface name to set MTU for
|
||||
* @macaddr: MAC address
|
||||
* @quiet: true if a failure to set MAC address with errno == EADDRNOTAVAIL
|
||||
* @quiet: true if a failure to set MAC address with
|
||||
* errno == EADDRNOTAVAIL || errno == EPERM
|
||||
* should be silent (still returns error, but without log)
|
||||
*
|
||||
* This function sets the @macaddr for a given interface @ifname.
|
||||
@ -258,7 +259,8 @@ virNetDevSetMACInternal(const char *ifname,
|
||||
|
||||
if (ioctl(fd, SIOCSIFHWADDR, &ifr) < 0) {
|
||||
|
||||
if (quiet && errno == EADDRNOTAVAIL)
|
||||
if (quiet &&
|
||||
(errno == EADDRNOTAVAIL || errno == EPERM))
|
||||
goto cleanup;
|
||||
|
||||
virReportSystemError(errno,
|
||||
@ -305,7 +307,8 @@ virNetDevSetMACInternal(const char *ifname,
|
||||
ifr.ifr_addr.sa_len = VIR_MAC_BUFLEN;
|
||||
|
||||
if (ioctl(s, SIOCSIFLLADDR, &ifr) < 0) {
|
||||
if (quiet && errno == EADDRNOTAVAIL)
|
||||
if (quiet &&
|
||||
(errno == EADDRNOTAVAIL || errno == EPERM))
|
||||
goto cleanup;
|
||||
|
||||
virReportSystemError(errno,
|
||||
@ -2229,11 +2232,12 @@ virNetDevSetNetConfig(const char *linkdev, int vf,
|
||||
int retries = 100;
|
||||
|
||||
/* if pfDevOrig == NULL, this isn't a VF, so we've failed */
|
||||
if (!pfDevOrig || errno != EADDRNOTAVAIL)
|
||||
if (!pfDevOrig ||
|
||||
(errno != EADDRNOTAVAIL && errno != EPERM))
|
||||
goto cleanup;
|
||||
|
||||
/* Otherwise this is a VF, and virNetDevSetMAC failed with
|
||||
* EADDRNOTAVAIL, which could be due to the
|
||||
* EADDRNOTAVAIL/EPERM, which could be due to the
|
||||
* "administratively set" flag being set in the PF for
|
||||
* this VF. When this happens, we can attempt to use an
|
||||
* alternate method to set the VF MAC: first set it into
|
||||
|
Loading…
Reference in New Issue
Block a user