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 F285C8017D for ; Tue, 27 Oct 2026 09:38:08 +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 69R9aolR023495; Tue, 27 Oct 2026 12:36:51 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69R9aolR023495 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="hq3QlXbj" Received: from mail-yw1-f200.google.com (mail-yw1-f200.google.com [209.85.128.200]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 69R9amgC023491 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Tue, 27 Oct 2026 12:36:49 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 69R9amgC023491 Received: by mail-yw1-f200.google.com with SMTP id 00721157ae682-86c3a053d9bso59363277b3.0 for ; Tue, 27 Oct 2026 02:36:49 -0700 (PDT) X-Gm-Message-State: AFq9FYJlGSTqMxQf+J/KGvHFT82xXv6fM7W0D3MG61wEm+hZnW7Kwr4x jKoLfrmno6jeed3yZANB28Q560A/PMErc+MfjS5lBkMxUAsvNdXEtHyDCYBgrpAI+ehR8e9PFg9 dnDlBrwaHtz6fowcr8vWOnW24yZBp+0s6xzuaMsS0gF5V1v0FtdJe1w== X-Gm-Gg: AYBFou0MlcaaZWDLs6ZMYxYpNkJFID8i8tJzZpFUNP7/CKuot85Kq8eQ4oBE8PUWnoo 4fr8AUHDlKW8A4eJmQGvvN3TStOe/5JWAYLZgWuDT/DB4THylu+CN8m6cCPm4GwsKFwxds9zVoW hhUAK89dlwe51CX920NQ8ViCFBCzgOoW1qt/EQ4n0bTYRKtDTJwGrhffCbJzPCJ6afaWGvPRxws Ad6SQJ7n+ASWNYnADUSW2z3TvtHUS4ZTjvLP0v0sPd/iGG5U9oSWBQctpmSPsdXp3pZ5Mc95Jt7 qEUgroAmIFQL3ucVg2wJX+UWCAb0W4Ia+RQ4uMccW2kPCZgX5A/sYf7hiSLmvjA9KU4zINua/9X 4dbuueO13c3H+YHE5CpyE+IfqLLCO7jHNNp+PJKBVD+CX8jHj1pNMdGpYHjXLe+pvTAh6WBjNNv 44Ee1sf2zQXqe0+l6JUM6QJo9lEnCS X-Received: by 2002:a05:690c:e191:20b0:8b1:60a1:cd3c with SMTP id 00721157ae682-8b166c40101mr50369817b3.41.1793093808291; Tue, 27 Oct 2026 02:36:48 -0700 (PDT) X-Received: by 2002:a05:690c:e191:20b0:8b1:60a1:cd3c with SMTP id 00721157ae682-8b166c40101mr50369647b3.41.1793093807605; Tue, 27 Oct 2026 02:36:47 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1793093807; cv=pass; d=google.com; s=arc-20260327; b=k95C32kDBZCq4lBCUi0u/oSdFtoolgYzAAIlJvTjiUJjwywehNMHC4qFT+qDHJOa0/ TEHLDLYGAzGMbb94lpO+EFiaR9lkJv2eQFU+H3VfDyqI46bCW7oc9UDJZl529DqpjgTq 4vu9W4iKJJMlH25VSn+060WsI1KP3hnC274ElPZ0oC2ZvCEJL2lxAGznDb5juCFLiZlS XT2E0ED3b33TRdJWOmWanKIFK+BbnIxLgGMze+Vw19zG7e046gmiEHGe6ZvK6NbnjhDn 4gyPeKnvttRe5vraN8ZGPXf46zcoY3YuWpINFxABxKxL6jdXtMDFcAfJTb3KcxE4nwML 8XEg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=mime-version:cc:to:message-id:content-transfer-encoding:subject :date:from:dkim-signature; bh=j/xpeOkQneANj8d3BgHKMmibx5d8cu+iKc1KjTEJY+A=; fh=y3TfVeQA9QYtIzD5Inxiyys5ebBfyOgjQPZaP/+mSiI=; b=CtxjF7KW2HF2MPgo6DVmEbrbQSrSxmscTwOasaivVAjzMMpKQ5eXoaSxqhUs0896+m cCuJPdJBZhzoODUzhBJV2/F3jgXRrbvhr82S+Rh6h5kR+gvc7aDVl9DEvA9JeUB+acYl NPnvCOo2k5e5onmar0iGJfXaPaRbjzuszcbtGJFhZU2SLoT8I4k/Udvfi6E8jLhviWJa YkSMu3HX+GGLq0wIWdtgNzW/B6LZXBOuih6cZOgAL+Ti9B2C8pdWoK67JYDNMX+BIfc4 IHqH6jkLCm1C19SEAM5rx818kQ2/1Bth8I+DU4LFOVrM6FNroSZcLLOFtkkJQkFgMwMU +6Hg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=hq3QlXbj; 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:c200::1 as permitted sender) smtp.mailfrom=ptikhomirov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazlp170100001.outbound.protection.outlook.com. [2a01:111:f403:c200::1]) by mx.google.com with ESMTPS id 00721157ae682-8b19e5e8232si13088547b3.91.2026.10.27.02.36.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Oct 2026 02:36:47 -0700 (PDT) Received-SPF: pass (google.com: domain of ptikhomirov@virtuozzo.com designates 2a01:111:f403:c200::1 as permitted sender) client-ip=2a01:111:f403:c200::1; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=hq3QlXbj; 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:c200::1 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=qE3kFIQx19TjNyv+zMH8YVDuCbhItr4kDZ8fVXp/KlvFHc2Yel7xNGeL9KSh0XDCU/z3wHu961uQjkSEq0ZtYrjdA0laIJs5FCJZfpdptamlZ1Cz4p+W7fw0CBSFkyStnvDSNxI7aQkQyzgXsNZU4hq+Dd1spIvFhGmJod45g+ZsVkDZofAEQk/CFisgPuTzku4Aff0tGI9/9JyO6urmZLFboxt7vVL823mXpcC7OOnLooEPXVHn7ESeMFMaIYyU0Yf5VIcuS6D0hkat0q6r9iw+rEOSZNoDbz2OhHzI0qkgd+n5mjy/4fkljAUWpVlo1iPCKEAdEZ+eYratSNWPaA== 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=j/xpeOkQneANj8d3BgHKMmibx5d8cu+iKc1KjTEJY+A=; b=zM2TY7ZQQB+/A0/LhaajEPuGD2wfPcqY5PWyg1nGbrAbjkZdEzzyRJlqXDMb+ZTb9d/4y0EQ8r1YQ1OukwZSceXuGE+sycMR5ABbG5VGzjXAfJ6ngdx2unNcHfHBYAyXg94hRrTSIKPWY1tM2uYesLW2Ab1K39VEXseRHSnLnMDsHm/aAUHEIAwtMRfsgSdRbKpPBwRDc/H3sU465C3KeQB/lGCF4SIHzxxW/D372WavDVfhkPDBWAKPmnJbHsvUQcL9bEIayBO+tZ9aXYFg2Z0GudFKN9Upwny/qVNTUINAgXxqUlWxw7diMWmmkQsXsr9YUy0MgxZT3iDPWNdwFg== 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=j/xpeOkQneANj8d3BgHKMmibx5d8cu+iKc1KjTEJY+A=; b=hq3QlXbjGBA6gnJzqJrnVilEmdx5D89X0o4Ag6W5B9Hjv2b02edJVQ0C605LJTGYI0xTFBdraBtueHfmPNpd4ACQMx780WD3QYe15zTyvTqLskDQl5W9kNIDYblrxtQ3I9pfxTmW2CrPPwJZyIE0uip9rFw9dcWQsTahryHlxwKK/4Oy4fKMMzwUPN/N4JzQj+r6Du3XgxX9dNexpbE/HoCCWYHd2ky3CCBuubCVOGJUt08dNt6F3kI2wyB1PibO5naL3CsSNdqCvxfiChTjWYJ9SLTwFBXpDNjVjQntVDRHwsj0zUMYDDuTbXQwOrYQQsYhJ5dIV+6v1XyTeUqSyg== 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 GV1PR08MB7730.eurprd08.prod.outlook.com (2603:10a6:150:51::7) 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 09:36:42 +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 09:36:42 +0000 From: Pavel Tikhomirov Date: Tue, 27 Oct 2026 10:36:32 +0100 Message-Id: <20261027-ptikhomirov-vstor-149268-cbt-account-at-rq-start-v2-1-c64ee6178730@virtuozzo.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/52O0Q6CMAxFf4X02Ro6laBP/ofxYdTpqpHhNhaF8 O8O/APTh/am7b1nhGC8mACHYgRvkgRxbRZqVQBb3d4MyiVrUKWqqKQKuygP657iXcIUovNI272 qauQmomZ2fZt7RP/CELXP826v+KpKKrWGbNt5c5X3EnkCy4L1muD8W4S+uRuOc+B8amUO+Cxwi ZaH/zkSYa4M0tCOthu6HJP42LthcGt2TzhP0/QFW6Atww8BAAA= X-Change-ID: 20261016-ptikhomirov-vstor-149268-cbt-account-at-rq-start-a592cf2010aa To: Konstantin Khorenko X-Mailer: b4 0.16.0 X-ClientProxiedBy: BE1P281CA0073.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:26::18) To AM0PR08MB11804.eurprd08.prod.outlook.com (2603:10a6:20b:747::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM0PR08MB11804:EE_|GV1PR08MB7730:EE_ X-MS-Office365-Filtering-Correlation-Id: 0174b94f-cf80-4b69-f6f2-08df340dcf34 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|52116014|23010399003|366016|376014|10070799003|1800799024|18002099003|261026121527099003|13003099007|56012099006|261022075727099003|261021123027099003|10067099003|261009223027099003|261022105027099003|261021121427099003|261026140227099003; X-Microsoft-Antispam-Message-Info: Tke2oRQ+zAwE0RJnP+XhpX/dfiAvAYCnV47IPyY6SK+OGeJcdeblS8kZDBQ9z9/vnS9IorzDwE1YBKRiBSa6ZdoHYDyuhQKbWsXjqJD39RzmnP+EmmIddsAxewfhBvjTpf7hbBsKVZ4Ts0I27/vnTWo0l/Uh3ZlMQopo9kPRMUmPw/90af+fRYyuVPq9UNrl0nR56G9Q/+QBGgiJaj7rcirmDoUOdR7trd3wsAJHeU9lX6J5uup87xdgDB2cxbR+24sYaOHX0bWWgE7ylJz8Err5KMCWuO5P95tXaqoIMYe95iovv1OLa0Dlpje0q55xdKF+88Z0aCJCkLFMocB6kPqC5iiSZnDJoXVYVPfuvtvTDJ0ZLaLBntXtXp5PvXACDFq6q6v+OM9HL2ba7uk8opLYPzeuKBX2FwRAGBMpOJHpiJiecTVg0jNxKi1FkLCNrVYe/Fu4ubQOjwzflNcK/fSHRnmG0anmXiqspbWged91STi79INXR1MAeVWQrJZbNFHxGnVxbLhYe0JOHh9O0wBfHO6B6JOqK4j5DF6sX3q2WWR2qjUqs++4XYHwhwUvuAlKqGORWB3U9iXD/uN5oU27wCUFZaTjjom6VrowtXrpscoQCZZjYX3ugyLKjcGn 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)(52116014)(23010399003)(366016)(376014)(10070799003)(1800799024)(18002099003)(261026121527099003)(13003099007)(56012099006)(261022075727099003)(261021123027099003)(10067099003)(261009223027099003)(261022105027099003)(261021121427099003)(261026140227099003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?S3hqaFJ3QndVODlpRHM4THdyQ2xpTVFndnQ3bGVBTUdCcjhObWpjMHBMVVZB?= =?utf-8?B?OU9xNXhyMjVQVDEvZHpJWlUxUWlQc3Z0bWNQQnRPSjkwK1pEajhSMmVGYXlW?= =?utf-8?B?Ynh5RFJqck9xUEhGQytMam9XRmJhTlBrQWRWb0Ywc2JFVjhrMmtqVG5acnhj?= =?utf-8?B?WE43VzdUNnZla2ozM0kzZlREdFVuOGpjUklzRlVnaTNtUzZVWkt6ZU5uWFFV?= =?utf-8?B?bjVITWxBSHE3SHExVHVTR2pDcDNjZHhRTXVkZ1lUVjRoTGxaaXBUalBjVU16?= =?utf-8?B?ckZJZ3dqL05lVTVVbmhYU2xsVGszS0hWN0UrVDM4TjVndUFJMVV2VjBTNHNo?= =?utf-8?B?UnRlSXQxZVVKSUVwMmpQdjVRcVpKZktvdEszYW92ajl2c1pIbFIzL2tQem9C?= =?utf-8?B?VmlOQStERS9jT1UxY1hYeHpCNnIyVjFJTmljSWNWUVpSK0NWTFlxWklhWlVC?= =?utf-8?B?UVBsNE43R3lzaERWbGcrZWN6ME1VOS85dEtKaUxTY3ZCL2JUNk8zQThUZjY2?= =?utf-8?B?cmN4dXNvcHlBZGZNcEh3L1RWTkhYUEgxQzhzS2w4T3hibUFRbnRFSXQzMFVm?= =?utf-8?B?ZWFaa1M2bk40OVoya2s4LzIzQjJGWGhvRHRRMVBJU05lWkFhVXllYlN3dFkw?= =?utf-8?B?ZEpuSzl0QUh2WUpVaDlNTHhPNEpQUkNuaUpmVG02emJocEo0T2IxdlpBdFR1?= =?utf-8?B?SktTakcvZFNkN09QRmJLaW5qRDB5U1VvZFh2eGJITjk3QnlvMTM1V0Z3U0kz?= =?utf-8?B?UDhRQmloUGtqWWszdXIrSUN0ZUlxM2J6cHRab3hXS2V1U2hjSFNWOGUzZkMw?= =?utf-8?B?TFlVZGV2anQ3eVVWcEFmNFpsZDk0S3lYTHQ4Wm1KbnlaV01mcE40WnRMcEdo?= =?utf-8?B?ZlpZQXNFeVV0UU1pRHBpenNvU25hZ0dzd1hEUDVidkZvWWN6emxYdGpCcmxN?= =?utf-8?B?R3VYbFdRMENIeWFYVlhCa2N1UmV5QTRZdUFaU3NDcDBhQlg0cXkvSWd5QWll?= =?utf-8?B?SUxwRDFYVEZ2Z29wRjkrbFcvcS96ek9BdE52N3N3bUtzbDhML0pUUEwyTEht?= =?utf-8?B?QUVKVE5Vbk1UcVlkN2R1bEtCS2VOei96VDUvdk1kTnZKY2lOZkZxQmt2bjZS?= =?utf-8?B?UENBSEh5dmdtZElPa2pBUlRob2EvY2JvcmhZeURIZ213V1N5NWtvVWZBdTln?= =?utf-8?B?eGdvcnZSRmYxS0VLb2lML0VHR1NSYTF4SStpbEN2SGsycTRFbHFMOTRYTndK?= =?utf-8?B?bGdqUnZOb2UxUFVnV0VONXVoZForWlE1MmROdUdRblVRWlczbzNIMExXbmpT?= =?utf-8?B?SWJ4N1BReEJjVzRiSzVmcGdoS2t6R0J0blg2ZjREWXEyelBlYTdFV2hVdEk5?= =?utf-8?B?bER5c2pIbTdNY0tZby9RY1cybTlFcDJVV2NVMVYzSEtQSGxkWThETzBxalE5?= =?utf-8?B?MTVDZ1o4WFlDSjZzSFkxK1RCZmlpRkZJNUl4T2JHY3RINnAwbng0UG82K01X?= =?utf-8?B?Ky9lNnZPZUtlS2IzazIzYzQ2Z1pPL01naDkrRGZBWk9oZmZWcEJhMmpGVERq?= =?utf-8?B?V3VCZnkyN25pQWJxWkQzQkNCUWRML1VGVnVsSnJoSFJRaWxydHNSd3FTTGxs?= =?utf-8?B?dUtkalJ5R2hwM0phMjViOWkrTitlWHJ5bjZ1NzQycVFzTjg1ZW9zclJlRGFt?= =?utf-8?B?QjJ2RE9GRFlRU2VoVTMxVVpTQ2hDYzlNU0I0TVVmeGVwZE82Y3ZXQlZPQ3ky?= =?utf-8?B?aGpJRTQ0dS8rU096U3FsYjBLcmZmZWdtWEtUUFltQzRYOVk2M3dyTFp4Lzl0?= =?utf-8?B?MldqUWJNQUlaQkQvaDFhbjBKK1U5NDAxR0xaWldIb3ZZYVJCZUplTjZVbzh1?= =?utf-8?B?RGhscjVsUzZIWDQyeERSOFMyVjh0L0p5V3lpeEtveU9GSHRnSVJ1cEc0SFhD?= =?utf-8?B?NHdScWRYUHB5eXN1bWp3endJUU1OME40bmNVUUp3b2FCTk1nUE9KamxPTjYw?= =?utf-8?B?TzBGWUl6R2JqQ1FUUE00L3k5ajFzWWt3T2Q0OWxnRUlLWlU1TE9lYThRMVhi?= =?utf-8?B?Z0puZG9vdk5iL21pM1pKU1JPWnZqc2NEUDVTVGxtS2VRMHlTK3hXNFRJTkRj?= =?utf-8?B?eUM0MDVTQUJyaTNILzQzaGw0RjRuYzZxbjBUamt1UlI2KzlNY0lJWHV4VVo2?= =?utf-8?B?WS9vdVFqTmpRTzJLakZlUFpSN2dEYkJKVHBOK3laMlEwb2ZnMDMrb05pTGls?= =?utf-8?B?WVpmZk8vck5pcnRkakNtWFo2SHRrK1o0TjQwcWdRSi9GVFFnZExPaE5VUUln?= =?utf-8?B?Q1RTMkh0dCsxRmswVE1VNUJtLzd1V3YwUVlhbmc2SjRCb2xHcXJ3a1NWUVhE?= =?utf-8?Q?dc54bJVVPar6yLt0Mi/SA3EIxH638ZispIWCqU+F4AUp7?= X-MS-Exchange-AntiSpam-MessageData-1: 42feJoV0tjuKRDdr88xW11CnYMbbzcJwvUA= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0174b94f-cf80-4b69-f6f2-08df340dcf34 X-MS-Exchange-CrossTenant-AuthSource: AM0PR08MB11804.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2026 09:36:42.6341 (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: 0EwCaCGHwx9+mUQjBlAPGfBMCEwXCqCLn2PIhLqX1itVUqMsnEaRgyaSbxgJJol2ORdBh2DVVyv5bjRAgNEjwu4yqPtkLcH5BUwu1mnvYNY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB7730 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v2] 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, which are now allocated already at submission. A page can still be missing only for a write submitted before BLKCBTSTART, then dm returns BLK_STS_RESOURCE, so that blk-mq dispatches the request again later, and the page is allocated from the kblockd workqueue. https://virtuozzo.atlassian.net/browse/VSTOR-149268 Feature: cbt: changed block tracking (for backup) Signed-off-by: Pavel Tikhomirov --- Fix CBT missing writes that request-based dm holds across a suspend, which made incremental backups taken with ploop-backup silently lose data. Claude tested full and incremental ploop-backup under write load (a random writer, and fio with 4 jobs x iodepth 64): the incremental backup lost blocks without the fix, and was consistent 10/10 with it. CBT start/stop and device resize under fio ran without warnings. https://virtuozzo.atlassian.net/browse/VSTOR-149268 --- Changes in v2: - No GFP_ATOMIC allocation at dispatch: bitmap pages are now allocated at bio submission, and the dispatch hook only sets bits in present pages. - A page missing at dispatch (a write submitted before BLKCBTSTART) is allocated with GFP_NOIO from the kblockd workqueue, and dm-rq returns BLK_STS_RESOURCE so that blk-mq dispatches the request again later, instead of setting CBT_ERROR when an atomic allocation fails. - Move the hook from dm_start_request() to dm_mq_queue_rq(), before the request is started, so that it can return BLK_STS_RESOURCE. - Link to v1: http://lore.virtuozzo.com/20261016-ptikhomirov-vstor-149268-cbt-account-at-rq-start-v1-1-1f20b151431d@virtuozzo.com --- block/blk-cbt.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++ drivers/md/dm-rq.c | 3 + include/linux/blkdev.h | 5 ++ 3 files changed, 185 insertions(+) diff --git a/block/blk-cbt.c b/block/blk-cbt.c index 90219f58f1ae5..30252027c4578 100644 --- a/block/blk-cbt.c +++ b/block/blk-cbt.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -52,6 +53,10 @@ struct cbt_info { struct page **snp_map; blkcnt_t snp_block_max; + /* Map pages blk_cbt_rq_start() found missing, see cbt_alloc_work_fn() */ + unsigned long *missing; + struct work_struct alloc_work; + spinlock_t lock; struct list_head list; }; @@ -221,6 +226,24 @@ static int __blk_cbt_set(struct cbt_info *cbt, blkcnt_t block, return (pages_missed && *pages_missed) ? -EAGAIN : 0; } +/* Allocate the missing map pages for blocks [block, block + count) */ +static void cbt_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++) { + struct cbt_info *c = cbt; + + if (!CBT_PAGE(cbt, idx) && cbt_page_alloc(&c, idx, 1)) + return; + } +} + static void blk_cbt_add(struct cbt_info *cbt, blkcnt_t start, blkcnt_t len) { struct cbt_extent *ex; @@ -236,6 +259,12 @@ static void blk_cbt_add(struct cbt_info *cbt, blkcnt_t start, blkcnt_t len) __blk_cbt_set(cbt, start, len, 1, 1, NULL, NULL); return; } + /* + * Preallocate the pages for blk_cbt_rq_start(): it runs under the + * dispatch rcu_read_lock(), and a missing page there means delaying + * the request and allocating the page from the kblockd workqueue. + */ + cbt_alloc_pages(cbt, start, len); ex = get_cpu_ptr(cbt->cache); if (ex->start + ex->len == start) { ex->len += len; @@ -266,6 +295,145 @@ void blk_cbt_bio_queue(struct request_queue *q, struct bio *bio) rcu_read_unlock(); } +/* 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_rcu(&cbt->rcu, &cbt_release_callback); +} + +/* Allocate the map pages blk_cbt_rq_start() found 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); +} + +/* + * 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, 1 << 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; + + if (likely(list_empty(&q->cbt_list))) + return false; + if (rq_data_dir(rq) == READ || blk_rq_is_passthrough(rq)) + return false; + + rcu_read_lock(); + list_for_each_entry_rcu(cbt, &q->cbt_list, list) { + 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; + } + } + rcu_read_unlock(); + + 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) { @@ -288,8 +456,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: @@ -671,6 +847,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 1284bb0e4ebc0..d76a0c9be28f0 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1627,6 +1627,7 @@ static inline bool blk_crypto_register(struct blk_crypto_profile *profile, extern void blk_cbt_update_size(struct block_device *bdev); extern void blk_cbt_release(struct request_queue *q); extern void blk_cbt_bio_queue(struct request_queue *q, struct bio *bio); +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) @@ -1638,6 +1639,10 @@ static inline void blk_cbt_release(struct request_queue *q) static inline void blk_cbt_bio_queue(struct request_queue *q, struct bio *bio) { } +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) { --- base-commit: f5d1fdcfffe101fe2bafa7df09d95d2e811c5c5e change-id: 20261016-ptikhomirov-vstor-149268-cbt-account-at-rq-start-a592cf2010aa Best regards, -- Pavel Tikhomirov _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel