From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR02CU008.outbound.protection.outlook.com (mail-westeuropeazon11023088.outbound.protection.outlook.com [52.101.72.88]) by lore.virtuozzo.com (Postfix) with ESMTPS id A36AE8013F for ; Thu, 3 Sep 2026 15:28:03 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Kdc72F1Z7YXfXzQW10uzsEzXILnke9AA8iPzxlWi1hLfLUKgBdptc3Z+f/Y0oOTAB7Rt7ndFBfpGUCoLS8VZ712rMzsb9HPapv6rYJ3O5Y6d/vJLiwH9P99qIvcYQql+11ayWOGx9+sK3ZuZ8quoToyjSavu5q4rtiecsHgF6oC7zETP1xIC1ncwyxuuDIAiqZcAXQWIg/YSACUfoJJi9/OKOpoc/7Df/yrHs2sCdBaSO9zDx5ee7AYTU0APz6QndQ5bhq3Fj01b0YJQmgKtLDXA18cMnx60Kt8mbS1lfv5GTeS8VygcJCgvMnPrmaJUdgz3zghCjTwhrwKK7vrGLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7cCmLbrLbs8EBWzJxY4yxeiGi5AhmSRgAnnbVZ6jAWo=; b=AOHNuBRJkhKe2grS1KE37/PVOimsQvZaMDxbmXdmwgn0Muper6gSy9OwDIWSL5zuXcmbJQHPeHUiN6PEzQr/PoMdqQtDQQf5T4//uXjwTFPKjnhYJc409pOHeoUctJED9BhY0PhaNNVMgctGrnBMVvpIyoQFzIHxG0SssDNWgfDzPyNoWsiXKY2xYbMN4eErSWeyz0wsco9fRcXDIeiIjWl1mU/C6bgFgVVJ1XgIx9yjhhZXa9q7OQKZGYBj2lslVKcU35VD2C6+X3wMoTT2ibRsoeJHi4/ZaQDb8VkfEnMV7PGqthLxHXf/5uwruoubzZc5kqmSvYfZwwJGXYesLg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7cCmLbrLbs8EBWzJxY4yxeiGi5AhmSRgAnnbVZ6jAWo=; b=WQbWsp7X9qB7tH+1kLoS6K0TGVZX9exzaNH8FAkUWb9OlOJu3b+QGOfm9+47Svw64khXQNPG/6jUH+ckJOKrMGVnDuBc2MByd+1f15b1V5sLK9e00u6tOdxsh7FmE9TMrXr9hb76qx2/psll9ZKXhj/lFL9Wi4ithv9ZpQ5jFtb2ZI+fYsemWa0MyJvAM71pRBwSc3CDNZ3SNlbY71pp9+bPe0+t+0Noez9Cv8EdRjsiDu6JI3hmOFr1qSp7epWwRjDY80/LBIyiXBiDUzMgKePc8Bmo3oxg1GfKK2mMl622vR3mXFTMohnELAMlER66RgpQVSca8SEdnV6KY9Ic8Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from PA4PR08MB6061.eurprd08.prod.outlook.com (2603:10a6:102:e9::13) by VI0PR08MB11480.eurprd08.prod.outlook.com (2603:10a6:800:2fb::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Thu, 3 Sep 2026 15:28:00 +0000 Received: from PA4PR08MB6061.eurprd08.prod.outlook.com ([fe80::c3bf:e107:b1d2:6a00]) by PA4PR08MB6061.eurprd08.prod.outlook.com ([fe80::c3bf:e107:b1d2:6a00%3]) with mapi id 15.21.0382.007; Thu, 3 Sep 2026 15:27:59 +0000 Message-ID: <26935de1-a678-47d7-b7f7-81543b041c68@virtuozzo.com> Date: Thu, 3 Sep 2026 17:27:58 +0200 User-Agent: Mozilla Thunderbird Subject: Re: [QEMU HCI-8.0 PATCH 2/5] vhost-blk: change backend setup To: Andrey Drobyshev Cc: svt-core@virtuozzo.com, den@openvz.org References: <20260903123204.24035-1-andrey.zhadchenko@virtuozzo.com> <20260903123204.24035-3-andrey.zhadchenko@virtuozzo.com> <178844736480.581266.3084182582245534198.b4-review@b4> Content-Language: en-US From: Andrey Zhadchenko In-Reply-To: <178844736480.581266.3084182582245534198.b4-review@b4> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR0P281CA0171.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b4::12) To PA4PR08MB6061.eurprd08.prod.outlook.com (2603:10a6:102:e9::13) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PA4PR08MB6061:EE_|VI0PR08MB11480:EE_ X-MS-Office365-Filtering-Correlation-Id: accc81e2-7d0d-41f8-785b-08df09cfef8e X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024|23010399003|10067099003|56012099006|4143699003|5113699003|6133799003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: FRk9KNtus7gfWFKrR/4duAXaJBKxAV6WmQO3Ud76+gO6krqHwzMNdaA/T5hInr+pgjfWaOB9HS56YyYVwjzlwfbarvociDij+HIjz+OOkGOySGV4NsGAOlJLFN0baGTpAN+4bgCwBibH88amfpoiwpTf2GUzQqY/MH3c6fQfIVV4gkk+WxF7aynCGdVk43HT1nekWdgzx+yaJxvzkb1/7bgngUXczm9gQPlCKgQLKPEfaFosnsrQM+0XZfxogcB/uuzayDxU/1IrOj/8A+1S1rCgzLVI6A29oandHfvnZRQk2eKg82L8MVbAxNVFkXy3mJuQUDuMhjLj8coKSru8sNuNxMQJm2kGmMqNgWmz/j8tN0sX4JB+7Hm2YM/yADEjlTF4xRRM+RQtEjvrWj3iD0wmLLopQyT9HthSoySBZ2OcXuux60YMjmEK0YA8qHlqvG41whKhCEOVWrXqOHQXpZTPToQ3U1cSMAatved5T9upAhYwEhHQBbiQrUu/MGB8PZyv5WqoFWRgOd0JggsDQGlr1m5hTGnijGWEltBoOcNioPT0UgOmWSlkds5zEzTNgZVKeHf4LWDhWAePZYuIHyeGPvtj9HyfVeEbm1tdgIzmPTFDYX5fsESoB5y3j82nQwqmQDmbAhfDN2ZuxXlHUbzw5DLOL+T8H8dtFEfgXho= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR08MB6061.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024)(23010399003)(10067099003)(56012099006)(4143699003)(5113699003)(6133799003)(18002099003)(22082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MFBDNXkwcWZROVFLRFpYZ3lhSDNqSWk2K01kVE9DL0hUTGhDYTZPb1RnNUs0?= =?utf-8?B?NXJWNmFSa09vNk9LV3VNalB3ZmpBSEdYS3lCZFFlQ1dGblFFTXBNN1N1Njhx?= =?utf-8?B?V0xkQkdLdlg4aWpBTDI3YWlKNS8yL0lsd0wxank4UnN5OTRzU3ZBSldBbWJh?= =?utf-8?B?VW5RY2R5VGtodWNLV3NkWGdJYXpTQXNPdUJXMWRhTGdRWWlDYTdOVmIwWnBj?= =?utf-8?B?WVk4dUxlNjZMSG1QbFZEc3pLZytDM0xISFFkdWE2eDJ6bDRjNzIyY0NzQXJo?= =?utf-8?B?R2R0bWNadzY2dm5TdWYvU2JXU3JwMmkwbTZaWGIvWkRyMXRReVR0dWF5b04r?= =?utf-8?B?eUtHMkNrWEVpYzVsb0xJQWpaUnpjUFNrRHJHL1FVczZnbmFrUi9TaUQ1bXJC?= =?utf-8?B?RnZDU09SYkJ2b3RzWXJ3bURsVUdSZW04N3AzNHZpejFNeGord1g1UW96OVVt?= =?utf-8?B?UEhNWFIwWkNFY1VkMU5xMElsa0s2ZWc0Sm9zRzlKTWNBREloUW1iaitpckM4?= =?utf-8?B?cVZkaDB6dU11VDdnS3VpQTlGUW90bnNhUUgwWnZLQjdDT1N5Um51S2ZHdVBr?= =?utf-8?B?SUpzWHpzeFRnQnpIclovaktFdHdmRTdGWVhOWXBZYkFGbEFCcGg3ajRKSDJj?= =?utf-8?B?cFRhVm5UeHhXRkEvMGlya3dtK2JZaFFFTDFlMVdHbTV5Rjg1SUxxU0F1UHJy?= =?utf-8?B?ZHI5TURrSDBnUmxpcjAzWkZESXhCSTdhTWZVNXlScFNET1BrUXBDSitOZVpQ?= =?utf-8?B?b3pZZVJEUWx6ZmM0R0J1RkxJQ0VpWkVxNGxMRkxyVTQ4ZmNyZkJMbXljQm5z?= =?utf-8?B?UGQraXIzOHd4VVdRUkQ3U3d2Rjd1VTRuR2FzSUNCbWVCMW9oVnFDbWZkdnVB?= =?utf-8?B?WUlPdHdxc2FycFNVSnJweFFrYVF0bjFiMldVeXcybEJnTHhQbjJFcUZXdWJ0?= =?utf-8?B?ZkdQYkJWYUtUNWxxSzZTaS93aFJsVnNNZDhtZzVJUjF0QTZCK2JaZlBOQXhI?= =?utf-8?B?a0lWMWgrUzRheHZRcldibEduTmd4NkpnN204bmdhem5rODR3aHNucGptL2dQ?= =?utf-8?B?cC8yZlVMWG9mMDF0THB6Y2h2RG5kZFBybkoxaUYxRXh4UGVnNVo2cFozRXJK?= =?utf-8?B?ZmZzWVlJVGJJdWIwTXl3NmJNMXUvUUwweTlkeVMzNzJFK2FPaktpRE5hdkZG?= =?utf-8?B?UnBSOTRnRG9wVXJxT3p1UWVXMW1xdmNMc0NhUzZDUGxOZDdyRno4REg1N3hy?= =?utf-8?B?Ty8zU1o2Ukg3elAxdHQ1SUtSM3RMcWZRQnU3eGRGeTB5Y0hJb3dRbUcxZkNh?= =?utf-8?B?UmJHb1NLVTFGTVpUd0ZzeXN4Wmw1WnpnVFRUKzM0S1hERUJvVFVNRTlMR1Vh?= =?utf-8?B?UlRpVHpsNWI5Z1pJNnRGQm8rRVpTSDB5a0IybVkxbk0ydXNkcmpJZnBEeWJa?= =?utf-8?B?Y3dKVEQvZVV3MmxzL016T1pWcjFqNDA3Uy9LRnJZQUFQWTB1dGVXWW95a1VJ?= =?utf-8?B?K0RycnQzRDBhVWhKRVQ3cTN3ZytDT3hsVGVGdUFMYWZoTFEvS1ZPT2ZxalhE?= =?utf-8?B?eXZacCtETEZpN0NOblhRWStJS09ORU4zWUIveUN4UFZ2enJqVHViY0RxUVI0?= =?utf-8?B?SkNaYUNnUjJNN1k5MlQ1aUQ1WkcwR2lFajR5Q0FNZTl5eGZVTGVwMit3aVQy?= =?utf-8?B?d29BRXpCS21OQlZ6QVFWUTNyTFNZV2VMREdUZFVBa2k2TG8xMkJKMTJrTEQv?= =?utf-8?B?LzNpSmFjc0JkdVZuR2JnRVIwUGoyQkRwNitkN0pYZ1dOb0hObmJ2Y3JMaUpq?= =?utf-8?B?SFhwOFc5Z09zL3pSUURlU21xL3pHQ1N1NjErNUE5dDNNTVBOZmpUdVN2ZTdi?= =?utf-8?B?QXQxL1Y5RHlZcmJqOFVjZGRuaWFwcjZ5UDRYMEVqRUUxdWkyZDNOZHYyMy9t?= =?utf-8?B?eVNjNm9HWW9xVUFmVDU0Qi83ZFpUbVQrRlRwdVBvM3BFdHorUllmQUx4dXpu?= =?utf-8?B?N1M2cVNoVURWUkhzeEd2cmRFb1hqUG41dnJPajRkOVM0U0I5YWliOUFZT0ZP?= =?utf-8?B?OW9weUJhSzZlZ2xkeVB0RWV4TVBnQWozYlJkb0hSL1ZPT1lEWHZqOElLQUJQ?= =?utf-8?B?MFJtSmdadnUvbjBvY0hrWmMvbXZwRUNLN2JUWjg3bGtoY2RZeDkrdVJZaFRv?= =?utf-8?B?TXFpRHpkYm5MYUtpa3NCWFJQb1orZXNXQWRGYlpVWjYrTVltQnJKaVFwbDJ6?= =?utf-8?B?dEhPY1o5bmU4eW9rcHVBWGhNb1Y1NU9aS3R0SVo2R3VZMVlkY0duSmc0Vmln?= =?utf-8?B?MGhwL2NhcjBPdEp2RE81RzBPeDJ0Yk9nazZ3VWFFWkNqTjdYSDI1SnA1WDEw?= =?utf-8?Q?Ki0CLi4SNWbVNH3A=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: accc81e2-7d0d-41f8-785b-08df09cfef8e X-MS-Exchange-CrossTenant-AuthSource: PA4PR08MB6061.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2026 15:27:59.4378 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6SPKxw+H/ZBRnZ2zA62Nu7BIRU9dFWWkbbFp+w/Gp5pCiyiQjVCDnFhehP7qoxVO+pytXz+SPeZ79vYF/UIqorW0/3g24/fEcv4uoW+ZlVU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR08MB11480 On 9/3/26 16:56, Andrey Drobyshev wrote: >> Previously we used very ugly and incapsulation-breaking assignment >> fd = blk_bs(s->conf.conf.blk)->file->bs->opaque; >> It is wrong in a many ways, so let's rework this. >> >> Patch changes default `drive` to new `devpath` option so device fd >> is managed by vhost-blk itself. Unfortunately this way we need a >> bit more preparational work: finding out disk length, block size, >> etc. Don't be too broad and just do the minimal and set reasonable >> default values. Validate with previously introduced >> blkconf_validate_blocksizes(). >> Also we lose resize, as this is tied to the block node, which is >> now have no place in the setup. We will add this in the next >> patches as well as RO mode. >> >> https://virtuozzo.atlassian.net/browse/VSTOR-143437 >> Signed-off-by: Andrey Zhadchenko >> >> diff --git a/hw/block/vhost-blk.c b/hw/block/vhost-blk.c >> index c52851fcf8b..a3e0010982f 100644 >> --- a/hw/block/vhost-blk.c >> +++ b/hw/block/vhost-blk.c >> @@ -24,23 +24,17 @@ >> #include "system/system.h" >> #include "linux-headers/linux/vhost.h" >> #include >> -#include >> -#include "include/block/block_int-common.h" >> #include "system/runstate.h" >> >> static int vhost_blk_start(VirtIODevice *vdev) >> { >> VHostBlk *s = VHOST_BLK(vdev); >> struct vhost_vring_file backend; >> - int ret, i, nworkers, *fd; >> + int ret, i, nworkers; >> BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); >> VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); >> char serial[VIRTIO_BLK_ID_BYTES] = {0}; >> >> - bdrv_graph_rdlock_main_loop(); >> - fd = blk_bs(s->conf.conf.blk)->file->bs->opaque; >> - bdrv_graph_rdunlock_main_loop(); >> - >> if (!k->set_guest_notifiers) { >> error_report("vhost-blk: binding does not support guest notifiers"); >> return -ENOSYS; >> @@ -92,7 +86,7 @@ static int vhost_blk_start(VirtIODevice *vdev) >> >> memset(&backend, 0, sizeof(backend)); >> backend.index = 0; >> - backend.fd = *fd; >> + backend.fd = s->backend_fd; >> if (ioctl(s->vhostfd, VHOST_BLK_SET_BACKEND, &backend)) { >> error_report("vhost-blk: unable to set backend"); >> ret = -errno; >> @@ -208,29 +202,79 @@ static void vhost_blk_vm_state(void *opaque, bool running, RunState state) >> } >> } >> >> -static void vhost_blk_resize_cb(void *opaque) >> +static int vhost_blk_update_size(VHostBlk *s, Error **errp) >> { >> - VirtIODevice *vdev = opaque; >> + BlockConf *conf = &s->conf.conf; >> + off_t length; >> + bool changed; >> + >> + length = lseek(s->backend_fd, 0, SEEK_END); >> + if (length < 0) { >> + int error = errno; >> + >> + error_setg_errno(errp, error, >> + "vhost-blk: unable to determine size of '%s'", >> + s->conf.devpath); >> + return -error; >> + } >> >> - assert(qemu_get_current_aio_context() == qemu_get_aio_context()); >> - virtio_notify_config(vdev); >> + changed = s->length != length; >> + s->length = length; >> + conf->heads = 16; >> + conf->secs = 63; >> + conf->cyls = s->length / BDRV_SECTOR_SIZE / >> + (conf->heads * conf->secs); >> + conf->cyls = MIN(MAX(conf->cyls, 2U), 16383U); >> + >> + return changed; > > This function should return int, but here we return bool. And then > we do 'if (vhost_blk_update_size() < 0) ...', which never fires. > >> } >> >> -static void vhost_blk_resize(void *opaque) >> +static bool vhost_blk_open_backend(VHostBlk *s, Error **errp) >> { >> - VirtIODevice *vdev = VIRTIO_DEVICE(opaque); >> + BlockConf *conf = &s->conf.conf; >> + struct stat st; >> >> - /* >> - * virtio_notify_config() needs to acquire the global mutex, >> - * so it can't be called from an iothread. Instead, schedule >> - * it to be run in the main context BH. >> - */ >> - aio_bh_schedule_oneshot(qemu_get_aio_context(), vhost_blk_resize_cb, vdev); >> -} >> + s->backend_fd = qemu_open(s->conf.devpath, O_RDWR, errp); >> + if (s->backend_fd < 0) { >> + error_prepend(errp, "vhost-blk: unable to open backend: "); >> + return false; >> + } > > Suggestion: how about also checking BLKSSZGET value of the device at this > point and comparing it against conf->logical_block_size? I would personally avoid this for now. First of all BLKSSZGET (and other things) may be undefined (failed this for BLKROGET btw) and proper ifdef decoration are not so important for 'change backend setup' patch. We can always add it later. > >> >> -static const BlockDevOps vhost_blk_block_ops = { >> - .resize_cb = vhost_blk_resize, >> -}; >> + if (fstat(s->backend_fd, &st) < 0) { >> + error_setg_errno(errp, errno, "vhost-blk: unable to stat '%s'", >> + s->conf.devpath); >> + goto fail; >> + } >> + >> + if (!S_ISBLK(st.st_mode)) { >> + error_setg(errp, "vhost-blk: '%s' is not a block device", >> + s->conf.devpath); >> + goto fail; >> + } >> + >> + if (vhost_blk_update_size(s, errp) < 0) { >> + goto fail; >> + } >> + >> + if (!conf->logical_block_size) { >> + conf->logical_block_size = BDRV_SECTOR_SIZE; >> + } >> + >> + if (!conf->physical_block_size) { >> + conf->physical_block_size = BDRV_SECTOR_SIZE; >> + } >> + >> + if (!blkconf_validate_blocksizes(conf, errp)) { >> + goto fail; >> + } >> + >> + return true; >> + >> +fail: >> + qemu_close(s->backend_fd); >> + s->backend_fd = -1; >> + return false; >> +} >> >> static void vhost_blk_device_realize(DeviceState *dev, Error **errp) >> { >> @@ -239,13 +283,8 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) >> VhostBlkConf *conf = &s->conf; >> int i, ret; >> >> - if (!conf->conf.blk) { >> - error_setg(errp, "vhost-blk: drive property not set"); >> - return; >> - } >> - >> - if (!blk_is_inserted(conf->conf.blk)) { >> - error_setg(errp, "vhost-blk: device needs media, but drive is empty"); >> + if (!conf->devpath) { >> + error_setg(errp, "vhost-blk: devpath property must be set"); >> return; >> } >> >> @@ -273,17 +312,7 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) >> return; >> } >> >> - if (!blkconf_apply_backend_options(&conf->conf, >> - !blk_supports_write_perm(conf->conf.blk), >> - true, errp)) { >> - return; >> - } >> - >> - if (!blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, errp)) { >> - return; >> - } >> - >> - if (!blkconf_blocksizes(&conf->conf, errp)) { >> + if (!vhost_blk_open_backend(s, errp)) { >> return; >> } >> >> @@ -311,13 +340,13 @@ static void vhost_blk_device_realize(DeviceState *dev, Error **errp) >> goto cleanup; >> } >> >> - blk_set_dev_ops(s->conf.conf.blk, &vhost_blk_block_ops, s); >> - >> ret = vhost_dev_init(&s->dev, (void *)((size_t)s->vhostfd), >> VHOST_BACKEND_TYPE_KERNEL, 0, NULL); >> if (ret < 0) { >> error_setg(errp, "vhost-blk: vhost initialization failed: %s", >> strerror(-ret)); >> + /* vhost_dev_init() closes vhostfd on failure */ >> + s->vhostfd = -1; > > Before this patch we were doing double close(vhostfd) after vhost_dev_init() > failure. I'd make it a separate commit with a "Fixes:" tag. > >> goto cleanup; >> } >> >> @@ -328,7 +357,14 @@ cleanup: >> qemu_del_vm_change_state_handler(s->mighand); >> } >> g_free(s->dev.vqs); >> - close(s->vhostfd); >> + if (s->vhostfd >= 0) { >> + close(s->vhostfd); >> + s->vhostfd = -1; >> + } >> + if (s->backend_fd >= 0) { >> + qemu_close(s->backend_fd); >> + s->backend_fd = -1; >> + } >> for (i = 0; i < conf->num_queues; i++) { >> virtio_del_queue(vdev, i); >> } >> @@ -344,6 +380,10 @@ static void vhost_blk_device_unrealize(DeviceState *dev) >> qemu_del_vm_change_state_handler(s->mighand); >> vhost_blk_set_status(vdev, 0); >> vhost_dev_cleanup(&s->dev); >> + if (s->backend_fd >= 0) { >> + qemu_close(s->backend_fd); >> + s->backend_fd = -1; >> + } >> g_free(s->dev.vqs); >> virtio_cleanup(vdev); >> } >> @@ -376,10 +416,6 @@ static uint64_t vhost_blk_get_features(VirtIODevice *vdev, >> >> virtio_add_feature(&features, VIRTIO_F_VERSION_1); >> >> - if (!blk_is_writable(s->conf.conf.blk)) { >> - virtio_add_feature(&features, VIRTIO_BLK_F_RO); >> - } >> - >> if (s->conf.num_queues > 1) { >> virtio_add_feature(&features, VIRTIO_BLK_F_MQ); >> } >> @@ -398,7 +434,9 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) >> int64_t length; >> int blk_size = conf->logical_block_size; >> >> - blk_get_geometry(s->conf.conf.blk, &capacity); >> + length = s->length; >> + capacity = length / BDRV_SECTOR_SIZE; >> + >> memset(&blkcfg, 0, sizeof(blkcfg)); >> virtio_stq_p(vdev, &blkcfg.capacity, capacity); >> virtio_stl_p(vdev, &blkcfg.seg_max, s->conf.queue_size - 2); >> @@ -406,7 +444,6 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) >> virtio_stl_p(vdev, &blkcfg.blk_size, blk_size); >> blkcfg.geometry.heads = conf->heads; >> >> - length = blk_getlength(s->conf.conf.blk); >> if (length > 0 && length / conf->heads / conf->secs % blk_size) { >> unsigned short mask; >> >> @@ -425,7 +462,8 @@ static void vhost_blk_update_config(VirtIODevice *vdev, uint8_t *config) >> } >> >> static const Property vhost_blk_properties[] = { >> - DEFINE_BLOCK_PROPERTIES(VHostBlk, conf.conf), >> + DEFINE_BLOCK_PROPERTIES_BASE(VHostBlk, conf.conf), > > DEFINE_BLOCK_PROPERTIES_BASE() macro defines lots of properties that > make no sense without BlockBackend. E.g. backend_defaults, write-cache, > share-rw, account-invalid, account-failed, stats-intervals. We should > consider limiting the list of config properties to the ones which really > matter to us. Ideally as a separate commit. From one point of view yes, from another point of view a lot other make sense for virtio-device. I thought it was better to leave it as is and use it later. But maybe remove it altogether (also along with logical/physical block size) and better add it later as separate options if we feel tuning these values brings any impact? > > Andrey >