util: simplify virNetDevMacVLanCreateWithVPortProfile()

Since commit 282d135ddb the parser for <interface> has cleared out
any interface name from the input XML that used the macvtap/macvlan
name as a prefix. Along with that, the switch to use the new
virNetDevGenerateName() function for auto-generating macvtap/macvlan
device names (commit 9b5d741a9), has realized two facts:

1) virNetDevGenerateName() can be called with a name already filled
   in, and in that case it is an effective NOP.

2) because virNetDevGenerate() will always find an unused name, there
   is no need to retry device creation in a loop - if it fails the
   first time, it would fail any subsequent time as well.

that, combined with the aforementioned parser change allow us to
simplify virNetDevMacVLanCreateWithVPortProfile() - we no longer need
any extra code to determine if a template "AutoName" was requested,
and don't need a separate code path for creating the device in the
case that a specific name was given in the XML - all we need to do is
log any requested name, and then call exactly the same code as we
would if no name was given.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Laine Stump 2020-12-15 14:50:40 -05:00
parent 9606349172
commit b36569ec77

View File

@ -673,6 +673,7 @@ virNetDevMacVLanCreateWithVPortProfile(const char *ifnameRequested,
uint32_t macvtapMode;
int vf = -1;
bool vnet_hdr = flags & VIR_NETDEV_MACVLAN_VNET_HDR;
virNetDevGenNameType type;
macvtapMode = modeMap[mode];
@ -706,66 +707,21 @@ virNetDevMacVLanCreateWithVPortProfile(const char *ifnameRequested,
}
if (ifnameRequested) {
int rc;
bool isAutoName
= (STRPREFIX(ifnameRequested, VIR_NET_GENERATED_MACVTAP_PREFIX) ||
STRPREFIX(ifnameRequested, VIR_NET_GENERATED_MACVLAN_PREFIX));
VIR_INFO("Requested macvtap device name: %s", ifnameRequested);
if ((rc = virNetDevExists(ifnameRequested)) < 0)
return -1;
if (rc) {
/* ifnameRequested is already being used */
if (!isAutoName) {
virReportSystemError(EEXIST,
_("Unable to create device '%s'"),
ifnameRequested);
return -1;
}
} else {
/* ifnameRequested is available. try to open it */
virNetDevReserveName(ifnameRequested);
if (virNetDevMacVLanCreate(ifnameRequested, macaddress,
linkdev, macvtapMode, flags) == 0) {
/* virNetDevMacVLanCreate() was successful - use this name */
ifname = g_strdup(ifnameRequested);
} else if (!isAutoName) {
/* couldn't open ifnameRequested, but it wasn't an
* autogenerated named, so there is nothing else to
* try - fail and return.
*/
return -1;
}
}
ifname = g_strdup(ifnameRequested);
}
if (!ifname) {
/* ifnameRequested was NULL, or it was an already in use
* autogenerated name, so now we look for an unused
* autogenerated name.
*/
virNetDevGenNameType type;
if (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP)
type = VIR_NET_DEV_GEN_NAME_MACVTAP;
else
type = VIR_NET_DEV_GEN_NAME_MACVLAN;
if (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP)
type = VIR_NET_DEV_GEN_NAME_MACVTAP;
else
type = VIR_NET_DEV_GEN_NAME_MACVLAN;
if (virNetDevGenerateName(&ifname, type) < 0 ||
virNetDevMacVLanCreate(ifname, macaddress,
linkdev, macvtapMode, flags) < 0)
return -1;
if (virNetDevGenerateName(&ifname, type) < 0 ||
virNetDevMacVLanCreate(ifname, macaddress,
linkdev, macvtapMode, flags) < 0) {
return -1;
}
/* all done creating the device */
if (virNetDevVPortProfileAssociate(ifname,
virtPortProfile,
macaddress,