diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 024c4ec552..6e8d5dd433 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2445,6 +2445,10 @@ struct _virStorageVolInfo { typedef virStorageVolInfo *virStorageVolInfoPtr; +typedef enum { + VIR_STORAGE_XML_INACTIVE = (1 << 0), /* dump inactive pool/volume information */ +} virStorageXMLFlags; + /* * Get connection from pool. */ diff --git a/src/libvirt.c b/src/libvirt.c index 0aa50cb6e9..ef5ac47137 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -12169,7 +12169,7 @@ error: /** * virStoragePoolGetXMLDesc: * @pool: pointer to storage pool - * @flags: bitwise-OR of virDomainXMLFlags + * @flags: bitwise-OR of virStorageXMLFlags * * Fetch an XML document describing all aspects of the * storage pool. This is suitable for later feeding back diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 3b95c704b0..fbc630d2bf 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -960,9 +960,10 @@ storagePoolGetXMLDesc(virStoragePoolPtr obj, { virStorageDriverStatePtr driver = obj->conn->storagePrivateData; virStoragePoolObjPtr pool; + virStoragePoolDefPtr def; char *ret = NULL; - virCheckFlags(0, NULL); + virCheckFlags(VIR_STORAGE_XML_INACTIVE, NULL); storageDriverLock(driver); pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid); @@ -974,7 +975,12 @@ storagePoolGetXMLDesc(virStoragePoolPtr obj, goto cleanup; } - ret = virStoragePoolDefFormat(pool->def); + if ((flags & VIR_STORAGE_XML_INACTIVE) && pool->newDef) + def = pool->newDef; + else + def = pool->def; + + ret = virStoragePoolDefFormat(def); cleanup: if (pool) diff --git a/tools/virsh.c b/tools/virsh.c index 567a5f6a08..2b4cb2cea0 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -10807,6 +10807,7 @@ static const vshCmdInfo info_pool_dumpxml[] = { static const vshCmdOptDef opts_pool_dumpxml[] = { {"pool", VSH_OT_DATA, VSH_OFLAG_REQ, N_("pool name or uuid")}, + {"inactive", VSH_OT_BOOL, 0, N_("show inactive defined XML")}, {NULL, 0, 0, NULL} }; @@ -10815,15 +10816,20 @@ cmdPoolDumpXML(vshControl *ctl, const vshCmd *cmd) { virStoragePoolPtr pool; bool ret = true; + bool inactive = vshCommandOptBool(cmd, "inactive"); + unsigned int flags = 0; char *dump; + if (inactive) + flags |= VIR_STORAGE_XML_INACTIVE; + if (!vshConnectionUsability(ctl, ctl->conn)) return false; if (!(pool = vshCommandOptPool(ctl, cmd, "pool", NULL))) return false; - dump = virStoragePoolGetXMLDesc(pool, 0); + dump = virStoragePoolGetXMLDesc(pool, flags); if (dump != NULL) { vshPrint(ctl, "%s", dump); VIR_FREE(dump); @@ -16127,7 +16133,8 @@ cmdPoolEdit(vshControl *ctl, const vshCmd *cmd) bool ret = false; virStoragePoolPtr pool = NULL; virStoragePoolPtr pool_edited = NULL; - unsigned int flags = 0; + unsigned int flags = VIR_STORAGE_XML_INACTIVE; + char *tmp_desc = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) goto cleanup; @@ -16136,6 +16143,19 @@ cmdPoolEdit(vshControl *ctl, const vshCmd *cmd) if (pool == NULL) goto cleanup; + /* Some old daemons don't support _INACTIVE flag */ + if (!(tmp_desc = virStoragePoolGetXMLDesc(pool, flags))) { + if (last_error->code == VIR_ERR_INVALID_ARG) { + flags &= ~VIR_STORAGE_XML_INACTIVE; + virFreeError(last_error); + last_error = NULL; + } else { + goto cleanup; + } + } else { + VIR_FREE(tmp_desc); + } + #define EDIT_GET_XML virStoragePoolGetXMLDesc(pool, flags) #define EDIT_NOT_CHANGED \ vshPrint(ctl, _("Pool %s XML configuration not changed.\n"), \ diff --git a/tools/virsh.pod b/tools/virsh.pod index f83a29da07..191c9f2387 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -2112,9 +2112,11 @@ Destroy the resources used by a given I object. This operation is non-recoverable. The I object will still exist after this command, ready for the creation of new storage volumes. -=item B I +=item B [I<--inactive>] I Returns the XML information about the I object. +I<--inactive> tells virsh to dump pool configuration that will be used +on next start of the pool as opposed to the current pool configuration. =item B I