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 9A10C8045D for ; Tue, 3 Nov 2026 07:09:21 +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 6A3774TA001621; Tue, 3 Nov 2026 10:07:05 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A3774TA001621 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="wWC6P5iq" Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A3771gf001617 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Tue, 3 Nov 2026 10:07:02 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A3771gf001617 Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cd652c0385bso2053476a12.2 for ; Mon, 02 Nov 2026 23:07:02 -0800 (PST) X-Gm-Message-State: APuU4Z8Cz1lHUb3U2yPnolf5bPjy5GH5VK9HIrD1x42Yu6YpXMY5ShWw jV9BJt4x/djv7ys54IxbMCdJPNahoOkR+MBVmdna54xpQCCES5Kjl6+GdcjtHMZRVMKjatiTtSm eVs0mLOldY8nDONKMkuOSCcXEkg0itubvVMrDXfNzCteIsNddaMgs1A== X-Gm-Gg: AYBFou1karxch8Io09GxPGaA2g2TGYZT+T7pEYQxUsxdSD0oBn5Nrt/U196dN0P2pCs pbKx/NGZV+HZ30tliBPUwkq6pr/t4OT+BsA+YWgrjMmbtCfF10mobTpzTXvaz3AUUph2PznemrO XnEv7mL8310Aqqx7WJASFhmffUpsxvONWrNsDBh3RIO3EaUJGw4mIGlgoG9bnBbX+VEkK6qgBgq bihHC3MrKFeqgFgRmnKrLFG3PMPseHGziqtm1aDNLV4UeMPskHaWg9J3c7UIFg6swawUEXZMJXl kxAQfNwp5gRslwrRh70f5fiQzQK5N3xLg8DecMxT6cMZDg40MXvQfw1YmTs9nTKuXIIHAFtBZGy y/vuGfoQUKw7s8UIxytKmRi8hhtf7TZ0UObL6RsoD0Z45xDXla5kKhnazPO3wHX8k7F8gOBxHeI VecfkiUy7nDWUDhbhcBGbmSq7/PRl/JWoD X-Received: by 2002:a05:6a21:6f11:b0:3e2:200b:dc1f with SMTP id adf61e73a8af0-3e928f72ebemr11270364637.74.1793689620843; Mon, 02 Nov 2026 23:07:00 -0800 (PST) X-Received: by 2002:a05:6a21:6f11:b0:3e2:200b:dc1f with SMTP id adf61e73a8af0-3e928f72ebemr11270338637.74.1793689619978; Mon, 02 Nov 2026 23:06:59 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1793689619; cv=pass; d=google.com; s=arc-20260327; b=azV4dCZfXmLk/42vrvTQbPje9uSos1m8przGsA8J3UL2YiGjHcDUkalFXrZzTrJxbH 3CXUgnx4wf5RswboII1G36ivFAkMSwQYTVL3DyqhVN7uk2nVIfN5Tvv0i7+9dd3CTiCQ uXEhDeUtTEfWZBASUN47zXqi4FSdg/WcthiNazE1HsAhg8x3sYOqNSnjv5uReH2fuVbL 8Ok7ydcGE6odlmVK80M5V1X0OG3zreL8nSQqY2YWFfScvurc32TFMqfTUXSMlWpQeKR6 qllXkCQ08Sbwq19zXsIvzIChpHF1ONHOeGoSPZrFnsDN83P5U2Lz0+4frpM4OFtosfWy SFlQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=mime-version:content-transfer-encoding:in-reply-to:from :content-language:references:cc:to:subject:user-agent:date :message-id:dkim-signature; bh=x8nBHmNxPK19/0guw1+CyZiLj9YjO54SydWAXIrDVHI=; fh=WX7lnLkMzOeCuhMZy9SAw9z6BeNHgGrBCGbuEYJyu08=; b=BwCiocXEwTNwrGVLR2vmREfHxbUmzfOg7RlVxCKepI3OuoYndWSJ2S8eZPwdjTB7n7 NqeSC/oBpUAVqeSR4SUcZLyn+RVh/g+I9h4DIu/tanq0xpw2HKC9GlBW0d9BjMCCUkS1 eV7zFgE9aHs1BaLC3dRdLB7yksQJN7bCe2+Niyz3uYVIGWvtCU9/xmezVNixPpI1uLaJ jEmm8xnpK3XRlSyRvuNSNJLvhiebPGqCx/z84ISmfWGjc3V4OUOOdlH+R2ut0se+jLA0 FBY1r006Oj2m4Qjm5LhmnH7DTj4kCMrT238XZ7Zeqpc6bLjQg7n0kGQgMrkhvYUU1Eqr vqAA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=wWC6P5iq; 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 alexander.ivanov@virtuozzo.com designates 2a01:111:f403:c200::5 as permitted sender) smtp.mailfrom=alexander.ivanov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazlp170120005.outbound.protection.outlook.com. [2a01:111:f403:c200::5]) by mx.google.com with ESMTPS id 41be03b00d2f7-cdb36558a20si2483600a12.395.2026.11.02.23.06.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Nov 2026 23:06:59 -0800 (PST) Received-SPF: pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 2a01:111:f403:c200::5 as permitted sender) client-ip=2a01:111:f403:c200::5; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=selector2 header.b=wWC6P5iq; 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 alexander.ivanov@virtuozzo.com designates 2a01:111:f403:c200::5 as permitted sender) smtp.mailfrom=alexander.ivanov@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=f1YVY5ftks/mmHB2kwi7e+hhjrESpyjkwDHBlOxeE0VALEdmjnnCJnGivpmYQSW8uW+UNrgLDVBqoU+mfT372JbfBnDqMwbrtFoxtlRrQzLqTlAtg30sR1n6U87G5kHb+63lTPf8f8c2JZCaCyDW7DCLVWB4Kh4SQjiAFWOBlRkIS37AidZ1dTsXPXXYSaXk8keDmNE2I1RVUXZkOHgq9LIp3mDIwUKjQmnDrqCCI/IgoX3ekXh1H6ixejkKy/NcBv/RRb1l3whSTYrUOLf62NnCPgKQFVrnNlRc0/D8xMgpU/ahUcWh6rm4D/9ZW6KSB9grI0EDYykldzB/Wk+pgA== 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=x8nBHmNxPK19/0guw1+CyZiLj9YjO54SydWAXIrDVHI=; b=u+ESRPjJ98Js56dCFdhCqrN7+1/Ye6e+8mIncLTOkQwam6XV70YkwjAZ0JidFkOr9kq0QuqNsC6/fR4TKtBaQDIQUNH0azRsc9udrjgWrwAdmUMFR2IyRfk665dk2yn/J3UEmj5clWc9h71xO3+wbzBR14DXZPEtLQsZccOUSNbjQFRqkKtdbZ5RDu951bGrWzNP/889cH7bQFS+oXHHzzYZXWS4ngaoYypz7jutg7vHCUUW5QIju9djWcm1ZfEBjhuVW4SpUHu48rHEKo0623cbmqWkqfEKQ4z8PhMw+cBBhA90bD5Az31GLyvhWAByvwOx5l4gtr3JpbcDfpw2ow== 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=x8nBHmNxPK19/0guw1+CyZiLj9YjO54SydWAXIrDVHI=; b=wWC6P5iqkfYhatxvosRa6ny4XxoLtHMUlEG97iyjWseF6t6kSHlmbfE7I52Do9tYotizskasxfxcLlrVM7srQRlnhKkv3mosRhd5Pzrc3ZNaHFqj+sH9rrV9h1d1urwGAx8a26PGNyhirZZFNa4UGsHKgfPRhIqwhZGT6IYbbEPGvCtPK7DEmqIZjFRJ32cUmEo5ZIWGEpc6VCpCn0QRs2kj2ECKss+q3k/KNUdIsrGjTQRjPWKFiYhyDwDMDsiXqWLnc4DBZ3G8iWQGaz1dPb85mr/xlTrZpjqqPu5S9p63epnWbexWE0npvuC6JRd1jIJN7aNRFU0jDwEIxvLUuA== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10743.eurprd08.prod.outlook.com (2603:10a6:800:205::19) by GV1PR08MB7348.eurprd08.prod.outlook.com (2603:10a6:150:23::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Tue, 3 Nov 2026 07:06:54 +0000 Received: from VI0PR08MB10743.eurprd08.prod.outlook.com ([fe80::7a7c:d078:f125:f16a]) by VI0PR08MB10743.eurprd08.prod.outlook.com ([fe80::7a7c:d078:f125:f16a%6]) with mapi id 15.21.0569.011; Tue, 3 Nov 2026 07:06:54 +0000 Message-ID: Date: Tue, 3 Nov 2026 08:06:53 +0100 User-Agent: Mozilla Thunderbird To: Andrey Zhadchenko References: <20261103061752.720813-1-andrey.zhadchenko@virtuozzo.com> <20261103061752.720813-7-andrey.zhadchenko@virtuozzo.com> Content-Language: en-US From: Alexander Ivanov In-Reply-To: <20261103061752.720813-7-andrey.zhadchenko@virtuozzo.com> X-ClientProxiedBy: ZR2P278CA0044.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:47::6) To VI0PR08MB10743.eurprd08.prod.outlook.com (2603:10a6:800:205::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10743:EE_|GV1PR08MB7348:EE_ X-MS-Office365-Filtering-Correlation-Id: 08caeec3-4503-48fa-cd4b-08df39790aa7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|23010399003|1800799024|366016|261026140227099003|4143699003|5023799004|56012099006|261009223027099003|261028144727099003|261021121427099003|261022105027099003|261021123027099003|261026121527099003|261022075727099003|10067099003|18002099003|22082099003|261102123227099003|6133799003; X-Microsoft-Antispam-Message-Info: fZEAIF+NfnUUxDvn5rqBuB62irml9h0eV+6hzIweyUI2T/ZEvbpawU3ce7bIMV7IXtjtBpS/VOOcWXVtjvZuvUuneXqfWAfRq+8zpRLWCYWmHuirJzN/mhA7e8W32DXCLfC23hp/kKHNAHUxyjAj9tMCfScK5qqOQLYptLXgEKDU2HmbODq1ybtDrTxNzy4t7ufc+0e6/hNKMZ8A+C1bXNDa+VEk54ND2tH6gf2++9w5tEPIWyE73kS0l0LCm1FTuVr07FYsBaAamXfjTMaBvDvk3JrBUX8zu8ss53jvaN0u8w1piWGSSwlb+53NHSsvQCIjDh0mlg5hXqBdWCmms+mRn/3RQc6VpTDgnIBkG5Q29d+gDLoiF7d7ispJC557Y0/eOiX1wsb1rMauXg7c3SD+WfNKKyppyK1rHzHBDO+h0aq8alwq1wAq2ELSpqtxaCD85yKNH7Kzp/Hv3O0r/LTrHYjSk7RJIjUOdz8pDOzA5cQwAIb7/i6q+k28qTqsc2ao2DNbPf4O436SjR730F7F7zOFdHpN/PBZC7atqwR1y15HLvnp7W9etBvwRjf1bdP9pWd1H1vpSZIMNyUfuULy2AxUFJ+XqLnN3REouuPZOA3MYYPjmaPvTy2C3B53 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI0PR08MB10743.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(23010399003)(1800799024)(366016)(261026140227099003)(4143699003)(5023799004)(56012099006)(261009223027099003)(261028144727099003)(261021121427099003)(261022105027099003)(261021123027099003)(261026121527099003)(261022075727099003)(10067099003)(18002099003)(22082099003)(261102123227099003)(6133799003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?d2VjL2R6N1VZaUhmQmdBUjlhQjloblZCMXcyL3JWMzhpT3d2ZEtPeW5IRUE3?= =?utf-8?B?VVlTTjRZaXI2YUhCUlBjSStDNW0rTTVtaS9uenN3UmFiTXFvOFRXM2Z6ZUgw?= =?utf-8?B?VzVDT1dvNHY2dFlwSktSc2I1UmdoUlYyTnptMkI3c0VucUEvZFZjNVlCTXpq?= =?utf-8?B?c0JVdmFsSDBYQ1UzR0VtZ0RzMjRpanNxR3FBWXBjMFBHM0JQZ2RUaTZXWHRK?= =?utf-8?B?aE1LWkVKemp1SkxxZmNUL2pQcGgwaE5PWlhpVTN5S0g0bHoxMEJDanhEd3JU?= =?utf-8?B?VkNNdi95ZWFZODRqSm1TZE1oY1hXSzl1ZlNHVFZpWGJJdUdIQUl1NzdPNUYy?= =?utf-8?B?OGlPaWhxSU1OM0lSSWRsYWh0L3VJalpXRHBnTTZyemxXQ1dPdVpWK1lBTjFr?= =?utf-8?B?ZFhiQWV6elpQY3psZk5VaURBdzB1eUlMaFdOODJJbVl5cW81Tnl2Kzh1ZUpV?= =?utf-8?B?UEFBRWxhZkxYMHN3c0FTRlF1MmV4QUw3aGs5bmk0Kzk4WGpNRkdoMkNPQ0py?= =?utf-8?B?ZFRMbWhMYmpuVmtVVmVDbTh6TW5lU1JDSjJlc2V2MS9ERVU0WER2RGE3cEhs?= =?utf-8?B?dWZnbjlEMFVmTUluUXhUS2ljaUM0STh4V3dFbXdkU1o0Zi8vL1ZtZTF3NVJr?= =?utf-8?B?cVlnNlo2SVgzSEpTcUdHUWZZanJSUzFodzNFWWY5ODVtSXREMm9nZFFXVENv?= =?utf-8?B?emFsek9wa0VTcDc5dkdCc2N2NWN6YVovYlhFaUExdXN4UzVMWTNETEN0dWtV?= =?utf-8?B?YndDa01FU0J2MHUva0paeE1BSHZBc05ReTBRaDdPRVdqdEhGTEVNVjAxTWdv?= =?utf-8?B?Umd6YVZxVlpiN1ZIano2dGhLQXlkT3g3dFdOM05Jc0Fza0FVODJSNEhTNkxE?= =?utf-8?B?MU5NQndIV3diOC9kNWluWTRjN3RzblRSanpyK09TcTFJeENIWC93S3V5cmw4?= =?utf-8?B?S1NJdnpHcEtnaENIWUIrNlN3MXptdExRMW5BOUM4Ty8zQVU1cWNUT2NaNXFO?= =?utf-8?B?ZEZnVHZMSVF4d2pac3k2Um1yTEJmdnpxdFE0VnJXaHlHT1pPZW9xNUxaeGZM?= =?utf-8?B?MHZLa25hcEcwMk5Sa1JrNVZJV284dll2aUQvWU5RWmFOZmpuZDNQbU9uc3BE?= =?utf-8?B?ZGUxYm1IK3B2TTRhQU5ZRXI3eGhSazU4Sk1weVJNN0FSUHdFeDV5YjhLMlNP?= =?utf-8?B?K0piTUpYb1Y5OFdMNmVHRThFd29YaHJFbUY3Z1Q5aExJWElqNGd3cThibHVQ?= =?utf-8?B?V050VkpYdnRKYk1jcDFGb3gyakhRTWhxMkJPVHByUURuaDcxWm0xMUE2Y01L?= =?utf-8?B?ZEZXT3dKTkptTUlGcEdnQ2hZNGlLM1dvcmNrUEhDNFVTdGtZeFZpR0NrTTJC?= =?utf-8?B?SU4wd1FHU2FkbFNiRGxxOGMzK0xpTzZTb0RsOVIxOWZURVVJd3VTZ0RPZHBy?= =?utf-8?B?TVdyT01WOEJpam9VanNTVjN4UWk0djl0NHFDV2d2UnVPOVpUWjNQaENwU1g1?= =?utf-8?B?aW9LR2RGc2dhVG1Ubi92b2VKZzBZcjI4Q3hvcTdId0JGenltUHlOQWkxK2Y1?= =?utf-8?B?OEFYUGJMd0xmellNZkdFZmpZaFgyRjkvY3lTNFRIYllranVJTGhpVWdFQnJv?= =?utf-8?B?THFQcVI1K2VHWjUwN093ZGZhY2FtTE15SEVySmUvMmVrdHhMUWxGNTEvcTJ5?= =?utf-8?B?WkU0UExQNHJVWUpKbEVzZjhYVEVkMlU4Mmp1ZG5rZ3VwUUFMdkFYSE1QZnNl?= =?utf-8?B?Ym8vU01VNXVmZ3l2VUk2aDNEUHNydWQ0ZFVPZlFXcWorN3hia3ErOEtScjFn?= =?utf-8?B?Rkp1QWptMlRWZHhaYTcrUnpxZmNRTUU4QkJyWmZtbkR5WkxQMkxOZkJPdnJ0?= =?utf-8?B?UEpyV2dEYm1PVkprOE1DTzZUY2d1VXZaRGxiOGZXRVYxWFk4S3BsazUyWVVR?= =?utf-8?B?c2trYkJGalhFM2ZnTDJ4Mm5qVHJXL3pXQ3Z5WVU2enMwUlp4cFRIcEc4dG5q?= =?utf-8?B?S1ZIUTZ0YmNBTCthdXJ1ay9PR0lkNHBlTFBJazd0SEtjMnZ0bHRyM3U1dHgz?= =?utf-8?B?cWFDU1V5MGFMOFMxNmNTbnhzVlFidkNGUnFtR2tuOUJUMHEvaE9zaWZrVUNs?= =?utf-8?B?VzlLQkZIbHhnbE9GMWVVRHNmVHg1K0JXQTNzTjhpVk9ydVdJVjhSK0hCY1Ri?= =?utf-8?B?eDBhL05OWUc3YzZkRHZHMC8vcjAzdHFvVzlRam52aVc0QzlJbUoybEE2c1Z3?= =?utf-8?B?djlkY3RHY2Y0OEdnUG4xQ04vMEU5Qk12cCt1dUVZMnEyTnZhR1grYWt3RW5k?= =?utf-8?B?QldnWjVaZUVQOTJMK0hYSGsrMDlCOVZuczhLMWZRMUc4eGJaaEd6eERJZHVK?= =?utf-8?Q?iloctr8f/NcB4qNQ=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 08caeec3-4503-48fa-cd4b-08df39790aa7 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10743.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2026 07:06:54.3811 (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: Tjqt5D0qx0s9QBihuF1dybizxe2xBpK70WoSc09X+jvlPBCaHEzw7a2kEhiA4tYDQb2MOJMaY9nFJCyzfZTGv8IwqBVbgWZrWm2UFp1d3RY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR08MB7348 X-OZ-Fwd: true Cc: devel@openvz.org Subject: Re: [Devel] [PATCH hci-8.1 v3 6/6] drivers/md/push_backup: add event file descriptor interface 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-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org On 11/3/26 07:17, Andrey Zhadchenko wrote: > The backup tool currently waits for the next cluster range to back up > by sleeping inside the "push_backup_read" target message. target_message() > calls into the target under dm_get_live_table(), i.e. with md->io_barrier > SRCU read-locked, so for the whole time the tool waits for a write to be > intercepted anything doing synchronize_srcu(&md->io_barrier) on this device > is stuck: dm suspend, table reload/remove and in particular > dm_internal_suspend_fast() called by "@stats_create". An unrelated dm-stats > consumer therefore hangs together with everything that later queues behind > md->suspend_lock. > > Add a file descriptor based interface that does not involve dm messages > on the data path: > > push_backup_get_fd - returns an anon inode fd in the message > result > read(fd, &range, 16) - next struct dm_push_backup_range to back up; > 0 when the backup is finished, > -ESTALE when not running, > -ENODEV after the target is destroyed > write(fd, &range, 16) - acknowledge the range, same as > push_backup_write > > This way we will avoid aforementioned problems. > > We can't access/uninstall fd across all processes that have it, so add kref > on the push_backup struct and tie it to number of fds. Free only when > everything is gone. > > The legacy messages keep working unchanged for compatibility but we will > clean it up later. > > Also destroy pbio object first before requing in resubmit_pbios(): Typo: requing -> requeuing > in-flight requests hold the target which we may have already stopped, > so dm_requeue_original may trigger .dtr and invalidate mempool. dm_requeue_original - > dm_requeue_original_rq()? > > https://virtuozzo.atlassian.net/browse/VSTOR-152912 > Signed-off-by: Andrey Zhadchenko > --- > v2: free the pbio before dm_requeue_original_rq() in resubmit_pbios(), > the requeue may drop the last md reference and let .dtr run > v3: install the fd only after its number fits into the result buffer > (reserve fd -> DMEMIT -> overflow check -> anon_inode_getfile -> > fd_install); rename pb->dead to pb->destroyed; prefix the UAPI type > as struct dm_push_backup_range; read() requires exactly > sizeof(range) like write(); subject prefix aligned with the rest of > the series > > drivers/md/dm-push-backup.c | 212 ++++++++++++++++++++++++---- > include/uapi/linux/dm-push-backup.h | 39 +++++ > 2 files changed, 222 insertions(+), 29 deletions(-) > create mode 100644 include/uapi/linux/dm-push-backup.h > > diff --git a/drivers/md/dm-push-backup.c b/drivers/md/dm-push-backup.c > index 6951e3fcdbfbf..54c33fabba083 100644 > --- a/drivers/md/dm-push-backup.c > +++ b/drivers/md/dm-push-backup.c > @@ -15,6 +15,11 @@ > #include > #include > #include > +#include > +#include > +#include > +#include > +#include > > > #define DM_MSG_PREFIX "push-backup" > @@ -46,6 +51,9 @@ struct push_backup { > u64 clu_size; > u64 nr_clus; > > + struct kref ref; > + bool destroyed; > + > bool alive; > void *map; > u64 map_bits; > @@ -69,6 +77,16 @@ struct push_backup { > struct rw_semaphore ctl_rwsem; > }; > > +static void pb_release(struct kref *ref) > +{ > + kfree(container_of(ref, struct push_backup, ref)); > +} > + > +static void pb_put(struct push_backup *pb) > +{ > + kref_put(&pb->ref, pb_release); > +} > + > static u64 pbio_first_required_for_backup_clu(struct push_backup *pb, struct pb_bio *pbio) > { > u64 clu; > @@ -196,9 +214,10 @@ static void resubmit_pbios(struct push_backup *pb, struct list_head *list) > struct pb_bio *pbio; > > while ((pbio = list_first_entry_or_null(list, struct pb_bio, list)) != NULL) { > + struct request *rq = pbio->rq; > list_del_init(&pbio->list); > - dm_requeue_original_rq(pbio->rq); > mempool_free(pbio, pb->pbio_pool); > + dm_requeue_original_rq(rq); > } > } > > @@ -411,35 +430,41 @@ static int push_backup_stop(struct push_backup *pb, > return 0; > } > > -static int push_backup_read(struct push_backup *pb, > - char *result, unsigned int maxlen) > +static bool pb_has_event(struct push_backup *pb) > +{ > + return READ_ONCE(pb->destroyed) || !READ_ONCE(pb->map) || > + !READ_ONCE(pb->alive) || !READ_ONCE(pb->map_bits) || > + !list_empty_careful(&pb->pending); > +} > + > +/* > + * Returns: > + * 1 - next range to back up is stored in @clu/@nr > + * 0 - backup is finished (nothing left to back up) > + * -EAGAIN - nothing pending at the moment > + * -ESTALE - backup is not running (not started, stopped or expired) > + * -ENODEV - target was destroyed > + */ > +static int pb_next_range(struct push_backup *pb, u64 *clu, u64 *nr) > { > - unsigned int left, right, sz = 0; > struct pb_bio *pbio; > + u64 left, right; > int ret; > > - if (!pb) > - return -EBADF; > - if (!pb->map) > - return -ESTALE; > -again: > - if (wait_event_interruptible(pb->waitq, > - !list_empty_careful(&pb->pending) || > - !pb->alive || !pb->map_bits)) > - return -EINTR; > - > spin_lock_irq(&pb->lock); > + ret = -ENODEV; > + if (pb->destroyed) > + goto unlock; > ret = -ESTALE; > - if (!pb->alive) > + if (!pb->map || !pb->alive) > goto unlock; > ret = 0; > if (!pb->map_bits) > goto unlock; > + ret = -EAGAIN; > pbio = list_first_entry_or_null(&pb->pending, typeof(*pbio), list); > - if (unlikely(!pbio)) { > - spin_unlock_irq(&pb->lock); > - goto again; > - } > + if (!pbio) > + goto unlock; > > ret = -EBADMSG; > left = pbio_first_required_for_backup_clu(pb, pbio); > @@ -452,15 +477,47 @@ static int push_backup_read(struct push_backup *pb, > else > right = pb->nr_clus - 1; > > - DMEMIT("%u:%u", left, right - left + 1); > + *clu = left; > + *nr = right - left + 1; > ret = 1; > unlock: > spin_unlock_irq(&pb->lock); > return ret; > } > > -static int push_backup_write(struct push_backup *pb, > - unsigned int clu, unsigned int nr) > +static int pb_wait_range(struct push_backup *pb, bool nonblock, > + u64 *clu, u64 *nr) > +{ > + int ret; > + > + while (1) { > + ret = pb_next_range(pb, clu, nr); > + if (ret != -EAGAIN || nonblock) > + return ret; > + if (wait_event_interruptible(pb->waitq, pb_has_event(pb))) > + return -ERESTARTSYS; > + } > +} > + > +static int push_backup_read(struct push_backup *pb, > + char *result, unsigned int maxlen) > +{ > + unsigned int sz = 0; > + u64 clu, nr; > + int ret; > + > + if (!pb) > + return -EBADF; > + > + ret = pb_wait_range(pb, false, &clu, &nr); > + if (ret == -ERESTARTSYS) > + ret = -EINTR; > + if (ret == 1) > + DMEMIT("%llu:%llu", clu, nr); > + return ret; > +} > + > +static int push_backup_write(struct push_backup *pb, u64 clu, u64 nr) > { > u64 i, key, nr_clus = pb->nr_clus; > LIST_HEAD(pbio_list); > @@ -471,11 +528,13 @@ static int push_backup_write(struct push_backup *pb, > return -EBADF; > if (clu >= nr_clus || nr > nr_clus - clu) > return -E2BIG; > - if (!pb->map) > - return -ESTALE; > > spin_lock_irq(&pb->lock); > - if (!pb->alive) { > + if (pb->destroyed) { > + spin_unlock_irq(&pb->lock); > + return -ENODEV; > + } > + if (!pb->map || !pb->alive) { > spin_unlock_irq(&pb->lock); > return -ESTALE; > } > @@ -530,6 +589,84 @@ static int push_backup_write(struct push_backup *pb, > return 0; > } > > +static ssize_t pb_fd_read(struct file *file, char __user *buf, > + size_t count, loff_t *ppos) > +{ > + struct push_backup *pb = file->private_data; > + struct dm_push_backup_range range; > + int ret; > + > + if (count != sizeof(range)) > + return -EINVAL; > + > + ret = pb_wait_range(pb, file->f_flags & O_NONBLOCK, > + &range.clu, &range.nr); > + if (ret <= 0) > + return ret; > + > + if (copy_to_user(buf, &range, sizeof(range))) > + return -EFAULT; > + return sizeof(range); > +} > + > +static ssize_t pb_fd_write(struct file *file, const char __user *buf, > + size_t count, loff_t *ppos) > +{ > + struct push_backup *pb = file->private_data; > + struct dm_push_backup_range range; > + int ret; > + > + if (count != sizeof(range)) > + return -EINVAL; > + if (copy_from_user(&range, buf, sizeof(range))) > + return -EFAULT; > + > + ret = push_backup_write(pb, range.clu, range.nr); > + return ret ? : sizeof(range); > +} > + > +static int pb_fd_release(struct inode *inode, struct file *file) > +{ > + pb_put(file->private_data); > + return 0; > +} > + > +static const struct file_operations pb_fops = { > + .owner = THIS_MODULE, > + .read = pb_fd_read, > + .write = pb_fd_write, > + .release = pb_fd_release, > +}; > + > +static int push_backup_get_fd(struct push_backup *pb, > + char *result, unsigned int maxlen) > +{ > + unsigned int sz = 0; > + struct file *file; > + int fd; > + > + fd = get_unused_fd_flags(O_CLOEXEC); > + if (fd < 0) > + return fd; > + > + DMEMIT("%d", fd); > + if (sz + 1 >= maxlen) { > + put_unused_fd(fd); > + return 1; > + } > + > + kref_get(&pb->ref); > + file = anon_inode_getfile("[push_backup]", &pb_fops, pb, O_RDWR); > + if (IS_ERR(file)) { > + pb_put(pb); > + put_unused_fd(fd); > + return PTR_ERR(file); > + } > + > + fd_install(fd, file); > + return 1; > +} > + > static int push_backup_statistics(struct push_backup *pb, char *result, > unsigned int maxlen) > { > @@ -608,6 +745,10 @@ static int pb_message(struct dm_target *ti, unsigned int argc, char **argv, > ret = push_backup_write(pb, val, val2); > } else if (!strcmp(argv[0], "push_backup_statistics")) { > ret = push_backup_statistics(pb, result, maxlen); > + } else if (!strcmp(argv[0], "push_backup_get_fd")) { > + if (argc != 1) > + goto unlock; > + ret = push_backup_get_fd(pb, result, maxlen); > } else { > ret = -ENOTSUPP; > } > @@ -622,18 +763,30 @@ static int pb_message(struct dm_target *ti, unsigned int argc, char **argv, > } > static void pb_destroy(struct push_backup *pb) > { > + void *map, *pending_map; > + > WARN_ON_ONCE(pb->nr_delayed); > > + spin_lock_irq(&pb->lock); > + pb->destroyed = true; > + map = pb->map; /* It's not zero if stop was not called */ > + pb->map = NULL; > + pending_map = pb->pending_map; > + pb->pending_map = NULL; > + spin_unlock_irq(&pb->lock); > + > + wake_up_interruptible(&pb->waitq); > + > timer_shutdown_sync(&pb->deadline_timer); > if (pb->wq) > destroy_workqueue(pb->wq); > - kvfree(pb->map); /* Is's not zero if stop was not called */ > - kvfree(pb->pending_map); > + kvfree(map); > + kvfree(pending_map); > kvfree(pb->pending_htable); > mempool_destroy(pb->pbio_pool); > if (pb->origin_dev) > dm_put_device(pb->ti, pb->origin_dev); > - kfree(pb); > + pb_put(pb); > } > > /* > @@ -652,6 +805,7 @@ static int pb_ctr(struct dm_target *ti, unsigned int argc, char **argv) > pb = kzalloc(sizeof(*pb), GFP_KERNEL); > if (!pb) > goto err; > + kref_init(&pb->ref); > spin_lock_init(&pb->lock); > init_rwsem(&pb->ctl_rwsem); > bio_list_init(&pb->deferred_bios); > @@ -760,7 +914,7 @@ static loff_t pb_llseek_hole(struct dm_target *ti, loff_t offset, > > static struct target_type pb_target = { > .name = "push_backup", > - .version = {1, 0, 0}, > + .version = {1, 1, 0}, > .features = DM_TARGET_SINGLETON, > .module = THIS_MODULE, > .ctr = pb_ctr, > diff --git a/include/uapi/linux/dm-push-backup.h b/include/uapi/linux/dm-push-backup.h > new file mode 100644 > index 0000000000000..764899f3525e2 > --- /dev/null > +++ b/include/uapi/linux/dm-push-backup.h > @@ -0,0 +1,39 @@ > +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ > +/* > + * Copyright (c) 2026 Virtuozzo International GmbH. All rights reserved. > + */ > + > +/* > + * Userspace interface of the dm-push-backup target's event file descriptor. > + * > + * The fd is obtained with the "push_backup_get_fd" target message; the fd > + * number is returned in the message result buffer. > + * > + * Both read() and write() operate on exactly one struct dm_push_backup_range > + * and return -EINVAL for any other count. > + * > + * read(fd, &range, sizeof(range)): > + * sizeof(range) - @range holds the next cluster range that must be backed > + * up before the writes postponed on it may proceed. > + * Reading does not consume anything: the same (or a wider) > + * range is returned until it is acknowledged via write(). > + * 0 - backup has finished, nothing is left to back up. > + * -EAGAIN - O_NONBLOCK is set and no writes are pending. > + * -ESTALE - backup is not running (not started, stopped or expired). > + * -ENODEV - the target has been destroyed. > + * > + * write(fd, &range, sizeof(range)): > + * acknowledge that @range has been backed up; equivalent to the > + * "push_backup_write clu:nr" message. > + */ > +#ifndef _UAPI_LINUX_DM_PUSH_BACKUP_H > +#define _UAPI_LINUX_DM_PUSH_BACKUP_H > + > +#include > + > +struct dm_push_backup_range { > + __u64 clu; /* first cluster */ > + __u64 nr; /* number of clusters */ > +}; > + > +#endif /* _UAPI_LINUX_DM_PUSH_BACKUP_H */ _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel