From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11021136.outbound.protection.outlook.com [40.107.130.136]) by lore.virtuozzo.com (Postfix) with ESMTPS id B1D448045D for ; Wed, 4 Nov 2026 13:45:53 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BGpeol/gEAm+gPT939ePNhGnHvDuRCAj9WBWLskKk2DZSFNtAMoAPNorRRajyh5E5DbtSh6y++S8dQ6Iidq8v43yZElLWTLx9V2imkTboreGNMoCAfYd1BLXpQ7H6cRHasvoiDbhJNFgpjMc1iD7TrXbIVBOG8FUkO3SRKScXugfSPbRb4cz1mpBX7nP5Dy6AYiDw6MPcdsgM0c36+89kQulOFNrT3FWZnYicSBL1TEQ7f1YTZxJUZoyUgWnj7iYegQ+x5s1zS9lTteuTls3Y8m+2pImP0EH2PigXEHzesG5QGe/kzE5DR26POsQKdtcMdwIsI8gey4Dzeb1yPpw6g== 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=jIarQITVRG+JoCypVNivFftDv9eVU2U1x5d9/rPoHgg=; b=WHxXxj86+tqJr17MZaSl8j5cPykv+S5AUeBrPWPxnfkKHLZOAdycTUFS3wMzm0ERWE+oAuu5nhKD2Xn+9its0esFHF5nx+fTkmv2EBCMoQBaNLfGY4IX4uekK4BtO9ctw4024vASPB8C5mMX3OTdbne01ynloHItqcBbG3v/ZEy38s0dIu5Mr6lPPqN/uTY+i8ntu0zuBGj6oS1NMhKI6cYH8YiNDvpEvJZQMx82I/IRwQnUn79eNDTFtAi7BzAu8CmVGXrZNaVxxnTQqHw6aiBuSkglNi/38hUDIdujVc7TN5OY27VUXttQ0nrvlL+ei9O1qF787wF+8iL17a6FXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 2a00:1450:4864:20::42f) smtp.rcpttodomain=virtuozzo.com smtp.mailfrom=openvz.org; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=openvz.org; dkim=pass (signature was verified) header.d=openvz.org; arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.onmicrosoft.com; s=selector2-virtuozzo-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jIarQITVRG+JoCypVNivFftDv9eVU2U1x5d9/rPoHgg=; b=c6AaCRHvirZjC5WCie1uOCT9Ss8Y2PA7tWy+3cbpoG/HO4e1vAQOkYu8O0iEvqGRSURD5uzpEjJ4akUjBPssIgj9HOia5OmoS/F8oVruet2+sQhlbzwvjjwnWVy2GDRgIYaBVMpZBzC794lEv1AtYxc/NQstZAji0SY6Xik9ryI= Received: from PAZP264CA0046.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:1fc::8) by AMBPR08MB762118.eurprd08.prod.outlook.com (2603:10a6:20b:78a::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.592.8; Wed, 4 Nov 2026 13:45:46 +0000 Received: from AM7PEPF00000054.EURPRD83.prod.outlook.com (2603:10a6:102:1fc:cafe::34) by PAZP264CA0046.outlook.office365.com (2603:10a6:102:1fc::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.592.9 via Frontend Transport; Wed, 4 Nov 2026 13:45:46 +0000 Authentication-Results: spf=pass (sender IP is 2a00:1450:4864:20::42f) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org; Received-SPF: Pass (protection.outlook.com: domain of openvz.org designates 2a00:1450:4864:20::42f as permitted sender) receiver=protection.outlook.com; client-ip=2a00:1450:4864:20::42f; helo=mail-wr1-x42f.google.com; pr=C Received: from mail-wr1-x42f.google.com (2a00:1450:4864:20::42f) by AM7PEPF00000054.mail.protection.outlook.com (2603:10a6:20f:fff8::218) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.615.2 via Frontend Transport; Wed, 4 Nov 2026 13:45:44 +0000 Received: by mail-wr1-x42f.google.com with SMTP id ffacd0b85a97d-48e10a70540so447103f8f.1 for ; Wed, 04 Nov 2026 05:45:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1793799944; x=1794404744; darn=virtuozzo.com; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=jIarQITVRG+JoCypVNivFftDv9eVU2U1x5d9/rPoHgg=; b=aY3YcbxOsqGYFDsM4549Ou1q5BB73uGEOPRENOTvjNoLZBKcGf3kF6Do+ZpQ9iJYcT 0ozVQ23d+zPpP9uw7TjRshzwQVqSMQ5BRZQguraGkMliXp1ueMcZTQe2zIRVcLC3/2oM ler5h1RzWOIuay5oKi6BJD4SK8HlUnt+vNL1bOGR+N5ZhZgdCt85t1GLb+qALXvt047W JJhSS2NhWaYl5VadBcyrlMwTtUSaOEUqN2lrTehXXJ80hhORHRsPUHIsxJygxUJgoJih Z3HLBOUUmxFmoLTCHcsL5DZ2zyYJaMPVRwk3mkttunvfgbAZwyaohDjPxYoTxCYDGhCT i4qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1793799944; x=1794404744; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=jIarQITVRG+JoCypVNivFftDv9eVU2U1x5d9/rPoHgg=; b=n/bou/2FxnFXT3TUzfp/yB8dGAu6Zsvk0KbrMdl2agw9DsXf+5ktS0CAgg96KINWVw GNw1hsmvUFq2hfoyTwYBXGJBKXlVXF5qgtNv6POrHdBdJVGvrxgtOG+KKJHN7ojQiMA+ AIk1lRAMTq5d/6Pi9txZxwhpOBWvGRtZnlHtStVhVD9dH/3L2jobFBGisXWVrpyVLQui 86HcxQ7sHkAijPenVLsmVpjkwl+PIUjDGx/un1TZVIZl6FzwZ6iME/TgI7B2SOSSIj8i sZsvSVjlcwGKDWJzKrfWKkDGB2iul/Z9Pai1YorucaydKZhZxARo7ZaOK7sioqz0rNSX Y9iA== X-Gm-Message-State: APuU4Z+40MRkCNmDkVUEgnw9nE/KyrQcXMrSkpRWlWv2L4fPWersPrC1 RUg+2X80nKNQmaiOTYtSXHYr+MvdQ0AuEHV+L+4CgMkvNCzpYKFT4kxbmvkXQu8CVQZIyEaAdeO Ems3Bg9c= X-Gm-Gg: AYBFou2VueRAQOSHAjM2AxMhpzdJXosTh08V8PazuYyZUm5WcisIcl7eYP63jUNK9rU HmtdPiTW22jUPcIveWS0JwuiOwGphT8oEI9QCV6QrImFxSnlHikj/uG0ThdcPVGlQ9jacXHxuU9 FNPz9CNMpn6l5nD8mAevP+qLbC1VL1Zl+LjE71P0KkTnphw76CRKf/02IKJ/BKybDxA7OJYSV7b GGAIGGjn+qHcYADx1kHvh2/0vJNeTv6/LtXRI/qzDyzvzp7YchgZKz2+kX5MAkVMpLF3nIeArdR 5NsaGeFm7mASi2Op2cgDJx7kv9kFHT5OivtEMOovjrs3h7egX/GcaaDEOrY9DTFfDZpJ3mLLphq hW9bt3auBPSWcTeoA5rJFcAMNzHhxxzEW5Vk1Wl1lFz52zfmuNiNvfEjY2Cm+UBEe3K+2nUxUC8 nNglVX9+66bLlNm7oHoMthizlS1QnsTskhZaIK3GwE7yldV/UEBMDK+7ogxudBYkQRMr5CbEfSO fG5t5FPCQj01IbnbA2Xv7Xbn+DUKUUraxoiDnXVhfXdjfQzIuwReOhazmMXCt6HjhaRI1nU+ZwU sTJeX1knoCY0x6F/cXgUUisXzA== X-Received: by 2002:a05:6000:40cc:b0:48e:5ea7:b1b9 with SMTP id ffacd0b85a97d-48e6e30543fmr38501228f8f.31.1793799944223; Wed, 04 Nov 2026 05:45:44 -0800 (PST) Received: from athena.sw.ru ([2a06:5b06:b600:300:162e:5a6e:fd46:18b7]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-48feeb51a9csm4005178f8f.59.2026.11.04.05.45.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2026 05:45:43 -0800 (PST) From: "Denis V. Lunev" To: andrey.drobyshev@virtuozzo.com Cc: svt-core@virtuozzo.com, den@openvz.org Subject: [PATCH hci-dev 2/6] block: notify the parent when a replaced child has a different size #VSTOR-130961 Date: Wed, 4 Nov 2026 14:45:35 +0100 Message-ID: <20261104134539.1519657-3-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261104134539.1519657-1-den@openvz.org> References: <20261104134539.1519657-1-den@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-EOPTenantAttributedMessage: 0bc7f26d-0264-416e-a6fc-8352af79c58f:0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM7PEPF00000054:EE_|AMBPR08MB762118:EE_ X-MS-Office365-Filtering-Correlation-Id: 6425b32d-15b5-4c08-9539-08df3a79eccc X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 0 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|48200799018|43022699015|61400799027|6059299003|9140799003|6133799003|10067099003|22082099003|16102099003|18002099003|55112099003|56012099006|5023799004|5063699009|261102123227099003|261021123027099003|261028144727099003|261026121527099003|261026140227099003|261009223027099003|261022105027099003|261026135527099003|261021121427099003; X-Microsoft-Antispam-Message-Info: =?utf-8?B?VFd4ZWhuWnhEak1lTWZzU3JpSjJqM0lHWTdHODhzdWx2ZFN4NTB4cjBPUVNS?= =?utf-8?B?aXpjSkNZUDhndXROWWVkQndzcSs0cGEyOVBDZmNkalpENTZBQzF1ZjBJN3Vv?= =?utf-8?B?UWxGclIvaUs1TWN2M0FSdWRlTDFEc3pxVWl3NkVyaEJLRUh3dVZJOEdaYlRj?= =?utf-8?B?bjlMRk9oYUthaWIwNldLdzNqd3NMbjA1czg5Q2wweXUzQTd2RGQ5ZHBzQ2hG?= =?utf-8?B?YnNJeDBMejRIb2VsMEJXNDRwQ1RTL1FmNVpHRjYwQ21zaTV2RklEUVhYUkQw?= =?utf-8?B?OEdHQkQ3eEUvdUwxbDVRYUgwWEhIMFNTOVdxek90MHlpcTZmVXRtcGVsUnlk?= =?utf-8?B?bTJ4V2pnTWRucVBIM2x0eUhvdWR6N3J0M3J3MGxiWmpCYTk0dFVidlFhV05x?= =?utf-8?B?Q3BkZFYwUm5aU3p5c0toYlhMTW9zcjVrZHluNWFMT0h1cStVNmdCWEVUTmFE?= =?utf-8?B?ZzJpcE5XSEk1K2x6VENEQVFVNWg4VlFDaGRMcjJJZjhEQVlVSWJYTE5DL011?= =?utf-8?B?aFBZTnQvMFI4bCtmZ3h1WlVOaXhxS2t5Wk5xUVFJMHROZ2VlVUVNUW80RmhD?= =?utf-8?B?L20yUG1nVk1mdmg3UW9GelltUWtYUUxrNWlMd3g3YzJmamlGV3dQdmV6NzBi?= =?utf-8?B?MklOS1VLNnNwRkxXU1k4cnlvcXc1L3VvOWtoTitLZkh5Q25FK29HS2ZRZUhx?= =?utf-8?B?Z3BEU2t1TkFld1FZSi9xYWliRjRJK1NTbnlXZm9SRG1Sdkt6L1AwZE1CdFdZ?= =?utf-8?B?cks0eXBaaWxQTHFCbXJUYm5GNi9NaDVWb0tKUFoxdG9abGU0YlRGTkM0R3p5?= =?utf-8?B?SWVXaDh1UHFiOFlVZjNmaW9ZT29CMU9XblFiWnc3SERZajl4N2t0ZDhQZTlk?= =?utf-8?B?bklLVVlJek53N2hXRGpBRHFqNXZTdzVaMXd5cE9nSENYV1MreUdUNUYvbnJE?= =?utf-8?B?Nk5ZazB5YjFNZGQrbkI1OWtHNnpGaUlkNkNnT1NUbnk1UUxDMEZabm9RWVRS?= =?utf-8?B?K0x0Z1BzeTVPT3JZdWdPRjZ4SFEwTldaRHVjbEhDYmFsdjZ2bys1VGg3ZjJa?= =?utf-8?B?LzJuWVIwQ3hLcHBWVjBSMDNoWHI2OUozUEtUQVVxa29UQXNSaXREbmIvcklG?= =?utf-8?B?QlRsdEFldVNzL3I4RjdESVpERHBJR2xDWEJZblg5MzNBZldmNWk0Q1M2eTFY?= =?utf-8?B?MVI4N1AyRlAxR2ZOWjc4Y1RwbFNacDVtUG5TYWd4VnBDcHFiZnlRVlhiNTVp?= =?utf-8?B?U3B2bm1qSWxabzFMRGRJNFNkR2pKd044L0NPQkdheEJzWTFVTW9XTllkaGNT?= =?utf-8?B?L2pTaW9pRlJDbXVENS9rTE84VjlEYjI3RjBXNkxiYkZwTFhPM24xNWNVcnF6?= =?utf-8?B?Rmo2b1IvUDI1cTRxN1ppeHR4ck9xVzltQUZwNUpDYWFTRzZEbUVERlEwWFVV?= =?utf-8?Q?rr9i6jL4?= X-Forefront-Antispam-Report: CIP:2a00:1450:4864:20::42f;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wr1-x42f.google.com;PTR:mail-wr1-x42f.google.com;CAT:NONE;SFS:(13230040)(82310400026)(376014)(48200799018)(43022699015)(61400799027)(6059299003)(9140799003)(6133799003)(10067099003)(22082099003)(16102099003)(18002099003)(55112099003)(56012099006)(5023799004)(5063699009)(261102123227099003)(261021123027099003)(261028144727099003)(261026121527099003)(261026140227099003)(261009223027099003)(261022105027099003)(261026135527099003)(261021121427099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: XphmT6cl1NnE2zmltDz2L9HUhTIVPjRoJryhFXAzMoexElPv2fM0nCBKFyEdJ5BrU6T7NlhLYhfPX2gKy45A/1oh3KjN5PwLRX+13T9K0OX4uK7rHx7ydZHbzlEeoqSsbrqW/HVB51bOGjxHnaS23VHmMqh3tCbEfRT2x7qtFHP+cfMhqUPer4pZ7e3Nr5r4uMekXWkig6oeBpnHHoeO3FQpRIrH0a721TAZpcs1+o3IYPCx5+0f8xeOy36Q0p4NO+gpa9EohX200SeEW7E65Qao82DcfEY9P+hXsHiZLgHts87P1XdAAbUbgjQohWfjfiS44yc4O4w/Z+hzXbMRlQV+bhotbiE/lc04YidDblWgIS3n0OEN8lZzaJwEtI4BUdW6YF8EYHYVOEnBun/pp8elLpLdlKsI/mnEy/rPQaNjKife2oNzV7d3Q6YQDEO0 X-ExternalRecipientOutboundConnectors: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2026 13:45:44.7793 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6425b32d-15b5-4c08-9539-08df3a79eccc X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-AuthSource: AM7PEPF00000054.EURPRD83.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-Transport-CrossTenantHeadersStamped: AMBPR08MB762118 List-Id: From: Denis V. Lunev bdrv_replace_child_bs() swaps the node a BdrvChild points to without telling the parent anything about it, so a parent which tracks the size of its child never learns that it changed. Every other way the size of a node changes goes through bdrv_co_truncate(), which does notify. The device models which care all register the same BlockDevOps hook: virtio-blk resize_cb = virtio_blk_resize(), ending up in virtio_notify_config() ide/ahci resize_cb = ide_resize_cb(), refreshing the cached size and the IDENTIFY data scsi-disk resize_cb = scsi_disk_resize_cb(), reporting CAPACITY DATA HAS CHANGED xen-block resize_cb = xen_block_resize_cb() Only scsi-disk is really hurt by the missing notification, because it is the one which validates guest requests against a cached size. virtio_blk_sect_range_ok() and ide_sect_range_ok() both call blk_get_geometry() for every request, so a missing notification leaves those guests with a stale idea of the size but never refuses I/O which the node underneath can serve. check_lba_range() compares against SCSIDevice.max_lba, filled in by scsi_disk_reset() and updated only by the READ CAPACITY(10) and (16) handlers, so with nothing to make the guest re-read the capacity every request past the end of the old node is refused for the whole life of the device. This is reachable with qom-set of the 'drive' property, which is allowed on a realized device, and it is silent on the host: out-of-range requests are answered by scsi_check_condition() and never reach scsi_handle_rw_error(), so there is no BLOCK_IO_ERROR event and io-status stays 'ok'. The guest sees ILLEGAL REQUEST / LOGICAL BLOCK ADDRESS OUT OF RANGE, which Linux turns into EREMOTEIO for reads as well as writes. Emit the notification from bdrv_replace_child_bs(), so that every device model gets it through the path it already implements rather than any of them being special cased. Send it only when the size really changed, which keeps the callback out of the common case of a replacement by an equally sized node. [ Ported to hci-dev: the downstream bdrv_replace_child_bs() only adds its steps to the caller's Transaction, and the callers hold the graph write lock while it runs, so neither the length query nor the notification can be done there. Both happen in a .commit action instead: tran_finalize() runs after the lock is dropped, and both nodes stay referenced and drained by bdrv_drained() until .clean. ] Signed-off-by: Denis V. Lunev Message-ID: <20260812121500.1034178-2-den@openvz.org> Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Eric Blake (cherry picked from commit 8b267376df877681d0ac9fbe24035d06bf6ed47f) --- block.c | 27 +++++++++++++++++++++++++++ include/block/block_int-io.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/block.c b/block.c index 7b27cb4edf3..1dc7e47431c 100644 --- a/block.c +++ b/block.c @@ -5605,6 +5605,28 @@ static void bdrv_drained(BlockDriverState *bs, Transaction *tran) tran_add(tran, &bdrv_drained_drv, bs); } +typedef struct BdrvReplaceResizeState { + BlockDriverState *old_bs; + BlockDriverState *new_bs; +} BdrvReplaceResizeState; + +static void bdrv_replace_resize_commit(void *opaque) +{ + BdrvReplaceResizeState *s = opaque; + int64_t old_len = bdrv_getlength(s->old_bs); + int64_t new_len = bdrv_getlength(s->new_bs); + + /* A parent caching the child size has to learn that it changed */ + if (old_len >= 0 && new_len >= 0 && new_len != old_len) { + bdrv_parent_cb_resize(s->new_bs); + } +} + +static TransactionActionDrv bdrv_replace_resize_drv = { + .commit = bdrv_replace_resize_commit, + .clean = g_free, +}; + /* Not for empty child */ int TSA_NO_TSA bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs, @@ -5612,9 +5634,14 @@ bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs, { g_autoptr(GSList) refresh_list = NULL; BlockDriverState *old_bs = child->bs; + BdrvReplaceResizeState *s; GLOBAL_STATE_CODE(); + s = g_new(BdrvReplaceResizeState, 1); + *s = (BdrvReplaceResizeState) { .old_bs = old_bs, .new_bs = new_bs }; + tran_add(tran, &bdrv_replace_resize_drv, s); + bdrv_drained(old_bs, tran); bdrv_drained(new_bs, tran); diff --git a/include/block/block_int-io.h b/include/block/block_int-io.h index e462b33b515..6f0c278bbd4 100644 --- a/include/block/block_int-io.h +++ b/include/block/block_int-io.h @@ -200,4 +200,7 @@ void bdrv_bsc_fill(BlockDriverState *bs, int64_t offset, int64_t bytes); void coroutine_fn GRAPH_RDLOCK bdrv_co_parent_cb_resize(BlockDriverState *bs); +void co_wrapper_bdrv_rdlock +bdrv_parent_cb_resize(BlockDriverState *bs); + #endif /* BLOCK_INT_IO_H */ -- 2.53.0