From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DU2PR03CU002.outbound.protection.outlook.com (mail-northeuropeazon11021115.outbound.protection.outlook.com [52.101.65.115]) by lore.virtuozzo.com (Postfix) with ESMTPS id 4AC95804C3 for ; Thu, 3 Sep 2026 14:56:13 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OoMr2mSMMQD/XHO6+mSGv+Vk/cU8jnCodVwVz6SwySGUIxPKHPaz6t2JC5UozV5yRKqJ4z1qy9ygtAvP5T+eyvTX86ce6pkVkwrqJdEgZVObiX8JyRsXQ7ZAkBVXvh8/JsZEHzOaXuwv/HRykruEDggblT0ztg106zChhnl4rcvN44mO7lfbm3Ve/8AJ2VZ9ZQfhcE6XEp1yNOEDOMO2+KDVlKlnxUiA0ZqSsOGPGUzynxjCMq5f/PY2NK7455bMLj92LtEQB2gRgOsDeHnIYA/oI2iPCqJAw3g4TSu82+6drUaKpr+9RQTiPKZx2VAuoDvgIawPGlPIerU2XHAx1w== 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=RxKnyeAZTyJY54nNrCfO4AFemqtV0ZzXmik3ZqcBbVs=; b=OztzOGlyqszW3RGAbUDcRpEY95cJF0fvSV4mjXsfgAumpYoS67lMAy6vezibCGbOdS43RR4HdpVvEAibKGu2QYno7tkVDaVQOv80xBVLEMTFSYzwSh9z2gwiA1Z/hYERVyQ2BDQn5yRVKgBCCIGUK/ef+KYyD78hL9KPO9NNAKbGeEKpnRq0IQtlMbl86eSFi3atOpsIfErJm62Ev/KpxWFjjhCxEU63kW/rWh922fbZVj9wJ0DrTwwqRClNahLbWtueo7PrzCBheUEtj+z11qbDJkvI5gbHAZw9cOUQ4LpzActuQk1CLKxa9XI162MBIhc69KoNToEwAJIp/u6UFw== 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=RxKnyeAZTyJY54nNrCfO4AFemqtV0ZzXmik3ZqcBbVs=; b=keE6AeXU1RiqjPIaBiOYH47M/nG7JfLHZVK48HYD6ixMhfHS8vtZkN6X9UJcBEF4naIlTDrnWA9DHuSAMyiD9pf5imWTjfYdWXpeY62SdBWCLrKsSlBa8HseRdXkeUlQPr8DtiGtz3hTNNBfxToh11nDx8dmqb6T7Kw3gTITX34vxb25i4PBpVCLSqWcTBuX7XpJqDM4CO7+jCcwj5jBdqVYWyPwJAl7YRYYTsTpNGDkNbkb476N3vfC9rsmtSLCujsfHC5tPnA/x/FGTmta0sXhiRMjHDMoRk8Hc3utt00WDboGt7R+MWBgkLBlDToeYM2+rxmRtkeAFD7aVYY1vg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by PA4PR08MB6128.eurprd08.prod.outlook.com (2603:10a6:102:f2::11) 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 14:56:11 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0382.007; Thu, 3 Sep 2026 14:56:11 +0000 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: Re: [QEMU HCI-8.0 PATCH 2/5] vhost-blk: change backend setup From: Andrey Drobyshev To: Andrey Zhadchenko Cc: svt-core@virtuozzo.com, den@openvz.org, andrey.drobyshev@virtuozzo.com In-Reply-To: <20260903123204.24035-3-andrey.zhadchenko@virtuozzo.com> References: <20260903123204.24035-1-andrey.zhadchenko@virtuozzo.com> <20260903123204.24035-3-andrey.zhadchenko@virtuozzo.com> Date: Thu, 03 Sep 2026 17:56:04 +0300 Message-Id: <178844736480.581266.3084182582245534198.b4-review@b4> X-Mailer: b4 0.16.0 X-ClientProxiedBy: FR5P281CA0017.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f1::9) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|PA4PR08MB6128:EE_ X-MS-Office365-Filtering-Correlation-Id: f74d0414-8365-4272-e113-08df09cb7d0f X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|366016|1800799024|376014|23010399003|22082099003|18002099003|5113699003|4143699003|56012099006|6133799003|10067099003|38350700014; X-Microsoft-Antispam-Message-Info: 1DjrDqrqKKD9PO2GAh6sIYYWLxlLed5qTG+txkNOa7OU+S0uqMglAHldwiz0gQMeJQU1FwbKPGaeWC1W9QeRAwcBV4JUNeBxr5B4vwJBbcU83Xtoy0B8O7g0h0E9wiKG5YDL4Q/I95TVeT3MWVeqzG6z9GR3w5SGQASRKsZbmMKd5xfauuWnVzSTI4UGfZ9HKlRT3gbBpDgRqhXxgYE+fBLBISzNQMkN5ZqUaLRxNKjXXzdziRm9H13wrpOnYUKOX3Onppqe70Emze2AIfQAcnalJDtVEJItd4vJGQrz8RjInJqV3ZlmKcX8vMuX8ail+yCnzL+7PxaBvM+xoZJUvZZGdnvFv8G7CIklk09p6zDCT3CyQuQPmAmRIxExOb5uoyqJ4QBdft8bVGQuOQ8eWZI3SCjMJ9zJDUA6TD1SSAmbI/Nxzo3JWk7xLE86damErXqmd1h0hJlR4XztT6MeclL6kSsJV0Qsn0lQK06moSWqmCZvMK1LesR0BWfg1zMDJG19SaNXqw2uXYUF8dyGzHeh4J+Gvp5HeEhK9Wt/xdTIzizCdsmx8dd/opAMCQ3nSpGIfRDm9cB/e71v1lKfsWmZwLcOLdGsOHri2hA4lz8C5S39fak07Ft2PvoJParTZLDrqinP6rZrgdE/FzSwHl6195givYNMGh1hUa6GxWhMNzQFy3PDqAAZu5k28ysiZqM4I8WDkKUriCmWCJimu7YF+zH5ccoNlrb6ivXbMyY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(366016)(1800799024)(376014)(23010399003)(22082099003)(18002099003)(5113699003)(4143699003)(56012099006)(6133799003)(10067099003)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WVExNGhoN0pLRm51Ry83ei96ZCs2UTlNQ28zQWV6NElGeWh5UXRLYUVjbGlT?= =?utf-8?B?UmU3MG95QTRNYW5yNVdYNnZLc1UrclNVbzFqM3B2NC81MzVpRjhJZFpHckl4?= =?utf-8?B?UXVNYW5XVk1vY3I3cVFrcTB4czRjdUMwUE1NNXQyeFl3eC9lWk02OVczWTNk?= =?utf-8?B?ZTVnbnMzZm0rUlZRUDNWeHplVS8wY21heTdlV0JrMGpGOE1ZMzFSb3hhOUNE?= =?utf-8?B?Ly9nQzg0V1NrMHNOb1g2ZHlaVFg0UVhKc0dZUlFZdWFIamUrZVM3dnBURmN2?= =?utf-8?B?Y2ZBcEZnUzRqZnV1ck50eEdsUW5kaWlNaFYzQThrZWlXcXRPeURHdTZNTlpV?= =?utf-8?B?M2w3SmtlbEhab1FDQ2NZdUxXb01YQTRxQUZsZWNVMHhZa1FQcy8rM1g4RzNx?= =?utf-8?B?WEdORWxxY2tTSXJDSHg0VmgyNkE0d25MK2RzRHphU3JueTVSejNRV1dLRnUw?= =?utf-8?B?V1RYMDdWMEFyaUN0YisveFlQRit6V2JlY0F4RkkzUWhmUUNJSUhjZVl3NXM5?= =?utf-8?B?bTFKb05BdEZNOXp3YUIyNFd2MFB4OFlzemVjSmlwbjhCNkwySkVmMGVnRllx?= =?utf-8?B?ZDV4dEpmM1lndDV2VndGVG9JcHd5R25qMDlHNnhDSm1yOS9IS0UzSC9iNHJi?= =?utf-8?B?bWticnA3ZjJ4UytNa09BL29CQ2xWRG9XOS9MaWNWaUJFQUV6Tjc4dkFtcmlp?= =?utf-8?B?OEp1SEprWGk5djdnSTB5RU1sTnJvaUhKbTVPeTZYejVOOGlxL2JoeHZLamo0?= =?utf-8?B?RjFMT0dqdlVTZjR0eXk0QWtIZXF5SkdKKzFtOFpyWnJzWnVyeWNlblRJNnc5?= =?utf-8?B?azV4SllYUU5VTHQrL1BOSE5MeDc4dXdVYWFWK3QvNGJuNVpKYUFyWTd5dzNF?= =?utf-8?B?azIycVNQcjQxSzdtdVlycTFHS0M4UTV6UDFwYXdVKzRZditLWXZpSTMwY1pi?= =?utf-8?B?UlB1c0E5TEF5aStkL0xDbW5iOVkyNDNEMmxjZWErYkRpOHYrYlgxaU5Qclhw?= =?utf-8?B?YkJZb1dEcmNmS0VIelduYTMzRWdrSEpQdTFIeUlhVDZXVWVkWHZCVW1YRUVy?= =?utf-8?B?dUp1ZWhmdmw5ckplV1dGZzROWUZUR1RxeXJOcEVqYjRNbnM4T2dKNFl2K1JZ?= =?utf-8?B?emZGU2RvdDFwbXN3dm45SGJPR2dSeW1pN09jYU5WOHNHZHNPWUJkTTBsbnZ5?= =?utf-8?B?K1U4cDFTNjNlSjhCNWtqUEtTYW14bitRbnlyK0FRYXRqQzZnd2JVQ1BJdFcx?= =?utf-8?B?akk0dFU0NmYyY3FiU2VUVjFpOS93NUNqdkQycFZkbVR4UmVRV2RqM3NZbjUy?= =?utf-8?B?VnBWZ21jQ096ZTYva0t6eVU3eHhSSENKbUVzWkJVNUNHRVp0U1pjZS9iTzVR?= =?utf-8?B?RThvNmpZWDRhcjBmZnJIZGVHdnVFUitRRzNNdjcxTVJWWEJLd00xMHNJdS9w?= =?utf-8?B?eUJCMENlMkZnNldiUVB2KzNieGF5c3NVZytzMnZ1eTZNOFlXb2dEYzRCbkgv?= =?utf-8?B?bS8zUVBFMkY2a1VwZXRiMi9wek9uUFZScktjZTBvTklLLzR4ZVVUL0RrazYr?= =?utf-8?B?ajB1TWgvZjArSjVtUU5nbitJcXN3Tnl2NUQxL05BRFIycHlNTFl3NmJ6eEgr?= =?utf-8?B?cHBpUWJTUmpsSUxLS01lZGd0RWxBaDZES214VXI5eUhLaDdPNEZDV3o1U05z?= =?utf-8?B?US9hS3VqbVBmek16MC80VzlNUzVjR0ZPaWxhQTd0NFlQZ29FeFcxVnBWN2FZ?= =?utf-8?B?Vi9qVGkzR1BwR0NQaGdKNHBkSisyaUJpMHcveE5OUHV1d3U5ZVFJdE5rMjF5?= =?utf-8?B?U1lJeGM4SjBEdHZwRHVpMktwOWp4UFlmbmVoeUlVU0dFdnkzeFdvZzdhODRD?= =?utf-8?B?NTY0TlZEQ3RyYzZiMDlxT2M2OXhNOEZSdDBBNzYzNEFQNEQxcHhGTkF2Y1gy?= =?utf-8?B?QWRSQzQzYW1jTkNpdFFVcFF5TUFZMEFETE42SmJoN0JFcDBKMEZuRTJ1a2xZ?= =?utf-8?B?L0Q3K0hlNnpMOEFKenFkRGJTT1d1Q3JuZEo4Vm1xZUwzQjRHSDh6eHNvVzVu?= =?utf-8?B?WWh4VzVZNVhZYzMrb0JUZGl5VlN3RENQMTVlUXA1MXdQYTg2MVgrR2Z5SFpi?= =?utf-8?B?UjY3ZEZZNk95d3BsZjZkZ2lnRnhSei9NRjVQcUZmeFZ1bTBIZEk1MFRCMGcr?= =?utf-8?B?cXNKMjZDLzViUEFwQXBxb0dlSlh6L3NjaW80Y0FRQTlqUXVQRFgwTXJoc1Uv?= =?utf-8?B?djlGN243L2FYSVJZSnFPdjA4Znc2eGZmTGtSMzlWQ093THM0NEh5emlSZnFL?= =?utf-8?B?Q29HWlNOY0JrREZ6RjZ1dHRWTG4rN3ZhSXlMNWJuQ2pFY2hqYUFsdjRXMTBR?= =?utf-8?Q?uhwBZbx088S3+pmY=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: f74d0414-8365-4272-e113-08df09cb7d0f X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Sep 2026 14:56:09.3897 (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: XYC0Gxvt2MdCrmx3ggPZE8OvxmgJ/jyyzTzizalO7vgeybf2XEBL2yEPsyJcubgM3FgHshZWxlb3bC7M0RZrtSJytlzWCC7VxNb6MatCw9U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB6128 > 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? > > -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. Andrey -- Andrey Drobyshev