From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (mail.openvz.org [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 7203380CB2 for ; Tue, 27 Oct 2026 14:25:39 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69REOQqD028568; Tue, 27 Oct 2026 17:24:27 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69REOQqD028568 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="t94mVw9e" Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69REO3J1028507 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Tue, 27 Oct 2026 17:24:04 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69REO3J1028507 Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-3adc5b185bfso4527051a91.3 for ; Tue, 27 Oct 2026 07:24:03 -0700 (PDT) X-Gm-Message-State: AFq9FYKtFcCW1GHretg83/tZluyg0CVhFqyzg1Zkorzlj9K06ogduwz9 qnp7C5SWclswISySbiq0nAsCJqGK6j2ooLHMc5RDpMKD+K2ucOrCLouATfRGq6Bti14Ry6mX4Fe wfxyf7iOiZhIrSJ8A0nRum7Vr5SxsfV9DsDUKn+QGMC973KJhfWneJA== X-Gm-Gg: AYBFou242vl4J2wqsxeVXEgRuE97xStrQ0JeL3r105eq62GEboon2NJ2gaJFueufyMU DLgJ9WYMGYYkEEhRFbP+78efLvxT0efk2z5chDwu5zax2LQ7Gxd/B0g6eTldEzVdYVmnTGrZCFT smgoJPtqTWqOC4n5P/YqEVvQYugGCM/xvzv71GqGtXCZTvBUL6DjLYv9CwI1yhkxBXgWFKFxhAo XAnODDa1ggx3WH7JVDqiioX8QrAm8ojFzZhvxBZ8THBYYs8S0pBSZVG+Lpq9KnmKZJSsOsSKg2x PafmGBnLfqX5x94oYUiUZE3I6L/fqqC54xCAdc5zAZ0lig3hrIg/AzYcgcXUL96tOLjBWqoZtuZ XYKnGGxdpOWvKvMxqm/x6/3q2m9HcKKD0dGYWds8ppcDG3CeXkZH91jqRshOyzkdL7apPrlY1q8 BG413/haKVH2IkumhSUed/Ek0d X-Received: by 2002:a17:90b:2782:b0:3ad:8769:8741 with SMTP id 98e67ed59e1d1-3adea1aec3amr8185393a91.4.1793111042373; Tue, 27 Oct 2026 07:24:02 -0700 (PDT) X-Received: by 2002:a17:90b:2782:b0:3ad:8769:8741 with SMTP id 98e67ed59e1d1-3adea1aec3amr8185367a91.4.1793111041626; Tue, 27 Oct 2026 07:24:01 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1793111041; cv=pass; d=google.com; s=arc-20260327; b=NZKdAUo7C2GkgYF18KrOKE7PfvXQMf4bzFBz0YZmYjE6Tp6CI2tn7Y1VtwuRd8F5up KrAIhEFytOUz1cgVAoesSqfaEyanxW7qpFh749FQcjfximpGMHzG6YG7/M4dcQ9KtW34 bCWvLDg+nA3M9dJGmwRpknkqJYkJYZypWsW+c7ukI2CZJsjf/IxVyU1iDKyVFWTtxd82 y5MJJakW6ViDLvvJWJn5OHLsVoq9nHjL5wdTHCrp7Z5OJBV3JZd220r3eaxGSXJ8ukB8 Pp/10C+GPN2bwiYTDKKZoQTKQygK1eWYFdU7grDg46kPJ2K/KsvozfNxfOS+8P+OjtoX JsmQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=mime-version:cc:to:in-reply-to:references:message-id :content-transfer-encoding:subject:date:from:dkim-signature; bh=0i7BlyDV/M3nqSXmBgGmLSPt5oyFGunOpaeWG5q+iwQ=; fh=y3TfVeQA9QYtIzD5Inxiyys5ebBfyOgjQPZaP/+mSiI=; b=S3bbuGVYK3WeSmiIXa+L2r/RloTaw+WPJ3wwD/MgbuFRUS7vSuIS1JY/im1pY9veJh EKwd5WdOYUm7WBpRYcDNZEzf0a9J/y1gyAng2vci/Hpsv7lk1clDrlJ7+TVGglM5EY81 uiot2EMbIMHtq4QwiMKXbNmxcMLL5ohfllegG3ZKWnJP2YKCuOwW9rdV/iCUJoZcJC46 YNilyzJpEQ29wCJ3XtE7nG5oMan9MH1c6ILQwOI4DXTQZ25GLzM34sz8/CrS66E48KKx LILh5AC+GXtaJUmnKMIfkFcnGEMLvj8JqCYl59v9fRI0a/xGcfKwMr3Ze+Lo/kufREgx C2SA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=t94mVw9e; arc=pass (i=1 spf=pass spfdomain=virtuozzo.com dkim=pass dkdomain=virtuozzo.com dmarc=pass fromdomain=virtuozzo.com); spf=pass (google.com: domain of ptikhomirov@virtuozzo.com designates 2a01:111:f403:c201::3 as permitted sender) smtp.mailfrom=ptikhomirov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazlp170110003.outbound.protection.outlook.com. [2a01:111:f403:c201::3]) by mx.google.com with ESMTPS id 41be03b00d2f7-cd8ccd0fb41si12944089a12.304.2026.10.27.07.24.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2026 07:24:01 -0700 (PDT) Received-SPF: pass (google.com: domain of ptikhomirov@virtuozzo.com designates 2a01:111:f403:c201::3 as permitted sender) client-ip=2a01:111:f403:c201::3; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=t94mVw9e; arc=pass (i=1 spf=pass spfdomain=virtuozzo.com dkim=pass dkdomain=virtuozzo.com dmarc=pass fromdomain=virtuozzo.com); spf=pass (google.com: domain of ptikhomirov@virtuozzo.com designates 2a01:111:f403:c201::3 as permitted sender) smtp.mailfrom=ptikhomirov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Zoir0tnEAr07G+rZuztCJsMt8yKj5Eq556+HVJolRpBz5OjycpvMkaqGU9S+5DJi1CwjN+uEzAGtritF9kdWviPB3wwrdSju+IEGEyWDOvMJInrLtrI7UgMwo/nbqDNN43iNSniXDs2CELd/MM6JoPfVGZ60oZrQAUwSne1gjBiBoWhQYfHp3Yj5tfEpAyovhk2Zv1h5VeNwvmASQuX3GMNvH3/xwTNToVEUhRRPSzAE9MjeM7MK/Z4fOrjIJbVgjpJqjVrLQd1sKNGFrKeKsbF03NXq5JidWmeLBcgRY7tBjTUXLEQ91xOSxakvuFkNTOK/iQDs8op/nBGrj6Rk6Q== 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=0i7BlyDV/M3nqSXmBgGmLSPt5oyFGunOpaeWG5q+iwQ=; b=OcmgbrJJMSUG1S1Q5E12Vmn6w5OjIIfVRxTZYdQMceRLOYa8HTLU++2PJk+mT5UiKfRVQlHsfFXbJhcn1UoSjb1ABdMZnpA+VHxVvMJ73LcW5V3h7Cd066OfgthyHzl7nSZUWhGsxYbf7YcUXXRG5kQnFeE5zMoiIR4NF9clcdNVlRnUiE/foGXgq0hnIvni0qbsMLy+5sV7sCOjf06l1TQ4vCMPhnnV9UwzijcCv1n+F2488NcwQHlOhES5hLSeprVDKB+09IfGQU5PpktfMwbWeYkmtkUKoZUlRD+gM9bCx4ysnQpVk5B0Wq9uuhPHd9HSi4vbZDAP2eTb7bsELA== 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=0i7BlyDV/M3nqSXmBgGmLSPt5oyFGunOpaeWG5q+iwQ=; b=t94mVw9eivgD8oF6zD5HhmWZNk0oJIoxXkAIIWe+t/9fvQMSBM0DuEhL5XIf3zAvHYSdQwyjIfkOUUZsOyw5qLWwJeTILYQQIaJ6c+IfV9jUAPo3lflib96puiTycERBxk+xnOWmcp4T9HI2HGYflW+u6/0rrNk6m7qBG145DPPSy4I3mC8dcnbXMikie+p+tduaD/OiwAevLZ4Sm8+wHcgB1g4CyrDjZTgRF7kOdX7UUO7xkWuGMNeZAEpHMt1qPlSdRHSsmwcNFq1Rf4xBxLZlT7W3kXDtRs10+bkjCFAwh0wnja4Fe0rnV+737rSeU8Le9HeZ8ZUUNJrLAyTYSw== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from AM0PR08MB11804.eurprd08.prod.outlook.com (2603:10a6:20b:747::14) by MIWPR08MB089781.eurprd08.prod.outlook.com (2603:10a6:290:ab::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.22; Tue, 27 Oct 2026 14:23:57 +0000 Received: from AM0PR08MB11804.eurprd08.prod.outlook.com ([fe80::bf46:f137:f6d2:5b3a]) by AM0PR08MB11804.eurprd08.prod.outlook.com ([fe80::bf46:f137:f6d2:5b3a%7]) with mapi id 15.21.0546.021; Tue, 27 Oct 2026 14:23:57 +0000 From: Pavel Tikhomirov Date: Tue, 27 Oct 2026 15:23:53 +0100 Message-Id: <20261027-ptikhomirov-vstor-149268-cbt-account-at-rq-start-v5-6-88dccc74b48b@virtuozzo.com> References: <20261027-ptikhomirov-vstor-149268-cbt-account-at-rq-start-v5-0-88dccc74b48b@virtuozzo.com> In-Reply-To: <20261027-ptikhomirov-vstor-149268-cbt-account-at-rq-start-v5-0-88dccc74b48b@virtuozzo.com> To: Konstantin Khorenko X-Mailer: b4 0.16.0 X-ClientProxiedBy: BE1P281CA0323.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:87::8) To AM0PR08MB11804.eurprd08.prod.outlook.com (2603:10a6:20b:747::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR08MB11804:EE_|MIWPR08MB089781:EE_ X-MS-Office365-Filtering-Correlation-Id: cac999e9-4f1b-456d-8e58-08df3435efe4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|23010399003|366016|10070799003|1800799024|52116014|376014|56012099006|261026140227099003|22082099003|18002099003|10067099003|261021121427099003|261022075727099003|261009223027099003|261022105027099003|261026121527099003|260925021311599003|260925022911599003|260925021911599003; X-Microsoft-Antispam-Message-Info: O3WZe4OkJD6WhJnsExYJpth+ZMHMD0i0xBVtBL9B5Fnv8/vRsULVcJZVQ2IXf98e7EYH9tc+1l+h9ocC/VJFELdqrcSM58VzDGsVeF5qfl1Jw8w9OpV40bg7t/3k3g6TQUH2oxSzrA4gGFoNFvuoWMEzaZUSffXbYzLoKa5h3R0nEexIgYnQ3jt3VsAWdh2DxTDckmWiQnOk76HOwD8sSvrvehQtuqdv0WX4105hpPpUDBxIEt+ofiuMkbabnqYwWvmVYhfPz0GPRZVlWh3t1WmSKINtyul2RtOrXltQ0LwZzqWkYHiHZdjLF+xlOEDoQjMVCvuXpp3MNBgWM9pQthgefqABEVC6r01YS+d09WaIuet25EHzKoWvc0ZpqU0aYlwtbASvY0DcUBghwcpNbwfO9H2emoaFzep/6XwKYlbgwsbJvKOz+wUZgD79Ncj9RI6Yc98EN2wk5irGeTfmCi2+43Wpbet1q77xPvrzdwIMggKZCnQH8AHTWgmo7VcT18R0Atk4ju9AlzH+2kZ/l/avvSSxdwmyy3FLzyD/x905Rf4A85qtJxcpX8RrKNLXk8qQ5SaTFd83QRTjBZU5EOA/zi1MTNhtdfaqtE61MetoXjy8Jn3tRWNNurvhFcBR X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM0PR08MB11804.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(23010399003)(366016)(10070799003)(1800799024)(52116014)(376014)(56012099006)(261026140227099003)(22082099003)(18002099003)(10067099003)(261021121427099003)(261022075727099003)(261009223027099003)(261022105027099003)(261026121527099003)(260925021311599003)(260925022911599003)(260925021911599003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QWs3b1kzZWs0WTZjNkJBeDlibWNScE9iemZpdkcvTU00RTVNc3BucDBrQm5Y?= =?utf-8?B?MHBEOFNkeVh3VXk3bzViaE0vWmpKcHloV2d5NXpiMXU0ZU5ONHJTcFdUS1Rr?= =?utf-8?B?Wlg2SGpsMEVQRlRTS3cxZ3QzbXNhWHJ1KzlCWUp3azFiZVJUS0pIc09sdmdO?= =?utf-8?B?S2dLS0FZbExnS0YvczJnTldBNXhlVklZRER3eEVOMUlPOTMveGRlbzY2VS9v?= =?utf-8?B?WDF0U01yZGViNUYzOTlCdTRQbXdYSmdKSWpVQ1BaSE0ySXRJS0pOQUZSMHdy?= =?utf-8?B?MWNPSWRlWVVxTEdBRGlCS1ljQUtxdDQ4L0VwUDAvcTA5TUZ3M2hlK0RYU1Z6?= =?utf-8?B?Um9GRXE5NWtTVThaUHFIUlVodkE1ZTN5NXZPQWZUenh1RDk4eHljVFcrSTJt?= =?utf-8?B?akNGM0ZXZFBRRlZUQy9WdFBvUDAyZkxzdU5WR3ZSRTlvYXpHQllQb1Fna0tW?= =?utf-8?B?SldvTE5vWFZIeGNDY3cwUG4xQ3kyR3B6UXAxVVpCakYzR1dZMVZvSVZjZXBJ?= =?utf-8?B?TmtOSEwrd1BmNGJMa2V5bFZyZ2cveWVBZmhrTHhhZm5BWTB1TkorU0N1Y2Mw?= =?utf-8?B?T0F4WERVV1B0R3ZXSkEvV2tRMGRpYlVPVlpNU1NBRDNTcVhDam51OEQrK0xI?= =?utf-8?B?Ri9TQUUrcnZNZ2Q3d0pNSXR2UFh2bGdtc2FqR2xWUFhyY0ZqVWxiQWIxUnI5?= =?utf-8?B?Z0lKYm9LWHlGd1RaVTMwNFllMTZMQ2pDSkxQeGxmdXBzTzNXUGxCemJvTzhI?= =?utf-8?B?YWlZMUFTUDJJanZnekNIMjJLc3FVclJGRitlc01XTVY5bjNUNkF0d1dCN3hG?= =?utf-8?B?T0pjaVM4aE5vdmRaYWdEYWErTzkyeXg0UjBVV2xPbFBoUlcrdHVpZHN0WXJu?= =?utf-8?B?LzRFczE2eXZVenNreDY2ckdXcTdWRjZNV1NGM1BYYVE1RHgyTG9qcjFrazJ6?= =?utf-8?B?RDNsRkNKSGtBbitvUVZjV3R6VzVscUM1M3cwM1dPVGVja25QdkUxb0FIWVVs?= =?utf-8?B?TklnTGExUkloL0VtRW5mWU1JMXJzcDl5VjlzY1NtczJSdmFzVjlvVTdkS1Iv?= =?utf-8?B?K0RiVU9jRjd1SHB2UFU2SW1ZQkVEK0pHY2g1ajlLL0tMYnlmMGZYencwRFNh?= =?utf-8?B?UG5zd0pPaWRsZTZqV2J2WEhYZ240OGVMVmZDNW55SzBCdnNUVXQ5RUNqUURo?= =?utf-8?B?RStoN3NBdk9zYkZBaCtHMW0yMm9ocTMzVkRYOUUxNmRXckE1ZHUydzBKUUFN?= =?utf-8?B?YmJRbFJkYUxuS2RBaEhNdWM3V21tU1BmNnlKRDgwWnVrdHplTVE0aHM4ZlBK?= =?utf-8?B?a3hKWHdLTElML2tLdXl5QmtyS1JqUHp0RncrN1ViZkxWSlBPWmNDMmJWWmR4?= =?utf-8?B?T0VNaHVhL1B6KzVuaW9CUW1DS1N4dFZHdjIwR2I4dWhKNUo2b2ZwdTM2Qmkx?= =?utf-8?B?RCtTd2k0bWZCUGVEOHdBMEJBbm5ldmhyK3FWL3ZSK09aYlFLS1k5VnhnWVc5?= =?utf-8?B?RXNnQkE1NC9KWVZOcWRuVjBSdEtVLytRUjdPNVNoUWFLeGIvQVJjY3h4TVVk?= =?utf-8?B?VE93aktmaVNtakZMOWxVeGdQRng1cHUweG1IZFNzNzU4MEs2Zkt2S0FGaUJp?= =?utf-8?B?MkdublJXZUU2QTVXa1BzcXpiTldWWDh2Y0Vpa1djZWVoQ1JibkJoSFVEWjZT?= =?utf-8?B?dFFSWmxEME5kNUdxV2duUGM3RDhiSXV1elRtdVl3WVdSTmN0MkwxcFloekNE?= =?utf-8?B?SHdXTnJTRUFqZHJqUStaajBGazI5N0dGRllzemw2aFdpVmNJSkNPcURGbHhW?= =?utf-8?B?MFNUOEJ6LzlZM0dLYnpIRzhNa1o4ODlWdyttQmNmNWxGaGlZbmo5ejdwYUV3?= =?utf-8?B?c0VVQmgxaFE4T1drS25UNm9ERlc1b25HbkxUakZXY1BjWUF5N05DVWdzYmEy?= =?utf-8?B?TjFORWd1K0hrYy9aWFhEM2FrMG1TMWRjYUhhSjFqVTlTSDVQSUVxbjZlQjFS?= =?utf-8?B?UkxoQVIvWmdFNHJhMTJtaHhQWk5FWUtvcC9uUHJ0NWEyYmpZVFo5ZU82R1FO?= =?utf-8?B?RmFJUGljcVk2V0ZwMEVXbG5tZkFSSXlVL2x0Q245UENndWt2cUFhN1VEcHJh?= =?utf-8?B?UzM3MU1RR0svMGVMcXA3NTRIUmZHTmtUWWJCVTBxMG1WWWxLMVZjZzNBMVhW?= =?utf-8?B?UnFsb2ZjcTVWSHR1b1RGWCtPVkFUdHJjQ3haS3pZbWJBS3kwMnJBUkVCK21p?= =?utf-8?B?TjNsY3BGM2ZadnZBTTBCWHFWQXNRN1JkYnR3cU85UEhlY3YzM2MwOHZSUXdr?= =?utf-8?B?MTBmc1VyTC90ajlLWFJ5amRaSzArSjRQT242dlZOZGwxOHlaLzhjei9NZXdL?= =?utf-8?Q?Efceji+gSv8+J+hOcPFE4+InUgUMqn4pnTZrLX5kR6tTq?= X-MS-Exchange-AntiSpam-MessageData-1: oZrenqg8K2gGghIKTGsuUY/gG/QWjI676A8= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: cac999e9-4f1b-456d-8e58-08df3435efe4 X-MS-Exchange-CrossTenant-AuthSource: AM0PR08MB11804.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2026 14:23:57.3257 (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: KN0GGD4BYd49fdQe8eV8h/fz+h+1+De+pEdtdFeYagXoDcz0oRqbT9t7axrABIjwy5NVRjNxyU3iLkw7hfTnTwl9qZzXODU/wB851UBMKEY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MIWPR08MB089781 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v5 6/6] block/blk-cbt: account a write request also when dm starts it X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org CBT accounts a write at bio submission. dm suspend of request based dm waits only for started requests, so a request submitted before the suspend but dispatched after resume is accounted before a backup point taken under the suspend (BLKCBTSTART, CBT_SNAP_CREATE) while its data lands after it. push_backup then saves the old data, and no incremental backup copies the new one. Account a write again when dm starts it. This runs under the dispatch rcu_read_lock(), so it can't allocate: it sets the bits directly in the bitmap pages, and the allocation of missing pages is now queued to the kblockd workqueue already at submission. If a page is still missing when dm starts the request (the work did not run yet, or the write was submitted before BLKCBTSTART), dm returns BLK_STS_RESOURCE, so that blk-mq dispatches the request again later. https://virtuozzo.atlassian.net/browse/VSTOR-149268 Feature: cbt: changed block tracking (for backup) Signed-off-by: Pavel Tikhomirov --- block/blk-cbt.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++++ drivers/md/dm-rq.c | 3 + include/linux/blkdev.h | 5 ++ 3 files changed, 180 insertions(+) diff --git a/block/blk-cbt.c b/block/blk-cbt.c index 7636602398d1d..50aa0557eb987 100644 --- a/block/blk-cbt.c +++ b/block/blk-cbt.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,10 @@ struct cbt_info { struct page **snp_map; blkcnt_t snp_block_max; + /* Map pages to allocate, see cbt_alloc_work_fn() */ + unsigned long *missing; + struct work_struct alloc_work; + spinlock_t lock; struct list_head list; }; @@ -230,6 +235,82 @@ static int __blk_cbt_set(struct cbt_info *cbt, blkcnt_t block, return (pages_missed && *pages_missed) ? -EAGAIN : 0; } +/* Drop a cbt->count reference, release the cbt if it is dead */ +static void cbt_put(struct cbt_info *cbt) +{ + unsigned long flags; + bool release; + + spin_lock_irqsave(&cbt->lock, flags); + release = !--cbt->count && test_bit(CBT_DEAD, &cbt->flags); + spin_unlock_irqrestore(&cbt->lock, flags); + if (release) + call_srcu(&cbt_srcu, &cbt->rcu, &cbt_release_callback); +} + +/* Allocate the map pages queued in cbt->missing */ +static void cbt_alloc_work_fn(struct work_struct *work) +{ + struct cbt_info *cbt = container_of(work, struct cbt_info, alloc_work); + unsigned long idx; + + for_each_set_bit(idx, cbt->missing, NR_PAGES(cbt->block_max)) { + struct page *page; + + clear_bit(idx, cbt->missing); + if (CBT_PAGE(cbt, idx)) + continue; + + page = alloc_page(GFP_NOIO | __GFP_ZERO); + spin_lock_irq(&cbt->lock); + if (!CBT_PAGE(cbt, idx) && !test_bit(CBT_DEAD, &cbt->flags)) { + if (page) { + cbt->map[idx] = page; + page = NULL; + } else { + set_bit(CBT_ERROR, &cbt->flags); + } + } + spin_unlock_irq(&cbt->lock); + if (page) + __free_page(page); + } + cbt_put(cbt); +} + +static void cbt_queue_alloc(struct cbt_info *cbt, unsigned long idx) +{ + unsigned long flags; + + set_bit(idx, cbt->missing); + spin_lock_irqsave(&cbt->lock, flags); + if (test_bit(CBT_DEAD, &cbt->flags)) { + spin_unlock_irqrestore(&cbt->lock, flags); + return; + } + cbt->count++; + spin_unlock_irqrestore(&cbt->lock, flags); + + /* The queued work drops the reference, or drop it if already queued */ + if (!kblockd_schedule_work(&cbt->alloc_work)) + cbt_put(cbt); +} + +/* Queue the allocation of the missing map pages for [block, block + count) */ +static void cbt_queue_alloc_pages(struct cbt_info *cbt, blkcnt_t block, + blkcnt_t count) +{ + unsigned long idx, last; + + if (unlikely(!count || block + count > cbt->block_max)) + return; + + last = (block + count - 1) / BITS_PER_PAGE; + for (idx = block / BITS_PER_PAGE; idx <= last; idx++) + if (!CBT_PAGE(cbt, idx)) + cbt_queue_alloc(cbt, idx); +} + /* Return true if all the map pages for [block, block + count) are there */ static bool cbt_pages_present(struct cbt_info *cbt, blkcnt_t block, blkcnt_t count) @@ -271,6 +352,8 @@ static bool blk_cbt_add(struct cbt_info *cbt, blkcnt_t start, blkcnt_t len, __blk_cbt_set(cbt, start, len, 1, NULL, NULL); return false; } + /* Queue the allocation early, so blk_cbt_rq_start() finds the pages */ + cbt_queue_alloc_pages(cbt, start, len); ex = get_cpu_ptr(cbt->cache); if (ex->start + ex->len == start) { ex->len += len; @@ -315,6 +398,86 @@ bool blk_cbt_bio_queue(struct request_queue *q, struct bio *bio, bool nowait) return wouldblock; } +/* + * Set the bits of [start, start + len) in the present pages, without + * allocating. Return true if a page is missing, its allocation is queued. + */ +static bool cbt_set_present(struct cbt_info *cbt, blkcnt_t start, blkcnt_t len) +{ + blkcnt_t block, end; + unsigned long flags; + bool missing = false; + + end = DIV_ROUND_UP(start + len, 1UL << cbt->block_bits); + block = start >> cbt->block_bits; + if (unlikely(end > cbt->block_max)) { + set_bit(CBT_ERROR, &cbt->flags); + return false; + } + + while (block < end) { + unsigned long idx = block / BITS_PER_PAGE; + unsigned long off = block & (BITS_PER_PAGE - 1); + unsigned long n = min_t(unsigned long, BITS_PER_PAGE - off, + end - block); + struct page *page = CBT_PAGE(cbt, idx); + + if (page) { + local_irq_save(flags); + spin_lock_page(page); + set_bits(page_address(page), off, n, 1); + unlock_page(page); + local_irq_restore(flags); + } else { + cbt_queue_alloc(cbt, idx); + missing = true; + } + block += n; + } + + return missing; +} + +/* + * Account a write again when request based dm starts it: dm suspend waits + * only for started requests, so one accounted at submission before a + * backup point taken under suspend may still reach the disk after it. + * + * Runs under the dispatch rcu_read_lock() (blk_mq_run_dispatch_ops()), so + * it must not sleep: if a bitmap page is missing, its allocation is queued + * and true is returned, for dm to retry the request later. + */ +bool blk_cbt_rq_start(struct request *rq) +{ + struct request_queue *q = rq->q; + struct cbt_info *cbt; + struct bio *bio; + bool retry = false; + int idx; + + if (likely(list_empty(&q->cbt_list))) + return false; + if (rq_data_dir(rq) == READ || blk_rq_is_passthrough(rq)) + return false; + + idx = srcu_read_lock(&cbt_srcu); + list_for_each_entry_srcu(cbt, &q->cbt_list, list, + srcu_read_lock_held(&cbt_srcu)) { + if (unlikely(test_bit(CBT_ERROR, &cbt->flags))) + continue; + __rq_for_each_bio(bio, rq) { + if (bio->bi_iter.bi_size && + cbt_set_present(cbt, bio->bi_iter.bi_sector << 9, + bio->bi_iter.bi_size)) + retry = true; + } + } + srcu_read_unlock(&cbt_srcu, idx); + + return retry; +} +EXPORT_SYMBOL_GPL(blk_cbt_rq_start); + static struct cbt_info *do_cbt_alloc(struct request_queue *q, __u8 *name, loff_t size, loff_t blocksize) { @@ -337,8 +500,16 @@ static struct cbt_info *do_cbt_alloc(struct request_queue *q, __u8 *name, goto err_pcpu; memset(cbt->map, 0, NR_PAGES(cbt->block_max) * sizeof(void*)); + + cbt->missing = bitmap_zalloc(NR_PAGES(cbt->block_max), GFP_KERNEL); + if (!cbt->missing) + goto err_map; + INIT_WORK(&cbt->alloc_work, cbt_alloc_work_fn); + cbt->queue = q; return cbt; +err_map: + vfree(cbt->map); err_pcpu: free_percpu(cbt->cache); err_cbt: @@ -720,6 +891,7 @@ static void cbt_release_callback(struct rcu_head *head) free_map(cbt->snp_map, nr_pages); } + bitmap_free(cbt->missing); free_percpu(cbt->cache); kfree(cbt); } diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c index 20f495bf5399d..5a8cd59ec257f 100644 --- a/drivers/md/dm-rq.c +++ b/drivers/md/dm-rq.c @@ -522,6 +522,9 @@ static blk_status_t dm_mq_queue_rq(struct blk_mq_hw_ctx *hctx, if (ti->type->busy && ti->type->busy(ti)) return BLK_STS_RESOURCE; + if (blk_cbt_rq_start(rq)) + return BLK_STS_RESOURCE; + dm_start_request(md, rq); /* Init tio using md established in .init_request */ diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 885555f480462..9698a582356a9 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1628,6 +1628,7 @@ extern void blk_cbt_update_size(struct block_device *bdev); extern void blk_cbt_release(struct request_queue *q); extern bool blk_cbt_bio_queue(struct request_queue *q, struct bio *bio, bool nowait); +extern bool blk_cbt_rq_start(struct request *rq); extern int blk_cbt_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg); #else /* CONFIG_BLK_DEV_CBT */ static inline void blk_cbt_update_size(struct block_device *bdev) @@ -1641,6 +1642,10 @@ static inline bool blk_cbt_bio_queue(struct request_queue *q, struct bio *bio, { return false; } +static inline bool blk_cbt_rq_start(struct request *rq) +{ + return false; +} static inline int blk_cbt_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) { -- 2.55.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel