@@ -471,8 +471,9 @@ BlockBackend *blk_new_open(const char *filename, const char *reference,
static void blk_delete(BlockBackend *blk)
{
assert(!blk->refcnt);
- assert(!blk->name);
assert(!blk->dev);
+ g_free(blk->name);
+ blk->name = NULL;
if (blk->public.throttle_group_member.throttle_state) {
blk_io_limits_disable(blk);
}
@@ -2594,3 +2595,10 @@ int blk_make_empty(BlockBackend *blk, Error **errp)
return bdrv_make_empty(blk->root, errp);
}
+
+void blk_set_name(BlockBackend *blk, char *name)
+{
+ if (!blk->name) {
+ blk->name = g_strdup(name);
+ }
+}
@@ -144,6 +144,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
ctx = iothread ? bdrv_get_aio_context(bs) : qemu_get_aio_context();
blk = blk_new(ctx, 0, BLK_PERM_ALL);
blk_created = true;
+ blk_set_name(blk, str);
ret = blk_insert_bs(blk, bs, errp);
if (ret < 0) {
@@ -113,4 +113,6 @@ const BdrvChild *blk_root(BlockBackend *blk);
int blk_make_empty(BlockBackend *blk, Error **errp);
+void blk_set_name(BlockBackend *blk, char *name);
+
#endif /* BLOCK_BACKEND_GLOBAL_STATE_H */
When QEMU emulates the SCSI device, it sets the 'device_id' of the SCSI device with the serial number configured by 'serial=' property, or with 'blk->name' of the block backend otherwise. Then QEMU emulates SCSI commands and fills the mandatory Device identification page(0x83) with the 'device_id' info. However, 'blk->name' of the block backend is NULL if the block backend is defined by '-blockdev' option. This causes the QEMU returns unconfigured empty page to the guest. As a result, this may cause various issues on the guest side. For example, Windows guest crashes due this in BZ#1708490, BZ#1722710#c10. This crash issue has been fixed in Windows vioscsi driver by patching the vpd page[1], but it is better for QEMU to return the non NULL vpd page if possible. This patch sets the 'blk->name' of the block backend that is defined by '-blockdev' option, so the QEMU returns non NULL vpd page when emulating SCSI device. [1] https://github.com/virtio-win/kvm-guest-drivers-windows/commit/b57548c769ed9f431c34f6449ce432dd077cb02e Signed-off-by: Annie Li <annie.li@oracle.com> --- block/block-backend.c | 10 +++++++++- hw/core/qdev-properties-system.c | 1 + include/sysemu/block-backend-global-state.h | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-)