Avoid reporting an error if veth device is already deleted

The kernel automatically destroys veth devices when cleaning
up the container network namespace. During normal shutdown, it
is thus likely that the attempt to run 'ip link del vethN'
will fail. If it fails, check if the device exists, and avoid
reporting an error if it has gone. This switches to use the
virCommand APIs instead of virRun too.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-10-02 11:16:14 +01:00
parent f5eae57086
commit 10caf94ddc
2 changed files with 15 additions and 3 deletions

View File

@ -171,6 +171,7 @@ src/util/virnetdevbridge.c
src/util/virnetdevmacvlan.c
src/util/virnetdevopenvswitch.c
src/util/virnetdevtap.c
src/util/virnetdevveth.c
src/util/virnetdevvportprofile.c
src/util/virnetlink.c
src/util/virnodesuspend.c

View File

@ -161,9 +161,20 @@ cleanup:
*/
int virNetDevVethDelete(const char *veth)
{
const char *argv[] = {"ip", "link", "del", veth, NULL};
virCommandPtr cmd = virCommandNewArgList("ip", "link", "del", veth, NULL);
int status;
VIR_DEBUG("veth: %s", veth);
if (virCommandRun(cmd, &status) < 0)
return -1;
return virRun(argv, NULL);
if (status != 0) {
if (!virNetDevExists(veth)) {
VIR_DEBUG("Device %s already deleted (by kernel namespace cleanup)", veth);
return 0;
}
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to delete veth device %s"), veth);
return -1;
}
return 0;
}