Fix XML validation with qemu commandline passthrough (bz #1292131)
Fix crash in libvirt_leasehelper (bz #1202350) Generate consistent systemtap tapsets regardless of host arch (bz #1173641) Fix qemu:///session error 'Transport endpoint is not connected' (bz #1271183) Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
This commit is contained in:
parent
8cbc8bc355
commit
a29c57e351
@ -0,0 +1,38 @@
|
|||||||
|
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||||
|
Date: Thu, 17 Dec 2015 13:43:58 +0100
|
||||||
|
Subject: [PATCH] schema: interleave domain name and uuid with other elements
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Allow <name> and <uuid> anywhere under <domain>, not just at the top:
|
||||||
|
|
||||||
|
error:XML document failed to validate against schema: Unable to validate
|
||||||
|
doc against /usr/share/libvirt/schemas/domain.rng
|
||||||
|
Expecting an element name, got nothing
|
||||||
|
Invalid sequence in interleave
|
||||||
|
Element domain failed to validate content
|
||||||
|
|
||||||
|
Introduced with the first RelaxNG schema in commit c642103.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1292131
|
||||||
|
(cherry picked from commit b4e0549febe416ffefc16f389423740d6d65fa74)
|
||||||
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
---
|
||||||
|
docs/schemas/domaincommon.rng | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
|
||||||
|
index 1120003..9e7fad5 100644
|
||||||
|
--- a/docs/schemas/domaincommon.rng
|
||||||
|
+++ b/docs/schemas/domaincommon.rng
|
||||||
|
@@ -30,8 +30,8 @@
|
||||||
|
<define name="domain">
|
||||||
|
<element name="domain">
|
||||||
|
<ref name="hvs"/>
|
||||||
|
- <ref name="ids"/>
|
||||||
|
<interleave>
|
||||||
|
+ <ref name="ids"/>
|
||||||
|
<optional>
|
||||||
|
<ref name="title"/>
|
||||||
|
</optional>
|
32
0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch
Normal file
32
0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
|
||||||
|
Date: Thu, 14 Jan 2016 14:31:17 +0100
|
||||||
|
Subject: [PATCH] leaseshelper: fix crash when no mac is specified
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
If dnsmasq specified DNSMASQ_IAID (so we're dealing with an IPv6
|
||||||
|
lease) but no DNSMASQ_MAC, we skip creation of the new lease object.
|
||||||
|
|
||||||
|
Also skip adding it to the leases array.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1202350
|
||||||
|
(cherry picked from commit df9fe124d650bc438c531673492569da87523d20)
|
||||||
|
Signed-off-by: Ján Tomko <jtomko@redhat.com>
|
||||||
|
---
|
||||||
|
src/network/leaseshelper.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c
|
||||||
|
index 2d528f7..6930310 100644
|
||||||
|
--- a/src/network/leaseshelper.c
|
||||||
|
+++ b/src/network/leaseshelper.c
|
||||||
|
@@ -439,7 +439,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
|
case VIR_LEASE_ACTION_OLD:
|
||||||
|
case VIR_LEASE_ACTION_ADD:
|
||||||
|
- if (virJSONValueArrayAppend(leases_array_new, lease_new) < 0) {
|
||||||
|
+ if (lease_new && virJSONValueArrayAppend(leases_array_new, lease_new) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("failed to create json"));
|
||||||
|
goto cleanup;
|
@ -0,0 +1,63 @@
|
|||||||
|
From: Cole Robinson <crobinso@redhat.com>
|
||||||
|
Date: Tue, 19 Jan 2016 22:19:56 -0500
|
||||||
|
Subject: [PATCH] build: predictably generate systemtap tapsets (bz 1173641)
|
||||||
|
|
||||||
|
The generated output is dependent on perl hashtable ordering, which
|
||||||
|
gives different results for i686 and x86_64. Fix this by sorting
|
||||||
|
the hash keys before iterating over them
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1173641
|
||||||
|
(cherry picked from commit a1edb05c6028470aa24b74aa0f8d5fb5a181128a)
|
||||||
|
---
|
||||||
|
src/rpc/gensystemtap.pl | 10 +++++-----
|
||||||
|
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/rpc/gensystemtap.pl b/src/rpc/gensystemtap.pl
|
||||||
|
index 2467300..7b80fbf 100755
|
||||||
|
--- a/src/rpc/gensystemtap.pl
|
||||||
|
+++ b/src/rpc/gensystemtap.pl
|
||||||
|
@@ -72,7 +72,7 @@ function libvirt_rpc_auth_name(type, verbose)
|
||||||
|
{
|
||||||
|
EOF
|
||||||
|
my $first = 1;
|
||||||
|
-foreach my $type (keys %auth) {
|
||||||
|
+foreach my $type (sort(keys %auth)) {
|
||||||
|
my $cond = $first ? "if" : "} else if";
|
||||||
|
$first = 0;
|
||||||
|
print " $cond (type == ", $type, ") {\n";
|
||||||
|
@@ -95,7 +95,7 @@ function libvirt_rpc_type_name(type, verbose)
|
||||||
|
{
|
||||||
|
EOF
|
||||||
|
$first = 1;
|
||||||
|
-foreach my $type (keys %type) {
|
||||||
|
+foreach my $type (sort(keys %type)) {
|
||||||
|
my $cond = $first ? "if" : "} else if";
|
||||||
|
$first = 0;
|
||||||
|
print " $cond (type == ", $type, ") {\n";
|
||||||
|
@@ -118,7 +118,7 @@ function libvirt_rpc_status_name(status, verbose)
|
||||||
|
{
|
||||||
|
EOF
|
||||||
|
$first = 1;
|
||||||
|
-foreach my $status (keys %status) {
|
||||||
|
+foreach my $status (sort(keys %status)) {
|
||||||
|
my $cond = $first ? "if" : "} else if";
|
||||||
|
$first = 0;
|
||||||
|
print " $cond (status == ", $status, ") {\n";
|
||||||
|
@@ -141,7 +141,7 @@ function libvirt_rpc_program_name(program, verbose)
|
||||||
|
{
|
||||||
|
EOF
|
||||||
|
$first = 1;
|
||||||
|
-foreach my $prog (keys %funcs) {
|
||||||
|
+foreach my $prog (sort(keys %funcs)) {
|
||||||
|
my $cond = $first ? "if" : "} else if";
|
||||||
|
$first = 0;
|
||||||
|
print " $cond (program == ", $funcs{$prog}->{id}, ") {\n";
|
||||||
|
@@ -165,7 +165,7 @@ function libvirt_rpc_procedure_name(program, version, proc, verbose)
|
||||||
|
{
|
||||||
|
EOF
|
||||||
|
$first = 1;
|
||||||
|
-foreach my $prog (keys %funcs) {
|
||||||
|
+foreach my $prog (sort(keys %funcs)) {
|
||||||
|
my $cond = $first ? "if" : "} else if";
|
||||||
|
$first = 0;
|
||||||
|
print " $cond (program == ", $funcs{$prog}->{id}, " && version == ", $funcs{$prog}->{version}, ") {\n";
|
48
0004-rpc-socket-Minor-cleanups.patch
Normal file
48
0004-rpc-socket-Minor-cleanups.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
From: Cole Robinson <crobinso@redhat.com>
|
||||||
|
Date: Mon, 11 Jan 2016 20:01:24 -0500
|
||||||
|
Subject: [PATCH] rpc: socket: Minor cleanups
|
||||||
|
|
||||||
|
- Add some debugging
|
||||||
|
- Make the loop dependent only on retries
|
||||||
|
- Make it explicit that connect(2) success exits the loop
|
||||||
|
- Invert the error checking logic
|
||||||
|
|
||||||
|
(cherry picked from commit f102c7146ed7f6e04af0ad3bce302476239f2502)
|
||||||
|
---
|
||||||
|
src/rpc/virnetsocket.c | 16 ++++++++++++----
|
||||||
|
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
|
||||||
|
index 5e5f1ab..fc8ce6c 100644
|
||||||
|
--- a/src/rpc/virnetsocket.c
|
||||||
|
+++ b/src/rpc/virnetsocket.c
|
||||||
|
@@ -620,6 +620,9 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
char *rundir = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
+ VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon,
|
||||||
|
+ NULLSTR(binary));
|
||||||
|
+
|
||||||
|
memset(&localAddr, 0, sizeof(localAddr));
|
||||||
|
memset(&remoteAddr, 0, sizeof(remoteAddr));
|
||||||
|
|
||||||
|
@@ -680,10 +683,15 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
if (remoteAddr.data.un.sun_path[0] == '@')
|
||||||
|
remoteAddr.data.un.sun_path[0] = '\0';
|
||||||
|
|
||||||
|
- while (retries &&
|
||||||
|
- connect(fd, &remoteAddr.data.sa, remoteAddr.len) < 0) {
|
||||||
|
- if (!(spawnDaemon && (errno == ENOENT ||
|
||||||
|
- errno == ECONNREFUSED))) {
|
||||||
|
+ while (retries) {
|
||||||
|
+ if (connect(fd, &remoteAddr.data.sa, remoteAddr.len) == 0) {
|
||||||
|
+ VIR_DEBUG("connect() succeeded");
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno);
|
||||||
|
+
|
||||||
|
+ if (!spawnDaemon ||
|
||||||
|
+ (errno != ENOENT && errno != ECONNREFUSED)) {
|
||||||
|
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
|
||||||
|
path);
|
||||||
|
goto cleanup;
|
@ -0,0 +1,40 @@
|
|||||||
|
From: Cole Robinson <crobinso@redhat.com>
|
||||||
|
Date: Mon, 11 Jan 2016 20:08:45 -0500
|
||||||
|
Subject: [PATCH] rpc: socket: Explicitly error if we exceed retry count
|
||||||
|
|
||||||
|
When we autolaunch libvirtd for session URIs, we spin in a retry
|
||||||
|
loop waiting for the daemon to start and the connect(2) to succeed.
|
||||||
|
|
||||||
|
However if we exceed the retry count, we don't explicitly raise an
|
||||||
|
error, which can yield a slew of different error messages elsewhere
|
||||||
|
in the code.
|
||||||
|
|
||||||
|
Explicitly raise the last connect(2) failure if we run out of retries.
|
||||||
|
|
||||||
|
(cherry picked from commit 8da02d528068942303923fc4f935e77cccac9c7c)
|
||||||
|
---
|
||||||
|
src/rpc/virnetsocket.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
|
||||||
|
index fc8ce6c..6a51dc8 100644
|
||||||
|
--- a/src/rpc/virnetsocket.c
|
||||||
|
+++ b/src/rpc/virnetsocket.c
|
||||||
|
@@ -690,7 +690,9 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
}
|
||||||
|
VIR_DEBUG("connect() failed: retries=%d errno=%d", retries, errno);
|
||||||
|
|
||||||
|
+ retries--;
|
||||||
|
if (!spawnDaemon ||
|
||||||
|
+ retries == 0 ||
|
||||||
|
(errno != ENOENT && errno != ECONNREFUSED)) {
|
||||||
|
virReportSystemError(errno, _("Failed to connect socket to '%s'"),
|
||||||
|
path);
|
||||||
|
@@ -700,7 +702,6 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
if (virNetSocketForkDaemon(binary) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
- retries--;
|
||||||
|
usleep(5000);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
|||||||
|
From: Cole Robinson <crobinso@redhat.com>
|
||||||
|
Date: Mon, 11 Jan 2016 20:13:38 -0500
|
||||||
|
Subject: [PATCH] rpc: socket: Don't repeatedly attempt to launch daemon
|
||||||
|
|
||||||
|
On every socket connect(2) attempt we were re-launching session
|
||||||
|
libvirtd, up to 100 times in 5 seconds.
|
||||||
|
|
||||||
|
This understandably caused some weird load races and intermittent
|
||||||
|
qemu:///session startup failures
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1271183
|
||||||
|
(cherry picked from commit 2eb7a975756d05a5b54ab4acf60083beb6161ac6)
|
||||||
|
---
|
||||||
|
src/rpc/virnetsocket.c | 9 +++++++--
|
||||||
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
|
||||||
|
index 6a51dc8..b132532 100644
|
||||||
|
--- a/src/rpc/virnetsocket.c
|
||||||
|
+++ b/src/rpc/virnetsocket.c
|
||||||
|
@@ -619,6 +619,7 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
virSocketAddr remoteAddr;
|
||||||
|
char *rundir = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
+ bool daemonLaunched = false;
|
||||||
|
|
||||||
|
VIR_DEBUG("path=%s spawnDaemon=%d binary=%s", path, spawnDaemon,
|
||||||
|
NULLSTR(binary));
|
||||||
|
@@ -699,8 +700,12 @@ int virNetSocketNewConnectUNIX(const char *path,
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (virNetSocketForkDaemon(binary) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
+ if (!daemonLaunched) {
|
||||||
|
+ if (virNetSocketForkDaemon(binary) < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
+ daemonLaunched = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
usleep(5000);
|
||||||
|
}
|
57
0007-security-Do-not-restore-kernel-and-initrd-labels.patch
Normal file
57
0007-security-Do-not-restore-kernel-and-initrd-labels.patch
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
From: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
Date: Fri, 15 Jan 2016 10:55:58 +0100
|
||||||
|
Subject: [PATCH] security: Do not restore kernel and initrd labels
|
||||||
|
|
||||||
|
Kernel/initrd files are essentially read-only shareable images and thus
|
||||||
|
should be handled in the same way. We already use the appropriate label
|
||||||
|
for kernel/initrd files when starting a domain, but when a domain gets
|
||||||
|
destroyed we would remove the labels which would make other running
|
||||||
|
domains using the same files very unhappy.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=921135
|
||||||
|
|
||||||
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
||||||
|
(cherry picked from commit 68acc701bd449481e3206723c25b18fcd3d261b7)
|
||||||
|
---
|
||||||
|
src/security/security_dac.c | 8 --------
|
||||||
|
src/security/security_selinux.c | 8 --------
|
||||||
|
2 files changed, 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
|
||||||
|
index deb6980..d01215f 100644
|
||||||
|
--- a/src/security/security_dac.c
|
||||||
|
+++ b/src/security/security_dac.c
|
||||||
|
@@ -971,14 +971,6 @@ virSecurityDACRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||||
|
virSecurityDACRestoreSecurityFileLabel(def->os.loader->nvram) < 0)
|
||||||
|
rc = -1;
|
||||||
|
|
||||||
|
- if (def->os.kernel &&
|
||||||
|
- virSecurityDACRestoreSecurityFileLabel(def->os.kernel) < 0)
|
||||||
|
- rc = -1;
|
||||||
|
-
|
||||||
|
- if (def->os.initrd &&
|
||||||
|
- virSecurityDACRestoreSecurityFileLabel(def->os.initrd) < 0)
|
||||||
|
- rc = -1;
|
||||||
|
-
|
||||||
|
if (def->os.dtb &&
|
||||||
|
virSecurityDACRestoreSecurityFileLabel(def->os.dtb) < 0)
|
||||||
|
rc = -1;
|
||||||
|
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
|
||||||
|
index c2464c2..38f2a29 100644
|
||||||
|
--- a/src/security/security_selinux.c
|
||||||
|
+++ b/src/security/security_selinux.c
|
||||||
|
@@ -1978,14 +1978,6 @@ virSecuritySELinuxRestoreSecurityAllLabel(virSecurityManagerPtr mgr,
|
||||||
|
virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.loader->nvram) < 0)
|
||||||
|
rc = -1;
|
||||||
|
|
||||||
|
- if (def->os.kernel &&
|
||||||
|
- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.kernel) < 0)
|
||||||
|
- rc = -1;
|
||||||
|
-
|
||||||
|
- if (def->os.initrd &&
|
||||||
|
- virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.initrd) < 0)
|
||||||
|
- rc = -1;
|
||||||
|
-
|
||||||
|
if (def->os.dtb &&
|
||||||
|
virSecuritySELinuxRestoreSecurityFileLabel(mgr, def->os.dtb) < 0)
|
||||||
|
rc = -1;
|
26
libvirt.spec
26
libvirt.spec
@ -378,7 +378,7 @@
|
|||||||
Summary: Library providing a simple virtualization API
|
Summary: Library providing a simple virtualization API
|
||||||
Name: libvirt
|
Name: libvirt
|
||||||
Version: 1.2.18.2
|
Version: 1.2.18.2
|
||||||
Release: 1%{?dist}%{?extra_release}
|
Release: 2%{?dist}%{?extra_release}
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
|
||||||
@ -389,6 +389,21 @@ URL: http://libvirt.org/
|
|||||||
%endif
|
%endif
|
||||||
Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz
|
Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz
|
||||||
|
|
||||||
|
# Fix XML validation with qemu commandline passthrough (bz #1292131)
|
||||||
|
Patch0001: 0001-schema-interleave-domain-name-and-uuid-with-other-el.patch
|
||||||
|
# Fix crash in libvirt_leasehelper (bz #1202350)
|
||||||
|
Patch0002: 0002-leaseshelper-fix-crash-when-no-mac-is-specified.patch
|
||||||
|
# Generate consistent systemtap tapsets regardless of host arch (bz
|
||||||
|
# #1173641)
|
||||||
|
Patch0003: 0003-build-predictably-generate-systemtap-tapsets-bz-1173.patch
|
||||||
|
# Fix qemu:///session error 'Transport endpoint is not connected' (bz
|
||||||
|
# #1271183)
|
||||||
|
Patch0004: 0004-rpc-socket-Minor-cleanups.patch
|
||||||
|
Patch0005: 0005-rpc-socket-Explicitly-error-if-we-exceed-retry-count.patch
|
||||||
|
Patch0006: 0006-rpc-socket-Don-t-repeatedly-attempt-to-launch-daemon.patch
|
||||||
|
# Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
|
||||||
|
Patch0007: 0007-security-Do-not-restore-kernel-and-initrd-labels.patch
|
||||||
|
|
||||||
%if %{with_libvirtd}
|
%if %{with_libvirtd}
|
||||||
Requires: libvirt-daemon = %{version}-%{release}
|
Requires: libvirt-daemon = %{version}-%{release}
|
||||||
%if %{with_network}
|
%if %{with_network}
|
||||||
@ -2331,6 +2346,15 @@ exit 0
|
|||||||
%doc examples/systemtap
|
%doc examples/systemtap
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Jan 20 2016 Cole Robinson <crobinso@redhat.com> - 1.2.18.2-2
|
||||||
|
- Fix XML validation with qemu commandline passthrough (bz #1292131)
|
||||||
|
- Fix crash in libvirt_leasehelper (bz #1202350)
|
||||||
|
- Generate consistent systemtap tapsets regardless of host arch (bz
|
||||||
|
#1173641)
|
||||||
|
- Fix qemu:///session error 'Transport endpoint is not connected' (bz
|
||||||
|
#1271183)
|
||||||
|
- Fix parallel VM start/top svirt errors on kernel/initrd (bz #1269975)
|
||||||
|
|
||||||
* Wed Dec 23 2015 Cole Robinson <crobinso@redhat.com> - 1.2.18.2-1
|
* Wed Dec 23 2015 Cole Robinson <crobinso@redhat.com> - 1.2.18.2-1
|
||||||
- Rebased to version 1.2.18.2
|
- Rebased to version 1.2.18.2
|
||||||
- disk backend is not removed properly when disk frontent hotplug fails (bz
|
- disk backend is not removed properly when disk frontent hotplug fails (bz
|
||||||
|
Loading…
Reference in New Issue
Block a user