Update to libvirt 0.8.8 RC1
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=96
This commit is contained in:
parent
8c2cf66f24
commit
02626c868f
@ -1,89 +0,0 @@
|
|||||||
commit 041973504f715bcff7de3b17cd258617244b79c4
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Wed Jan 5 15:16:57 2011 -0700
|
|
||||||
|
|
||||||
Add support for HAP feature to xen drivers
|
|
||||||
|
|
||||||
xen-unstable c/s 16931 introduced a per-domain setting for hvm
|
|
||||||
guests to enable/disable hardware assisted paging. If disabled,
|
|
||||||
software techniques such as shadow page tables are used. If enabled,
|
|
||||||
and the feature exists in underlying hardware, hardware support for
|
|
||||||
paging is used.
|
|
||||||
|
|
||||||
This provides implementation for mapping HAP setting to/from
|
|
||||||
domxml/native formats in xen drivers.
|
|
||||||
|
|
||||||
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
||||||
index 6ce0c3f..d3633ee 100644
|
|
||||||
--- a/src/xen/xend_internal.c
|
|
||||||
+++ b/src/xen/xend_internal.c
|
|
||||||
@@ -2210,6 +2210,8 @@ xenDaemonParseSxpr(virConnectPtr conn,
|
|
||||||
def->features |= (1 << VIR_DOMAIN_FEATURE_APIC);
|
|
||||||
if (sexpr_int(root, "domain/image/hvm/pae"))
|
|
||||||
def->features |= (1 << VIR_DOMAIN_FEATURE_PAE);
|
|
||||||
+ if (sexpr_int(root, "domain/image/hvm/hap"))
|
|
||||||
+ def->features |= (1 << VIR_DOMAIN_FEATURE_HAP);
|
|
||||||
|
|
||||||
/* Old XenD only allows localtime here for HVM */
|
|
||||||
if (sexpr_int(root, "domain/image/hvm/localtime"))
|
|
||||||
@@ -5923,6 +5925,8 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
||||||
virBufferAddLit(&buf, "(apic 1)");
|
|
||||||
if (def->features & (1 << VIR_DOMAIN_FEATURE_PAE))
|
|
||||||
virBufferAddLit(&buf, "(pae 1)");
|
|
||||||
+ if (def->features & (1 << VIR_DOMAIN_FEATURE_HAP))
|
|
||||||
+ virBufferAddLit(&buf, "(hap 1)");
|
|
||||||
|
|
||||||
virBufferAddLit(&buf, "(usb 1)");
|
|
||||||
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index 4d6b41b..ec618aa 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -830,6 +830,10 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
|
||||||
goto cleanup;
|
|
||||||
else if (val)
|
|
||||||
def->features |= (1 << VIR_DOMAIN_FEATURE_APIC);
|
|
||||||
+ if (xenXMConfigGetBool(conf, "hap", &val, 0) < 0)
|
|
||||||
+ goto cleanup;
|
|
||||||
+ else if (val)
|
|
||||||
+ def->features |= (1 << VIR_DOMAIN_FEATURE_HAP);
|
|
||||||
}
|
|
||||||
if (xenXMConfigGetBool(conf, "localtime", &vmlocaltime, 0) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
@@ -2409,6 +2413,10 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
|
||||||
(1 << VIR_DOMAIN_FEATURE_APIC)) ? 1 : 0) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
+ if (xenXMConfigSetInt(conf, "hap",
|
|
||||||
+ (def->features &
|
|
||||||
+ (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0)
|
|
||||||
+ goto no_memory;
|
|
||||||
|
|
||||||
if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) {
|
|
||||||
if (def->clock.data.timezone) {
|
|
||||||
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
|
|
||||||
index 6fff276..fffa617 100644
|
|
||||||
--- a/src/xenapi/xenapi_driver.c
|
|
||||||
+++ b/src/xenapi/xenapi_driver.c
|
|
||||||
@@ -1358,6 +1358,8 @@ xenapiDomainDumpXML (virDomainPtr dom, int flags ATTRIBUTE_UNUSED)
|
|
||||||
defPtr->features = defPtr->features | (1<<VIR_DOMAIN_FEATURE_APIC);
|
|
||||||
else if (STREQ(result->contents[i].key, "pae"))
|
|
||||||
defPtr->features = defPtr->features | (1<<VIR_DOMAIN_FEATURE_PAE);
|
|
||||||
+ else if (STREQ(result->contents[i].key, "hap"))
|
|
||||||
+ defPtr->features = defPtr->features | (1<<VIR_DOMAIN_FEATURE_HAP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xen_string_string_map_free(result);
|
|
||||||
diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
|
|
||||||
index a7e2a4b..2ec5f9e 100644
|
|
||||||
--- a/src/xenapi/xenapi_utils.c
|
|
||||||
+++ b/src/xenapi/xenapi_utils.c
|
|
||||||
@@ -529,6 +529,8 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
|
|
||||||
allocStringMap(&strings, (char *)"apic", (char *)"true");
|
|
||||||
if (def->features & (1 << VIR_DOMAIN_FEATURE_PAE))
|
|
||||||
allocStringMap(&strings, (char *)"pae", (char *)"true");
|
|
||||||
+ if (def->features & (1 << VIR_DOMAIN_FEATURE_HAP))
|
|
||||||
+ allocStringMap(&strings, (char *)"hap", (char *)"true");
|
|
||||||
}
|
|
||||||
if (strings != NULL)
|
|
||||||
(*record)->platform = strings;
|
|
@ -1,32 +0,0 @@
|
|||||||
commit 094c6f4a24165d2d07f64bbd70243b3306a34d5b
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Fri Jan 14 11:12:46 2011 -0700
|
|
||||||
|
|
||||||
Fix 'make check' after commit 04197350
|
|
||||||
|
|
||||||
I broke 'make check' with commit 04197350 by unconditionally
|
|
||||||
emitting 'hap=' in xen xm driver. Only emit 'hap=' if
|
|
||||||
xendConfigVersion >= 3. I've tested sending 'hap=' to a Xen 3.2
|
|
||||||
machine without support for hap setting and verified that xend
|
|
||||||
silently drops the unrecognized setting.
|
|
||||||
|
|
||||||
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
||||||
index ec618aa..bfb6698 100644
|
|
||||||
--- a/src/xen/xm_internal.c
|
|
||||||
+++ b/src/xen/xm_internal.c
|
|
||||||
@@ -2413,10 +2413,11 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
|
||||||
(1 << VIR_DOMAIN_FEATURE_APIC)) ? 1 : 0) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
- if (xenXMConfigSetInt(conf, "hap",
|
|
||||||
- (def->features &
|
|
||||||
- (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0)
|
|
||||||
- goto no_memory;
|
|
||||||
+ if (priv->xendConfigVersion >= 3)
|
|
||||||
+ if (xenXMConfigSetInt(conf, "hap",
|
|
||||||
+ (def->features &
|
|
||||||
+ (1 << VIR_DOMAIN_FEATURE_HAP)) ? 1 : 0) < 0)
|
|
||||||
+ goto no_memory;
|
|
||||||
|
|
||||||
if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME) {
|
|
||||||
if (def->clock.data.timezone) {
|
|
@ -1,54 +0,0 @@
|
|||||||
commit 4301b95af7f554700de8e69ecf3f3bb3148b1d44
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Thu Jan 13 12:52:23 2011 -0700
|
|
||||||
|
|
||||||
[v2] qemu: Retry JSON monitor cont cmd on MigrationExpected error
|
|
||||||
|
|
||||||
When restoring a saved qemu instance via JSON monitor, the vm is
|
|
||||||
left in a paused state. Turns out the 'cont' cmd was failing with
|
|
||||||
"MigrationExpected" error class and "An incoming migration is
|
|
||||||
expected before this command can be executed" error description
|
|
||||||
due to migration (restore) not yet complete.
|
|
||||||
|
|
||||||
Detect if 'cont' cmd fails with "MigrationExpecte" error class and
|
|
||||||
retry 'cont' cmd.
|
|
||||||
|
|
||||||
V2: Fix potential double-free noted by Laine Stump
|
|
||||||
|
|
||||||
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
|
|
||||||
index 2e159c7..ca06e7e 100644
|
|
||||||
--- a/src/qemu/qemu_monitor_json.c
|
|
||||||
+++ b/src/qemu/qemu_monitor_json.c
|
|
||||||
@@ -702,13 +702,29 @@ qemuMonitorJSONStartCPUs(qemuMonitorPtr mon,
|
|
||||||
int ret;
|
|
||||||
virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("cont", NULL);
|
|
||||||
virJSONValuePtr reply = NULL;
|
|
||||||
+ int i = 0, timeout = 3;
|
|
||||||
if (!cmd)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
- ret = qemuMonitorJSONCommand(mon, cmd, &reply);
|
|
||||||
+ do {
|
|
||||||
+ ret = qemuMonitorJSONCommand(mon, cmd, &reply);
|
|
||||||
|
|
||||||
- if (ret == 0)
|
|
||||||
- ret = qemuMonitorJSONCheckError(cmd, reply);
|
|
||||||
+ if (ret != 0)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ /* If no error, we're done */
|
|
||||||
+ if ((ret = qemuMonitorJSONCheckError(cmd, reply)) == 0)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ /* If error class is not MigrationExpected, we're done.
|
|
||||||
+ * Otherwise try 'cont' cmd again */
|
|
||||||
+ if (!qemuMonitorJSONHasError(reply, "MigrationExpected"))
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ virJSONValueFree(reply);
|
|
||||||
+ reply = NULL;
|
|
||||||
+ usleep(250000);
|
|
||||||
+ } while (++i <= timeout);
|
|
||||||
|
|
||||||
virJSONValueFree(cmd);
|
|
||||||
virJSONValueFree(reply);
|
|
@ -1,41 +0,0 @@
|
|||||||
commit 48a5dccda905b5c6e8a02a37c093c42a9ef4e350
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Wed Jan 5 14:56:48 2011 -0700
|
|
||||||
|
|
||||||
Add HAP to virDomainFeature enum
|
|
||||||
|
|
||||||
Extend the virDomainFeature enumeration to include HAP (hardware
|
|
||||||
assisted paging) feature.
|
|
||||||
|
|
||||||
Hardware features such as Extended Page Table and Nested Page
|
|
||||||
Table augment hypervisor software techniques such as shadow
|
|
||||||
page table. Adding HAP to the virDomainFeature enumeration
|
|
||||||
allows users to select between hardware and software memory
|
|
||||||
management mechanisms for their guests.
|
|
||||||
|
|
||||||
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
|
||||||
index b4df38c..2c54683 100644
|
|
||||||
--- a/src/conf/domain_conf.c
|
|
||||||
+++ b/src/conf/domain_conf.c
|
|
||||||
@@ -75,7 +75,8 @@ VIR_ENUM_IMPL(virDomainBoot, VIR_DOMAIN_BOOT_LAST,
|
|
||||||
VIR_ENUM_IMPL(virDomainFeature, VIR_DOMAIN_FEATURE_LAST,
|
|
||||||
"acpi",
|
|
||||||
"apic",
|
|
||||||
- "pae")
|
|
||||||
+ "pae",
|
|
||||||
+ "hap")
|
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virDomainLifecycle, VIR_DOMAIN_LIFECYCLE_LAST,
|
|
||||||
"destroy",
|
|
||||||
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
|
|
||||||
index a459a22..6a8ec64 100644
|
|
||||||
--- a/src/conf/domain_conf.h
|
|
||||||
+++ b/src/conf/domain_conf.h
|
|
||||||
@@ -730,6 +730,7 @@ enum virDomainFeature {
|
|
||||||
VIR_DOMAIN_FEATURE_ACPI,
|
|
||||||
VIR_DOMAIN_FEATURE_APIC,
|
|
||||||
VIR_DOMAIN_FEATURE_PAE,
|
|
||||||
+ VIR_DOMAIN_FEATURE_HAP,
|
|
||||||
|
|
||||||
VIR_DOMAIN_FEATURE_LAST
|
|
||||||
};
|
|
@ -1,56 +0,0 @@
|
|||||||
commit 79f56c669f0f4d554cec3137d0a6aadf7c5f2bec
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Wed Jan 5 16:07:54 2011 -0700
|
|
||||||
|
|
||||||
Document HAP domain feature
|
|
||||||
|
|
||||||
Add HAP feature to schema and documentation.
|
|
||||||
|
|
||||||
Index: libvirt-0.8.7/docs/formatdomain.html.in
|
|
||||||
===================================================================
|
|
||||||
--- libvirt-0.8.7.orig/docs/formatdomain.html.in
|
|
||||||
+++ libvirt-0.8.7/docs/formatdomain.html.in
|
|
||||||
@@ -437,6 +437,7 @@
|
|
||||||
<pae/>
|
|
||||||
<acpi/>
|
|
||||||
<apic/>
|
|
||||||
+ <hap/>
|
|
||||||
</features>
|
|
||||||
...</pre>
|
|
||||||
|
|
||||||
@@ -456,6 +457,10 @@
|
|
||||||
<dd>ACPI is useful for power management, for example, with
|
|
||||||
KVM guests it is required for graceful shutdown to work.
|
|
||||||
</dd>
|
|
||||||
+ <dt><code>hap</code></dt>
|
|
||||||
+ <dd>Enable use of Hardware Assisted Paging if available in
|
|
||||||
+ the hardware.
|
|
||||||
+ </dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h3><a name="elementsTime">Time keeping</a></h3>
|
|
||||||
Index: libvirt-0.8.7/docs/schemas/domain.rng
|
|
||||||
===================================================================
|
|
||||||
--- libvirt-0.8.7.orig/docs/schemas/domain.rng
|
|
||||||
+++ libvirt-0.8.7/docs/schemas/domain.rng
|
|
||||||
@@ -1741,7 +1741,7 @@
|
|
||||||
</element>
|
|
||||||
</define>
|
|
||||||
<!--
|
|
||||||
- A set of optional features: PAE, APIC and ACPI support
|
|
||||||
+ A set of optional features: PAE, APIC, ACPI, and HAP support
|
|
||||||
-->
|
|
||||||
<define name="features">
|
|
||||||
<optional>
|
|
||||||
@@ -1762,6 +1762,11 @@
|
|
||||||
<empty/>
|
|
||||||
</element>
|
|
||||||
</optional>
|
|
||||||
+ <optional>
|
|
||||||
+ <element name="hap">
|
|
||||||
+ <empty/>
|
|
||||||
+ </element>
|
|
||||||
+ </optional>
|
|
||||||
</interleave>
|
|
||||||
</element>
|
|
||||||
</optional>
|
|
@ -1,48 +0,0 @@
|
|||||||
commit a43c7338d8772aa3a5bc0ec5914d3c28c20447c3
|
|
||||||
Author: Kay Schubert <kayegypt@web.de>
|
|
||||||
Date: Thu Jan 6 09:14:58 2011 +0100
|
|
||||||
|
|
||||||
bridge: Fix generation of dnsmasq's --dhcp-hostsfile option
|
|
||||||
|
|
||||||
I added a host definition to a network definition:
|
|
||||||
|
|
||||||
<network>
|
|
||||||
<name>Lokal</name>
|
|
||||||
<uuid>2074f379-b82c-423f-9ada-305d8088daaa</uuid>
|
|
||||||
<bridge name='virbr1' stp='on' delay='0' />
|
|
||||||
<ip address='192.168.180.1' netmask='255.255.255.0'>
|
|
||||||
<dhcp>
|
|
||||||
<range start='192.168.180.128' end='192.168.180.254' />
|
|
||||||
<host mac='23:74:00:03:42:02' name='somevm' ip='192.168.180.10' />
|
|
||||||
</dhcp>
|
|
||||||
</ip>
|
|
||||||
</network>
|
|
||||||
|
|
||||||
But due to the wrong if-statement the argument --dhcp-hostsfile doesn't get
|
|
||||||
added to the dnsmasq command. The patch below fixes it for me.
|
|
||||||
|
|
||||||
diff --git a/AUTHORS b/AUTHORS
|
|
||||||
index b204bd6..721b8f8 100644
|
|
||||||
--- a/AUTHORS
|
|
||||||
+++ b/AUTHORS
|
|
||||||
@@ -142,6 +142,7 @@ Patches have also been contributed by:
|
|
||||||
Josh Durgin <joshd@hq.newdream.net>
|
|
||||||
Roopa Prabhu <roprabhu@cisco.com>
|
|
||||||
Paweł Krześniak <pawel.krzesniak@gmail.com>
|
|
||||||
+ Kay Schubert <kayegypt@web.de>
|
|
||||||
|
|
||||||
[....send patches to get your name here....]
|
|
||||||
|
|
||||||
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
|
|
||||||
index 7d43ef5..4c64a74 100644
|
|
||||||
--- a/src/network/bridge_driver.c
|
|
||||||
+++ b/src/network/bridge_driver.c
|
|
||||||
@@ -524,7 +524,7 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (networkSaveDnsmasqHostsfile(ipdef, dctx, false) < 0) {
|
|
||||||
+ if (networkSaveDnsmasqHostsfile(ipdef, dctx, false) == 0) {
|
|
||||||
virCommandAddArgPair(cmd, "--dhcp-hostsfile",
|
|
||||||
dctx->hostsfile->path);
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
commit af521a0182a0d6867796c65b1b0cd83fb14032a9
|
|
||||||
Author: Jim Fehlig <jfehlig@novell.com>
|
|
||||||
Date: Wed Jan 5 15:20:01 2011 -0700
|
|
||||||
|
|
||||||
Add HAP to xen hypervisor capabilities
|
|
||||||
|
|
||||||
xen-unstable c/s 16931 introduced a per-domain setting for hvm
|
|
||||||
guests to enable/disable hardware assisted paging. If disabled,
|
|
||||||
software techniques such as shadow page tables are used. If enabled,
|
|
||||||
and the feature exists in underlying hardware, hardware support for
|
|
||||||
paging is used.
|
|
||||||
|
|
||||||
Xen does not provide a mechanism to discover the HAP capability, so
|
|
||||||
we advertise its availability for hvm guests on Xen >= 3.3.
|
|
||||||
|
|
||||||
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
|
|
||||||
index ead8ee9..229ef3d 100644
|
|
||||||
--- a/src/xen/xen_hypervisor.c
|
|
||||||
+++ b/src/xen/xen_hypervisor.c
|
|
||||||
@@ -2321,6 +2321,16 @@ xenHypervisorBuildCapabilities(virConnectPtr conn,
|
|
||||||
hv_minor > 0 ?
|
|
||||||
0 : 1)) == NULL)
|
|
||||||
goto no_memory;
|
|
||||||
+
|
|
||||||
+ /* Xen 3.3.x and beyond supports enabling/disabling
|
|
||||||
+ * hardware assisted paging. Default is off.
|
|
||||||
+ */
|
|
||||||
+ if ((hv_major == 3 && hv_minor >= 3) || (hv_major > 3))
|
|
||||||
+ if (virCapabilitiesAddGuestFeature(guest,
|
|
||||||
+ "hap",
|
|
||||||
+ 0,
|
|
||||||
+ 1) == NULL)
|
|
||||||
+ goto no_memory;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,7 +2,7 @@ Index: src/lxc/lxc_container.c
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- src/lxc/lxc_container.c.orig
|
--- src/lxc/lxc_container.c.orig
|
||||||
+++ src/lxc/lxc_container.c
|
+++ src/lxc/lxc_container.c
|
||||||
@@ -838,6 +838,9 @@ int lxcContainerStart(virDomainDefPtr de
|
@@ -845,6 +845,9 @@ int lxcContainerStart(virDomainDefPtr de
|
||||||
lxc_child_argv_t args = { def, nveths, veths, control, ttyPath };
|
lxc_child_argv_t args = { def, nveths, veths, control, ttyPath };
|
||||||
|
|
||||||
/* allocate a stack for the container */
|
/* allocate a stack for the container */
|
||||||
@ -12,7 +12,7 @@ Index: src/lxc/lxc_container.c
|
|||||||
if (VIR_ALLOC_N(stack, stacksize) < 0) {
|
if (VIR_ALLOC_N(stack, stacksize) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return -1;
|
return -1;
|
||||||
@@ -856,7 +859,11 @@ int lxcContainerStart(virDomainDefPtr de
|
@@ -863,7 +866,11 @@ int lxcContainerStart(virDomainDefPtr de
|
||||||
flags |= CLONE_NEWNET;
|
flags |= CLONE_NEWNET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ Index: src/lxc/lxc_container.c
|
|||||||
VIR_FREE(stack);
|
VIR_FREE(stack);
|
||||||
DEBUG("clone() completed, new container PID is %d", pid);
|
DEBUG("clone() completed, new container PID is %d", pid);
|
||||||
|
|
||||||
@@ -882,6 +889,7 @@ int lxcContainerAvailable(int features)
|
@@ -889,6 +896,7 @@ int lxcContainerAvailable(int features)
|
||||||
char *childStack;
|
char *childStack;
|
||||||
char *stack;
|
char *stack;
|
||||||
int childStatus;
|
int childStatus;
|
||||||
@ -32,7 +32,7 @@ Index: src/lxc/lxc_container.c
|
|||||||
|
|
||||||
if (features & LXC_CONTAINER_FEATURE_USER)
|
if (features & LXC_CONTAINER_FEATURE_USER)
|
||||||
flags |= CLONE_NEWUSER;
|
flags |= CLONE_NEWUSER;
|
||||||
@@ -889,14 +897,21 @@ int lxcContainerAvailable(int features)
|
@@ -896,14 +904,21 @@ int lxcContainerAvailable(int features)
|
||||||
if (features & LXC_CONTAINER_FEATURE_NET)
|
if (features & LXC_CONTAINER_FEATURE_NET)
|
||||||
flags |= CLONE_NEWNET;
|
flags |= CLONE_NEWNET;
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:98d76f1aa9ce28e887271969f67f7a470b554cfb1a22c4e9d2f2ae6db45e6135
|
|
||||||
size 9205470
|
|
3
libvirt-0.8.8.tar.bz2
Normal file
3
libvirt-0.8.8.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:a63182fc0c19d08f8996ba74fb4bf852b4f8be9b894a7503e7a0fe2b8993f6dd
|
||||||
|
size 9358764
|
@ -1,3 +1,8 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Feb 11 11:43:16 MST 2011 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Update to libvirt 0.8.8 RC1
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Jan 31 09:14:37 MST 2011 - jfehlig@novell.com
|
Mon Jan 31 09:14:37 MST 2011 - jfehlig@novell.com
|
||||||
|
|
||||||
|
18
libvirt.spec
18
libvirt.spec
@ -144,8 +144,8 @@ Url: http://libvirt.org/
|
|||||||
License: LGPLv2.1+
|
License: LGPLv2.1+
|
||||||
Group: Development/Libraries/C and C++
|
Group: Development/Libraries/C and C++
|
||||||
AutoReqProv: yes
|
AutoReqProv: yes
|
||||||
Version: 0.8.7
|
Version: 0.8.8
|
||||||
Release: 3
|
Release: 1
|
||||||
Summary: A C toolkit to interract with the virtualization capabilities of Linux
|
Summary: A C toolkit to interract with the virtualization capabilities of Linux
|
||||||
# The client side, i.e. shared libs and virsh are in a subpackage
|
# The client side, i.e. shared libs and virsh are in a subpackage
|
||||||
Requires: %{name}-client = %{version}-%{release}
|
Requires: %{name}-client = %{version}-%{release}
|
||||||
@ -169,13 +169,6 @@ Recommends: PolicyKit >= 0.6
|
|||||||
Source0: %{name}-%{version}.tar.bz2
|
Source0: %{name}-%{version}.tar.bz2
|
||||||
Source1: libvirtd.init
|
Source1: libvirtd.init
|
||||||
# Upstream patches
|
# Upstream patches
|
||||||
Patch0: a43c7338-dnsmasq-hostfile-fix.patch
|
|
||||||
Patch1: 48a5dccd-hap1.patch
|
|
||||||
Patch2: 04197350-hap2.patch
|
|
||||||
Patch3: af521a01-hap3.patch
|
|
||||||
Patch4: 79f56c66-hap4.patch
|
|
||||||
Patch5: 094c6f4a-hap-fix.patch
|
|
||||||
Patch6: 4301b95a-json-cont-cmd.patch
|
|
||||||
# Need to go upstream
|
# Need to go upstream
|
||||||
Patch100: xen-name-for-devid.patch
|
Patch100: xen-name-for-devid.patch
|
||||||
Patch102: clone.patch
|
Patch102: clone.patch
|
||||||
@ -288,13 +281,6 @@ Authors:
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1
|
|
||||||
%patch1 -p1
|
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch6 -p1
|
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
%patch102
|
%patch102
|
||||||
%patch103 -p1
|
%patch103 -p1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: libvirt-0.8.7/tools/Makefile.am
|
Index: libvirt-0.8.8/tools/Makefile.am
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.7.orig/tools/Makefile.am
|
--- libvirt-0.8.8.orig/tools/Makefile.am
|
||||||
+++ libvirt-0.8.7/tools/Makefile.am
|
+++ libvirt-0.8.8/tools/Makefile.am
|
||||||
@@ -129,18 +129,18 @@ install-data-local: install-init
|
@@ -129,18 +129,18 @@ install-data-local: install-init
|
||||||
|
|
||||||
uninstall-local: uninstall-init
|
uninstall-local: uninstall-init
|
||||||
@ -28,7 +28,7 @@ Index: libvirt-0.8.7/tools/Makefile.am
|
|||||||
|
|
||||||
BUILT_SOURCES += libvirt-guests.init
|
BUILT_SOURCES += libvirt-guests.init
|
||||||
|
|
||||||
@@ -152,11 +152,6 @@ libvirt-guests.init: libvirt-guests.init
|
@@ -155,11 +155,6 @@ libvirt-guests.init: libvirt-guests.init
|
||||||
< $< > $@-t && \
|
< $< > $@-t && \
|
||||||
chmod a+x $@-t && \
|
chmod a+x $@-t && \
|
||||||
mv $@-t $@
|
mv $@-t $@
|
||||||
@ -40,10 +40,10 @@ Index: libvirt-0.8.7/tools/Makefile.am
|
|||||||
|
|
||||||
|
|
||||||
CLEANFILES = $(bin_SCRIPTS) $(man1_MANS)
|
CLEANFILES = $(bin_SCRIPTS) $(man1_MANS)
|
||||||
Index: libvirt-0.8.7/tools/libvirt-guests.sysconf
|
Index: libvirt-0.8.8/tools/libvirt-guests.sysconf
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.7.orig/tools/libvirt-guests.sysconf
|
--- libvirt-0.8.8.orig/tools/libvirt-guests.sysconf
|
||||||
+++ libvirt-0.8.7/tools/libvirt-guests.sysconf
|
+++ libvirt-0.8.8/tools/libvirt-guests.sysconf
|
||||||
@@ -1,15 +1,23 @@
|
@@ -1,15 +1,23 @@
|
||||||
+## Path: System/Virtualization/libvirt
|
+## Path: System/Virtualization/libvirt
|
||||||
+
|
+
|
||||||
@ -82,10 +82,10 @@ Index: libvirt-0.8.7/tools/libvirt-guests.sysconf
|
|||||||
# number of seconds we're willing to wait for a guest to shut down
|
# number of seconds we're willing to wait for a guest to shut down
|
||||||
-#SHUTDOWN_TIMEOUT=0
|
-#SHUTDOWN_TIMEOUT=0
|
||||||
+SHUTDOWN_TIMEOUT=120
|
+SHUTDOWN_TIMEOUT=120
|
||||||
Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
Index: libvirt-0.8.8/tools/libvirt-guests.init.sh
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.7.orig/tools/libvirt-guests.init.in
|
--- libvirt-0.8.8.orig/tools/libvirt-guests.init.sh
|
||||||
+++ libvirt-0.8.7/tools/libvirt-guests.init.in
|
+++ libvirt-0.8.8/tools/libvirt-guests.init.sh
|
||||||
@@ -4,10 +4,10 @@
|
@@ -4,10 +4,10 @@
|
||||||
#
|
#
|
||||||
### BEGIN INIT INFO
|
### BEGIN INIT INFO
|
||||||
@ -108,18 +108,18 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
+. /etc/rc.status
|
+. /etc/rc.status
|
||||||
+rc_reset
|
+rc_reset
|
||||||
+
|
+
|
||||||
sysconfdir=@sysconfdir@
|
sysconfdir="@sysconfdir@"
|
||||||
localstatedir=@localstatedir@
|
localstatedir="@localstatedir@"
|
||||||
libvirtd=@sbindir@/libvirtd
|
libvirtd="@sbindir@"/libvirtd
|
||||||
|
|
||||||
-# Source function library.
|
-# Source function library.
|
||||||
-test ! -r "$sysconfdir"/rc.d/init.d/functions ||
|
-test ! -r "$sysconfdir"/rc.d/init.d/functions ||
|
||||||
- . "$sysconfdir"/rc.d/init.d/functions
|
- . "$sysconfdir"/rc.d/init.d/functions
|
||||||
-
|
-
|
||||||
URIS=default
|
# Source gettext library.
|
||||||
ON_BOOT=start
|
# Make sure this file is recognized as having translations: _("dummy")
|
||||||
ON_SHUTDOWN=suspend
|
. "@bindir@"/gettext.sh
|
||||||
@@ -42,12 +41,10 @@ test -f "$sysconfdir"/sysconfig/libvirt-
|
@@ -49,12 +48,10 @@ test -f "$sysconfdir"/sysconfig/libvirt-
|
||||||
LISTFILE="$localstatedir"/lib/libvirt/libvirt-guests
|
LISTFILE="$localstatedir"/lib/libvirt/libvirt-guests
|
||||||
VAR_SUBSYS_LIBVIRT_GUESTS="$localstatedir"/lock/subsys/libvirt-guests
|
VAR_SUBSYS_LIBVIRT_GUESTS="$localstatedir"/lock/subsys/libvirt-guests
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
@@ -71,12 +68,31 @@ run_virsh_c() {
|
@@ -78,12 +75,31 @@ run_virsh_c() {
|
||||||
( export LC_ALL=C; run_virsh "$@" )
|
( export LC_ALL=C; run_virsh "$@" )
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -84,7 +100,7 @@ list_guests() {
|
@@ -91,7 +107,7 @@ list_guests() {
|
||||||
for id in $(echo "$list" | awk 'NR > 2 {print $1}'); do
|
for id in $(echo "$list" | awk 'NR > 2 {print $1}'); do
|
||||||
uuid=$(run_virsh_c $uri dominfo $id | awk '/^UUID:/{print $2}')
|
uuid=$(run_virsh_c $uri dominfo $id | awk '/^UUID:/{print $2}')
|
||||||
if [ -z "$uuid" ]; then
|
if [ -z "$uuid" ]; then
|
||||||
@ -175,7 +175,7 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
uuids="$uuids $uuid"
|
uuids="$uuids $uuid"
|
||||||
@@ -111,7 +127,7 @@ guest_is_on() {
|
@@ -118,7 +134,7 @@ guest_is_on() {
|
||||||
guest_running=false
|
guest_running=false
|
||||||
info=$(run_virsh_c $uri dominfo $uuid)
|
info=$(run_virsh_c $uri dominfo $uuid)
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
@ -184,7 +184,7 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -148,6 +164,12 @@ start() {
|
@@ -156,6 +172,12 @@ start() {
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -194,35 +194,35 @@ Index: libvirt-0.8.7/tools/libvirt-guests.init.in
|
|||||||
+ continue
|
+ continue
|
||||||
+ fi
|
+ fi
|
||||||
+
|
+
|
||||||
echo $"Resuming guests on $uri URI..."
|
eval_gettext "Resuming guests on \$uri URI..."; echo
|
||||||
for guest in $list; do
|
for guest in $list; do
|
||||||
name=$(guest_name $uri $guest)
|
name=$(guest_name $uri $guest)
|
||||||
@@ -227,7 +249,7 @@ stop() {
|
@@ -237,7 +259,7 @@ stop() {
|
||||||
suspending=false
|
|
||||||
if [ $SHUTDOWN_TIMEOUT -le 0 ]; then
|
if [ $SHUTDOWN_TIMEOUT -le 0 ]; then
|
||||||
echo $"Shutdown action requested but SHUTDOWN_TIMEOUT was not set"
|
gettext "Shutdown action requested but SHUTDOWN_TIMEOUT was not set"
|
||||||
|
echo
|
||||||
- RETVAL=6
|
- RETVAL=6
|
||||||
+ rc_failed 6
|
+ rc_failed 6
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -291,14 +313,13 @@ gueststatus() {
|
@@ -301,14 +323,13 @@ gueststatus() {
|
||||||
rh_status() {
|
rh_status() {
|
||||||
if [ -f "$LISTFILE" ]; then
|
if [ -f "$LISTFILE" ]; then
|
||||||
echo $"stopped, with saved guests"
|
gettext "stopped, with saved guests"; echo
|
||||||
- RETVAL=3
|
- RETVAL=3
|
||||||
+ rc_failed 3
|
+ rc_failed 3
|
||||||
else
|
else
|
||||||
if [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ]; then
|
if [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ]; then
|
||||||
echo $"started"
|
gettext "started"; echo
|
||||||
else
|
else
|
||||||
echo $"stopped, with no saved guests"
|
gettext "stopped, with no saved guests"; echo
|
||||||
fi
|
fi
|
||||||
- RETVAL=0
|
- RETVAL=0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,4 +361,4 @@ case "$1" in
|
@@ -352,4 +373,4 @@ case "$1" in
|
||||||
usage
|
usage
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -13,10 +13,10 @@ Date: Wed Jan 27 16:11:41 2010 -0700
|
|||||||
This approach allows removing a disk when domain is inactive. We
|
This approach allows removing a disk when domain is inactive. We
|
||||||
obviously can't search xenstore when the domain is inactive.
|
obviously can't search xenstore when the domain is inactive.
|
||||||
|
|
||||||
Index: libvirt-0.8.7/src/xen/xend_internal.c
|
Index: libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.7.orig/src/xen/xend_internal.c
|
--- libvirt-0.8.8.orig/src/xen/xend_internal.c
|
||||||
+++ libvirt-0.8.7/src/xen/xend_internal.c
|
+++ libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
@@ -89,6 +89,7 @@ xenDaemonFormatSxprOnePCI(virDomainHostd
|
@@ -89,6 +89,7 @@ xenDaemonFormatSxprOnePCI(virDomainHostd
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -25,7 +25,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
virDomainDeviceDefPtr dev,
|
virDomainDeviceDefPtr dev,
|
||||||
char *class,
|
char *class,
|
||||||
char *ref,
|
char *ref,
|
||||||
@@ -4054,7 +4055,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr
|
@@ -4061,7 +4062,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr
|
||||||
|
|
||||||
sexpr = virBufferContentAndReset(&buf);
|
sexpr = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
/* device doesn't exist, define it */
|
/* device doesn't exist, define it */
|
||||||
ret = xend_op(domain->conn, domain->name, "op", "device_create",
|
ret = xend_op(domain->conn, domain->name, "op", "device_create",
|
||||||
"config", sexpr, NULL);
|
"config", sexpr, NULL);
|
||||||
@@ -4172,7 +4173,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr
|
@@ -4179,7 +4180,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr
|
||||||
|
|
||||||
sexpr = virBufferContentAndReset(&buf);
|
sexpr = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
virXendError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
_("requested device does not exist"));
|
_("requested device does not exist"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@@ -4265,7 +4266,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr
|
@@ -4272,7 +4273,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr
|
||||||
def, xml, VIR_DOMAIN_XML_INACTIVE)))
|
def, xml, VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
|
||||||
@@ -6037,6 +6038,7 @@ error:
|
@@ -6053,6 +6054,7 @@ error:
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
virDomainXMLDevID(virDomainPtr domain,
|
virDomainXMLDevID(virDomainPtr domain,
|
||||||
@ -60,7 +60,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
virDomainDeviceDefPtr dev,
|
virDomainDeviceDefPtr dev,
|
||||||
char *class,
|
char *class,
|
||||||
char *ref,
|
char *ref,
|
||||||
@@ -6045,8 +6047,12 @@ virDomainXMLDevID(virDomainPtr domain,
|
@@ -6061,8 +6063,12 @@ virDomainXMLDevID(virDomainPtr domain,
|
||||||
xenUnifiedPrivatePtr priv = domain->conn->privateData;
|
xenUnifiedPrivatePtr priv = domain->conn->privateData;
|
||||||
char *xref;
|
char *xref;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
@ -73,7 +73,7 @@ Index: libvirt-0.8.7/src/xen/xend_internal.c
|
|||||||
if (dev->data.disk->driverName &&
|
if (dev->data.disk->driverName &&
|
||||||
STREQ(dev->data.disk->driverName, "tap"))
|
STREQ(dev->data.disk->driverName, "tap"))
|
||||||
strcpy(class, "tap");
|
strcpy(class, "tap");
|
||||||
@@ -6056,19 +6062,21 @@ virDomainXMLDevID(virDomainPtr domain,
|
@@ -6072,19 +6078,21 @@ virDomainXMLDevID(virDomainPtr domain,
|
||||||
else
|
else
|
||||||
strcpy(class, "vbd");
|
strcpy(class, "vbd");
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: libvirt-0.8.6/src/xen/xend_internal.c
|
Index: libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.6.orig/src/xen/xend_internal.c
|
--- libvirt-0.8.8.orig/src/xen/xend_internal.c
|
||||||
+++ libvirt-0.8.6/src/xen/xend_internal.c
|
+++ libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
@@ -1358,7 +1358,7 @@ error:
|
@@ -1365,7 +1365,7 @@ error:
|
||||||
static int
|
static int
|
||||||
xenDaemonParseSxprDisks(virDomainDefPtr def,
|
xenDaemonParseSxprDisks(virDomainDefPtr def,
|
||||||
const struct sexpr *root,
|
const struct sexpr *root,
|
||||||
@ -11,7 +11,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c
|
|||||||
int xendConfigVersion)
|
int xendConfigVersion)
|
||||||
{
|
{
|
||||||
const struct sexpr *cur, *node;
|
const struct sexpr *cur, *node;
|
||||||
@@ -1405,7 +1405,6 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
@@ -1412,7 +1412,6 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
||||||
/* There is a case without the uname to the CD-ROM device */
|
/* There is a case without the uname to the CD-ROM device */
|
||||||
offset = strchr(dst, ':');
|
offset = strchr(dst, ':');
|
||||||
if (!offset ||
|
if (!offset ||
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: libvirt-0.8.6/src/xen/xend_internal.c
|
Index: libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- libvirt-0.8.6.orig/src/xen/xend_internal.c
|
--- libvirt-0.8.8.orig/src/xen/xend_internal.c
|
||||||
+++ libvirt-0.8.6/src/xen/xend_internal.c
|
+++ libvirt-0.8.8/src/xen/xend_internal.c
|
||||||
@@ -1376,20 +1376,24 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
@@ -1383,20 +1383,24 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
||||||
const char *src = NULL;
|
const char *src = NULL;
|
||||||
const char *dst = NULL;
|
const char *dst = NULL;
|
||||||
const char *mode = NULL;
|
const char *mode = NULL;
|
||||||
@ -27,7 +27,7 @@ Index: libvirt-0.8.6/src/xen/xend_internal.c
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (VIR_ALLOC(disk) < 0)
|
if (VIR_ALLOC(disk) < 0)
|
||||||
@@ -1514,7 +1518,12 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
@@ -1521,7 +1525,12 @@ xenDaemonParseSxprDisks(virDomainDefPtr
|
||||||
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
|
if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user