[libvirt] [PATCH 1/2] conf: Add oldlabel field to virSecurityDeviceLabelDef
Daniel P. Berrange
berrange at redhat.com
Mon Feb 18 11:38:01 UTC 2013
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 :|
More information about the libvir-list
mailing list