Introduce filesystem limits to virDomainFSDef

This commit is contained in:
Guido Günther 2012-05-23 14:38:55 +02:00
parent b46e005459
commit 41f1db6a0c
4 changed files with 55 additions and 3 deletions

View File

@ -1686,6 +1686,20 @@
default read-write access is given (currently only works for default read-write access is given (currently only works for
QEMU/KVM driver). QEMU/KVM driver).
</dd> </dd>
<dt><code>space_hard_limit</code></dt>
<dd>
Maximum space available to this guest's filesystem.
<span class="since">Since 0.9.13</span>
</dd>
<dt><code>space_soft_limit</code></dt>
<dd>
Maximum space available to this guest's filesystem. The container is
permitted to exceed its soft limits for a grace period of time. Afterwards the
hard limit is enforced.
<span class="since">Since 0.9.13</span>
</dd>
</dl> </dl>
<h4><a name="elementsAddress">Device Addresses</a></h4> <h4><a name="elementsAddress">Device Addresses</a></h4>

View File

@ -1316,6 +1316,18 @@
<ref name="address"/> <ref name="address"/>
</optional> </optional>
</interleave> </interleave>
<interleave>
<optional>
<element name="space_hard_limit">
<ref name='scaledInteger'/>
</element>
</optional>
<optional>
<element name="space_soft_limit">
<ref name='scaledInteger'/>
</element>
</optional>
</interleave>
</element> </element>
</define> </define>
<!-- <!--

View File

@ -4200,9 +4200,10 @@ cleanup:
*/ */
static virDomainFSDefPtr static virDomainFSDefPtr
virDomainFSDefParseXML(xmlNodePtr node, virDomainFSDefParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt,
unsigned int flags) { unsigned int flags) {
virDomainFSDefPtr def; virDomainFSDefPtr def;
xmlNodePtr cur; xmlNodePtr cur, save_node = ctxt->node;
char *type = NULL; char *type = NULL;
char *fsdriver = NULL; char *fsdriver = NULL;
char *source = NULL; char *source = NULL;
@ -4210,6 +4211,8 @@ virDomainFSDefParseXML(xmlNodePtr node,
char *accessmode = NULL; char *accessmode = NULL;
char *wrpolicy = NULL; char *wrpolicy = NULL;
ctxt->node = node;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(); virReportOOMError();
return NULL; return NULL;
@ -4237,6 +4240,18 @@ virDomainFSDefParseXML(xmlNodePtr node,
def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH; def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH;
} }
if (virDomainParseScaledValue("./space_hard_limit[1]", ctxt,
&def->space_hard_limit, 1,
ULONG_LONG_MAX,
false) < 0)
goto error;
if (virDomainParseScaledValue("./space_soft_limit[1]", ctxt,
&def->space_soft_limit, 1,
ULONG_LONG_MAX,
false) < 0)
goto error;
cur = node->children; cur = node->children;
while (cur != NULL) { while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) { if (cur->type == XML_ELEMENT_NODE) {
@ -4303,6 +4318,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
goto error; goto error;
cleanup: cleanup:
ctxt->node = save_node;
VIR_FREE(type); VIR_FREE(type);
VIR_FREE(fsdriver); VIR_FREE(fsdriver);
VIR_FREE(target); VIR_FREE(target);
@ -7076,7 +7092,7 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps,
goto error; goto error;
} else if (xmlStrEqual(node->name, BAD_CAST "filesystem")) { } else if (xmlStrEqual(node->name, BAD_CAST "filesystem")) {
dev->type = VIR_DOMAIN_DEVICE_FS; dev->type = VIR_DOMAIN_DEVICE_FS;
if (!(dev->data.fs = virDomainFSDefParseXML(node, flags))) if (!(dev->data.fs = virDomainFSDefParseXML(node, ctxt, flags)))
goto error; goto error;
} else if (xmlStrEqual(node->name, BAD_CAST "interface")) { } else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
dev->type = VIR_DOMAIN_DEVICE_NET; dev->type = VIR_DOMAIN_DEVICE_NET;
@ -8621,7 +8637,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
if (n && VIR_ALLOC_N(def->fss, n) < 0) if (n && VIR_ALLOC_N(def->fss, n) < 0)
goto no_memory; goto no_memory;
for (i = 0 ; i < n ; i++) { for (i = 0 ; i < n ; i++) {
virDomainFSDefPtr fs = virDomainFSDefParseXML(nodes[i], virDomainFSDefPtr fs = virDomainFSDefParseXML(nodes[i], ctxt,
flags); flags);
if (!fs) if (!fs)
goto error; goto error;
@ -11319,6 +11335,14 @@ virDomainFSDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1; return -1;
if (def->space_hard_limit)
virBufferAsprintf(buf, " <space_hard_limit unit='bytes'>"
"%llu</space_hard_limit>\n", def->space_hard_limit);
if (def->space_soft_limit) {
virBufferAsprintf(buf, " <space_soft_limit unit='bytes'>"
"%llu</space_soft_limit>\n", def->space_soft_limit);
}
virBufferAddLit(buf, " </filesystem>\n"); virBufferAddLit(buf, " </filesystem>\n");
return 0; return 0;

View File

@ -699,6 +699,8 @@ struct _virDomainFSDef {
char *dst; char *dst;
unsigned int readonly : 1; unsigned int readonly : 1;
virDomainDeviceInfo info; virDomainDeviceInfo info;
unsigned long long space_hard_limit; /* in bytes */
unsigned long long space_soft_limit; /* in bytes */
}; };