From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from PA4PR04CU001.outbound.protection.outlook.com (mail-francecentralazon11023089.outbound.protection.outlook.com [40.107.162.89]) by lore.virtuozzo.com (Postfix) with ESMTPS id DBF17802E4 for ; Tue, 1 Sep 2026 15:51:06 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kWgJZ5IPrAweEdpX1pXYjep4p3pygNyaSI9DYX0/03f9eK/DqbV86FZy2lb4+TtEKnw17FVcOO7YkAg9kveu3LH0hxvs7zVlSd/0Zesch0wE2M8OIQSH4KKg6asoW0GKnfN8AS2PLoHitf6QPQGEu9S1Gnv5leWN7koEaUkWwFXG21tbu+2ZKD8eKig0QzzM6PB8GR9gQ980uzXiOt/HOuxNw5ibo8X4w31+AsBCkqI+kJkFZl53FE+/DhAYDWLsMrgzEaFmCq+QIb4MgflOyheTIZifrLbk10q5EoopNMuJhZ8VdLuYQFGLMhE36I1CNkHM4B5t4McBAqc64hO8uw== 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=L3TL8rAePGjpacKBA0qIIDHWgnusDgxuegkPx+bNHNc=; b=AVwcEFyvqdT0nSrJWuo3GZ0jwvXNMzJYS+a3HtdND/1tFITUJfVIlRt1alJgIHE3U6POutVXT6X3Es/LW1nHkq7cXwAAtIvpnin/XpG+jxS17mliwYEBhb5hdUqdISKSBf6Y8rGrhP9A4x3m0qcJFniNBrVWMWDE/cw+edxg8Csw6BzM8RtRGAXHXgowKJ2F73YhEaa8lJ1HieqHdti3mig+xcPCymiC2P+mROtL9ORCxZbBiGrd/lrpllQQ46K+lCE/kQC4vwnwjMlj8XoCDT/jDmi+F6n0gBdsB9vy39tVdLnlBSTJO2L6fqv733Fun4pFxexdsGUqerX+Xou1yA== 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=L3TL8rAePGjpacKBA0qIIDHWgnusDgxuegkPx+bNHNc=; b=XdWWTKhZo2GwTuaI6m2PVccVDh1mqi6BPfIub0FOVjdvt7eMr/9pEHXZRZamPixD2iviXcV04t9JSMqml9OuN7QvW57SrsPpVCg2oCEh039zE23NlzILNZTyoTilHzAGGJV8P4A4aD8NSlRS+CoBh2BAnkGNizaG/PAqjuw1GoWnURpfT0Umm8ailAYBCkLTZI/gom0wDQLr20Ec2Xkca8lm2XzHFXjEqT8DNQqQrQpQMUavYn8ZbPtD6UVH4eA4XnPtb3DZPbmxejXN0/i9RWztxs6mBmaAdVcmhPizmPHsba4wcV5cqCSHbUFdcZJavEfpYnXWGhOfUF1fxm13ng== 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 AM8PR08MB6610.eurprd08.prod.outlook.com (2603:10a6:20b:36a::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Tue, 1 Sep 2026 15:51:05 +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; Tue, 1 Sep 2026 15:51:05 +0000 Message-ID: Date: Tue, 1 Sep 2026 18:51:04 +0300 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH hci-8.0 1/5] iotests: add coverage for NBD transmission commands #VSTOR-119829 To: "Denis V. Lunev" , svt-core@virtuozzo.com References: <20260831152528.1350583-1-den@openvz.org> <20260831152528.1350583-2-den@openvz.org> Content-Language: en-US From: Andrey Drobyshev In-Reply-To: <20260831152528.1350583-2-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: ZR0P278CA0152.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::10) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AM8PR08MB6610:EE_ X-MS-Office365-Filtering-Correlation-Id: 3eef0670-fb40-48a3-62f8-08df0840d51f 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|1800799024|376014|366016|23010399003|5113699003|22082099003|18002099003|56012099006|3023799007|10067099003|5023799004|4143699003; X-Microsoft-Antispam-Message-Info: STxwgM0cEoLvCfQ34gveAsgORTmmh2qhIRgvrmZrCHhjAZFfuaU6O73EUiGf9grW2EaZaY2I3Lfne+10YzLad0w8d0uotNQ0bS1LTeFj6NF5Ku4H8XAQvKJqcvRfU0DV2ZauMzjhMEEpiQT1Z63hanBMc4k0vP3jekkPqsf1pL/LY4+ma6lv1GNcotiFn8kj5mW4vHJd8PydRCGGHp/6ZkoPkOnqW6NlSKgEVPtmr5oGOiGM71pUTuRolKsm3jWgsLiBjPsUHfG2vWDvRopKHDtHHFeJgfYX45qwHKQeMN/K6vd5zikzI7ldHIch50hWtbiDPjWZqaH57wY2OBgpfuQbv0qkU75emkpZsp4myahuujQXlgKi6YfT5R7gqsr4347mfho1GciabOwlymMLiVBC2D6ktZi8GsExJPhAyAU4yDEKCB9CEupP1AB09AImED1FtkyHKTiod5T/NQtiq02OMt669nwrJN8fQ8wtHN6VFqYxnaPit1qCDMxjKsjk8yHoy74TL7ai0NtfvLjkhsk6EGNK49SiB5rTXFd1fXMIuiIDdtbbUmziglkeLsNnFaihF0NNNwY1oZx0pRVdw2Eg97GRuQy7fxFNExKtlA6QoRLbM5oQtf+sVXkwwG9+jSnCaBXiJ+ets69BnCjBkMInyzl5qLrknRx1N15JQWI= 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)(1800799024)(376014)(366016)(23010399003)(5113699003)(22082099003)(18002099003)(56012099006)(3023799007)(10067099003)(5023799004)(4143699003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MW0zcTQ2Y2ZaUDFvajRmRENhNnBYQmxwSG1nVkhBTkVFTHh0NUd6eTg0eFRL?= =?utf-8?B?VEJVRTYyUVo5aHFDVlJpWGtMMm1TZHNLL0xuUmZJSHJmVis0eFZRVHY5NU1H?= =?utf-8?B?SWxVbXJVUHdVTDE5elRjVVM2VndkakkxbjRMR3labzVheE5mZTNCa1EvM0ZR?= =?utf-8?B?Q2NWakEwWHFPL043L3BrRjZhZldPNS9iVjJpeGw4cHdjSklIUzVJVzI0a0dX?= =?utf-8?B?U2NORGpzMnFOWnBVY1d2STY4QnZ0MnlNd21PUktkWVVneWs4T2ZwTUprYUph?= =?utf-8?B?bjhuVm1EbU44dWU0Z3RSdGppejJSQUtKMERnVkRsRmlBcjZCU29UNzJJamNX?= =?utf-8?B?cWdubnZmdVl3S3k2c3VRN05lUDU0UkxWOXNhQmE5ZXZYZUhrbUNHdkpKeDFU?= =?utf-8?B?aS9FTDlIT0txV0FObFZMK0ZCVEVybDFSTjFRZDlLVktIdWJUdUZ5QzZiRmpw?= =?utf-8?B?ZnY3dGZEOEF6WEZsb2doM1BkMkg5RGlwVi9mUEwyVUw3ajdFL2l0WjBVRzF6?= =?utf-8?B?cGdEMWRDK0VRM014OG5ucUVQeGJ1dElpMEMyQjBVQk1RRlcra3k4c3A3RFJv?= =?utf-8?B?TU51b01SdGl6RGo1eHdoOHVDMURhOGN2akpTVjBVV2FQVDYvek9qQmdMaGxF?= =?utf-8?B?KzIyQjlCb2k0ei93NXhuZ3F5NllmZ1psbkFEdVlnYzJnQzF5Um1Mb1cwVHY5?= =?utf-8?B?WUM1NXA5Tms5MnZadThhcHlldW5XYlFBZDFRbzF0bFhvbm53QkpiTkFtaXRR?= =?utf-8?B?Z3hGWUJQZGVyOXRIZnFlYkhCRXlsT1d1MlMyVWhBQUpoODJZUnNjQWFBRXFl?= =?utf-8?B?TVRKcitjc3hxc0U1ZGhFMm9SVVVjRWc5K1d6VnQrcWxLVmoxeUVzL2EvYmVT?= =?utf-8?B?ZDNCOFcwWk1vR0lMZy9hWFlVSi9mRFhVaUhZS0RncXl6TGNFOXQrNE1YYkFJ?= =?utf-8?B?T1VhbDBvUm81Uy9TZXFjYU9tQ0NPcGRBZWdrRVFGMFZ0RW9hK0MrejQ4OWN4?= =?utf-8?B?dmhWQ2ErRi94V3N6OU9wV0Jub0JkV2p0Z1ZSVkE2Z05kWlAySUJEMzhtZERX?= =?utf-8?B?NnNLLzdmUzk5TVVUYkdzSEFBYnV3bFNSeWg3UU9iQmJ2TThrVDNXQ0hidVRV?= =?utf-8?B?Wi9tUzE4MHNpWmJzdkFnV0h5dlJ6R2kyRVF0R3B0c3Z2VEY4NmN6c2phQWhy?= =?utf-8?B?VGtrUEZyODR5VDEvUEZwOVJYcE5lK0t0ZUppVGduMzRRSXgzK3FDaFAxUGly?= =?utf-8?B?TjBTQ1lPaG1SbVFQUU1ZYS9BUWExNEZmY2thUGZkQTFGOGJuTjVSL0g5c2Uy?= =?utf-8?B?MVlZZE45Mk1RNXVWYldEZEI0T3hnNlQ5ODJ1QXVVVkxFQWU0SGhOVnhncW1J?= =?utf-8?B?cXpwbjI1aGFITVlLZnZyQTdKZGdnMis1VDdnbExxTmI4S0lsRGtCeDk0bkUz?= =?utf-8?B?ZW5tUUVaSExMWlV4enc1eW9QWk5rOWVmRzdOcklWTCtmZlVqZDdUNmxTN0Zh?= =?utf-8?B?WVl5d2svMW44OWdqYSsyL2diTU1wNk5pS1RBTk84VjdNMDBEUzY2TS8zRXRY?= =?utf-8?B?Wmd5ZGIybmU4Rld1clFvQUozcGh3SDJROXlKOFlXU3Rmd2czbThMUDlIUFUy?= =?utf-8?B?OVh3eE9VMjdEcks5ZERTRUlDbDZIdytKaldOaEUydVhzejhSSm1ZOENUcUlJ?= =?utf-8?B?aTBZc2RWMW03bFhiRDRwRW9WMnpiZVVaa1F4RUMrT2N6QnZDczhlSmtWdHh6?= =?utf-8?B?aTg0clMxVmRjUS9MTmpVY2syRWpJakFIeW1EQjFreFp3TDVFVEpFdE1MUmFw?= =?utf-8?B?T0ZhV0hnaG4zNlJwU0ZrcnNSekxQNU8vSVlzbTZVWmtBTDV4ZVVFLzRXZE1U?= =?utf-8?B?WitZeWRybHJ3NFhRb0RyNUgwNTJReUZPcFVRUTJXaHROTzZ6ajNNclBjbzNk?= =?utf-8?B?OXhBL2tPbEVvQWp4Q1dQMzhKYXlsTTFuVHQrVVlNeEpLQ2NVOStvTXF2Mm5m?= =?utf-8?B?eElCN3hxN3QrajJzUGtkK1hhU29xL1dWdkZnZk1VWkJtU2ZKeStDNi84c3JC?= =?utf-8?B?M2U4dlN5SWY4Z0JQaTd5VTNmQ1lsK2MySExjZVhZSUxxM0xuTGpleUVuTG41?= =?utf-8?B?WlF6bm1ZVmMwMVlrb2h3c3B0Mmd3Z2F4RjVJVUtUYWovM21FaUpONlQwNVlo?= =?utf-8?B?UmgwWldqcEVoY2RiMStYNzhRcUVKNEdYRzJHWVRuTFBUMVFXNk5rUU8rVi9Q?= =?utf-8?B?THJTZTBNYVVua0ZaZXpnQTRFTzd0c1dpU05wV2lXUElrcGJPM1Zqall6T3py?= =?utf-8?B?RXVZTzlReFR4NnJxdkYwZ2hBOFVla1NOcGMrU0FnMTY0N0ZRYXJnYjZCSkJl?= =?utf-8?Q?P9FtVzUgbISwSGZ0=3D?= X-Auto-Response-Suppress: DR, OOF, AutoReply X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3eef0670-fb40-48a3-62f8-08df0840d51f X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Sep 2026 15:51:05.7598 (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: MIJ4jOaOjJ99o9/AhOSbXjGqWqQ2B1BEo1Q7ZgzRK9F/0F0B0GOOEQdAhxbO5YfdaYHLu1FeuF7pXE5cmZ2d4x0jgH2q+dBqN/EgEGK6zZ0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR08MB6610 On 8/31/26 6:25 PM, Denis V. Lunev wrote: > From: Denis V. Lunev > > NBD_CMD_CACHE has no coverage anywhere in the tree. Nothing ever > sends it: our own NBD client does not implement the command, and > neither qemu-io nor 'qemu-nbd --list' can issue one, so the only > clients reaching this server path are external ones. > > Add a test driven by libnbd, gated the way nbd-multiconn already is, > and start it with the case the command exists for. The export is a > qcow2 image over a fully written backing file, so a prefetch has > visible work to do. > > Signed-off-by: Denis V. Lunev > CC: Eric Blake > Message-ID: <20260827161002.310688-2-den@openvz.org> > Reviewed-by: Vladimir Sementsov-Ogievskiy > --- > tests/qemu-iotests/tests/nbd-commands | 140 ++++++++++++++++++++++ > tests/qemu-iotests/tests/nbd-commands.out | 5 + > 2 files changed, 145 insertions(+) > create mode 100755 tests/qemu-iotests/tests/nbd-commands > create mode 100644 tests/qemu-iotests/tests/nbd-commands.out > > diff --git a/tests/qemu-iotests/tests/nbd-commands b/tests/qemu-iotests/tests/nbd-commands > new file mode 100755 > index 00000000000..4c1cd33db74 > --- /dev/null > +++ b/tests/qemu-iotests/tests/nbd-commands > @@ -0,0 +1,140 @@ > +#!/usr/bin/env python3 > +# group: rw auto quick > +# > +# Test NBD transmission commands against a qemu NBD export > +# > +# Copyright (C) 2026 Virtuozzo International GmbH > +# > +# SPDX-License-Identifier: GPL-2.0-or-later > + > +import os > +from types import ModuleType > + > +import iotests > +from iotests import qemu_img_create, qemu_img_map, qemu_io > + > + > +base = os.path.join(iotests.test_dir, 'base') > +top = os.path.join(iotests.test_dir, 'top') > +# Larger than the maximum payload size an export can advertise > +size = 64 * 1024 * 1024 > +pattern = 0xa5 > +nbd_sock = os.path.join(iotests.sock_dir, 'nbd_sock') > +nbd_uri = 'nbd+unix:///exp?socket=' + nbd_sock > +nbd: ModuleType > + > +DEPTH_LOCAL = 1 > +DEPTH_BACKING = 2 > + > + > +class TestNbdCommands(iotests.QMPTestCase): > + def setUp(self): > + qemu_img_create('-f', iotests.imgfmt, base, str(size)) > + qemu_io('-c', f'write -P {pattern} 0 {size}', base) > + qemu_img_create('-f', iotests.imgfmt, '-b', base, > + '-F', iotests.imgfmt, top, str(size)) > + > + self.vm = iotests.VM() > + self.vm.launch() > + self.vm.cmd('blockdev-add', { > + 'driver': iotests.imgfmt, > + 'node-name': 'n', > + 'file': {'driver': 'file', 'filename': top}, > + 'backing': { > + 'driver': iotests.imgfmt, > + 'node-name': 'base', > + 'file': {'driver': 'file', 'filename': base}, > + }, > + }) > + self.vm.cmd('nbd-server-start', { > + 'addr': {'type': 'unix', 'data': {'path': nbd_sock}} > + }) > + self.vm.cmd('block-export-add', { > + 'type': 'nbd', > + 'id': 'exp', > + 'node-name': 'n', > + 'name': 'exp', > + 'writable': True, > + 'allocation-depth': True, > + }) > + > + self.h = None > + self.connect() > + > + def tearDown(self): > + self.disconnect() > + self.vm.shutdown() > + for f in (top, base, nbd_sock): > + try: > + os.remove(f) > + except OSError: > + pass > + > + def connect(self, structured=True, extended=True): > + self.disconnect() > + h = nbd.NBD() > + h.set_request_structured_replies(structured) > + h.set_request_extended_headers(extended) > + h.add_meta_context('base:allocation') > + h.add_meta_context('qemu:allocation-depth') > + # Let the server, not libnbd, reject the out of range requests below > + h.set_strict_mode(h.get_strict_mode() & > + ~(nbd.STRICT_BOUNDS | nbd.STRICT_PAYLOAD)) > + h.connect_uri(nbd_uri) > + self.assertEqual(h.get_structured_replies_negotiated(), structured) > + self.assertEqual(h.get_extended_headers_negotiated(), extended) > + self.h = h > + > + def disconnect(self): > + if self.h is not None: > + self.h.shutdown() > + self.h = None > + > + def block_status(self, count=size): > + """Map each meta context in the reply to its list of extents.""" > + reply = {} > + > + def cb(meta, _offset, entries, _err): > + reply.setdefault(meta, []).extend(zip(entries[0::2], > + entries[1::2])) > + > + self.h.block_status(count, 0, cb) > + return reply > + > + def top_extents(self): > + """Which parts of the top image are local, once qemu has let go.""" > + self.disconnect() > + self.vm.shutdown() > + return [(e['start'], e['length'], e['depth']) > + for e in qemu_img_map(top)] This test is broken in our downstream because of commit ce4a1338cf7 ("block/io: copy-on-read: use aio task pool"). The test fails flakily. Namely we get on qemu_img_map(): OK run: {start: 0, length: 33554432, depth: 0, offset: 327680} {start: 33554432, length: 33554432, depth: 1, offset: 33882112} FAIL run: {start: 0, length: 16777216, depth: 0, offset: 17104896} {start: 16777216, length: 16777216, depth: 0, offset: 327680} {start: 33554432, length: 33554432, depth: 1, offset: 33882112} I.e. it's same data, but cluster allocation order is broken. I'll send a follow up fix. Andrey