From: Peter Krempa Date: Wed, 18 Dec 2013 13:54:07 +0000 (+0100) Subject: virsh: domain: Fix undefine with storage of 'volume' disks X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ef56cc43d1e2dd7e8fd8f5b9cb11c7a7b9ba65b3;p=people%2Fdariof%2Flibvirt.git virsh: domain: Fix undefine with storage of 'volume' disks The undefine code that removes the storage along with the VM didn't take into account the existence of 'volume' type disks. Add the functionality. --- diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 8b80e1e6a..760dca598 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -2939,6 +2939,7 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) int nvol_nodes; char *source = NULL; char *target = NULL; + char *pool = NULL; size_t i; size_t j; @@ -3048,6 +3049,7 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) vshUndefineVolume vol; VIR_FREE(source); VIR_FREE(target); + VIR_FREE(pool); /* get volume source and target paths */ if (!(target = virXPathString("string(./target/@dev)", ctxt))) @@ -3057,9 +3059,12 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) "./source/@file|" "./source/@dir|" "./source/@name|" - "./source/@dev)", ctxt))) + "./source/@dev|" + "./source/@volume)", ctxt))) continue; + pool = virXPathString("string(./source/@pool)", ctxt); + /* lookup if volume was selected by user */ if (vol_list) { bool found = false; @@ -3075,7 +3080,33 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd) continue; } - if (!(vol.vol = virStorageVolLookupByPath(ctl->conn, source))) { + if (pool) { + virStoragePoolPtr storagepool = NULL; + + if (!source) { + vshPrint(ctl, + _("Missing storage volume name for disk '%s'"), + target); + continue; + } + + if (!(storagepool = virStoragePoolLookupByName(ctl->conn, + pool))) { + vshPrint(ctl, + _("Storage pool '%s' for volume '%s' not found."), + pool, target); + vshResetLibvirtError(); + continue; + } + + vol.vol = virStorageVolLookupByName(storagepool, source); + virStoragePoolFree(storagepool); + + } else { + vol.vol = virStorageVolLookupByPath(ctl->conn, source); + } + + if (!vol.vol) { vshPrint(ctl, _("Storage volume '%s'(%s) is not managed by libvirt. " "Remove it manually.\n"), target, source); @@ -3190,6 +3221,7 @@ out: cleanup: VIR_FREE(source); VIR_FREE(target); + VIR_FREE(pool); for (i = 0; i < nvols; i++) { VIR_FREE(vols[i].source); VIR_FREE(vols[i].target);