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...@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(-) diff --git a/block/block-backend.c b/block/block-backend.c index aa4adf06ae..255b009270 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -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); + } +} diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c index a91f60567a..9504acf4df 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -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) { diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/block-backend-global-state.h index 415f0c91d7..95f166f9c7 100644 --- a/include/sysemu/block-backend-global-state.h +++ b/include/sysemu/block-backend-global-state.h @@ -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 */ -- 2.34.3