* Fri Feb 08 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 3.1.0-13.el8
- kvm-io-ensure-UNIX-client-doesn-t-unlink-server-socket.patch [bz#1665896] - kvm-scsi-disk-Don-t-use-empty-string-as-device-id.patch [bz#1668248] - kvm-scsi-disk-Add-device_id-property.patch [bz#1668248] - Resolves: bz#1665896 (VNC unix listener socket is deleted after first client quits) - Resolves: bz#1668248 ("An unknown error has occurred" when using cdrom to install the system with two blockdev disks.(when choose installation destination))
This commit is contained in:
parent
df2f32921c
commit
1cbaf605ab
294
kvm-io-ensure-UNIX-client-doesn-t-unlink-server-socket.patch
Normal file
294
kvm-io-ensure-UNIX-client-doesn-t-unlink-server-socket.patch
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
From dea7d39cce3b1da16de0bfb47a028f770547098a Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Daniel P. Berrange" <berrange@redhat.com>
|
||||||
|
Date: Tue, 29 Jan 2019 13:58:57 +0000
|
||||||
|
Subject: [PATCH 1/3] io: ensure UNIX client doesn't unlink server socket
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
Message-id: <20190129135857.10581-2-berrange@redhat.com>
|
||||||
|
Patchwork-id: 84141
|
||||||
|
O-Subject: [RHEL-8.0/AV qemu-kvm PATCH 1/1] io: ensure UNIX client doesn't unlink server socket
|
||||||
|
Bugzilla: 1665896
|
||||||
|
RH-Acked-by: John Snow <jsnow@redhat.com>
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||||
|
|
||||||
|
The qio_channel_socket_close method for was mistakenly unlinking the
|
||||||
|
UNIX server socket, even if the channel was a client connection. This
|
||||||
|
was not noticed with chardevs, since they never call close, but with the
|
||||||
|
VNC server, this caused the VNC server socket to be deleted after the
|
||||||
|
first client quit.
|
||||||
|
|
||||||
|
The qio_channel_socket_close method also needlessly reimplemented the
|
||||||
|
logic that already exists in socket_listen_cleanup(). Just call that
|
||||||
|
method directly, for listen sockets only.
|
||||||
|
|
||||||
|
This fixes a regression introduced in QEMU 3.0.0 with
|
||||||
|
|
||||||
|
commit d66f78e1eaa832f73c771d9df1b606fe75d52a50
|
||||||
|
Author: Pavel Balaev <mail@void.so>
|
||||||
|
Date: Mon May 21 19:17:35 2018 +0300
|
||||||
|
|
||||||
|
Delete AF_UNIX socket after close
|
||||||
|
|
||||||
|
Fixes launchpad #1795100
|
||||||
|
|
||||||
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||||
|
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
(cherry picked from commit 73564c407caedf992a1c688b5fea776a8b56ba2a)
|
||||||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||||
|
---
|
||||||
|
io/channel-socket.c | 19 ++--------
|
||||||
|
tests/test-io-channel-socket.c | 86 +++++++++++++++++++++++++++++++++++++-----
|
||||||
|
2 files changed, 80 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
||||||
|
index b50e63a..bc5f80e 100644
|
||||||
|
--- a/io/channel-socket.c
|
||||||
|
+++ b/io/channel-socket.c
|
||||||
|
@@ -688,10 +688,13 @@ qio_channel_socket_close(QIOChannel *ioc,
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (sioc->fd != -1) {
|
||||||
|
- SocketAddress *addr = socket_local_address(sioc->fd, errp);
|
||||||
|
#ifdef WIN32
|
||||||
|
WSAEventSelect(sioc->fd, NULL, 0);
|
||||||
|
#endif
|
||||||
|
+ if (qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_LISTEN)) {
|
||||||
|
+ socket_listen_cleanup(sioc->fd, errp);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (closesocket(sioc->fd) < 0) {
|
||||||
|
sioc->fd = -1;
|
||||||
|
error_setg_errno(errp, errno,
|
||||||
|
@@ -699,20 +702,6 @@ qio_channel_socket_close(QIOChannel *ioc,
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sioc->fd = -1;
|
||||||
|
-
|
||||||
|
- if (addr && addr->type == SOCKET_ADDRESS_TYPE_UNIX
|
||||||
|
- && addr->u.q_unix.path) {
|
||||||
|
- if (unlink(addr->u.q_unix.path) < 0 && errno != ENOENT) {
|
||||||
|
- error_setg_errno(errp, errno,
|
||||||
|
- "Failed to unlink socket %s",
|
||||||
|
- addr->u.q_unix.path);
|
||||||
|
- rc = -1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (addr) {
|
||||||
|
- qapi_free_SocketAddress(addr);
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
diff --git a/tests/test-io-channel-socket.c b/tests/test-io-channel-socket.c
|
||||||
|
index 0597213..c253ae3 100644
|
||||||
|
--- a/tests/test-io-channel-socket.c
|
||||||
|
+++ b/tests/test-io-channel-socket.c
|
||||||
|
@@ -49,6 +49,7 @@ static void test_io_channel_set_socket_bufs(QIOChannel *src,
|
||||||
|
|
||||||
|
static void test_io_channel_setup_sync(SocketAddress *listen_addr,
|
||||||
|
SocketAddress *connect_addr,
|
||||||
|
+ QIOChannel **srv,
|
||||||
|
QIOChannel **src,
|
||||||
|
QIOChannel **dst)
|
||||||
|
{
|
||||||
|
@@ -78,7 +79,7 @@ static void test_io_channel_setup_sync(SocketAddress *listen_addr,
|
||||||
|
|
||||||
|
test_io_channel_set_socket_bufs(*src, *dst);
|
||||||
|
|
||||||
|
- object_unref(OBJECT(lioc));
|
||||||
|
+ *srv = QIO_CHANNEL(lioc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -99,6 +100,7 @@ static void test_io_channel_complete(QIOTask *task,
|
||||||
|
|
||||||
|
static void test_io_channel_setup_async(SocketAddress *listen_addr,
|
||||||
|
SocketAddress *connect_addr,
|
||||||
|
+ QIOChannel **srv,
|
||||||
|
QIOChannel **src,
|
||||||
|
QIOChannel **dst)
|
||||||
|
{
|
||||||
|
@@ -146,21 +148,34 @@ static void test_io_channel_setup_async(SocketAddress *listen_addr,
|
||||||
|
qio_channel_set_delay(*src, false);
|
||||||
|
test_io_channel_set_socket_bufs(*src, *dst);
|
||||||
|
|
||||||
|
- object_unref(OBJECT(lioc));
|
||||||
|
+ *srv = QIO_CHANNEL(lioc);
|
||||||
|
|
||||||
|
g_main_loop_unref(data.loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static void test_io_channel_socket_path_exists(SocketAddress *addr,
|
||||||
|
+ bool expectExists)
|
||||||
|
+{
|
||||||
|
+ if (addr->type != SOCKET_ADDRESS_TYPE_UNIX) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ g_assert(g_file_test(addr->u.q_unix.path,
|
||||||
|
+ G_FILE_TEST_EXISTS) == expectExists);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static void test_io_channel(bool async,
|
||||||
|
SocketAddress *listen_addr,
|
||||||
|
SocketAddress *connect_addr,
|
||||||
|
bool passFD)
|
||||||
|
{
|
||||||
|
- QIOChannel *src, *dst;
|
||||||
|
+ QIOChannel *src, *dst, *srv;
|
||||||
|
QIOChannelTest *test;
|
||||||
|
if (async) {
|
||||||
|
- test_io_channel_setup_async(listen_addr, connect_addr, &src, &dst);
|
||||||
|
+ test_io_channel_setup_async(listen_addr, connect_addr,
|
||||||
|
+ &srv, &src, &dst);
|
||||||
|
|
||||||
|
g_assert(!passFD ||
|
||||||
|
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
|
||||||
|
@@ -169,14 +184,25 @@ static void test_io_channel(bool async,
|
||||||
|
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
|
||||||
|
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
|
||||||
|
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
test = qio_channel_test_new();
|
||||||
|
qio_channel_test_run_threads(test, true, src, dst);
|
||||||
|
qio_channel_test_validate(test);
|
||||||
|
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ /* unref without close, to ensure finalize() cleans up */
|
||||||
|
+
|
||||||
|
object_unref(OBJECT(src));
|
||||||
|
object_unref(OBJECT(dst));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
|
||||||
|
- test_io_channel_setup_async(listen_addr, connect_addr, &src, &dst);
|
||||||
|
+ object_unref(OBJECT(srv));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
+
|
||||||
|
+ test_io_channel_setup_async(listen_addr, connect_addr,
|
||||||
|
+ &srv, &src, &dst);
|
||||||
|
|
||||||
|
g_assert(!passFD ||
|
||||||
|
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
|
||||||
|
@@ -189,10 +215,24 @@ static void test_io_channel(bool async,
|
||||||
|
qio_channel_test_run_threads(test, false, src, dst);
|
||||||
|
qio_channel_test_validate(test);
|
||||||
|
|
||||||
|
+ /* close before unref, to ensure finalize copes with already closed */
|
||||||
|
+
|
||||||
|
+ qio_channel_close(src, &error_abort);
|
||||||
|
+ qio_channel_close(dst, &error_abort);
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
object_unref(OBJECT(src));
|
||||||
|
object_unref(OBJECT(dst));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ qio_channel_close(srv, &error_abort);
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
+
|
||||||
|
+ object_unref(OBJECT(srv));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
} else {
|
||||||
|
- test_io_channel_setup_sync(listen_addr, connect_addr, &src, &dst);
|
||||||
|
+ test_io_channel_setup_sync(listen_addr, connect_addr,
|
||||||
|
+ &srv, &src, &dst);
|
||||||
|
|
||||||
|
g_assert(!passFD ||
|
||||||
|
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
|
||||||
|
@@ -201,14 +241,25 @@ static void test_io_channel(bool async,
|
||||||
|
g_assert(qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_SHUTDOWN));
|
||||||
|
g_assert(qio_channel_has_feature(dst, QIO_CHANNEL_FEATURE_SHUTDOWN));
|
||||||
|
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
test = qio_channel_test_new();
|
||||||
|
qio_channel_test_run_threads(test, true, src, dst);
|
||||||
|
qio_channel_test_validate(test);
|
||||||
|
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ /* unref without close, to ensure finalize() cleans up */
|
||||||
|
+
|
||||||
|
object_unref(OBJECT(src));
|
||||||
|
object_unref(OBJECT(dst));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ object_unref(OBJECT(srv));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
|
||||||
|
- test_io_channel_setup_sync(listen_addr, connect_addr, &src, &dst);
|
||||||
|
+ test_io_channel_setup_sync(listen_addr, connect_addr,
|
||||||
|
+ &srv, &src, &dst);
|
||||||
|
|
||||||
|
g_assert(!passFD ||
|
||||||
|
qio_channel_has_feature(src, QIO_CHANNEL_FEATURE_FD_PASS));
|
||||||
|
@@ -221,8 +272,23 @@ static void test_io_channel(bool async,
|
||||||
|
qio_channel_test_run_threads(test, false, src, dst);
|
||||||
|
qio_channel_test_validate(test);
|
||||||
|
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ /* close before unref, to ensure finalize copes with already closed */
|
||||||
|
+
|
||||||
|
+ qio_channel_close(src, &error_abort);
|
||||||
|
+ qio_channel_close(dst, &error_abort);
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
object_unref(OBJECT(src));
|
||||||
|
object_unref(OBJECT(dst));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, true);
|
||||||
|
+
|
||||||
|
+ qio_channel_close(srv, &error_abort);
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
+
|
||||||
|
+ object_unref(OBJECT(srv));
|
||||||
|
+ test_io_channel_socket_path_exists(listen_addr, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -316,7 +382,6 @@ static void test_io_channel_unix(bool async)
|
||||||
|
|
||||||
|
qapi_free_SocketAddress(listen_addr);
|
||||||
|
qapi_free_SocketAddress(connect_addr);
|
||||||
|
- g_assert(g_file_test(TEST_SOCKET, G_FILE_TEST_EXISTS) == FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -335,7 +400,7 @@ static void test_io_channel_unix_fd_pass(void)
|
||||||
|
{
|
||||||
|
SocketAddress *listen_addr = g_new0(SocketAddress, 1);
|
||||||
|
SocketAddress *connect_addr = g_new0(SocketAddress, 1);
|
||||||
|
- QIOChannel *src, *dst;
|
||||||
|
+ QIOChannel *src, *dst, *srv;
|
||||||
|
int testfd;
|
||||||
|
int fdsend[3];
|
||||||
|
int *fdrecv = NULL;
|
||||||
|
@@ -359,7 +424,7 @@ static void test_io_channel_unix_fd_pass(void)
|
||||||
|
connect_addr->type = SOCKET_ADDRESS_TYPE_UNIX;
|
||||||
|
connect_addr->u.q_unix.path = g_strdup(TEST_SOCKET);
|
||||||
|
|
||||||
|
- test_io_channel_setup_sync(listen_addr, connect_addr, &src, &dst);
|
||||||
|
+ test_io_channel_setup_sync(listen_addr, connect_addr, &srv, &src, &dst);
|
||||||
|
|
||||||
|
memcpy(bufsend, "Hello World", G_N_ELEMENTS(bufsend));
|
||||||
|
|
||||||
|
@@ -412,6 +477,7 @@ static void test_io_channel_unix_fd_pass(void)
|
||||||
|
|
||||||
|
object_unref(OBJECT(src));
|
||||||
|
object_unref(OBJECT(dst));
|
||||||
|
+ object_unref(OBJECT(srv));
|
||||||
|
qapi_free_SocketAddress(listen_addr);
|
||||||
|
qapi_free_SocketAddress(connect_addr);
|
||||||
|
unlink(TEST_SOCKET);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
98
kvm-scsi-disk-Add-device_id-property.patch
Normal file
98
kvm-scsi-disk-Add-device_id-property.patch
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
From c9f6e5639cc9d7b1d336b55ccacb6673933a3864 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Date: Wed, 6 Feb 2019 15:58:29 +0000
|
||||||
|
Subject: [PATCH 3/3] scsi-disk: Add device_id property
|
||||||
|
|
||||||
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Message-id: <20190206155829.14641-3-kwolf@redhat.com>
|
||||||
|
Patchwork-id: 84254
|
||||||
|
O-Subject: [RHEL-7.7/8.0-AV qemu-kvm-rhev PATCH 2/2] scsi-disk: Add device_id property
|
||||||
|
Bugzilla: 1668248
|
||||||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
|
||||||
|
The new device_id property specifies which value to use for the vendor
|
||||||
|
specific designator in the Device Identification VPD page.
|
||||||
|
|
||||||
|
In particular, this is necessary for libvirt to maintain guest ABI
|
||||||
|
compatibility when no serial number is given and a VM is switched from
|
||||||
|
-drive (where the BlockBackend name is used) to -blockdev (where the
|
||||||
|
vendor specific designator is left out by default).
|
||||||
|
|
||||||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||||
|
(cherry picked from commit 7471a649fc3a391dd497297013fb2525ca9821ba)
|
||||||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||||
|
---
|
||||||
|
hw/scsi/scsi-disk.c | 24 ++++++++++++++++--------
|
||||||
|
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
|
||||||
|
index 93eef40..e74e1e7 100644
|
||||||
|
--- a/hw/scsi/scsi-disk.c
|
||||||
|
+++ b/hw/scsi/scsi-disk.c
|
||||||
|
@@ -104,6 +104,7 @@ typedef struct SCSIDiskState
|
||||||
|
char *serial;
|
||||||
|
char *vendor;
|
||||||
|
char *product;
|
||||||
|
+ char *device_id;
|
||||||
|
bool tray_open;
|
||||||
|
bool tray_locked;
|
||||||
|
/*
|
||||||
|
@@ -642,13 +643,8 @@ static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
|
||||||
|
|
||||||
|
case 0x83: /* Device identification page, mandatory */
|
||||||
|
{
|
||||||
|
- const char *str = s->serial ?: blk_name(s->qdev.conf.blk);
|
||||||
|
- int max_len = s->serial ? 20 : 255 - 8;
|
||||||
|
- int id_len = strlen(str);
|
||||||
|
+ int id_len = s->device_id ? MIN(strlen(s->device_id), 255 - 8) : 0;
|
||||||
|
|
||||||
|
- if (id_len > max_len) {
|
||||||
|
- id_len = max_len;
|
||||||
|
- }
|
||||||
|
DPRINTF("Inquiry EVPD[Device identification] "
|
||||||
|
"buffer size %zd\n", req->cmd.xfer);
|
||||||
|
|
||||||
|
@@ -657,7 +653,7 @@ static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
|
||||||
|
outbuf[buflen++] = 0; /* not officially assigned */
|
||||||
|
outbuf[buflen++] = 0; /* reserved */
|
||||||
|
outbuf[buflen++] = id_len; /* length of data following */
|
||||||
|
- memcpy(outbuf + buflen, str, id_len);
|
||||||
|
+ memcpy(outbuf + buflen, s->device_id, id_len);
|
||||||
|
buflen += id_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2363,6 +2359,16 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
||||||
|
if (!s->vendor) {
|
||||||
|
s->vendor = g_strdup("QEMU");
|
||||||
|
}
|
||||||
|
+ if (!s->device_id) {
|
||||||
|
+ if (s->serial) {
|
||||||
|
+ s->device_id = g_strdup_printf("%.20s", s->serial);
|
||||||
|
+ } else {
|
||||||
|
+ const char *str = blk_name(s->qdev.conf.blk);
|
||||||
|
+ if (str && *str) {
|
||||||
|
+ s->device_id = g_strdup(str);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (blk_is_sg(s->qdev.conf.blk)) {
|
||||||
|
error_setg(errp, "unwanted /dev/sg*");
|
||||||
|
@@ -2904,7 +2910,9 @@ static const TypeInfo scsi_disk_base_info = {
|
||||||
|
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
|
||||||
|
DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
|
||||||
|
DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
|
||||||
|
- DEFINE_PROP_STRING("product", SCSIDiskState, product)
|
||||||
|
+ DEFINE_PROP_STRING("product", SCSIDiskState, product), \
|
||||||
|
+ DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
|
||||||
|
+
|
||||||
|
|
||||||
|
static Property scsi_hd_properties[] = {
|
||||||
|
DEFINE_SCSI_DISK_PROPERTIES(),
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
71
kvm-scsi-disk-Don-t-use-empty-string-as-device-id.patch
Normal file
71
kvm-scsi-disk-Don-t-use-empty-string-as-device-id.patch
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
From 18d600a76319abe59dc4b5e371e5807c089f9159 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Date: Wed, 6 Feb 2019 15:58:28 +0000
|
||||||
|
Subject: [PATCH 2/3] scsi-disk: Don't use empty string as device id
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Message-id: <20190206155829.14641-2-kwolf@redhat.com>
|
||||||
|
Patchwork-id: 84253
|
||||||
|
O-Subject: [RHEL-7.7/8.0-AV qemu-kvm-rhev PATCH 1/2] scsi-disk: Don't use empty string as device id
|
||||||
|
Bugzilla: 1668248
|
||||||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||||
|
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
|
|
||||||
|
scsi-disk includes in the Device Identification VPD page, depending on
|
||||||
|
configuration amongst others, a vendor specific designator that consists
|
||||||
|
either of the serial number if given or the BlockBackend name (which is
|
||||||
|
a host detail that better shouldn't have been leaked to the guest, but
|
||||||
|
now we have to maintain it for compatibility).
|
||||||
|
|
||||||
|
With anonymous BlockBackends, i.e. scsi-disk devices constructed with
|
||||||
|
drive=<node-name>, and no serial number explicitly specified, this ends
|
||||||
|
up as an empty string. If this happens to more than one disk, we have
|
||||||
|
accidentally signalled to the OS that this is a multipath setup, which
|
||||||
|
is obviously not what was intended.
|
||||||
|
|
||||||
|
Instead of using an empty string for the vendor specific designator,
|
||||||
|
simply leave out that designator, which makes Linux detect such setups
|
||||||
|
as separate disks again.
|
||||||
|
|
||||||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||||
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||||
|
(cherry picked from commit a8f58afcdb86e266e06c9dc41a71605e570244c3)
|
||||||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||||
|
---
|
||||||
|
hw/scsi/scsi-disk.c | 14 ++++++++------
|
||||||
|
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
|
||||||
|
index 0e9027c..93eef40 100644
|
||||||
|
--- a/hw/scsi/scsi-disk.c
|
||||||
|
+++ b/hw/scsi/scsi-disk.c
|
||||||
|
@@ -652,12 +652,14 @@ static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
|
||||||
|
DPRINTF("Inquiry EVPD[Device identification] "
|
||||||
|
"buffer size %zd\n", req->cmd.xfer);
|
||||||
|
|
||||||
|
- outbuf[buflen++] = 0x2; /* ASCII */
|
||||||
|
- outbuf[buflen++] = 0; /* not officially assigned */
|
||||||
|
- outbuf[buflen++] = 0; /* reserved */
|
||||||
|
- outbuf[buflen++] = id_len; /* length of data following */
|
||||||
|
- memcpy(outbuf + buflen, str, id_len);
|
||||||
|
- buflen += id_len;
|
||||||
|
+ if (id_len) {
|
||||||
|
+ outbuf[buflen++] = 0x2; /* ASCII */
|
||||||
|
+ outbuf[buflen++] = 0; /* not officially assigned */
|
||||||
|
+ outbuf[buflen++] = 0; /* reserved */
|
||||||
|
+ outbuf[buflen++] = id_len; /* length of data following */
|
||||||
|
+ memcpy(outbuf + buflen, str, id_len);
|
||||||
|
+ buflen += id_len;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (s->qdev.wwn) {
|
||||||
|
outbuf[buflen++] = 0x1; /* Binary */
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
@ -174,6 +174,12 @@ Patch44: kvm-throttle-groups-fix-restart-coroutine-iothread-race.patch
|
|||||||
Patch45: kvm-iotests-add-238-for-throttling-tgm-unregister-iothre.patch
|
Patch45: kvm-iotests-add-238-for-throttling-tgm-unregister-iothre.patch
|
||||||
# For bz#1668244 - qemu-img: /var/tmp/v2vovl9951f8.qcow2: CURL: Error opening file: The requested URL returned error: 404 Not Found
|
# For bz#1668244 - qemu-img: /var/tmp/v2vovl9951f8.qcow2: CURL: Error opening file: The requested URL returned error: 404 Not Found
|
||||||
Patch47: kvm-json-Fix-handling-when-not-interpolating.patch
|
Patch47: kvm-json-Fix-handling-when-not-interpolating.patch
|
||||||
|
# For bz#1665896 - VNC unix listener socket is deleted after first client quits
|
||||||
|
Patch48: kvm-io-ensure-UNIX-client-doesn-t-unlink-server-socket.patch
|
||||||
|
# For bz#1668248 - "An unknown error has occurred" when using cdrom to install the system with two blockdev disks.(when choose installation destination)
|
||||||
|
Patch49: kvm-scsi-disk-Don-t-use-empty-string-as-device-id.patch
|
||||||
|
# For bz#1668248 - "An unknown error has occurred" when using cdrom to install the system with two blockdev disks.(when choose installation destination)
|
||||||
|
Patch50: kvm-scsi-disk-Add-device_id-property.patch
|
||||||
|
|
||||||
BuildRequires: zlib-devel
|
BuildRequires: zlib-devel
|
||||||
BuildRequires: glib2-devel
|
BuildRequires: glib2-devel
|
||||||
@ -1021,8 +1027,15 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Thu Jan 31 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 3.1.0-12.el8
|
* Fri Feb 08 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 3.1.0-12.el8
|
||||||
- Removing kvm-Fix-fsfreeze-hook-path-in-the-man-page.patch [bz#1644985]
|
- Removing kvm-Fix-fsfreeze-hook-path-in-the-man-page.patch [bz#1644985]
|
||||||
|
- kvm-io-ensure-UNIX-client-doesn-t-unlink-server-socket.patch [bz#1665896]
|
||||||
|
- kvm-scsi-disk-Don-t-use-empty-string-as-device-id.patch [bz#1668248]
|
||||||
|
- kvm-scsi-disk-Add-device_id-property.patch [bz#1668248]
|
||||||
|
- Resolves: bz#1665896
|
||||||
|
(VNC unix listener socket is deleted after first client quits)
|
||||||
|
- Resolves: bz#1668248
|
||||||
|
("An unknown error has occurred" when using cdrom to install the system with two blockdev disks.(when choose installation destination))
|
||||||
|
|
||||||
* Thu Jan 31 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 3.1.0-11.el8
|
* Thu Jan 31 2019 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 3.1.0-11.el8
|
||||||
- kvm-Fix-fsfreeze-hook-path-in-the-man-page.patch [bz#1644985]
|
- kvm-Fix-fsfreeze-hook-path-in-the-man-page.patch [bz#1644985]
|
||||||
|
Loading…
Reference in New Issue
Block a user