[libvirt] [PATCH 2/2] snapshot: simplify redefinition of disk snapshot
Daniel Veillard
veillard at redhat.com
Fri Oct 7 14:15:12 UTC 2011
On Thu, Oct 06, 2011 at 05:18:34PM -0600, Eric Blake wrote:
> Redefining disk-only snapshot xml should work even if the user
> did not explicitly pass VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY;
> the flag is only required for conditions where the <state>
> subelement is not already present in parsing (that is, defining
> a new snapshot).
>
> Also, fix the error code of some user-visible errors (the remaining
> VIR_ERR_INTERNAL_ERROR should not be user-visible, since parsing
> of <active> is only done from internal code).
>
> * src/conf/domain_conf.c (virDomainSnapshotDefParseString): Allow
> disks during redefinition of disk snapshot.
> ---
> src/conf/domain_conf.c | 44 +++++++++++++++++++++++---------------------
> 1 files changed, 23 insertions(+), 21 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index f9007ce..34bf2d0 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -11696,25 +11696,6 @@ virDomainSnapshotDefParseString(const char *xmlStr,
>
> def->description = virXPathString("string(./description)", ctxt);
>
> - if ((i = virXPathNodeSet("./disks/*", ctxt, &nodes)) < 0)
> - goto cleanup;
> - if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_DISKS) {
> - def->ndisks = i;
> - if (def->ndisks && VIR_ALLOC_N(def->disks, def->ndisks) < 0) {
> - virReportOOMError();
> - goto cleanup;
> - }
> - for (i = 0; i < def->ndisks; i++) {
> - if (virDomainSnapshotDiskDefParseXML(nodes[i], &def->disks[i]) < 0)
> - goto cleanup;
> - }
> - VIR_FREE(nodes);
> - } else if (i) {
> - virDomainReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> - _("unable to handle disk requests in snapshot"));
> - goto cleanup;
> - }
> -
> if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE) {
> if (virXPathLongLong("string(./creationTime)", ctxt,
> &def->creationTime) < 0) {
> @@ -11730,13 +11711,13 @@ virDomainSnapshotDefParseString(const char *xmlStr,
> /* there was no state in an existing snapshot; this
> * should never happen
> */
> - virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + virDomainReportError(VIR_ERR_XML_ERROR, "%s",
> _("missing state from existing snapshot"));
> goto cleanup;
> }
> def->state = virDomainSnapshotStateTypeFromString(state);
> if (def->state < 0) {
> - virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + virDomainReportError(VIR_ERR_XML_ERROR,
> _("Invalid state '%s' in domain snapshot XML"),
> state);
> goto cleanup;
> @@ -11768,6 +11749,27 @@ virDomainSnapshotDefParseString(const char *xmlStr,
> def->creationTime = tv.tv_sec;
> }
>
> + if ((i = virXPathNodeSet("./disks/*", ctxt, &nodes)) < 0)
> + goto cleanup;
> + if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_DISKS ||
> + (flags & VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE &&
> + def->state == VIR_DOMAIN_DISK_SNAPSHOT)) {
> + def->ndisks = i;
> + if (def->ndisks && VIR_ALLOC_N(def->disks, def->ndisks) < 0) {
> + virReportOOMError();
> + goto cleanup;
> + }
> + for (i = 0; i < def->ndisks; i++) {
> + if (virDomainSnapshotDiskDefParseXML(nodes[i], &def->disks[i]) < 0)
> + goto cleanup;
> + }
> + VIR_FREE(nodes);
> + } else if (i) {
> + virDomainReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("unable to handle disk requests in snapshot"));
> + goto cleanup;
> + }
> +
> if (flags & VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL) {
> if (virXPathInt("string(./active)", ctxt, &active) < 0) {
> virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list