On Mon, Feb 18, 2013 at 12:29:03PM +0100, Michal Privoznik wrote: > The field is there to store the original label of device, > so we can restore it when domain is shutting down. > --- > src/conf/domain_conf.c | 20 +++++++++++++++----- > src/conf/domain_conf.h | 1 + > 2 files changed, 16 insertions(+), 5 deletions(-) > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 7a2b012..d83330a 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -957,6 +957,7 @@ virSecurityDeviceLabelDefFree(virSecurityDeviceLabelDefPtr def) > return; > VIR_FREE(def->model); > VIR_FREE(def->label); > + VIR_FREE(def->oldlabel); > VIR_FREE(def); > } > > @@ -3639,14 +3640,15 @@ static int > virSecurityDeviceLabelDefParseXML(virSecurityDeviceLabelDefPtr **seclabels_rtn, > size_t *nseclabels_rtn, > virSecurityLabelDefPtr *vmSeclabels, > - int nvmSeclabels, xmlXPathContextPtr ctxt) > + int nvmSeclabels, xmlXPathContextPtr ctxt, > + unsigned int flags) > { > virSecurityDeviceLabelDefPtr *seclabels; > size_t nseclabels = 0; > int n, i, j; > xmlNodePtr *list = NULL; > virSecurityLabelDefPtr vmDef = NULL; > - char *model, *relabel, *label; > + char *model, *relabel, *label, *oldlabel; > > if ((n = virXPathNodeSet("./seclabel", ctxt, &list)) < 0) > goto error; > @@ -3717,6 +3719,13 @@ virSecurityDeviceLabelDefParseXML(virSecurityDeviceLabelDefPtr **seclabels_rtn, > NULLSTR(seclabels[i]->model)); > goto error; > } > + > + /* only parse oldlabel when parsing domain status XML */ > + if (flags & VIR_DOMAIN_XML_INTERNAL_STATUS) { > + oldlabel = virXPathStringLimit("string(./oldlabel)", > + VIR_SECURITY_LABEL_BUFLEN-1, ctxt); > + seclabels[i]->oldlabel = oldlabel; > + } > } > VIR_FREE(list); > > @@ -4299,7 +4308,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, > &def->nseclabels, > vmSeclabels, > nvmSeclabels, > - ctxt) < 0) > + ctxt, flags) < 0) > goto error; > ctxt->node = saved_node; > } > @@ -5926,7 +5935,7 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, > &chr_def->nseclabels, > vmSeclabels, > nvmSeclabels, > - ctxt) < 0) { > + ctxt, flags) < 0) { > ctxt->node = saved_node; > goto error; > } > @@ -12344,10 +12353,11 @@ virSecurityDeviceLabelDefFormat(virBufferPtr buf, > > virBufferAsprintf(buf, " relabel='%s'", def->norelabel ? "no" : "yes"); > > - if (def->label) { > + if (def->label || def->oldlabel) { > virBufferAddLit(buf, ">\n"); > virBufferEscapeString(buf, " <label>%s</label>\n", > def->label); > + virBufferEscapeString(buf, " <oldlabel>%s</oldlabel>\n", def->oldlabel); > virBufferAddLit(buf, "</seclabel>\n"); > } else { > virBufferAddLit(buf, "/>\n"); > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 9232ff9..b7f4b38 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -327,6 +327,7 @@ typedef virSecurityDeviceLabelDef *virSecurityDeviceLabelDefPtr; > struct _virSecurityDeviceLabelDef { > char *model; > char *label; /* image label string */ > + char *oldlabel; /* the original label to return to */ > bool norelabel; > }; This is storing driver specific state in the XML configuration description which is bad practice in general. Any such state should be maintained inside the DAC driver itself. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list