From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 418723F23C4; Tue, 28 Apr 2026 11:11:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374705; cv=fail; b=QRVZdIEB/tkRHspiAjlqzMAr9Df3EHn2SRM9MZ9cKVbOrU5kKN72iG/s8krVzes96p9knZNHDqW0a9LdKHJlafVwktykJZcl9hTfZMjAAkoGprK91uYbky9vf8kvqvT+A68y1CV1LrVtvR1nd/goYH4ddE1XquBBMP1p3k10ghk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374705; c=relaxed/simple; bh=xYjlI7GGuZjwwrV9dxuK9fHXb2Fem4+yZXJuvGWOWrA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=q7EyiAkZt2R8FjxKaNKRgn2DCWMVSSaduHtojqHAmDOEpFmT71G05NkthtqBqysoThSILdyBR9THuBK86DIQ8Nl18J6JW8wov6EsP/LsgCEoRbPGUZMbcxMBuZl+RkLV65tRjw3TizdUIcH79/FMwXqfGyfZz3cOn5NuXfQy8TE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=JIH3/9LZ; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=jc3yK/Bz; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="JIH3/9LZ"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="jc3yK/Bz" Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SAKCW71015453; Tue, 28 Apr 2026 11:11:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=qu5ejjtQDJobWV+8ud6I/z21eINPbr/9+GVvdtHO884=; b= JIH3/9LZMG1WKHUNrryRSlrAo+2YjFvYEVANWmKpvAxUVYTgTQF2WdKsnRng3F1M I3klsrJSb6Wixe0uDV5vbV+mvAOgmX9+BgKvAatC2HuaXJgpy7XFFY0AKCJAOiK1 3QZy3KhBhLYiO1ySjG6m0TxxMzLSOrQfyIV+TMJLc6ySKryVukgt69Wm0M00sDNJ aLaQSYQOydAwvPlQ2MOD0MV5zMqTHQoXhEnRJdVUgBaehP69Qh0Yu410yHRpvIcx PzgGLLjKBtHxLdveLTr8JwmJEC670GNoXove7cT7zWSC8y1PunPw07o/cInuIQC7 eaX6fUR0+L1U3GXEcUhJdA== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drm6yyjtd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:24 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2jhU036886; Tue, 28 Apr 2026 11:11:23 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012060.outbound.protection.outlook.com [52.101.43.60]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2bvem5-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:23 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WXpKoIeA5LFqIjTdIdfLCVoeIbSYGmHj4iFaneKSFZhhqATjJA4BHCAVlL/gIyAcc9IWaVQQLxaG9cmAMx0hsyuMy3d8+yZT6Du1dxC/NS/kdPq3azNOWzCEkCpj+ZhAuIDPp4ewE80mgm7ff075pPe7+tgvY2/lHsIVfwtmZMvpM4KcjJkhz1stayIPaWBRguZJxDTty0o3V9Ye+y5VBkdiw5nZYqJ0qnBRVFk35cSYA7kMvTBZxkBmgboVyNFOdyaYUeiVR/3/4aNcSwJv4cFGj/YwqOIkYaV5vaVwVP8QEunvYC9AGFQ+WVK6bgKaeBks/qNciK5C+xmZB2qKjQ== 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=qu5ejjtQDJobWV+8ud6I/z21eINPbr/9+GVvdtHO884=; b=ZBxbWV+U+zeJEmyv76P77Z6pBsDBm1262uOGzFNURFspORxycA/Rjwzv/qxRz1j7d7aNdlS9jngjRyaDUzNkSl0Q2VXyjNkKH2wzENjGQ6Hoe1r3nz9fILMdYT1bDpEREI+nh8kQcPI940yDU31GhAnMwVrai7ZbLeM17Rz6Y3bX9xE6mmddAlKX43XhujwFYBey8K/0q/kdtoTmDtOdy7Stz/hotWB79TII2iF1W+e5y2yMWFcFpj3xt6HNiVqVKiLYPalo/aeGyP9CMiZ7a8cX14ncwvg8p5VHNwTY6UXRZG79spfz/J60yvDqx5t4dLTp/nDKDUAHdUzedT+RbA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qu5ejjtQDJobWV+8ud6I/z21eINPbr/9+GVvdtHO884=; b=jc3yK/BzlIOkPqMWE3KPbR78zyn0O8kesqmdPNQryFgd87Gx0T/M+BH4uNbk24/j1eG9vVIFxRUnxGSJM8mi+KGWO30bMkCG6IBY+McDCNiKMbca/p+D3x6vSa6inWl2kmwl6rx1Hs/5s20Ju/sFy0eZhxT4cf6XMQRtOdOAi9o= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:19 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:18 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 01/13] libmultipath: Add initial framework Date: Tue, 28 Apr 2026 11:10:53 +0000 Message-ID: <20260428111105.1778008-2-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH7PR02CA0010.namprd02.prod.outlook.com (2603:10b6:510:33d::29) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: 3ae5bcaf-188f-4d2b-2b46-08dea516df05 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: ux03vHIOlipE60jf7WFQsdqJ3cKk/sTkwcqXST/61XGgKDcAAYfKRkf8NX68P2n+0YCuEYIReHZNdEM2YXSd1hZavkm/6AYah+zUnL7CINy0HNyKR69ljMu1wMtx5dZ0ybZQLA765s2B4WjJAYg6M4veS3Qgz4vRNHdXMGy6qECTS5RY9RCXHIFLprB6tS8g3FKeAjETKG+rxkJuNTbJjuxPCrQ/dbMOolURUtxUeqBpYy8nD7tZdNH3alwpymqkFe6IcDz2aY134kr+vgnNsLfsIGOllktAi30bsQ5JEOAMZoEDAqpq8fgNIwxTZFkJjEub1Mt9j+pjB5NTPr+QlW/PnCwm2TsYLWnv8SS7CRh+rNgR6l5dsy9b8BztH+MKM+dCsmYxdURyeQyTWgEdWBznwZlaIGbWlWPFQ70m71fNpDcXUlLgxQhYRHApPoOwHC1xc+oPotCpFML982PgEDAyKvS7QVURIVmEHlII3bCpqyvCZRwtKUqmU/2yN9v9lnfczgyob4H7faWJVn+FR14L8LBsOUktiOwyFX174cka8yYI/vMAKgLJgNt/bOrZMXMgJH0wKlNmIeUkCgcbP4mVGWdaXDWDUCPjWnHO7UENJP3RtdZBjmg7CXLkr/qnYDBu4oiNoqJCdWTZKpvkYNJv397euJmjVFAF+9jTE0oEZ8YbLXWp9yHzYFYSVn4a3VnfYEp8J6JCqjyq6L8MjYd9ct8wrGmiaXWXL9NnbHo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?hJU/o0T0pfKHqMvD1JQTWIU5RZBtR20fAfuCU74+M6kCJrY0R76aw+tUEqPv?= =?us-ascii?Q?inB/pmzTtvOEQtnaI9hD/fNXO6Wg7s47munR+LE++Qj1ZAgmtBWpNTS4sxR6?= =?us-ascii?Q?huiRj9WRwkDEfujcQeXcto+AHVJZCbxSnBWSBy68zzaeQMwlJHfCbNF4HIR/?= =?us-ascii?Q?EtM1Vdt6YEiOD+WGlf9HPz057Evhpj9+A7GfeGxU72y3h9xWJIewmMAj+p4W?= =?us-ascii?Q?RDR3O5ZluYCQZ7zES+cDKObsYPY2Lt1OA9gSP0Jn2LHTKiUAdTlqRSL1mTU0?= =?us-ascii?Q?dMisGCY/tBsAKxR3N8lVZIdhjQ7Ly39nBP3a4of+Ql5oPpbz3pInBrbYy+Zp?= =?us-ascii?Q?HcmNEeN91loPTfEVXdizglp+P3NHMTOfcYAUsvLU5iLDlSORX7Gr6SmHHWDW?= =?us-ascii?Q?JHZ/M0DGF0oHhJSo8T6+nz1K2OxKWbh628rBNZw7/gKueeSnDwbJdfttRwTi?= =?us-ascii?Q?cAzd4JCkcqCT3dX8TXZLsimIhj2jdM4dtjvSgJdPFwaY4zEPPQUFZ07eLqjk?= =?us-ascii?Q?0sJccYzjszyVwST/mxQRoXL5KRrB3d6eNiJ0s9Xd+42hHwfY302c+qg9EFeF?= =?us-ascii?Q?hfblhd48pnaBIQ0GbSgn5GvsPaRv+R/gVXnTEC8IZr4IXB+uhzdKQe2/GzCq?= =?us-ascii?Q?7ja/XdoeeLoZZs3ut/I02/vH5jg+SWnM/JEnv1p9w163047uZPIAdR2gQEQD?= =?us-ascii?Q?ymF7lA7iVWEI8oTTRBPNhcHYThA5QnEf7CYSpMVfKm5sPbTNPP19a+5b8+Ro?= =?us-ascii?Q?ZugLyc52+TyxgB19l5P4/x3buwhAOi6wDKDfj2XTthQuiklGw3yeoCaoWSZ0?= =?us-ascii?Q?IPoUafs4FkheNJFDV22Bjs9hKYZFj+/tjJV4PqJiaIf4UrdTGVbReJo7q5/e?= =?us-ascii?Q?rdU7Sm84t/clbRvWxe8FfaATivl5AO+jY0s6aZVmL1mzslMCf0R6kS0d2+MR?= =?us-ascii?Q?CWPmxFJX6KXbuxz2aT5AfKtEWyy6++Z4NoHY9mD8eYaEqfl+XTn6e4xYZD3E?= =?us-ascii?Q?S5AYWC+Oa/kzvfnVNkLO93F7m5PWorN90cKbdT9xBiDvCTwR3dfBOUof5FHB?= =?us-ascii?Q?PrPlcMPEC1nkHz3dBDmepR9WF/9AZMj59UGKU6YzZ+9JwuFQkNofKw+fAyfq?= =?us-ascii?Q?u6h2oOQyLOE4d0519g6DOlYGZ3GTOlUQ/o1tCMjgiTqXEMeNJPdwM4nx+U72?= =?us-ascii?Q?qExgVBzbrtVlylUQZlWNX0uY1uHbumX2fKjvtzNqPigpFBOVXbdoDd9li69s?= =?us-ascii?Q?5HTm3FS15fXWXnsf+wVE4B7FLiIB3FOueyIaGIHN6PXQvkLQANGdd0JKlGpx?= =?us-ascii?Q?mzB7F5++WNNN+hdjgQIPs9VaeP2u2s4o9wV1X/h0DnYoeTQCXw4B0Uu/r6GH?= =?us-ascii?Q?l0o+2Gt/mBc7oP+i0YvfdBX2BVherdaYMAbERwJqzbtsmCGGYfpJGocOKII9?= =?us-ascii?Q?9K23AOVw/vZkGzXoO4T1FxoagyPND97nrBZRcEoTiJI7l0RQuTMPACHi3XR8?= =?us-ascii?Q?4NsYB6kAGSqMnz5N8T7TPr9oGai3Us3AaVf0H4Vur0pX70/29tslmTdN7sBH?= =?us-ascii?Q?X+GNOtMVYojhJRTAs2ZFs9fmTYD4jaYeol8AOjXBF/ktRZUVeuJyPOMXCUzF?= =?us-ascii?Q?HTx5UAKuX2r+YSoYxLMD+rDvqKTvYW42NytdVcQKO7pYS41pB9Kx70J+2Od9?= =?us-ascii?Q?dfAeMlQG5AbPHEZxx5J5zT5iVbJFZMQ4pJUYHG+uSfIokClf2oCH8X71XYgz?= =?us-ascii?Q?7MJ8M3Sm3dZwPkv3YpW0vvUJ3T9ff/o=3D?= X-Exchange-RoutingPolicyChecked: iFVlkLHt2bh8UDocI7uh4ZTSZqp91ynbjFuMi+M+OtYJ4KL3VRli8KSh+t3POXW3sQSrlWUw6YKZ5HfOJC62EvZYwAp/TLJzdKXtn3DRJjVlMdqee2RrABqedfFvVT6rkq7sAiwuVarfaj9mGw+hSL9F0UmIAYaYwFSWD634Xdx4ralx1c+qGzDOEunZWH08C5iMlCsg5v3CWfkEQd5n0V+hVq4c1bYpp45uEmTKRg4r8y7wMiAHZfGCphQS37Es/iOuXMWKfrNSMrD2/MGowOAOd1Jl9uCV00+gwelIxZkYQlJbFbOsmyX3usB3+z4Zj4SLcy3BpZec2Bund/EoGQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: eKKP8T+G6C4urZ1d6F1LlWlZbDzpw8mkVj4cBaD9AkPaNdUD4dQciUM2ATEFhcDenp28JPxCUhxGMwmZGwTg6xiTBs7wq9nfoowdcStsg9clSJPDbUwKK+dKDyWAicS0TUCz/OAn/ToplaLbNVkOP+ImCeLEar2ec75sok9xDNlvLEkj4VVfnBLdOix0f/9ZpRUqwEK7ESfBFHujBmM6sImAfwjkfoa7NvlMSU/aa3vpjuOF/M2dUTlUk6f4dUiYxZ/sCjszFjWq5Wz2f/VGK4WxodcP8/ecCQwtu/eMgKIbrIj1ilfO5RDZQhxM0Z+xSZTupLGFIDtwPGj1DOWrUZMO392zwKMyS+rIFnKXDajB67bhwVKZE8ooaqizSsXhPnk7FhvG3KB+CvQYLvDQsP4j2HYSFs8x1XgoCXSKpJg9eLWuSW6VpfShvh4cdMmfE7WJcaqKyOiMys3sPDBnindmC8ZXZNMGnxbBfmdkWqqBxYO4VsRW2zLIOnCH85lo1fWFQoxUm8i6CcNws4WYsGgZKWNQPm2v/LVxCXTVPuvY7atbbFyFMCAPxAoOCQFpaqM0b//ifkDVp37kdutPRpG7o3BCpFAO+txt4/ZnMk4= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3ae5bcaf-188f-4d2b-2b46-08dea516df05 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:18.4432 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QFJ1OEFMbqqfuJXy+kJ/4MpgWXNknWF9XGXD4KNkIaEzJFVvZMYUzFCkvXUpaY2BaQg2FPcWED6yLUNvuKuLeA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 lowpriorityscore=0 phishscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: 0LwnBUeDsUX-pyhdyVsVGkYkB48oI7sH X-Proofpoint-ORIG-GUID: 0LwnBUeDsUX-pyhdyVsVGkYkB48oI7sH X-Authority-Analysis: v=2.4 cv=BePoFLt2 c=1 sm=1 tr=0 ts=69f095dc b=1 cx=c_pps a=qoll8+KPOyaMroiJ2sR5sw==:117 a=qoll8+KPOyaMroiJ2sR5sw==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=RD47p0oAkeU5bO7t-o6f:22 a=yPCof4ZbAAAA:8 a=XP0GnSSCGFUgwQirCqwA:9 cc=ntf awl=host:12310 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX4gxlityiGVeR 89n/6jWK51uXqcvcjKSjjAmOm5kSKD7eCdgtAlMNwYQTH0QloN7zCrnudTQtVbvAhrSn1K6ezlw +ODs9fPwT9WFtH5zBwWyj3Sqn3R9qkE8d+PVdz1c3vT/aL7BILzaDQHTV1QYQjfTp9uFfPBXkUX z9A/Ikp5b0ZUMHQim6gtcdn8Rr9mOcNfF+pUZjtIjpY/KqRT411DDoIuLj4E/RuzayiGqYRh+J5 mKCixJm8QO1Eb1843hNz65wynX0xAndfisd5VRh+9IKB4dxrk8gXVYyuqGtKywbeRa6Ee3f5rAF HNHPCBQtWl5fpccMYmT7kgn18TQ1gyXXmtXalZzwX/8oZY/ES792p3CblgHlWXl6geWN1RiMdqb VacC2NyHIuoR/PPpvPHgZIM0LDgA3jEomow5qNMIG0CB+mH+XjwhiauondTRm1OrjyUuKdB0cDn 9Jf5JbPsB/DUTsg6ronYt4Uhp1vic7iLzi0gKCTY= Content-Type: text/plain; charset="utf-8" Add initial framework for libmultipath. libmultipath is a library for multipath-capable block drivers, such as NVMe. The main function is to support path management, path selection, and failover handling. Basic support to add and remove the head structure - mpath_head - is included. This main purpose of this structure is to manage available paths and path selection. It is quite similar to the multipath functionality in nvme_ns_head. It also manages the multipath gendisk. Each path is represented by the mpath_device structure. It should hold a pointer to the per-path gendisk and also a list element for all siblings of paths. For NVMe, there would be a mpath_device per nvme_ns. All the libmultipath code is more or less taken from drivers/nvme/host/multipath.c, which was originally authored by Christoph Hellwig . Signed-off-by: John Garry --- include/linux/multipath.h | 28 +++++++++++++++ lib/Kconfig | 6 ++++ lib/Makefile | 2 ++ lib/multipath.c | 74 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 include/linux/multipath.h create mode 100644 lib/multipath.c diff --git a/include/linux/multipath.h b/include/linux/multipath.h new file mode 100644 index 0000000000000..102dfcf21ffc9 --- /dev/null +++ b/include/linux/multipath.h @@ -0,0 +1,28 @@ + +#ifndef _LIBMULTIPATH_H +#define _LIBMULTIPATH_H + +#include +#include + +struct mpath_device { + struct list_head siblings; + struct gendisk *disk; +}; + +struct mpath_head { + struct srcu_struct srcu; + struct list_head dev_list; /* list of all mpath_devs */ + struct mutex lock; + + struct kref ref; + + void *drvdata; + struct mpath_device __rcu *current_path[]; +}; + +int mpath_get_head(struct mpath_head *mpath_head); +void mpath_put_head(struct mpath_head *mpath_head); +struct mpath_head *mpath_alloc_head(void); + +#endif // _LIBMULTIPATH_H diff --git a/lib/Kconfig b/lib/Kconfig index 0f2fb96106476..5c70e6df89740 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -636,3 +636,9 @@ config UNION_FIND =20 config MIN_HEAP bool + +config LIBMULTIPATH + bool "MULTIPATH BLOCK DRIVER LIBRARY" + depends on BLOCK + help + If you say yes here then you get a multipath lib for block drivers diff --git a/lib/Makefile b/lib/Makefile index 1b9ee167517f3..98948b18af7f7 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -335,3 +335,5 @@ CONTEXT_ANALYSIS_test_context-analysis.o :=3D y obj-$(CONFIG_CONTEXT_ANALYSIS_TEST) +=3D test_context-analysis.o =20 subdir-$(CONFIG_FORTIFY_SOURCE) +=3D test_fortify + +obj-$(CONFIG_LIBMULTIPATH) +=3D multipath.o diff --git a/lib/multipath.c b/lib/multipath.c new file mode 100644 index 0000000000000..0d5690b5ba4ca --- /dev/null +++ b/lib/multipath.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2017-2018 Christoph Hellwig. + * Copyright (c) 2026 Oracle and/or its affiliates. + */ +#include +#include + +static struct workqueue_struct *mpath_wq; + +static void mpath_free_head(struct kref *ref) +{ + struct mpath_head *mpath_head =3D + container_of(ref, struct mpath_head, ref); + + cleanup_srcu_struct(&mpath_head->srcu); + kfree(mpath_head); +} + +int mpath_get_head(struct mpath_head *mpath_head) +{ + if (!kref_get_unless_zero(&mpath_head->ref)) + return -ENXIO; + return 0; +} +EXPORT_SYMBOL_GPL(mpath_get_head); + +void mpath_put_head(struct mpath_head *mpath_head) +{ + kref_put(&mpath_head->ref, mpath_free_head); +} +EXPORT_SYMBOL_GPL(mpath_put_head); + +struct mpath_head *mpath_alloc_head(void) +{ + struct mpath_head *mpath_head; + int ret; + + mpath_head =3D kzalloc(struct_size(mpath_head, current_path, + num_possible_nodes()), GFP_KERNEL); + if (!mpath_head) + return ERR_PTR(-ENOMEM); + INIT_LIST_HEAD(&mpath_head->dev_list); + mutex_init(&mpath_head->lock); + kref_init(&mpath_head->ref); + + ret =3D init_srcu_struct(&mpath_head->srcu); + if (ret) { + kfree(mpath_head); + return ERR_PTR(ret); + } + + return mpath_head; +} +EXPORT_SYMBOL_GPL(mpath_alloc_head); + +static int __init mpath_init(void) +{ + mpath_wq =3D alloc_workqueue("mpath-wq", + WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0); + if (!mpath_wq) + return -ENOMEM; + return 0; +} + +static void __exit mpath_exit(void) +{ + destroy_workqueue(mpath_wq); +} + +module_init(mpath_init); +module_exit(mpath_exit); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("libmultipath"); --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C78053F7885; Tue, 28 Apr 2026 11:11:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374710; cv=fail; b=MOj6pcHo342fmvAa8oWbE/RuJp19D1UA+XjbFzyDUJrJ3pEhb7G5aXrS2BeSUQjeZoUDOLANQ2pzmDf2RSONziXJXy8fk/y6ejg/ckk4O0kTygC8rl+DpAwl7DzHBms/RpmI3yMQl7DLPS7n7ivAFw9t5EtpEtES69Kw8wNvBmY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374710; c=relaxed/simple; bh=SVycnrhyMs0jlsPUshaZfW3tJGZLSiubs/P5NLvcEQQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=rRIP2UMGLVnkp0RP7soAziwu3J709D6vqiyigjpuVbwY2tOADfFwROETKA9HDzDViM21ZwlsdEAbwcoZwxGjntGvevMhRXsTs7CX8leiq7IXo50BRzkLayY4dWhFQ+tXkUmXJpOxQsTqlux+I4RAxD2U3H775Uu47liu4ZqbNLU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=ZN/89onQ; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=pORhorc3; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="ZN/89onQ"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="pORhorc3" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SAQvRg1905274; Tue, 28 Apr 2026 11:11:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=TLDHcnlGX2iGN/9FnmGvv+PrPiiBYykQiMR0bm81Ge8=; b= ZN/89onQeWOBLpQ/Wg+HrvCyQXsKTFW+LMXbR6DyzduK8y2lAPbQSCqOzzkIb4kS ftgAOvfGE+3JqBKRS9Qxe89QwnGujluuTc0LVjjuxgJkhuGsHFB9Z0C2USiicAtd VsllwNRwdx0CwXN0D6+C7TrsH2/c6Oxwn/0gxx4fP5FUvXyuUrsicDGY6ULnsCUT TdGiCzW4z0AmBXp6gTgPU2igm2eNTyxC9yfZt1yKr7ktPp/7yNDGrGShRQ4chUrY DTctRkoCGWo7/YW8r2HPLbYrSmNh++ZQ29kmbXIGwEKQA44hj3uhhOG72bT7MHKk bqaiHOicUnVEv/uBkAN6Dg== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drng8fcna-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:25 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2jhV036886; Tue, 28 Apr 2026 11:11:24 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012060.outbound.protection.outlook.com [52.101.43.60]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2bvem5-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:24 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Lv65OcYf1Nxiv+Sn+vi42elAiXqSUXaEvq1xNtgco6NPmDsDl14GbFvv6nbJrItKRotCAXuayYg3ksjIhCRXWT95zMo6aUKxwBzTSYYQtFzvp1lhFVIpZbzITPahsFLQp89/m2BVCa59WB80sIFl5qJ1KpzZLAdo5MRhb9V9bi1OP1cZkjVg9m5dIkfkkvTBqcJyNWFtlkiRnQCWNZ22ecAQJrJ7+Kz8sYtgqxLTaBtyW+Hjoq0n2seOPfk+P5M2gEu//6EqDeGK3qfOeXwcHabUvQ+lFJFJQNTdjuyru0i/X1RHcTVzTJjc2EonGUcr9pkRanOoHUsRQnW3CAKRBQ== 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=TLDHcnlGX2iGN/9FnmGvv+PrPiiBYykQiMR0bm81Ge8=; b=HvCIH5Iy3t8ayC7pnUAzTbT2W0P02fvAP9dw4oC/pJX+YlPXHB3UKfJLla0T3xdHw5Z7botT6jPEINjjh4aEe1QMvtE1dMxAPkAFw6IkZdCEdbASAtCzkdpnAQ/A7xyWBPeOvpwzTcCDEz0xXouwBojYdIe1jnnNcbwlAV4ynThfdCEoKUhmJbLtWLKlDalt7ftHFrC1osnarjwkNvf+0gQ3xxj2viqYuTJimkwLUYYduSPB+PBIsrfcIvAlmbkkJJimsbtTn+Pbzyw9uARwAfbw8uJJGaU4QOx7/UU8w7HLQjOfSjSHlmoSTGDAzj4IAHqnNkj7qSCpO1RORE1YEA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TLDHcnlGX2iGN/9FnmGvv+PrPiiBYykQiMR0bm81Ge8=; b=pORhorc3pxbxIJ1q2ytfLVmU2uPfyIR1dts7wPd15EZISIvdkndRjguNLCTqbcLUQaAC3END3rBRve506B9KjZNtu24GxuBHmmYdxgfCYww6M/eCDPzTgtBMlzZn122EILsZTWyV32j7dmd0J4XMNObi1nibqg4+pyuPAw857X4= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:20 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:20 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 02/13] libmultipath: Add basic gendisk support Date: Tue, 28 Apr 2026 11:10:54 +0000 Message-ID: <20260428111105.1778008-3-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH0P220CA0026.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:d3::7) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: 354fbb62-65f0-485c-ecc4-08dea516e02b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 4Nd/wLavMK5el6G9B9pgZEV7GubFDuJMBj7/wihYtEJ82225Jxly5jOkc877rWnl1lMjgKGf8KsZKCdUVeXpKoyBGFE0mGs7mvUK8u+TDJk5XsXFwCZF+Og8EccmUU1T3MsK8gP/z3t8EnBDy75UKe3Qr4+7Y3B6IMaulPV7/+InxufpwXaTU3J+qImRho6cGJbESz+r6enl6c5uDHJcQmlJ2g/0m7JykrJIwR2prOW1WlOJpNaJmzKdGnOEYLHJbAYegWyDU7RSTMyKd4L75bkSoYsQA3yQYxDm1wmj6ziyfdF8rFaXNi8npQD1Wu1dLtKWGDRskXdMORhuvIJjb0y4ZF5n+Z7QAzghumxSmdbGQH9Oj3pxw42lQYibp25/g4b63x+5tzxw2ctHunMPS/qWwVbYH6c+GG2s/NgOPeC/qKrpwtpaJLDhXTd/pEZsbze3gXZ5TArELauBkw+Y65pWRtMh38dXIQ9HcWjNRLKQZ+d1tsthgLDEAAdMGKv6uivHjCBy8HCgKsRWzsAvgxAr/8qQrsRTpJfIEqV1WGJSr0WTXzlBM5Jc4Wxq84kQC82wk8/HaWtp81NYoKQFNZM9m0K+GPJbls0apLQoSm38P6N24uNEMRtCvJr2EJi5ye4BJ7TX8V3h9GQQZtjA1gkcalE//N8WtFUWbbLCEK3H5QEEVBxRakznDrJXns8lxquKZijau220vrahVgx/H4tQvIG5hEn/Xgpxx682wPg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7LFGGH3IG1c74TODg2UW5sIvTLKLK09r9eWmnaAyr+0e04ql4gJ4/HH7Ylwg?= =?us-ascii?Q?vOi/nv0Ox8V3HtsHJUIsntcdsN8pNNLlWSg9ut6eo7zBlF2ELsPHSkUJr4XF?= =?us-ascii?Q?xjbBExuH7PwhkRAm8C0dSryGF+LOAPnBOC5/9TP/rPLfKO+JNumqYZQ3vXkm?= =?us-ascii?Q?7wg9YayBb+2P+FwzfUBtVPjkz7vYjpzZZ+CPORnj1e5rWBBM3Bb25N1S5+ew?= =?us-ascii?Q?zUcmHUpNNvF01JzXgQsWX/IZq+usN0mEnSjgl/gPT/YrWOKA5SN1i8cXq1be?= =?us-ascii?Q?YAwK1+FjnFrdCHiKKtbSKV08Lx5LxDKexTm5rawkWBz32Y+gyC2Y74Q1I5Yh?= =?us-ascii?Q?Zmk8cldQXVKe272DWhNaz9HCpCowtdREHazvPB7wpYgLCQHAMHQRVp4z0aoV?= =?us-ascii?Q?mSxpLbQHxgBQr4YnUKZ5BzKfkpOjCkXsz9oFfpuRoSgprRPLAnMcZl7q8BiJ?= =?us-ascii?Q?ToL29iSOr0eQjLNvugMHjT6B2Gp5D0guGiSwKlot3xZSYc/ElR/1zU+wFmNg?= =?us-ascii?Q?L9O6kdCVMGeNCS7XIb8s/GOGHbE0L/HI45eUBuWPke/7682qc/CTj1l+pj+0?= =?us-ascii?Q?naygsVNZsBFey9dt6PyGMbXbhWEjCF9yAi6LTDv6MbMb/3D51x3Cv5WHczay?= =?us-ascii?Q?Nbfii4AMEZrRI4uS4cJSmnozk51NFkJx3+5eyVr7yoznnLVu2cFbeA1ELOt/?= =?us-ascii?Q?s8bCAFQ79onoezjqY8wymFzhcM3Jnfcx3CvFLYg3vE7IKvuukvg3IQvCIRMB?= =?us-ascii?Q?b5TW74zC11EZSyo2z3P+vSInAQYOwciNXYove0DfJWUjTZWHpXRacMrIZ7vn?= =?us-ascii?Q?mgY7zctn2tWg111zt3gXz+mM92gLZ9urohw69vFs5hBDZVGJ1qVdOly/0KDo?= =?us-ascii?Q?yyKixS41ZTdcyOemrRJHnsWCReOOTU/wUd7xXLvdgnKU+u0N2bxSpAf/hXuW?= =?us-ascii?Q?ZtycGi83dcfEZx7PJycrtHnp03wiMpdxfkkNABhd3NlhEi79Y3vWM9uD4MEV?= =?us-ascii?Q?sL5wm1llD77eaO9Hq+Mo3KOClYlLibdXUoNYbjbld61EcnZ8va/XAxANhVHb?= =?us-ascii?Q?dMnD27Q1NSWAMGsI2QoaxHSZZy7iWuT2a44VQpLB99zana2fE5vuEjCHWgk5?= =?us-ascii?Q?l8Lkg9FX8uGguV1PCwBdCn3+IcrXVIF5LkMGrS2qqQfLTUuGEP3USNLScSxE?= =?us-ascii?Q?n9Vo3eDyGpscLwvJkcVpqRXinF+lyARbTMt7oDE5yDNJFpRb0Im/Sv+QJR5z?= =?us-ascii?Q?Xq/GVo3wRh6xw5LgOWzacATDheB7zVq+fOCljbjzeVkQ3udo+CMRmBA1DYER?= =?us-ascii?Q?wN4QC4ZySVhTYLNcegWf5s3aEa9hiHot9cHXcA7BsFAHI2jVlG5ZgrJQP3+i?= =?us-ascii?Q?4mmjuT3bXBWPvsMHv3260xy6wSQylDURA3W0I2NOhLEICBeukDtPM7Xx2KT+?= =?us-ascii?Q?C5uHVMxaIejN/ggse0c/b4mSmsCNpn8oook0N699GbjBOGcCIEXfX9Fuq9nk?= =?us-ascii?Q?4juUevLtPZ5N/LGfJmR82uR1KUJ+8E+qeEBXJsXSsZ8x76xFaaQnPLOjj8Xt?= =?us-ascii?Q?WKFS750qhDPhUP1dBczjDFoIayTDOM7H5XYRTBzxLRlC9qP0ob+TPiE5JcEk?= =?us-ascii?Q?qSQlZdfwJpq8S0C7WDsgmr6A+NHP3/2LiocjyYYB96BXf69n3BqSMVCpVTL7?= =?us-ascii?Q?OC2ZS4PIk9emIMM8pXbU5lFEEWsrCbPvP+3jGENT4hGeKJpkna/21Ja5Eeis?= =?us-ascii?Q?n/GhtBbLvpDMGlhPHc/py+ZEO+aZiKw=3D?= X-Exchange-RoutingPolicyChecked: L3CTI+pcFCNhoDhifyKaU+vb7krCtnFmsEBgZyFiLHQAnChPzS6k2LaAQuUlkMQ4TLpPBwj55Lb9V8QV71wYAqNLCdAMGn6x7X8Ec+2BfdiSUNlsFak2RwB/2gm/hlReS3mue99ViYJNezmiX38MCuJw76iUs5SfR/neU6ygQIYM4qMzs8LM1LBYUSJ+gZHBCf5sLQAAzH30m7EjDAg3q3/wMx5bZLGJfjlzxfBVbizGx93UALLTYz7Q5FOhov4hv2HeaI6lDVtspgFuvhh86faXsmtLqetLNPApsG85517QpfOwJ2iGbNNuuBVuB6CBNDdq04jUeqzlU4JkArIuGg== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 8GuM7C+zOykQpV9YVDPtyyM1HcpGNaajmltJ6Xx0NmwAAl9lwMYCqBqc2miH5DM6+2U2QH4VpW4MGuxO19dUVsPArVaw/yyAnBe08uy7Hjr+Xy+uEBdhk3LJfYdQrLiBuPYzbSBtoxrGeNv2uaHW9bgfpbBloMtNOH6HUmktrMUESnt/8cUcO3u+uZb0RagcEXg98tHdwAYL1kimcqKApcdHhiQCeW02mSbth0k+qTKVOcmzuM8/Vu4pHDg3twrtOG/QbcRQJktoVdaxl4opjjQr/fmujD1rA4Rg2mi3a7kRvWfphtx9DMGvVa0oUONCWsFYpYuRtXzTDDKhbr7E5i1r982i0c9IEe0T43JWkDjNSDQ13IeoC5CDjydMrpVhB0Malv7GIAOD4ykwoN09AoHJhyVHUltFaxngFnnS+1bftfUi9jO8JHlAeBTRnectG5drOZUHoEdCmt48bvSZpqmGqDXG3nD6sOu4iNOiARgjFEadzcmeEJM0olkCmJJuBjiy+Bml8ln1KETs2YI86F5VuPvRmM0nOo+OMYTDWrEmkJfFrItgNHkeXsc5z//w+CXIUlWan86xlUTHzkwfNbbswFkUkBmmnpU2RVNXTLE= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 354fbb62-65f0-485c-ecc4-08dea516e02b X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:20.5049 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: enJLU/w+yH1UGGa3siGoaui8LmJCheNiFSK1yKM3LkYMTAbaQ/vC8XPVQK6vHhPQKf2Ur/pb5SzvtkNb/xxQOw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 lowpriorityscore=0 phishscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Authority-Analysis: v=2.4 cv=U7uiy+ru c=1 sm=1 tr=0 ts=69f095dd b=1 cx=c_pps a=qoll8+KPOyaMroiJ2sR5sw==:117 a=qoll8+KPOyaMroiJ2sR5sw==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=EIcjfB9IiI4px24ztqRk:22 a=yPCof4ZbAAAA:8 a=B52eoxIPv8yZRAGToxQA:9 cc=ntf awl=host:12310 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX3Zd/gKMfgG6c ahv/J8jn5bvTnhTKDjVe/mtw1WnS1nuze0eBeGNHNugpG1JJt3vF0CxRVquKHcZyYLc643c9d9i Tsa+3AmX7h+Vf2xX/83WO/xNtGjZEZ8F618niQ56pznxh7OvxsAS1FPkZUb6nE8Rj+jsqDIFt5S qBKSvYeJ3wLFxKKc/v9yDIA3/oluD7i7vgzV18sRzvHSZWWvvVZIw1ZHnE3M48WctL/e2PO3LPz 6GUDNhFI+tHb9Md2hpY6NX8VSez0cnzs3t0fBz0JnKvvoLffqqz7v9hqX26rY5cou2PQdHQDwkr ae5LJpRDuBX05T23gOPlioIAlqy1UB8EZbnnlcHyP0xbqvbJcPZxi/PfmoPUH2/8HdILzx66aej V9JLaTOfEAzrFqhcMmUovi4oTFZq5e3479LVlzBSDzubUul9USbKxbXaWOh9veRU0ttJYbxh8HN E8WAONFPG5MmWWXqEaJJzmQaB4zGoqYR9/ltyc4o= X-Proofpoint-GUID: 56FGO4HzAz7G1_93MumkCaT8OppdiUqF X-Proofpoint-ORIG-GUID: 56FGO4HzAz7G1_93MumkCaT8OppdiUqF Content-Type: text/plain; charset="utf-8" Add support to allocate and free a multipath gendisk. NVMe has almost like-for-like equivalents here: - mpath_alloc_head_disk() -> nvme_mpath_alloc_disk() - multipath_partition_scan_work() -> nvme_partition_scan_work() - mpath_remove_disk() -> nvme_remove_head() - mpath_device_set_live() -> nvme_mpath_set_live() struct mpath_head_template is introduced as a method for drivers to provide custom multipath functionality. Signed-off-by: John Garry --- include/linux/multipath.h | 38 ++++++++++++++++ lib/multipath.c | 96 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 102dfcf21ffc9..3e2a513059cde 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -5,11 +5,19 @@ #include #include =20 +extern const struct block_device_operations mpath_ops; + struct mpath_device { + struct mpath_head *mpath_head; struct list_head siblings; struct gendisk *disk; }; =20 +struct mpath_head_template { +}; + +#define MPATH_HEAD_DISK_LIVE 0 + struct mpath_head { struct srcu_struct srcu; struct list_head dev_list; /* list of all mpath_devs */ @@ -18,11 +26,41 @@ struct mpath_head { struct kref ref; =20 void *drvdata; + unsigned long flags; + struct gendisk *disk; + struct work_struct partition_scan_work; + struct device *parent; + const struct attribute_group **disk_groups; + const struct mpath_head_template *mpdt; struct mpath_device __rcu *current_path[]; }; =20 +static inline struct mpath_head *mpath_bd_device_to_head(struct device *de= v) +{ + return dev_get_drvdata(dev); +} + +static inline struct mpath_head *mpath_gendisk_to_head(struct gendisk *dis= k) +{ + return mpath_bd_device_to_head(disk_to_dev(disk)); +} + int mpath_get_head(struct mpath_head *mpath_head); void mpath_put_head(struct mpath_head *mpath_head); struct mpath_head *mpath_alloc_head(void); =20 +void mpath_put_disk(struct mpath_head *mpath_head); +void mpath_remove_disk(struct mpath_head *mpath_head); +int mpath_alloc_head_disk(struct mpath_head *mpath_head, + struct queue_limits *lim, int numa_node); +void mpath_device_set_live(struct mpath_device *mpath_device); + +static inline bool is_mpath_disk(struct gendisk *disk) +{ + #if IS_ENABLED(CONFIG_LIBMULTIPATH) + return disk->fops =3D=3D &mpath_ops; + #else + return false; + #endif +} #endif // _LIBMULTIPATH_H diff --git a/lib/multipath.c b/lib/multipath.c index 0d5690b5ba4ca..726d9bec13553 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -31,6 +31,99 @@ void mpath_put_head(struct mpath_head *mpath_head) } EXPORT_SYMBOL_GPL(mpath_put_head); =20 +static int mpath_bdev_open(struct gendisk *disk, blk_mode_t mode) +{ + struct mpath_head *mpath_head =3D disk->private_data; + + return mpath_get_head(mpath_head); +} + +static void mpath_bdev_release(struct gendisk *disk) +{ + struct mpath_head *mpath_head =3D disk->private_data; + + mpath_put_head(mpath_head); +} + +const struct block_device_operations mpath_ops =3D { + .owner =3D THIS_MODULE, + .open =3D mpath_bdev_open, + .release =3D mpath_bdev_release, +}; +EXPORT_SYMBOL_GPL(mpath_ops); + +static void multipath_partition_scan_work(struct work_struct *work) +{ + struct mpath_head *mpath_head =3D + container_of(work, struct mpath_head, partition_scan_work); + + if (WARN_ON_ONCE(!test_and_clear_bit(GD_SUPPRESS_PART_SCAN, + &mpath_head->disk->state))) + return; + + mutex_lock(&mpath_head->disk->open_mutex); + bdev_disk_changed(mpath_head->disk, false); + mutex_unlock(&mpath_head->disk->open_mutex); +} + +void mpath_remove_disk(struct mpath_head *mpath_head) +{ + if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { + struct gendisk *disk =3D mpath_head->disk; + + del_gendisk(disk); + } +} +EXPORT_SYMBOL_GPL(mpath_remove_disk); + +void mpath_put_disk(struct mpath_head *mpath_head) +{ + if (!mpath_head->disk) + return; + + /* make sure all pending bios are cleaned up */ + flush_work(&mpath_head->partition_scan_work); + put_disk(mpath_head->disk); +} +EXPORT_SYMBOL_GPL(mpath_put_disk); + +int mpath_alloc_head_disk(struct mpath_head *mpath_head, + struct queue_limits *lim, int numa_node) +{ + mpath_head->disk =3D blk_alloc_disk(lim, numa_node); + if (IS_ERR(mpath_head->disk)) + return PTR_ERR(mpath_head->disk); + + mpath_head->disk->private_data =3D mpath_head; + mpath_head->disk->fops =3D &mpath_ops; + + set_bit(GD_SUPPRESS_PART_SCAN, &mpath_head->disk->state); + + return 0; +} +EXPORT_SYMBOL_GPL(mpath_alloc_head_disk); + +void mpath_device_set_live(struct mpath_device *mpath_device) +{ + struct mpath_head *mpath_head =3D mpath_device->mpath_head; + int ret; + + if (!mpath_head->disk) + return; + + if (!test_and_set_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { + dev_set_drvdata(disk_to_dev(mpath_head->disk), mpath_head); + ret =3D device_add_disk(mpath_head->parent, mpath_head->disk, + mpath_head->disk_groups); + if (ret) { + clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags); + return; + } + queue_work(mpath_wq, &mpath_head->partition_scan_work); + } +} +EXPORT_SYMBOL_GPL(mpath_device_set_live); + struct mpath_head *mpath_alloc_head(void) { struct mpath_head *mpath_head; @@ -44,6 +137,9 @@ struct mpath_head *mpath_alloc_head(void) mutex_init(&mpath_head->lock); kref_init(&mpath_head->ref); =20 + INIT_WORK(&mpath_head->partition_scan_work, + multipath_partition_scan_work); + ret =3D init_srcu_struct(&mpath_head->srcu); if (ret) { kfree(mpath_head); --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F00CF3F7887; Tue, 28 Apr 2026 11:11:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374709; cv=fail; b=uAvcZP//Zvt1y35BNrjhMbX0snRJW9WJePHd6BFkQNtQ/FIXolvIwQ1ykS2SjppQQ8ENYG2FK8yw4Vm8af4VxrDWWBgsj5G1a6LXYCo1hi9orGvEmMkMvyEhsIO4ZYGarSWhbjsW6mFszevihixkT32+VhBmfEUZQcYPVfQ3LdM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374709; c=relaxed/simple; bh=1cys07I2/6NullQ6wHxHdsCNPFQ+6pPsYM9i+K0Mi8o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=iEpRRbQgbio6ibaOSQOF7W0B/pqlUBWyZxsOF4snVdNZsm5ubpCtCl9Pb4f1sZsfJrxJD2xqvgSh72OlJ8NLOMTmn0/1Yca2KbOW7PKotYqgDCFvoVwzhmgrRXuLcn9F/kPEt3P/66XhVYuTwgbMv9o6RTDvymjUN60hE8oECYg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=RF0YuTMO; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=coMTA0Gg; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="RF0YuTMO"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="coMTA0Gg" Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SB29ZL1015471; Tue, 28 Apr 2026 11:11:30 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=wIMtkbHfRZV/it66bMUBJ0JKrm3aVBeQwUSNX6Z2Ga8=; b= RF0YuTMOMjeQ/LQgsMALKdbVjDm1J0kmTW4YMh2YrPBqAE0Ty2reW11cCwH5qVJ9 11GKAJJYRPD5Nv2J4JY3Nxm8F9qo6f1f4X2ukGr9ZRTon3OWdDa11rbV1YRO6lJ5 UiZl35TTzWtHs8eebf4M7PWM9zP1iT3sVVBizj5yKN5azYb4+n0ncj7wd02xhha1 1UfarJL5CY554gQKlLHdgEg5uOnwXIoP75YnpAXe4mfs3nfDeZzFfUYvDsw4kZ7k oBJL8Yl4N5wdmqY5T/ETQR8EyAR7KG/7+Xn/PsY9rVMeecOVVYXhUcdfa5R/hWK7 XW1m1s7ixpvT0O8cv5y9ZQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drm6yyju7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:30 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2kNj040801; Tue, 28 Apr 2026 11:11:29 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudth-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:29 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jwVCY2FWgokZd4EBdbWUeGJH8z2u7iwkqYgtJYWfnSbBpCSl8w4R/lAk6+8uV0uD8asfHRx2RSS5KWxY3T/ixVbkwmf7/0euwv3BTpj0X5yZMcDzIbj1xVvzcST33IAtGK9uGjYwU2w+bX5DtxgdTZBCiBDwk0IASoZsfxnoHZuN/tU7IyVhPJB15StUyzVszZdKF3qSs/4OzF5ckA9ueZr3pQyvy+L+Rti4qW8DjsX5Zt0QwwSd2bRvQGStdttVQaKHF/haR7UQS144zAYA5AZEh9fCrYBEmxZFMd1R7qV6/d1yxAz1w4QLyhyGQOhTMu46lPGa8i4UUwOIj7CM2A== 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=wIMtkbHfRZV/it66bMUBJ0JKrm3aVBeQwUSNX6Z2Ga8=; b=ocXZVo0AdxwgjTz04ITlMq0OagHBD2Ga7FwyRrYpZoDszFPUm8aAl/u89Bs2faWUTwgxq9CacOwnmmV8IRhzshRfFcsoKpRbNzl5MaBLLUZLJVZKFKquh2Ml5UnExzcmWZzqJ62SOwHg5o43UwyYXsbtp3LVjxC4uj1tPoGOdyclsjs+9MdnRltpfi3ZJpbwFBY3DvBmiiOn2eu/5vtfofhKMC1Unu0m/iLE6ZOO3qA9ePj2dWlG1lXi1RgLaNiyDVKtQmWyoNlLQzWekFw48JFoURQGK8Fcq/bUE2q5Vl4DBA0mDF5nm735MhjtAFUS2Df+5Nyfzal4GDasnZRI7w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wIMtkbHfRZV/it66bMUBJ0JKrm3aVBeQwUSNX6Z2Ga8=; b=coMTA0GgAoejFWRDCaLRmbfeKnLwAPwBjapzfADVx4ptGGpWjt+ZE82zpHdcaBjzimuG+d4zw2npINxj7/wMGahNS6xgdxBLUFDpJNTJ4k2N8TseuRWkukLPyabc6szMWQtNlgiI2i4ExrBjsP3t+Ae6z6zd4rbSg/yHUOxpuA4= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:22 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:22 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 03/13] libmultipath: Add path selection support Date: Tue, 28 Apr 2026 11:10:55 +0000 Message-ID: <20260428111105.1778008-4-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH8PR02CA0018.namprd02.prod.outlook.com (2603:10b6:510:2d0::8) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: 814ea7ce-04e8-4301-6aee-08dea516e13b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: ZCigyNxwbKG5ztV4auo+hI36fAHakI5lSDtpDJvDt1FpDCbVOE1EzNUH9Se+k5iJYBk7BF3fiOQCbn1v2LuNY9+WsveYf5DeCm6qg7vS3NpB9gxJMEEDR7XTrJh7Qbqd1EAxyjGu9xaXdWB92H5p/s0MKFbbfSKE/wekZE8w3v0JAjf+qlksMPN1ajLBFMa5YIzFCR6P3F/K7ih+p/llnaktDNKMgECg2wYfHz9XN2cnpy/anMsMHV+YfSpzt3W1to3CrtZjFO4vm9KTS37yLDWzICTaYrkr5HcqbK0UyJfgS/jKX08iPG6euiOJj90CsqUPVsq3hrqttWDR6v2m7wxPE4hNmU4yas287EcrYSiUA4HOXmv7JMh78L7Uw0AWrMYzmadSOk3FFoJfn5TeUCl6fEyDYwLEgXpogOx9LqBPWFqlw9UupNt5wgt5QtjUXBFngAoRNeDDQPQiGtzgfACUSLQNCDt6GVh9P87CJYjl/H9kE5GFiO88Tr/JIdG0Rlb8ymOkxT7e1S0hqcb1Z5obJ2E29alkOPKspsTw228EqLgEZB9pzOiiHZ/POXdRH6/rlBvDzTQGvWnH0xC96tm32q2VSQeeQy+mSdVoc4O49RQdS72u6kcCQ7f4lyfxnXtIcxSU9McX3IERlWI83qrS5YH2KcwAipLVnmsQtEFPUxWCExyGo/KZglEqavQHA0/KDWpnooRnX6rGpPrkvedT1/OP/06XuIAmnTcShu4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fkNF0xa2Ghhz0oqRMVAiSAtSIAT0hync/tDl1QAEHVti9FMvAb0OfQrmSgVR?= =?us-ascii?Q?4US+Chhdco8VYCoa788kFhPXii2v0IugDk+X8sHuGwsUwomdOAO/6QlgpTNm?= =?us-ascii?Q?llXeHAc7Br5ajLqh1/uFYRMLKWv5niHe243/91O3DzQTXn2icPkuiDh5+XIw?= =?us-ascii?Q?1zBBhZV6DxrtuB/2Gefn+EHaJ8e5nOvtcrx4CH6kdLtVp/WaD13P8NIDeLVS?= =?us-ascii?Q?j8KFKUkn1mbyPRh92146rb4u4zfis/ohvPuQPm5f9vP+R9jWnsHS63r+M4RT?= =?us-ascii?Q?VgQxQTa1sww9Cl1qokVlaTuyjaBF2Umilnwri6WuSGfmvCzjxJHhUmDxFXFE?= =?us-ascii?Q?ysdPk6X/jc+9APJGRf+9kXxZiL3K735V5RzDeX1gui3SFabYy5zsQhpmf/Ab?= =?us-ascii?Q?VXSNPN+uzS1jCuH+qS0eoe+Sol4DuN+aCc48NmN497/u90N0mFDwEg7UFgZ/?= =?us-ascii?Q?9zCTjOiE7frzHkT8VXww25rx2KgahuYzNDxRBqJ18ClTfymHX27n+Hnqgpn/?= =?us-ascii?Q?1pZ7vH5OaSVmY9Lid3oObneUgAOV5TVnfSKLSZs5/vVAyLUSempX6mPaVm74?= =?us-ascii?Q?VU+mEkVRMenUBpoRaI/NOGTSKVzzLAqVsc9fo9Gzf0lsQJDLOKOiYqpIlO5W?= =?us-ascii?Q?Yvnzca3YYooE732OgzQ1Pr1NGjobA6VZRG29339nUb/CDsuNSUvBdmhvBVZ4?= =?us-ascii?Q?PVfTxDOZWDLfFze3agz5fgt+T2kIAjG0eWfa1prJAJLqNd9CbQYJ22Z9kr3m?= =?us-ascii?Q?FPLHfuSsoDsTDAxcGDnNmpic5APWqzsgtZ1thu80JAUabRdH1oPSIHdMYpJ/?= =?us-ascii?Q?pprgo/h1D53YsbYc+GsMxPsB6S0v3u4448vZRu1/rGGnLIIVflAc90bXeX3z?= =?us-ascii?Q?drz8OBTPXz67Cic1/u8Dt9IOSpGwKUg8H4I+eCv3BqbqyRjgdW3bjW5T8AEO?= =?us-ascii?Q?V4dGZ6nW+R2JZXNUL2y3+LoKyo+tQsIjN8QaH7npz1k5XK+M7Rk6HC3K9+SY?= =?us-ascii?Q?JTN+xV6T6eSuufNTDNylTc1p9k3fM0fFOZhLoX7y7RRObrphLXVSWUocWe+q?= =?us-ascii?Q?ENyCaJYkOkWrPexhGXJJZF/ytGrXDYqEd38s661otpLbug72poG0o2qoM8uh?= =?us-ascii?Q?Faw3oG5HbEIh56xbrDsjd9b8NbdVbUKAaXEvP9Sqgyoc6NGEO2J8FjmZC8Fb?= =?us-ascii?Q?QawVDx/NUMz5IJKEjyJ/ySnP1piPDdeCmzjckrMhZpc3ctACKTsYGE4lyeg6?= =?us-ascii?Q?hMwtyswNVFLXkz2vz0Bq8PGrczoGbYC4lxcSLdRsjP4DeBuDSsYJfmwk/VtK?= =?us-ascii?Q?/XfsxjXSqerpvna14Fh32YWwPT+OvNX2wCfYEBshJu/C0V+mRuR70BL7eS3s?= =?us-ascii?Q?pafeeIt52Dq3h2/BJ6F5BPHZRnXjpWNX52QyaX2nN7U7dawtOX/3U56fJ3e+?= =?us-ascii?Q?jRFzLjnGqKkYFEPJDfpuU3VlBBALSoG7k+Mvl8WtgRTd65qzuVZXjahJisQa?= =?us-ascii?Q?Te/jTSHkrfYkRMU/6dlADy3VvgwS2mFU9oQEKqiedtbFn3YWJ9JmNwVSmivp?= =?us-ascii?Q?BEJ6YgopA4wZpp6ZtPk/SaNfVmPgjizvRKU/d1RcJYueT5N2cKKIe+ZQ2AMo?= =?us-ascii?Q?QtArgjYe1U7LRmuLIRdhDfCJYieG3cL0IDF9ELJZ/b3dwJS/Y5IWezGou96k?= =?us-ascii?Q?xHLrnjqtjCn9+k9XzUIlifRX35Ki+GB2siV8MO5W6UgE9g7j1GVnrT7xtwLp?= =?us-ascii?Q?M6hSJQQlwprrs0JdFmCZCKjLD6sgCMc=3D?= X-Exchange-RoutingPolicyChecked: GN9LYPHPKngbef904GoyPyMyK0b/OhjGptGGirIzFTeYiFTM0qulFpYN09DTc5/SpYEioCj826UwwJs7w9kkb2DO+/2lyQKqXWkGHXb1X3I9UuIAr7BpRkxI3m0+rJn/4/U5D4Tfn4NEg38FDP15v++oLiPOyL+xB52gzFcavzEH+eD+j9A+RC9+Zq3p91yP/K+c3umQW3Xa0K55RGOcRcVENPMJN/koXsIIqxFkhvS8zqrmzWOIfi1X/VysbtSUzAfzhV5bbc77/7J3BVz3wSTGGUFWi5/FF8g6ahpmK3v8NxejI1L33puMuCSoMs4i2rQdlHgj0MVHxL3T8chrLQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 3HtztqhPoQuvEKpg3OO9YS/O0+Z7zJIPpHAPVjCMSm/PNDS/3cO6L2nbgyT51mAl5WjCgQSF2cvrfc+8EJ+xAJZdaookt5qQFNNkrb2Qdy4pEh0DkSLLHsKxpJnHt5GBaMe1qiBTdOK5d4cilXTLDr36L4EdOiZZPf973/+L3MDE1RJ48cuYgyA1QSDj3Os4l59yMFVSyaIwG9x36+65g5tFrxYarIzRDecF+H2jxqtDvErti9M4QntNe2pnLcVn6I5A7xArGW2rPl929sHbvUAusisdxya25UIrjShEHLBRXCYxa4oj7lyAZPfadVf9gALUKgcER6nvsIHTPNt9tDgqe42kUYq/0fdnZa/E95VZfWJQ1KDQhL5IO5XJILLS86oT77MbL++0Vb799YwmQe3oOJbUnC1NTspgG3Qi50ZK7W9mms6C2DDMcOXWK2MA/0FE598yJzv/U5/sfUQyd0AdGD/VjFoy8YanycAGgEIBgMmGDwzEXUKcuYtOsYTvSJBUTbqIqa0aL3MSjEEW6RhyE6JVZgUj6jb174mDtg45uO9pYVXDaePreXGF+cHBy50sRu7kA8b93xtw2lCQq1zPOEs/fRVw6uZIC14tcVo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 814ea7ce-04e8-4301-6aee-08dea516e13b X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:22.2655 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lNw8y7LsHnl/5cOjcRFwfMXskK/hxvxcizxar1kmt3TxDNRazi/y09eZLQ02l2O/vMlGhNvuoRMSEaI30O+sUg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: w3sE378bvH3s9z5TXt9SqFenzt1ATNN_ X-Proofpoint-ORIG-GUID: w3sE378bvH3s9z5TXt9SqFenzt1ATNN_ X-Authority-Analysis: v=2.4 cv=BePoFLt2 c=1 sm=1 tr=0 ts=69f095e2 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=RD47p0oAkeU5bO7t-o6f:22 a=yPCof4ZbAAAA:8 a=Lb5UtHSxAhypNmDEWQsA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX9+Zd34jmFCjb BP1c5GldCkG9UxILvAPYdHVcPvP7FzqGK6zTQOUQX6oY0UOpGk3mI+/Y2fLGJ7GxVszjHnCEvlh lErJ/kEOXhntNjVwnt/iDlfy8PQuPiaGr1/1S59vlvSNfRqNlNqLlN0UajfDE/IEIQd1KVnF/Ik JCV/VmvGOYqCnfpILmkDTGik1lZ0NNz4iFKmWXpaC6wWCs4VyVH4BGT5pZdav/ZX15ptUlpu13H 7ztMpUyo7JnunCluhlAVfmIU5KqSYZuszAyLgY3eGwwC+ZrdNmmtcXuSSW//Q+FVD+lVI+519hv OXzSp4ZU0EYJMgRgb7Y2d0Dh1IyR2nZrQDdPDS9wav+llAo5lQjXYN+VNUfaIC1C6WDK1BHociE oZjbWp2D5ZFWYt7jbOIZOl/B/+wSTha8UP52SOaznEBSlAqAVY5fOLVLHcfK7GiGNXgvW7ludZG zMRCPti+AGv48UV30Fg== Content-Type: text/plain; charset="utf-8" Add code for path selection. NVMe ANA is abstracted into enum mpath_access_state. The motivation here is so that SCSI ALUA can be used. Callbacks .is_disabled, .is_optimized, .get_access_state are added to get the path access state. Path selection modes round-robin, NUMA, and queue-depth are added, same as NVMe supports. NVMe has almost like-for-like equivalents here: - __mpath_find_path() -> __nvme_find_path() - mpath_find_path() -> nvme_find_path() and similar for all introduced callee functions. Functions mpath_set_iopolicy() and mpath_get_iopolicy() are added for setting default iopolicy. A separate mpath_iopolicy structure is introduced. There is no iopolicy member included in the mpath_head structure as it may not suit NVMe, where iopolicy is per-subsystem and not per namespace. Signed-off-by: John Garry --- include/linux/multipath.h | 37 ++++++ lib/multipath.c | 248 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 3e2a513059cde..13d810148a96a 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -7,13 +7,36 @@ =20 extern const struct block_device_operations mpath_ops; =20 +enum mpath_iopolicy_e { + MPATH_IOPOLICY_NUMA, + MPATH_IOPOLICY_RR, + MPATH_IOPOLICY_QD, +}; + +struct mpath_iopolicy { + enum mpath_iopolicy_e iopolicy; +}; + +enum mpath_access_state { + MPATH_STATE_OPTIMIZED, + MPATH_STATE_NONOPTIMIZED, + MPATH_STATE_OTHER +}; + struct mpath_device { struct mpath_head *mpath_head; struct list_head siblings; struct gendisk *disk; + int numa_node; + enum mpath_access_state access_state; }; =20 struct mpath_head_template { + bool (*is_disabled)(struct mpath_device *); + bool (*is_optimized)(struct mpath_device *); + int (*get_nr_active)(struct mpath_device *); + enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); + const struct attribute_group **device_groups; }; =20 #define MPATH_HEAD_DISK_LIVE 0 @@ -45,6 +68,14 @@ static inline struct mpath_head *mpath_gendisk_to_head(s= truct gendisk *disk) return mpath_bd_device_to_head(disk_to_dev(disk)); } =20 +static inline enum mpath_iopolicy_e mpath_read_iopolicy( + struct mpath_iopolicy *mpath_iopolicy) +{ + return READ_ONCE(mpath_iopolicy->iopolicy); +} +void mpath_synchronize(struct mpath_head *mpath_head); +int mpath_set_iopolicy(const char *val, int *iopolicy); +int mpath_get_iopolicy(char *buf, int iopolicy); int mpath_get_head(struct mpath_head *mpath_head); void mpath_put_head(struct mpath_head *mpath_head); struct mpath_head *mpath_alloc_head(void); @@ -63,4 +94,10 @@ static inline bool is_mpath_disk(struct gendisk *disk) return false; #endif } + +static inline bool mpath_qd_iopolicy(struct mpath_iopolicy *mpath_iopolicy) +{ + return mpath_read_iopolicy(mpath_iopolicy) =3D=3D MPATH_IOPOLICY_QD; +} + #endif // _LIBMULTIPATH_H diff --git a/lib/multipath.c b/lib/multipath.c index 726d9bec13553..fa211420b72c3 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -6,8 +6,242 @@ #include #include =20 +static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head); + static struct workqueue_struct *mpath_wq; =20 +static const char *mpath_iopolicy_names[] =3D { + [MPATH_IOPOLICY_NUMA] =3D "numa", + [MPATH_IOPOLICY_RR] =3D "round-robin", + [MPATH_IOPOLICY_QD] =3D "queue-depth", +}; + +int mpath_set_iopolicy(const char *val, int *iopolicy) +{ + if (!val) + return -EINVAL; + if (!strncmp(val, "numa", 4)) + *iopolicy =3D MPATH_IOPOLICY_NUMA; + else if (!strncmp(val, "round-robin", 11)) + *iopolicy =3D MPATH_IOPOLICY_RR; + else if (!strncmp(val, "queue-depth", 11)) + *iopolicy =3D MPATH_IOPOLICY_QD; + else + return -EINVAL; + + return 0; +} +EXPORT_SYMBOL_GPL(mpath_set_iopolicy); + +int mpath_get_iopolicy(char *buf, int iopolicy) +{ + return sprintf(buf, "%s\n", mpath_iopolicy_names[iopolicy]); +} +EXPORT_SYMBOL_GPL(mpath_get_iopolicy); + + +void mpath_synchronize(struct mpath_head *mpath_head) +{ + synchronize_srcu(&mpath_head->srcu); +} +EXPORT_SYMBOL_GPL(mpath_synchronize); + +static bool mpath_path_is_disabled(struct mpath_head *mpath_head, + struct mpath_device *mpath_device) +{ + return mpath_head->mpdt->is_disabled(mpath_device); +} + +static struct mpath_device *__mpath_find_path(struct mpath_head *mpath_hea= d, + int node) +{ + int found_distance =3D INT_MAX, fallback_distance =3D INT_MAX, distance; + struct mpath_device *found =3D NULL, *fallback =3D NULL, *mpath_device; + + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings, + srcu_read_lock_held(&mpath_head->srcu)) { + if (mpath_path_is_disabled(mpath_head, mpath_device)) + continue; + + if (mpath_device->numa_node !=3D NUMA_NO_NODE && + (mpath_head->mpdt->get_iopolicy(mpath_head) =3D=3D + MPATH_IOPOLICY_NUMA)) + distance =3D node_distance(node, + mpath_device->numa_node); + else + distance =3D LOCAL_DISTANCE; + + switch(mpath_device->access_state) { + case MPATH_STATE_OPTIMIZED: + if (distance < found_distance) { + found_distance =3D distance; + found =3D mpath_device; + } + break; + case MPATH_STATE_NONOPTIMIZED: + if (distance < fallback_distance) { + fallback_distance =3D distance; + fallback =3D mpath_device; + } + break; + default: + break; + } + } + + if (!found) + found =3D fallback; + + if (found) + rcu_assign_pointer(mpath_head->current_path[node], found); + + return found; +} + +static struct mpath_device *mpath_next_dev(struct mpath_head *mpath_head, + struct mpath_device *mpath_dev) +{ + mpath_dev =3D list_next_or_null_rcu(&mpath_head->dev_list, + &mpath_dev->siblings, struct mpath_device, + siblings); + + if (mpath_dev) + return mpath_dev; + return list_first_or_null_rcu(&mpath_head->dev_list, + struct mpath_device, siblings); +} + +static struct mpath_device *mpath_round_robin_path( + struct mpath_head *mpath_head) +{ + struct mpath_device *mpath_device, *found =3D NULL; + int node =3D numa_node_id(); + enum mpath_access_state access_state_old; + struct mpath_device *old =3D + srcu_dereference(mpath_head->current_path[node], + &mpath_head->srcu); + + if (unlikely(!old)) + return __mpath_find_path(mpath_head, node); + + if (list_is_singular(&mpath_head->dev_list)) { + if (mpath_path_is_disabled(mpath_head, old)) + return NULL; + return old; + } + + for (mpath_device =3D mpath_next_dev(mpath_head, old); + mpath_device && mpath_device !=3D old; + mpath_device =3D mpath_next_dev(mpath_head, mpath_device)) { + + if (mpath_path_is_disabled(mpath_head, mpath_device)) + continue; + if (mpath_device->access_state =3D=3D MPATH_STATE_OPTIMIZED) { + found =3D mpath_device; + goto out; + } + if (mpath_device->access_state =3D=3D MPATH_STATE_NONOPTIMIZED) + found =3D mpath_device; + } + + /* + * The loop above skips the current path for round-robin semantics. + * Fall back to the current path if either: + * - no other optimized path found and current is optimized, + * - no other usable path found and current is usable. + */ + access_state_old =3D old->access_state; + if (!mpath_path_is_disabled(mpath_head, old) && + (access_state_old =3D=3D MPATH_STATE_OPTIMIZED || + (!found && access_state_old =3D=3D MPATH_STATE_NONOPTIMIZED))) + return old; + + if (!found) + return NULL; +out: + rcu_assign_pointer(mpath_head->current_path[node], found); + + return found; +} + +static struct mpath_device *mpath_queue_depth_path( + struct mpath_head *mpath_head) +{ + struct mpath_device *best_opt =3D NULL, *mpath_device; + struct mpath_device *best_nonopt =3D NULL; + unsigned int min_depth_opt =3D UINT_MAX, min_depth_nonopt =3D UINT_MAX; + unsigned int depth; + int (*get_nr_active)(struct mpath_device *) =3D + mpath_head->mpdt->get_nr_active; + + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings, + srcu_read_lock_held(&mpath_head->srcu)) { + + if (mpath_path_is_disabled(mpath_head, mpath_device)) + continue; + + depth =3D get_nr_active(mpath_device); + + switch (mpath_device->access_state) { + case MPATH_STATE_OPTIMIZED: + if (depth < min_depth_opt) { + min_depth_opt =3D depth; + best_opt =3D mpath_device; + } + break; + case MPATH_STATE_NONOPTIMIZED: + if (depth < min_depth_nonopt) { + min_depth_nonopt =3D depth; + best_nonopt =3D mpath_device; + } + break; + default: + break; + } + + if (min_depth_opt =3D=3D 0) + return best_opt; + } + + return best_opt ? best_opt : best_nonopt; +} + +static inline bool mpath_path_is_optimized(struct mpath_head *mpath_head, + struct mpath_device *mpath_device) +{ + return mpath_head->mpdt->is_optimized(mpath_device); +} + +static struct mpath_device *mpath_numa_path(struct mpath_head *mpath_head) +{ + int node =3D numa_node_id(); + struct mpath_device *mpath_device; + + mpath_device =3D srcu_dereference(mpath_head->current_path[node], + &mpath_head->srcu); + if (unlikely(!mpath_device)) + return __mpath_find_path(mpath_head, node); + if (unlikely(!mpath_path_is_optimized(mpath_head, mpath_device))) + return __mpath_find_path(mpath_head, node); + return mpath_device; +} + +__maybe_unused +static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head) +{ + enum mpath_iopolicy_e iopolicy =3D + mpath_head->mpdt->get_iopolicy(mpath_head); + + switch (iopolicy) { + case MPATH_IOPOLICY_QD: + return mpath_queue_depth_path(mpath_head); + case MPATH_IOPOLICY_RR: + return mpath_round_robin_path(mpath_head); + default: + return mpath_numa_path(mpath_head); + } +} + static void mpath_free_head(struct kref *ref) { struct mpath_head *mpath_head =3D @@ -71,6 +305,7 @@ void mpath_remove_disk(struct mpath_head *mpath_head) if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { struct gendisk *disk =3D mpath_head->disk; =20 + mpath_synchronize(mpath_head); del_gendisk(disk); } } @@ -121,6 +356,19 @@ void mpath_device_set_live(struct mpath_device *mpath_= device) } queue_work(mpath_wq, &mpath_head->partition_scan_work); } + + mutex_lock(&mpath_head->lock); + if (mpath_path_is_optimized(mpath_head, mpath_device)) { + int node, srcu_idx; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + for_each_online_node(node) + __mpath_find_path(mpath_head, node); + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + } + mutex_unlock(&mpath_head->lock); + + mpath_synchronize(mpath_head); } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 291CC3FAE02; Tue, 28 Apr 2026 11:12:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374729; cv=fail; b=sxDyThdc6v5k+9x9sPZZg7ebQqfJU2YJMtuYuZYZv1MHm4WR/qpH+ukl6xGgvAHY8kqDoTrnjuTHQfh3wuM56YxFpQThXcUh+LIX3Ry+PiR/w5Ws2+2fOAYaJazPzdDF5huN0T/497e0Z0KsWc9T3EnvrZ181g33PyzNOZ8mtuA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374729; c=relaxed/simple; bh=+7yH+R9/Eh5L8tSbc0OczuhWw0TgBu7HPp3TMW/6ZZI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NsBKC5NaMHzFHdWdMGqrIMZFA+4XkD1EXIBVw8tT1YjBHWyFLm9brdrlqxliuljumu7DhfY9nwg5xbNNZWsH4sNIrvjU42wKEuFhON81PcxdIYd9f5EkpoGpoKbvhlif2zTQ9TRhk1MibSt/NFhxrgTQMDqH2ypMKn7G5pgdGx8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=P1EbTZjx; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Ygad4HHu; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="P1EbTZjx"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Ygad4HHu" Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S9jIkc720982; Tue, 28 Apr 2026 11:11:31 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=ZMfVht24w6rCImAj08eDnbix/wVPGRRu4Q66GVQu3uk=; b= P1EbTZjxhQHvMFhCitnf8p+8usqcNSmxvJWh8XL+P/9IFBsANaMCi+HnRx1voE/o m/sRS6hniraPE2NIzsH/hrv6y9/1uJVoY/+7NWMGqzx1pGrMMuNJDO623KdG0Rt3 T3B4HTiT+iRkgbh5JGObDlfiDCsCvnUAcs6JV/EUFgDembDli5vOtEX4CeZJrBi4 m8OAk8w3V4WudiBjH7HrwKhzEmzjZwVk68yPX8mKu7VDzbvIwsWoJ0ujtVrnrbhe urgMpYnMg6FUbNJNFiDJ3LUYYmBJrlzBEDS5rNgh9pPK1BmDVea2qQN8ltFWZntV r13CR+/awE7AyMiFAXCUZg== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drp5syesp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:31 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2kNk040801; Tue, 28 Apr 2026 11:11:30 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudth-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:30 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iLecWJWzPyMZAXsu3yfTvPWSyKjPJUOa/WqI1goc428U++ldeAWabv6EcSG3mGEXQA2lV5ZMKUM+91f/hB4IzwSdblvozS0kvFHasT7AIKwbPvu83om5RWIYySiUarIoMB/N+3RoXD1U+RSVd9unU1ohK6CJLXNLfj17HltEbn9wRa5swtvCrz5R1O2QYBnTS8pNLAOu2H4K8FtDJJcALVcPxJSvvYWXkxndqqPp/ljUlwASfUbletF2/5TwlMeqhQi+u7UfmurvKRYAQ7zEJvi0MZNE/wJYC2QN3NEFrzJIQOC1yOgGNz6pOsgtHGP7n70TcRq1DHwxwMae5uQYEg== 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=ZMfVht24w6rCImAj08eDnbix/wVPGRRu4Q66GVQu3uk=; b=pB3M1UqRuWU6eUGqj/3x4rggX4qdqbrjnytiq20aHbJJ9hVg9u1lNSnaL/Ox555gCVqJVJcf0el7CHCIkxBPgJ85KGzUl5zTHUaOjUlJlsqcndXLcIlM73MMdKp5fMSL4/itiLpQrpXY3AY00l1fPq4yZOuapk5kj3LiOv2vjuATvBYDxzV8vS3GcNc16aMEm1gTfKCGHgpF5KyWUcE0tnEUFvqwPwvjbIJYX8+z6PdFOtLfN7osHmjY0UJM/EkthdxnVqrXO5OqNGnNpl+A3ybrOGqVMkKjxBwr2zX4hspcnvxFR5h1D52Uk/0wWb+CsLMsScJRehr/Ri+OM+qZxg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZMfVht24w6rCImAj08eDnbix/wVPGRRu4Q66GVQu3uk=; b=Ygad4HHu2AsfLh60p+wQ8LhcGhwf0XKg5Z6R/kRjUyHM0zxtsr2PwiS+tw8OVocKY+PGqcqDjnBzYyBUPkPG477WpQZLLbympRy/OQhjOzrjr9AwNlcesHnoijRPzROo9Ulf7vsBC0iFLcoWvU2mfcKvTJRRi0V0cNSn6t5C/Mw= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:24 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:24 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 04/13] libmultipath: Add bio handling Date: Tue, 28 Apr 2026 11:10:56 +0000 Message-ID: <20260428111105.1778008-5-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH8P220CA0044.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:2d9::11) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: da8f4909-ab11-4624-7426-08dea516e237 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: iRiogBpSS4aVqJ51dDtv1ON8OuR8fvWuc9t6u96SrIrhpV91bp5dlGZqhlDb6b9za2hCtrVX4vu+11MhmW2te5jKuiPxtc4YGey+ZeQyKM9FZXPAL1O+acvYKVEzmc4W8D79JkPc1h0AERFZU7MO0m3MKVADHP2IjmHjc6Rq+s7dDZoYN4A5KaEyjPBUQtikPidSRv2tabMt/8N9JTA2gHbb4nXWZvjHh5voheKkxqbg5jH2U38fs8YMsEaAun+ye+oyJHIp8D4MBv+x7RjBUxwdKtnHPLk70hGfEFFL0xScXlPx2Wln9MQ+XR/25p5C8fFgP+H6jZ8oC5lXhEYfaqiOutfEuVA9D/OLacIkgonJhOb7K5T9dpgmAh94TiRduvX6ejc8He0UriHxWM63+ZTcpoQTSRk9yDSnItId5o/eXptPiUayw/mw/HQDKoS9tKaNItvWuEfs1DpRmFPSk0VUn97J3gYL6rnge/sevvp2gHl7jRY91QJatqzizrrUaz3dU3ovl2Bv80JXBL/nvpcEoJbJ5InVDVEd0spQju2GSXgaiOdZQtA9cdia7O1M1XENB8/YelQ9zuSTOxGyw/sD5gVVxMRN4W2e/oItM1ROQAlr5BEryDbA0x0JQYp+N7bVP4To/u9qICet4i0/SMyZaIEF6x5nMI0TdaqVD3Q12VL/5CqXKOrxHdmGKeOeDdxoZQhlTB21RNVx3qN5DCEonXHbwJUZY0RqkNbLrxw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?gVG1eyEhmugNW91xb+9kZo/SFpTIKz5PnQjYdtxIR/O/eLT7gBmwJg5ZkzMG?= =?us-ascii?Q?nCGVCx7urcL6tWYPiQGqspOEcV/uWbQ3eMn51EJVDetZlQnfij7B+/GVnTAE?= =?us-ascii?Q?GclOyA20f7x5pK+1q5tP9s2yjC4mcmk+TRw5sZvduATERCkum7uBeK5CY6RO?= =?us-ascii?Q?qCQuQzEHckl0ykvg1dmPkW6rMKsLDg74UjpMBepSH1wYmkQIVgPRbWXC9rDK?= =?us-ascii?Q?j5bV69HpzStZHdcN9v2Qp1isu5WREABNf1gFDkbKBEO1trRheaVL4ncC0Cvt?= =?us-ascii?Q?HzX08ibRVnBtxsSCU1Hu1zuw4vBjygr0dVYWRD4sDLfRd77a4Zwooat9x0Rc?= =?us-ascii?Q?/215K2t2aAm+g8Pm+8uN4g/0rbfus14hySODmItUQ7x7pAIzoC2aLuFOiZJA?= =?us-ascii?Q?i+/9gVtfITQX3lm0748PmQxBMAPgh2hq2xcNnHFgpSKATYhy5CNmSqsnBfXU?= =?us-ascii?Q?zxSuSDWJpqYYJRGf4XTtRG3YZwb1fnxuPgGqzTOWxIolqzFXVip8kefOvJ97?= =?us-ascii?Q?qrCCABwprxqYIXjCcF0LdmgbyRTVqyu7Hj6CaFQQgUzEQlRN53sfBngz6XpI?= =?us-ascii?Q?P1NPB2FmkAl7ZJKNYPu1JvBb40F/FS/x/tRJuXvahiRcyBnpWWSWrDtdumvw?= =?us-ascii?Q?rOCvM/vIwoRJktjBIF6jRlS4z+hwjkv2LrsuX1X88TTEhev9NHmk2nPiRURj?= =?us-ascii?Q?8P3Da3gNYTbNRFAi942zEsxSM9yLR4nh/r++m2AxVVi/vkfGPllCmW9VQt0X?= =?us-ascii?Q?vNVnWalEnyUMmC9V7Eeae6FSLVWOqyL//LHbxoCbImvFn7cctAbzkYtrJWmK?= =?us-ascii?Q?ob3hog9xV+/FgmqeZsWfa2I4REk0kXYyh8cEOmVU4bFbEw4Rgj2K7RfPsDgr?= =?us-ascii?Q?97SUvjk73pECNuzxGECY2pvbfC/tt977C5iB9/lFoVyVBwg2+6RzQZqVW8qw?= =?us-ascii?Q?cIXpQQrKjMbZ8swMOi3OQIhLWiVo/wOr7rGZBkFcRvr6KsUQyykhHfnBDwkz?= =?us-ascii?Q?mNB2dH/7U3jzS6P3R2w4e7VQOl8hyoRn9ACDIQ0nt8hL5djknBuvZzBSCkXm?= =?us-ascii?Q?q3TJ8FlIsTBoiiOqDyrL1J3HGiLUA+/yYKxK/qBwQrqNpsPE51fKZJPfoAcG?= =?us-ascii?Q?+Eh/Kj3bEmyRUQsyraCP7ykZtSQRPK9DlCRhLZoxphGYEZAuC1dX+Lidn197?= =?us-ascii?Q?rzU6XTao08+aMgxO6EtQkalVzRncqAwnLQmSkYV6It2zhpkfC1CGlWtpIdSy?= =?us-ascii?Q?BFH25r4TDBwQHZPEovRj6Iu/1kJ0za7pduOMmzqcYGPCzdReMZKRlUX2uD5b?= =?us-ascii?Q?i03rsCAYRnARKmr2o3Ar++hotWa5Tab0xz4UH/0sI4GZhslRKvZpVChebLiZ?= =?us-ascii?Q?L6MYnlS29QCveXy1VDaKchGHb9ebu/oq5c+cnMLykj0l3FxA9DNMNriB4bAM?= =?us-ascii?Q?zzWE5mMQguNGXmB2xiJJ5op/e8VkwCV3A66eUYzge1WLPu2dLmo0BTTOpqli?= =?us-ascii?Q?lj/FIQ66p8gZyKBKrRpWSPZtwpAft/3UYF6vVtuCg3UjCDJmnbpqXlpxNfrs?= =?us-ascii?Q?4KOCWYZUcvIM86eMPPVIrhgeEZv6ZgwUi2DsNSijq9SD2ISx+Vm7eu1W5ldv?= =?us-ascii?Q?WGnD+NB1PK4tpAGYjU0aAddXl7a+9pPYg79MkjTtjPe7N11/ik00LObSJDU/?= =?us-ascii?Q?Q97Nn69iVxREdRouIet6/SeJn4q+ozHtASUXSjOJPKaysBtk0MvU57PyjUjW?= =?us-ascii?Q?VkBwIe5BeGRIaeP4UwLcpdfnByU7AgQ=3D?= X-Exchange-RoutingPolicyChecked: QYEcdMJYMePvso3iNf1A16pR/V5WSV3bp6tk0Bnfafqdz4JypSEV/glo8obbF2+hxWdADBpAalLVTGmYRNFq8x126zKOSAX8vnioayITc1tNH5R2YaruUfxZ4ghzMOMmNiRrduZMnCWqEideJ8FIc8v0VsyLgU+tO4Cj+dkaPvegDGrBZwI4ciMkdyHD9cNHmS/u15B3oSaU/QbW5JmagX4zDFMAQht0ElYvJv7VEP+GbS3BQiu0XGQaFnel9fCT5+YpIUD8j79lKQW6O7Y/1IJM/ahntn+ZLT2u6VUDu9XvzhTLHIsRpTGE1sVM4tYQmo5D5YobDTLQ6Nz+yI8UPQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: dNzDHsuWNo24T8j+m5+rI4rV7P6Hk84l+eOYRRsgEaBj/iJvRbwXdhKPugWqpQwYuu6k/mgwOr4SSzRsEW+2vT4XcYjzVDb7eWSBsurWuRxUqfL/o31L5Y4C+McwzJof9pQm0BDD036mRZ0sTOBfJKBjgwPZ6k/w4rCPAy0AUzJHwky7JXk5R05Ai8iBvvxSkQBTKHsGuAPzxaikT5bYIvbXD+1IbzUTgqV8K/SclsNLrfDGfP2pzQKiFrfPilv12ACcPf76PJSmTLLqhdmlRIOaN9CGaZk71hs9nzqMTnxiuAjIh+w3O1OgrDvFWqvkFA+Oem3pS5JRIAq/ueTgnYvPSVuI1eE9QtDsJr3MpmHbM6GWY2Yx55NiKIx3qs2+aTuGaErp24eC/0TSfSLdU1bQIpqR+NV3+EezRNwFb+0/F7RuCZR6QZ61vRstR4bKTq8oJp09kLXihYRymZ25UJ86esJ1W9gHaE1zxqDhM11AGpuGw64A+/HRS439wDVLsbFtcHJZqMNzWMtMYeh87gFd5vIgyqTazmwUxO3gRirMuAEykZb3wIgU/nTiEieuKOm5u1sp3j3pgVqc3Xv5Btq0Mfahq13LFAGujaOY1RI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: da8f4909-ab11-4624-7426-08dea516e237 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:23.9603 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: H4IKAjOI8/zsUsU0w8yR3mdw+VaRbvFIeDdqrwutNo6ZF/kuBL0MjSl9dXHDbG8ZekQEhYFDegRG2Q9SOQIMxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX4w2xbsApmJmr V6DRia0Vj78kefyXDra+RVX1K7peKnB2lRb7Z14coH0vjVTFnSpDYL0koUWUMTjoBw0vjeS37/y I0Vsm3Y0/N/FQlcic+dIN8zUG6lAqTVvc1iy+frsdnzYP4Qugn8mPLK9OwkrYtk31/Kb4rIce8y jXP/iQH1jZRwkLs8eKed325RJH8oXsBr1ZiJgzVCXhWmg1yibwoXuL+cBKi+GYE7wQ2s79W48IR evlPP2asgYmCUDKxhMpWa6mGFSeRBO3KSJIesouz5/6rWXkNvNm2x7Y/qQjhCyuegdKZxvubqiE KScs+njHI9yOxR9d7ok7dxGIunsWBzGrxJNi+OUXH1OnPI0uCRaFlbPekmw3kY03Pi9G7uvcjhw ny8AxIV8KhUzquUfN9PMBr5ZylNhe5Kn+NQy0LF/m32bzkmjGqJZyrCzAQ49y3fcCIuft5e6FNX TVfbgDebuIKjYy6XhsQ== X-Proofpoint-ORIG-GUID: 0u4NB0JyQhVFohoLx_oh28azzmbeBYWQ X-Proofpoint-GUID: 0u4NB0JyQhVFohoLx_oh28azzmbeBYWQ X-Authority-Analysis: v=2.4 cv=E7v9Y6dl c=1 sm=1 tr=0 ts=69f095e3 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=7Gl3-_t3PgB9XO-mQDs3:22 a=yPCof4ZbAAAA:8 a=NCbfIFLLqE_mmLRBXG4A:9 Content-Type: text/plain; charset="utf-8" Add support to submit a bio per-path. In addition, for failover, add support to requeue a failed bio. NVMe has almost like-for-like equivalents here: - nvme_available_path() -> mpath_available_path() - nvme_requeue_work() -> mpath_requeue_work() - nvme_ns_head_submit_bio() -> mpath_bdev_submit_bio() For failover, a driver may want to re-submit a bio, so add support to clone a bio prior to submission. A bio which is submitted to a per-path device has flag REQ_MPATH set, same as what is done for NVMe with REQ_NVME_MPATH. Signed-off-by: John Garry --- include/linux/multipath.h | 18 +++++++ lib/multipath.c | 100 +++++++++++++++++++++++++++++++++++++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 13d810148a96a..2a5a9236480f7 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -3,6 +3,7 @@ #define _LIBMULTIPATH_H =20 #include +#include #include =20 extern const struct block_device_operations mpath_ops; @@ -32,10 +33,12 @@ struct mpath_device { }; =20 struct mpath_head_template { + bool (*available_path)(struct mpath_device *); bool (*is_disabled)(struct mpath_device *); bool (*is_optimized)(struct mpath_device *); int (*get_nr_active)(struct mpath_device *); enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); + struct bio *(*clone_bio)(struct bio *); const struct attribute_group **device_groups; }; =20 @@ -48,6 +51,10 @@ struct mpath_head { =20 struct kref ref; =20 + struct bio_list requeue_list; /* list for requeing bio */ + spinlock_t requeue_lock; + struct work_struct requeue_work; /* work struct for requeue */ + void *drvdata; unsigned long flags; struct gendisk *disk; @@ -58,6 +65,13 @@ struct mpath_head { struct mpath_device __rcu *current_path[]; }; =20 +#define REQ_MPATH REQ_DRV + +static inline bool is_mpath_request(struct request *req) +{ + return req->cmd_flags & REQ_MPATH; +} + static inline struct mpath_head *mpath_bd_device_to_head(struct device *de= v) { return dev_get_drvdata(dev); @@ -100,4 +114,8 @@ static inline bool mpath_qd_iopolicy(struct mpath_iopol= icy *mpath_iopolicy) return mpath_read_iopolicy(mpath_iopolicy) =3D=3D MPATH_IOPOLICY_QD; } =20 +static inline void mpath_schedule_requeue_work(struct mpath_head *mpath_he= ad) +{ + kblockd_schedule_work(&mpath_head->requeue_work); +} #endif // _LIBMULTIPATH_H diff --git a/lib/multipath.c b/lib/multipath.c index fa211420b72c3..eabf1347d9acc 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -5,6 +5,7 @@ */ #include #include +#include =20 static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head); =20 @@ -39,7 +40,6 @@ int mpath_get_iopolicy(char *buf, int iopolicy) } EXPORT_SYMBOL_GPL(mpath_get_iopolicy); =20 - void mpath_synchronize(struct mpath_head *mpath_head) { synchronize_srcu(&mpath_head->srcu); @@ -226,7 +226,6 @@ static struct mpath_device *mpath_numa_path(struct mpat= h_head *mpath_head) return mpath_device; } =20 -__maybe_unused static struct mpath_device *mpath_find_path(struct mpath_head *mpath_head) { enum mpath_iopolicy_e iopolicy =3D @@ -242,6 +241,73 @@ static struct mpath_device *mpath_find_path(struct mpa= th_head *mpath_head) } } =20 +static bool mpath_available_path(struct mpath_head *mpath_head) +{ + struct mpath_device *mpath_device; + + if (!test_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) + return false; + + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings, + srcu_read_lock_held(&mpath_head->srcu)) { + if (mpath_head->mpdt->available_path(mpath_device)) + return true; + } + + return false; +} + +static void mpath_bdev_submit_bio(struct bio *bio) +{ + struct mpath_head *mpath_head =3D bio->bi_bdev->bd_disk->private_data; + struct device *dev =3D mpath_head->parent; + struct mpath_device *mpath_device; + int srcu_idx; + + /* + * The mpath_devuce might be going away and the bio might be moved to a + * different queue in failover, so we need to use the bio_split + * pool from the original queue to allocate the bvecs from. + */ + bio =3D bio_split_to_limits(bio); + if (!bio) + return; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + + if (likely(mpath_device)) { + if (mpath_head->mpdt->clone_bio) { + struct bio *orig =3D bio; + + bio =3D mpath_head->mpdt->clone_bio(bio); + if (!bio) { + bio_io_error(orig); + goto out; + } + } + trace_block_bio_remap(bio, disk_devt(mpath_device->disk), + bio->bi_iter.bi_sector); + bio_set_dev(bio, mpath_device->disk->part0); + bio->bi_opf |=3D REQ_MPATH; + + submit_bio_noacct(bio); + } else if (mpath_available_path(mpath_head)) { + dev_warn_ratelimited(dev, "no usable path - requeuing I/O\n"); + + spin_lock_irq(&mpath_head->requeue_lock); + bio_list_add(&mpath_head->requeue_list, bio); + spin_unlock_irq(&mpath_head->requeue_lock); + } else { + dev_warn_ratelimited(dev, "no available path - failing I/O\n"); + + bio_io_error(bio); + } + +out: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); +} + static void mpath_free_head(struct kref *ref) { struct mpath_head *mpath_head =3D @@ -283,6 +349,7 @@ const struct block_device_operations mpath_ops =3D { .owner =3D THIS_MODULE, .open =3D mpath_bdev_open, .release =3D mpath_bdev_release, + .submit_bio =3D mpath_bdev_submit_bio, }; EXPORT_SYMBOL_GPL(mpath_ops); =20 @@ -300,11 +367,34 @@ static void multipath_partition_scan_work(struct work= _struct *work) mutex_unlock(&mpath_head->disk->open_mutex); } =20 +static void mpath_requeue_work(struct work_struct *work) +{ + struct mpath_head *mpath_head =3D + container_of(work, struct mpath_head, requeue_work); + struct bio *bio, *next; + + spin_lock_irq(&mpath_head->requeue_lock); + next =3D bio_list_get(&mpath_head->requeue_list); + spin_unlock_irq(&mpath_head->requeue_lock); + + while ((bio =3D next) !=3D NULL) { + next =3D bio->bi_next; + bio->bi_next =3D NULL; + submit_bio_noacct(bio); + } +} + void mpath_remove_disk(struct mpath_head *mpath_head) { if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { struct gendisk *disk =3D mpath_head->disk; =20 + /* + * requeue I/O after MPATH_HEAD_DISK_LIVE has been cleared + * to allow multipath to fail all I/O. + */ + mpath_schedule_requeue_work(mpath_head); + mpath_synchronize(mpath_head); del_gendisk(disk); } @@ -317,6 +407,8 @@ void mpath_put_disk(struct mpath_head *mpath_head) return; =20 /* make sure all pending bios are cleaned up */ + kblockd_schedule_work(&mpath_head->requeue_work); + flush_work(&mpath_head->requeue_work); flush_work(&mpath_head->partition_scan_work); put_disk(mpath_head->disk); } @@ -369,6 +461,7 @@ void mpath_device_set_live(struct mpath_device *mpath_d= evice) mutex_unlock(&mpath_head->lock); =20 mpath_synchronize(mpath_head); + mpath_schedule_requeue_work(mpath_head); } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 @@ -387,6 +480,9 @@ struct mpath_head *mpath_alloc_head(void) =20 INIT_WORK(&mpath_head->partition_scan_work, multipath_partition_scan_work); + INIT_WORK(&mpath_head->requeue_work, mpath_requeue_work); + spin_lock_init(&mpath_head->requeue_lock); + bio_list_init(&mpath_head->requeue_list); =20 ret =3D init_srcu_struct(&mpath_head->srcu); if (ret) { --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 89A7D3F9F3C; Tue, 28 Apr 2026 11:12:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374728; cv=fail; b=cnXchtT7r6SlSHX3xBWx8I4F12xYJYMJmgc3r/EU6LsFUFDmk756VZYZPloP9DifO2GzzwxlKxbRL1MQ7vzujsD5Ty9Ce+W7nIvcA6t5fbBp6EVEh693XK7IZaOAZsChNpVesHYR8HxWYQcd/f/nPxhnIAE3rujv/c8ljDJUFkA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374728; c=relaxed/simple; bh=8Aotsj+R/Mu8n8kjrVWf5GG7I8eeeVEDaVFilXoD7AY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=iiQaoneE8esir40FFd71wG4ZQFEekMZLBl9bjq07aHhQzEYwRfZvzeSvXt9d2EAD7ODwmQRedpxCJwLxZC47gVBiKkkg1ZscnHnhIsv1AoE5EVQhSp/glkDtUWTiHj284Mp6IVRWX78rY665sVH6r3UfqxuQs26TbBxNOGCqWEY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=q9000RbX; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=hGByxeXk; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="q9000RbX"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="hGByxeXk" Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SAqb401015452; Tue, 28 Apr 2026 11:11:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=h4Ag0pzhG3ZUhMb9s0uerkDDASEyD7QSGIlHpUlSnC4=; b= q9000RbX5aVGxr3SSP8E8Q7G+uBzdZGuWQg9CNPRYUvgnLYBAE+b9wwJB+v+mVII c+jEhceoSvtZsgpLlB6maMzAutNrRSIFSWQJoUzQ4X2E3vsupY1DQgmJSogJPDpZ LKKu1ulJEznJ0shRmbGRtWLgM15+hrqxX89Uwy4dzpINWFUIP6vSnK0FdctZomnt z4xnhXwqICFnMaYpCw8KA/qV4ft3soCh9mAQeGFcPbHUdpoOMxSwIhh5+g62Iygm fa2tLLz3y4f3Sj2qFFHY3XI2s78+q816Bp3gtP1FesdOpfFvwZl5YaZVSAQaEbdQ tqMyA0SCNGvpUZy8w5D3MA== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drm6yyjuh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:32 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2kNm040801; Tue, 28 Apr 2026 11:11:31 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudth-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:31 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AMD/LKnKkl1kanohBXmF/Or/goPEes70VBFplSaoga6x6rHwOPWNFOBQwL4Ve4xNtEGWdgvXZVQNnrpekzbqoRfQAAMFfCl54qZawWrXOMaP9GNTOzvOSyLOqe0BVkT65sU5grunhJ5Vzf3sGtOd3Txy/k3rsTsEO2joFsuA3PVpzw2alFxM56kBtmFDCN4QPlhSCyF5uRcsM6Yd4xwjlcEQ4yMunBAwUwoPrYSpKpt5dLcW5DLP2zjTIgvYhP/48FS0ywckDkmBMB7jAJb0P5mLwTMhdNDRQrQETmW6fsCH5F7NEQpDE+ubAO6LYgYCqGSAwmSPfobnrnqsFmK8fA== 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=h4Ag0pzhG3ZUhMb9s0uerkDDASEyD7QSGIlHpUlSnC4=; b=hDUwyyX6Av9mYHJBnfje9sTtKxPzLVqW3EHYOELQOpWDnWze9m5SERX8Z52avA2Ae4Z1S7okPJ2EiCRb9nKOwOFEhl90NVZZn+Ih72ON1Nuqn52wmiCGet4QvvhRsnxA5LiIjzVez73+uMasKFYG0azfQSx0jX4Ck7P0pxvLucY5NW+jpPWx1JSqSAPPRjNJZGTWcB3pX1V+jVWL9z8anXq0p0Pxuj2QKTwUaAKI6eOUYZWrR804+V77HyLeY4y69sSEsIURRc/ErWtozGnBc1BZ8+gf516gB/2M9xwyiu5JkrT3MGUO8PsjQKWVxm/YF+li55TL2tGprd3YP7PpEA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=h4Ag0pzhG3ZUhMb9s0uerkDDASEyD7QSGIlHpUlSnC4=; b=hGByxeXkIFpcEgsDYfOZDbKaDybIqxipQ5bJVTXbl+DcrPHC5lqdHCMaZ65wltMqSEsSZpw3ppScgjLtdwySeB0oz1unsOkOl+8LBFRwcMmadhghwZgrnLyftEkw077lCMLQGeMulDpOGJw6E2ld6HQaWUWQVxjobj0Cop+fyn0= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:26 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:26 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 05/13] libmultipath: Add support for mpath_device management Date: Tue, 28 Apr 2026 11:10:57 +0000 Message-ID: <20260428111105.1778008-6-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH8P220CA0037.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:2d9::9) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: d5aa288d-6a53-4daf-0dd4-08dea516e389 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: oT5zSARvYbhsUzQGsVKYy0YLQZPDA41gD2UhGgquU+a4/mVG6E49KDLPyAt9rSS+gXIbA/wWKtMsu0pNGP4jMhNScrdKite1uXcYHGRrjYL4buL7aksxhPo9V73uvq6I6XmPX4wiG+piymd/bB6T2Kz2EOKXSJKS440EI6qbhHQxRi89m2Vn5yFHy2uez+oD+/iqg1JYIv2lwRnUElAGyKyIfLfMlqJw33QoDy6dDzoxAugowv13vPlZDL9jc2wesQ0Y/6N45AYetydTjIjlLTWFFj9k5ndQcWYbNleHZcfASOVBDeMBJUgb9H4ECT03SBe4E1mEbMfAG8pZ9/LnZxcbZPtzB4iGBKLs0ldW/1F2Az+i0qkVc1B4E94T1cBu4dGOlsOB/X3d86JSA1n7XBdSD+yPhryblvsuokJBS37iLZFO9cxfEuYI2KEKjRu/PVjoGteeCxy+78R04lLfzNOe8+f7620mLZ0118gqdg13SXSm2K7CFOlaCkkN7o7ae+v/ALKd0ZtYeeXULq8elTOiTxuDqT9KKdOraBaCbgp+qUwr616mYL0s/EqIdCSabACg19DwDZi8jFFLluEiJ1hNFm4kdxQqUGSLg/3OayC+KKhZE56wqMfcNURsZT2vYrpdzOP4ot/hm6Yo0dI6F1pWmMsRLS+WgyA8KlIY0UkgHpCVc7bkHAA8/q43ZXmwFEiSJzxTZjIeJHsk+NcUikd6Pj9QtFTz7VvYmoqVu9I= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?jHdzvod5ZJzZJm6b4BK2VRtxe/vZpvuOkyF2Zvtuf2GYwPQutf3qsHHvBA0w?= =?us-ascii?Q?ZD2Uwe2u4xeoPjC4axr1fc2Lu8/asFIILd+ZdFaWY58QH/xeogRkIuw2iHNo?= =?us-ascii?Q?9AMVOu92jUC9FdyeybSEcGtLAe4Zm+QwYp2RjsoR1T/bjS9O6BNvItKz+UZT?= =?us-ascii?Q?Ym33MSODxTIMLInZoU69ZfJ9SZhLu+PKWHyv7+qB+1XFE2IXPuDGq4RxpZee?= =?us-ascii?Q?R7bjCdFoOd15Jluxc5w1vjYJVjbkqzrCySLjn0bk/jKVkXKUhhAgRiXkZCpe?= =?us-ascii?Q?1IXnPu1wTqPAbv8uowktP+mUOkChuusbuN0abxxHkfS7wuoynrUXKtQlzVWD?= =?us-ascii?Q?iTLWlt8FAb7Uk0rvkm2TmFQtYewQKS+zgXN/sp0j+h2fIQ/AOVqD1E4gk3Mb?= =?us-ascii?Q?+8k+UxRPwQXgc0Mnq1Ym/zkztBNntKATPgPcFF+z5mVVQoziclHVd3Hnkxew?= =?us-ascii?Q?w5ecSd4MdcmwPKgOP9g462Eb3ggN3jH2skl01T4KI808y0B47XM4QLEDDNXe?= =?us-ascii?Q?n/iO6Ap6lkPXDexCFecojP41YI0MMSihe6qgKO4lxachIImHNxu3k82gLvAp?= =?us-ascii?Q?LjjOChIsbnFo8gMttdt3OF+7it0Yg+gSoTU08sdZpaUEFXmS7hTuKepS01tn?= =?us-ascii?Q?A4oLPEvJr/gIweQ5jVxuofgC0K8YeG+sXn/2kZZP3GH2INVVK2bi9KGwslxW?= =?us-ascii?Q?2n/Ee1a4UYUDq3glTIDKPHxEa1BDcRgT+YJk+UiYkPdbizCsVf2r6tK+qxXG?= =?us-ascii?Q?vgijiheicwONAonM0GiV8k8WfFySVhUVJnUZqtvC2CNWjK8TTpZa7nLB/LPr?= =?us-ascii?Q?lF6wwlU/7dbV6kdK9HUxr2X97nnJJt9jfrEzODMuZVFlq3VKqTLgGGR2Ds0e?= =?us-ascii?Q?iJXJKoz4xgHtD3C+pcwFeD5W4pdSkC9wmvLOibpLtny2KZzRXO3AAfZEusKt?= =?us-ascii?Q?miD54WA9WcJFWkZxRGtxntID4pvPnOt7OH8XvjMd/TQ19Wlg8KC7FdvdBuHE?= =?us-ascii?Q?LJ9rQAknicB+3DnJv34HcVnTqgB1eC/MjUzN+atL3mtPcl0HTqzFPApYyPrX?= =?us-ascii?Q?yo7qj73N0BZmp38bb/BjYBJ+bVw7Q6HDpJ6Koicam+8n2daB9nAfhUS7TgzR?= =?us-ascii?Q?U96TtbG0pcsQeT4SBD7yDJPXCypaKnTMLOc5+mY3DN9bIR5a1GDo5iISHPxK?= =?us-ascii?Q?Qa2yI8CgHGNvCNaQE5r5TewH97zpGMZqncF7tOKKiqdsX4vM80Lhe55Cx0zy?= =?us-ascii?Q?cN3DZPGiVdWGNo2i5E1x1rytY02ovlmuVh/c2fiJITRK38KJ9kJe92m0CNI7?= =?us-ascii?Q?ckpAIC0eFQQ/VLFTXKc1mTo7AUsHYktP3ktzg/7dCmLkNXaE3v54NOoUk9lO?= =?us-ascii?Q?L6OaLatWibrNzW46lmhqFsutKsr53EZXqIWUJqkxZtUswYHt5UruhupRMmJZ?= =?us-ascii?Q?LsXZaj/paLfc2MBibnIT31uQjprpsInXINlgqMHq6CjmEyOFa+LJ/J4y8oxz?= =?us-ascii?Q?clWbiL+9jrVsV+YAKQOGmx0H4KMwH3DVE3TADf6eIf9NtKU2q+BXIof3iT2N?= =?us-ascii?Q?PN9M7EnonCHbbd30OEUAYd+3LrNm+65wD7ho1Jh0X+4GTN1HSv0Sw4yWtpzE?= =?us-ascii?Q?cp3KspKx0jE71gDGGTiWO596CpMdUXQAgCW8A6MBw3Lr7e5Qd8WuJAq2luQL?= =?us-ascii?Q?ORmGzbo5JPdi8YOILJYWwz6F9OVi8dmcgNivb0QEMO/spiUCgmTT4wNZSfmp?= =?us-ascii?Q?Y5oKJLxtthvAYShMQB+QAwsSP2senf8=3D?= X-Exchange-RoutingPolicyChecked: VnDL9LpwjnJ2F2wUH+jx3618tTH3PpHhrqgRJxakLPBVVBpCALYijS+0BXef0M+tQtZ8wlWVty+C3Wpm3vVAnIwUhZHCIJ8V9e6Nc6Ad/T01t3OubF9vOHct3TnpEVd26KffN6CM6IZimyJX0NBXhJWvMxyf1P08wFMp9DeS37sIqBE2iXYBxg6+/9MCbjREXHgf/3C1aVphc8L+x1Cj8nrohDFhzdSqnUvsM3FhsRCPDnP2GSl2bK3cIbWyWc5zU3clsggMGRUXSif/YOMuc9+GkNB2CPto+DpuVKX/11LW+6WAVhdFN7extqRrmjyD4aZSlaEaqsQ4+ob+o4vsIw== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Tms9WHtJ5DaCkMFdLrk2xsSnhx56vXOR5QHZ0loFFxDnOo+BD9+uMMs1T5e0pgrsEhgQLN783dA5NoSMl0zj1boAExOxu7qtkGt2kzXR/ZLc7eptJIgJnQxOwGDJscz8pp2Sm08pnxoqowhkBHJq/s4KYbyMOr8+Ew3KW618oQ1pMtVZE8jaQISO12g7hieDaMY6wpP5NCWqh4/rFiJ9fEebCKZx5eoRRzfPTuuDTj8ING9ot2lIQPxWDgbFTPaSDTwh+8YrRyVF3k+i4q+BFNV0RLYOSRvZ3WE0mz1XFA5LH8RqP2QV8SU+I7m7tRNqzRaBZx+YP6fTxEPGgsED+wX2pdl+n8SFMg82qpqWt5pzFKOW3+7CaRImdAOyTiPnjVGaN/AGFOBJnazNMucX9C1am3pq35zlFMPaMzEUhHOH0SvxG0sPxqEkTtV9eKJ7GZdYRqLkCbJN3Gi6c1Y42UQnr0hXdQR4GwVfxI9ny4HpxKGvWzI7QjfitQuyUr6k7BvW4qg11RBADsqpI3hBz49vIsrzyYUg4zTdzFM1cF0wc8d/K7HPPVZIADrEBoONinfh4BXTD2wtZTD2hSyVUo5yo+Yk/ATXj4UDDgpAnbo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: d5aa288d-6a53-4daf-0dd4-08dea516e389 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:26.0427 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: WiLUQzCFKtUgnfIvf5hGa+IMpiLOKXk/QtwVILX1utwEnd5guySGgPP2EYcPcjtYiE5O4PlBgy80ScCK2BZRSA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: aamZ0SxR84lDyt-sgGauWQcnaWpW8-R8 X-Proofpoint-ORIG-GUID: aamZ0SxR84lDyt-sgGauWQcnaWpW8-R8 X-Authority-Analysis: v=2.4 cv=BePoFLt2 c=1 sm=1 tr=0 ts=69f095e4 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=RD47p0oAkeU5bO7t-o6f:22 a=yPCof4ZbAAAA:8 a=ldRTlTcT5PaS6-tWTisA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX2T5MTdxVDcMW 6DjAeL4nMJbk0vW2/v89ajeGrHwjIFTNYhbEaEXcZ1Q9uHo5do8V7fOfSJGrBxS46LbRnNnKtD1 4D/tIBhZVFfw7e2wNLSjeEoYjtKj6TlSKyg0uH3wP7UFzrHrNmm5uohPGyw1h8+oDO2K//Zy1Qt HbFBQU81/Rakwuxd9RTEbzYNEcqAQO/7Fs2SnKNnwivY3jzlhKXs2QASp+htuk/RKIp+GZ/CWlk bTQcC3i4ecdTpSv+N04cnmytNSFKlWLbfAOqPbTbintTm7PzcMvFnFDPQeNw4aWw/YH23Yo0T0w CTCggdtlutnz26HUI6D5nDALj7e9ZCVbv/uPIKy9P2QjNWKsfmPTdw4LxcU6XgzhKlcKdyX2fZ4 /VT0tdwKcSmunQ39kK2DYANDh5oFwX4uA1MbkdpkVpDKFKuDoBt6oqExO87qo0VTKovCWyB2yX8 zrz1+I+dGoZwRGGQebA== Content-Type: text/plain; charset="utf-8" Add support to add or remove a mpath_device as a path. NVMe has almost like-for-like equivalents here: - nvme_mpath_clear_current_path() -> mpath_clear_current_path() - nvme_mpath_add_sysfs_link() -> mpath_add_sysfs_link() - nvme_mpath_remove_sysfs_link() -> mpath_remove_sysfs_link() - nvme_mpath_revalidate_paths() -> mpath_revalidate_paths() mpath_revalidate_paths() has a CB arg for NVMe specific handling. The functionality in mpath_clear_paths() and mpath_synchronize() have the same pattern which is frequently used in the NVMe code. Helper mpath_call_for_device() is added to allow a driver run a callback on any path available. It is intended to be used for occasions when the NVMe drivers accesses the list of paths outside its multipath code, like NVMe sysfs.c Signed-off-by: John Garry --- include/linux/multipath.h | 16 ++++ lib/multipath.c | 182 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 2a5a9236480f7..72186ab220083 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -24,10 +24,13 @@ enum mpath_access_state { MPATH_STATE_OTHER }; =20 +#define MPATH_DEVICE_SYSFS_ATTR_LINK 0 + struct mpath_device { struct mpath_head *mpath_head; struct list_head siblings; struct gendisk *disk; + unsigned long flags; int numa_node; enum mpath_access_state access_state; }; @@ -90,6 +93,19 @@ static inline enum mpath_iopolicy_e mpath_read_iopolicy( void mpath_synchronize(struct mpath_head *mpath_head); int mpath_set_iopolicy(const char *val, int *iopolicy); int mpath_get_iopolicy(char *buf, int iopolicy); +bool mpath_clear_current_path(struct mpath_device *mpath_device); +void mpath_synchronize(struct mpath_head *mpath_head); +void mpath_add_device(struct mpath_head *mpath_head, + struct mpath_device *mpath_device); +bool mpath_delete_device(struct mpath_device *mpath_device); +bool mpath_head_devices_empty(struct mpath_head *mpath_head); +int mpath_call_for_device(struct mpath_head *mpath_head, + int (*cb)(struct mpath_device *mpath_device)); +void mpath_clear_paths(struct mpath_head *mpath_head); +void mpath_revalidate_paths(struct mpath_head *mpath_head, + void (*not_ready_cb)(struct mpath_device *mpath_device)); +void mpath_add_sysfs_link(struct mpath_head *mpath_head); +void mpath_remove_sysfs_link(struct mpath_device *mpath_device); int mpath_get_head(struct mpath_head *mpath_head); void mpath_put_head(struct mpath_head *mpath_head); struct mpath_head *mpath_alloc_head(void); diff --git a/lib/multipath.c b/lib/multipath.c index eabf1347d9acc..1232e057199ae 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -46,6 +46,115 @@ void mpath_synchronize(struct mpath_head *mpath_head) } EXPORT_SYMBOL_GPL(mpath_synchronize); =20 +void mpath_add_device(struct mpath_head *mpath_head, + struct mpath_device *mpath_device) +{ + mpath_device->mpath_head =3D mpath_head; + mutex_lock(&mpath_head->lock); + list_add_tail_rcu(&mpath_device->siblings, &mpath_head->dev_list); + mutex_unlock(&mpath_head->lock); +} +EXPORT_SYMBOL_GPL(mpath_add_device); + +bool mpath_delete_device(struct mpath_device *mpath_device) +{ + bool empty; + + mutex_lock(&mpath_device->mpath_head->lock); + list_del_rcu(&mpath_device->siblings); + empty =3D list_empty(&mpath_device->mpath_head->dev_list); + mutex_unlock(&mpath_device->mpath_head->lock); + + return empty; +} +EXPORT_SYMBOL_GPL(mpath_delete_device); + +bool mpath_head_devices_empty(struct mpath_head *mpath_head) +{ + bool empty; + + mutex_lock(&mpath_head->lock); + empty =3D list_empty(&mpath_head->dev_list); + mutex_unlock(&mpath_head->lock); + + return empty; +} +EXPORT_SYMBOL_GPL(mpath_head_devices_empty); + +int mpath_call_for_device(struct mpath_head *mpath_head, + int (*cb)(struct mpath_device *mpath_device)) +{ + struct mpath_device *mpath_device; + int ret =3D -EWOULDBLOCK, srcu_idx; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) + ret =3D cb(mpath_device); + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} +EXPORT_SYMBOL_GPL(mpath_call_for_device); + +bool mpath_clear_current_path(struct mpath_device *mpath_device) +{ + struct mpath_head *mpath_head =3D mpath_device->mpath_head; + bool changed =3D false; + int node; + + for_each_node(node) { + if (mpath_device =3D=3D + rcu_access_pointer(mpath_head->current_path[node])) { + rcu_assign_pointer(mpath_head->current_path[node], + NULL); + changed =3D true; + } + } + + return changed; +} +EXPORT_SYMBOL_GPL(mpath_clear_current_path); + +static void mpath_revalidate_paths_iter(struct mpath_head *mpath_head, + void (*not_ready_cb)(struct mpath_device *mpath_device)) +{ + sector_t capacity =3D get_capacity(mpath_head->disk); + struct mpath_device *mpath_device; + int srcu_idx; + + if (!not_ready_cb) + return; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings, + srcu_read_lock_held(&mpath_head->srcu)) { + if (capacity !=3D get_capacity(mpath_device->disk)) + not_ready_cb(mpath_device); + } + srcu_read_unlock(&mpath_head->srcu, srcu_idx); +} + +void mpath_clear_paths(struct mpath_head *mpath_head) +{ + int node; + + for_each_node(node) + rcu_assign_pointer(mpath_head->current_path[node], NULL); +} +EXPORT_SYMBOL_GPL(mpath_clear_paths); + +void mpath_revalidate_paths(struct mpath_head *mpath_head, + void (*not_ready_cb)(struct mpath_device *mpath_device)) +{ + + mpath_revalidate_paths_iter(mpath_head, not_ready_cb); + mpath_clear_paths(mpath_head); + + mpath_schedule_requeue_work(mpath_head); +} +EXPORT_SYMBOL_GPL(mpath_revalidate_paths); + static bool mpath_path_is_disabled(struct mpath_head *mpath_head, struct mpath_device *mpath_device) { @@ -449,6 +558,8 @@ void mpath_device_set_live(struct mpath_device *mpath_d= evice) queue_work(mpath_wq, &mpath_head->partition_scan_work); } =20 + mpath_add_sysfs_link(mpath_head); + mutex_lock(&mpath_head->lock); if (mpath_path_is_optimized(mpath_head, mpath_device)) { int node, srcu_idx; @@ -465,6 +576,77 @@ void mpath_device_set_live(struct mpath_device *mpath_= device) } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 +void mpath_add_sysfs_link(struct mpath_head *mpath_head) +{ + struct device *target; + struct device *source; + int rc, srcu_idx; + struct kobject *mpath_gd_kobj; + struct mpath_device *mpath_device; + + /* + * Ensure head disk node is already added otherwise we may get invalid + * kobj for head disk node + */ + if (!test_bit(GD_ADDED, &mpath_head->disk->state)) + return; + + mpath_gd_kobj =3D &disk_to_dev(mpath_head->disk)->kobj; + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + + list_for_each_entry_srcu(mpath_device, &mpath_head->dev_list, siblings, + srcu_read_lock_held(&mpath_head->srcu)) { + if (!test_bit(GD_ADDED, &mpath_device->disk->state)) + continue; + + if (test_and_set_bit(MPATH_DEVICE_SYSFS_ATTR_LINK, + &mpath_device->flags)) + continue; + + target =3D disk_to_dev(mpath_device->disk); + source =3D disk_to_dev(mpath_head->disk); + /* + * Create sysfs link from head gendisk kobject @kobj to the + * ns path gendisk kobject @target->kobj. + */ + rc =3D sysfs_add_link_to_group(mpath_gd_kobj, "multipath", + &target->kobj, dev_name(target)); + + if (unlikely(rc)) { + dev_err(disk_to_dev(mpath_head->disk), + "failed to create link to %s rc=3D%d\n", + dev_name(target), rc); + clear_bit(MPATH_DEVICE_SYSFS_ATTR_LINK, + &mpath_device->flags); + } else { + dev_info(source, "Created multipath sysfs link to %s\n", + mpath_device->disk->disk_name); + } + } + + srcu_read_unlock(&mpath_head->srcu, srcu_idx); +} +EXPORT_SYMBOL_GPL(mpath_add_sysfs_link); + +void mpath_remove_sysfs_link(struct mpath_device *mpath_device) +{ + struct device *target; + struct kobject *mpath_gd_kobj; + struct mpath_head *mpath_head =3D mpath_device->mpath_head; + + if (!test_bit(MPATH_DEVICE_SYSFS_ATTR_LINK, &mpath_device->flags)) + return; + + target =3D disk_to_dev(mpath_device->disk); + mpath_gd_kobj =3D &disk_to_dev(mpath_head->disk)->kobj; + + sysfs_remove_link_from_group(mpath_gd_kobj, "multipath", + dev_name(target)); + + clear_bit(MPATH_DEVICE_SYSFS_ATTR_LINK, &mpath_device->flags); +} +EXPORT_SYMBOL_GPL(mpath_remove_sysfs_link); + struct mpath_head *mpath_alloc_head(void) { struct mpath_head *mpath_head; --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E77AA3FB044; Tue, 28 Apr 2026 11:13:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; cv=fail; b=nN+9b7hSNcW/ZqKHMb+8pPuCBwX1vUa6g55M5CjK/sx9wd6wDgbcwbPST55rCRYjRYmkKAAAamLli3mVBQqS7vlZg/P+04s/NCU3HPBtWxMMiBc0sJeQ7LVoLzZbA63ZXqoRQokn39WvjbdreIZHTXPbAr1uug+8TTbocxlf/LY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; c=relaxed/simple; bh=Afyh97dA4Ml76f7Z6foTZEF5PK4538q3lH/POb2UdPM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NK10wjE0Cj0ZEVptNJONRA7QekqotBv9KWGAwHTmfWQN1I7zpmxNnnd+EI1+gMLJvLnkkkkugxfbDv3tRIE2LZ+hHNei0iSPYt2kYRRo1p3SDlzeAHs2j+JbBJebtWNIWl2rsJ3qZnepCdzYrl8nZClytPSNwojCmpK9QuHcTI4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=L034I506; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Mt84GTSb; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="L034I506"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Mt84GTSb" Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SAOwcb721101; Tue, 28 Apr 2026 11:11:33 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=Yjo2CbkYEzSaTxbZjtDA5EJ96JtQ85mr7cha0pCXnDs=; b= L034I506e/V8CVhE3JY23MQbuUGezZP5omn9LRRStvU3z2+NpoKwbTWuk0YylLZe libupHMF6JYIJuxAXRH9uvdya88yvnfOk3P7vhN+C4P3C8m4SVSG2FShnbHIDy7y v4qCes0ZCPXrfxJ6Ai3B9z5a/SrD6bB0fcggDFm8YdC7if6dVvHiOdAR538KcLtR bFtMs1KTXJ9qARuqer6hGFnSj32JYYXFxQ4DEDiMPaM2GaODdmQ7VCJLf/G2MkMJ E2K1ROEtnelR0bjWXhJSEE8UJbKQhFhfMKR6J5k+hc/gKkYhkzB91rGpnTQnWnuC 6ZV0Q8NmEOzFIeJ8iOPhhQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drp5syest-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:32 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2kNn040801; Tue, 28 Apr 2026 11:11:32 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudth-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:32 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Eni8RUMs/R+qrak3Ptel99i7ZSvbs4OotGNE9bYe9hRUsdQjCQk8f0Hxkv4mC4O/SSvM73A5i2uN2ajKNACMH8GxeZ4T99iv6u1169m17mm6usuRMzvGRioCokp2splLTZaLI3tqIV7XWU673mE+lgTrdj2NWRq3MUXVCMsKmAmrFrr9RNy/VI1pjNxtYhvx6RQFazcfXGXera2ty2Rink/MuBoVSu3oKMgdh6x8msvIqPY9kO4+zpTZ8FCft/AS3GJOGcAfpcKron8v6KaXCCpV6m9PaXqLNZ/Ehcef6F3+2vgS2+sTxVpCh2kZ08ArvMkYlb1n7WDKeCGdDiGb3g== 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=Yjo2CbkYEzSaTxbZjtDA5EJ96JtQ85mr7cha0pCXnDs=; b=e4opa1plgW+N5kiZeZtrr7AhhX9v9l6CUB03PbNg86GP9WrqfkXFfVpz9ALcp7unP5rutVsDGpoR/jsR54dcNhXggoGG9RhAEY6B0IIlP5Fd4kfME3RWLf+uHCyGE37MbqPrQacTqRuUppfT4rWgR/cvr1AnnB8uw4Xawv7gSUnLhZ/pPXMZVgW85M1zbMkb6I+EhD86i9ew2evYLjqREBJg/DLQZuWIUQcTVXOw0/HNHcP3crayYQy+/BCSnWx1frDqr5OteC9AcUBx8Mu6gTwQM2S73r8F6YOlU9Ru16xtfR1ekN30RCeCtu055KC2Tuzi9YaBR1XUkxfMbE9CCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Yjo2CbkYEzSaTxbZjtDA5EJ96JtQ85mr7cha0pCXnDs=; b=Mt84GTSb0EZgdnlw9Ezg7ZU0g2jExcqvgkO0xD8D+uzAalrJ7CE15MzSlT+sXA25WWK/9NTeQ36comEJtEHQEblC1s0bEdd2ly2ed5IoxAztw+uk3K5qxi1tFiazGCifO0QZkrV1x9evuBxoNCVZhMfslEgOoePSgJlGr3T+zrc= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:27 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:27 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 06/13] libmultipath: Add cdev support Date: Tue, 28 Apr 2026 11:10:58 +0000 Message-ID: <20260428111105.1778008-7-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH1PEPF000132E5.NAMP220.PROD.OUTLOOK.COM (2603:10b6:518:1::25) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: 30194107-03e7-42c4-6fbb-08dea516e48c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: fWV9f+e2Y+ZdOWenVc1BOfS+sNQ5SOoYFyUwbNpuL2mNVTwalmoBNjqin5CGnhzKhkptUAgqeTMY/XIGoAunNmsQSHI+VK05K0SgqBK3PuMNKd2g5A23Nz05jxq2iA+XxdGY9Sgyut4dGhhUmGN9sJoNonCMUMjl1SY2NugxSWNCPioaUVPdmwNkluwc4tibrPGqG7V1Brh95V4JM16anmjhXcYJUbdE3INVMn7H5+DTC5Z0T0pFWFkR3x51uEiSuH0rAH8xx7k0jmhHR2Jm6uBMpPkvRMgTqd9WpbyHsGpJVE9gmyRO4cdTas6CWQioPSm1n0W2EsOrMhf7vKB/qNT5ti4OzjkFk5iZ1EJplfNRlhoBLDdhIFq39QRJ+PoXbufdfg0Gl7yMkn6apYYfmlj4Uck3MVUO/3V6Zg0GS4+jq8jDCd85+HiNHBifZSVwM1lq0geFNLCLrrooTSjEYIpo9Juf9LgZETk7qGyJq+2V0NZDqFhd4GOAot/BTfzUu+obF5Vp3oNz37mCLaLXwIkxGhJIyzBU3NMFxJqelfET+ekLrbuBCs5Fk5fOPsQuaodsw1ExC/TT5V6v2rzx9NLDtNNfaSEqW0OxRqlrOgoozA1pCQ0J2LLM1zWx1iyAqKpQ9WpNeupNWUpJp2/AKiWwhDx0Goq9YBGVBp/RVrpN3zHcJMXJZ50cgK5XO29qdjjGwQIeOZy0tL3b9lhdOgLuu+RvPh+OQESLfsXwBp8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1uJeUBPu73PgjAZDfBZzaWLMui62GUFKCb9rNJLed5GY9RGjSmsDhbnNPT2L?= =?us-ascii?Q?n0/oOdS9fUyL2zeuob0fchmchqV6MAnb3gqV/ovEt3WOEEyhVMciHuN5DaUX?= =?us-ascii?Q?vAUKgHC3nwP5eef1VTGNVaG+jgV+SdTV+g823FZ7Jj8/E+5I4xyRiXzApK6E?= =?us-ascii?Q?Mn1utIdKAxRQS+0kdaO3stNhj9/ANfB+B9E8zlRUozqQIAmH3iu9BSzdJzPG?= =?us-ascii?Q?nz+N3d3AI510SzAFnt4+a8JRdeU51n89NoTm5/m2DdKKCKzQJ0NYeTKzHVO1?= =?us-ascii?Q?+553WOkR1pWRX+x1FUdbBlIJTo/TzkqX9wUafJ6+F2QveiHnkydIPIld1IzA?= =?us-ascii?Q?646nKpc7xc+FGc++DRw4u/Vwvt11pFGd5Vop2But53MIVL9MXLsgoG6bSlR5?= =?us-ascii?Q?5AxIIBoFlUrCLDhUdWtDieraF3Cl3eoDDnfWbp9ltb6r8HvQvp4LA5pSCRNa?= =?us-ascii?Q?1TS829DIorwYtpEK3nH5AcCKmLuLkOOMwPS7rbgVwvu824ufPsMuHmkfkSq/?= =?us-ascii?Q?tNKiOGjP5mzDPuUjEMaZlkdDazaU12Qpy9uBodTxwaKhuKaJnE+sspBf0oJx?= =?us-ascii?Q?nGts7ulCTtoisxBczDNONUb0pVKjOuOjcYa+u82sg7x9KggoX2kFwJu2cVoM?= =?us-ascii?Q?QtF1Nf3ceKnnfEe5YdlqNma+bOvlktE+dNjskYfyV9zehSUUenQaabYGo7Eu?= =?us-ascii?Q?z/g+o4RwaLTlbnCdIa8Rewp4Y5E2fhy8n/1AsE6nH+3YhiMQLZmrKndFY6pT?= =?us-ascii?Q?jQ82l7ceHJskVgo0wroGXsDK1M7SCVzBID3E1Xd4UX+bP+8oC6GptgBbGjIC?= =?us-ascii?Q?TfsfTwlfGIKXMiXFv2vYGGtmLCW1Bk+J+lgars0g252B/7J1FqlgXiTQIyVL?= =?us-ascii?Q?0xG7KdHA7B3ayOheu3mzaYB0xTm2tuM1hyFt8u+0Vt2ZnmKoRuNSXE9Kl6QT?= =?us-ascii?Q?uVMYvuvbaZAQVkyYuauK75ctMXsDsw1V+TeGXK2FZEIfTUJHX6vFrVhDOeN6?= =?us-ascii?Q?LId9KGTtGs5ZXlG/2nQtDvP9gxEsfBXeQdR6Zo0BTgV8zOdZCfBWm25c0BeS?= =?us-ascii?Q?htEohuSu0ALRMxJU1bL3j68ujaYjeSg2+yGAXoMNWz/Mvjs8iRfYRHxB+3N7?= =?us-ascii?Q?FFPN0j/wdtL/LDkEDpXLNJdg0K4dQEL2r7HKVIeO4XizZH1KDZR7lR+hi10N?= =?us-ascii?Q?8+0+rLR8LIrJ3xZ3oWU9zcSH94VCQYHjCfEARpQ5yLbeIUZNHNOt2Ek2Qi8r?= =?us-ascii?Q?hWNH/puIVuypUvDdQDYYP/Cv6wIsxWhB9mtkZklpFgPKF7f3+EKh8zJ07aek?= =?us-ascii?Q?Y2Gr9OYhRD3qS5ptzPGKadLpiFaC9fIRutxr0FoOA7irRQiQbXZBTV00316n?= =?us-ascii?Q?k2+xWigOpPin4ZI3V7w0fpwF0li+ZC8FSHOE4AQZb1WWhnSPeRe99AwwPGRS?= =?us-ascii?Q?DmGlschWl4gsY698JI1Egca63lyq7AIkAzOJXuEw0BbSgrVYqXDdeyR/5la8?= =?us-ascii?Q?nVBGn+17GvxHEN6bpwn4cFeshshSij6x6NBKbLTqb8HUmVRc3F9inySWRyXB?= =?us-ascii?Q?VgXKTcaVl1qdl/pbqB7el56/iBSwWvjH1hTtxUxIBqVtq7RjIXE6NVmikxsz?= =?us-ascii?Q?QJByjA6AhcThGipLukoDLbHnfh4ZUDaIpLnnfPjjylNQjJZqkuvuS8d9Qjcv?= =?us-ascii?Q?B6PAFsAfhgd5B2QqG6g0tStcdmLkjqEg97nrv6xYdWsAq49HWvVttsZ8ISJr?= =?us-ascii?Q?917JBWF5Ab0pf2EG57t03CgsSkhLBxs=3D?= X-Exchange-RoutingPolicyChecked: jgMd8zU/vBQx/84Ia/fdKRkLoTpbhEavuZzLi11+so5w8yHy3FwPqYqJOg3B+XTrMBrs7i1qeGJTKd+uzF+8xnyyG3xVDH3dbgTemGKUQGupVrZDcoAgIppmR7ukf+JfODfBaFRoMTtBiToHCv4240xQfLi2pMUn34wxCfjDdie4MCWxclmRzFCa3fYPSU83t97/mwa34JQRUD5Xuvt1SDioCe42vMPygyAxyJUhhZ0NunGchu9DD2fTI3RZSTzOlPl1SZOlY9BmkBwu+TGVRrdOKNC3tffBY5ny30XkmzLA8bDjhhGq5C7a48/pn5qtMF5qT26M0dg35ZE424+lSQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: wVrqXhqnmqjhDiqGL/qp7XzloIG1w8cMGG/fM5W2ae/kMZe8qmJCulE2V8PofNWaxrCgmcSl1gs8TcxJuUPm12f1Vup3OdFcAPO9GBbg2TQ/1UyVBPYaVSKUGbksNaAu/O8cTa84O7CGo52K1Pw6yRnyKS+DTSvMT9xNR+H9Dpm/IU4LhvgGfx+rHMApRweyIZBBbnqe+0DelMkLZUQAQoMyOPZIIbHmxDA6LTrGW6Z2Kw2nJDGyOktsumVNbEgEIvsoOxy+q3u04sOzRqksHM4iIUt0D+2RhlawO/XrpVXMDJC7xUQ0W/oH2FV9ZTzPQI+lFnYqBzl0zkCO0XBfzVbQf182R0zgEormjw6ARJ6xJdIwQk250Qenxk1oBk3Y9LMW+rYDPMrJnaM8B6RAJ5TsWnGVAFdQ2ih8zcgNiK9uJxcE1b9wR6yPhmLjfYuLYb9QMBGAvsNv26fTADg2Ci5kGg+/15buEzFBSCjaubporAvXRkHq3V+/GiD6cZPgHDGIve08fi+9Uz5sIq+HNzHH/YNaznjje9+Kq1jZ2lWZnbV/DBMwERnE8U3aaFhLntM5J+X8ih58g9DQxcesbLHsTOfE6bRBT3S1DdGF9RI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 30194107-03e7-42c4-6fbb-08dea516e48c X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:27.8359 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: z2q0LLYCx/+YaGxVVYfWYFqCoA5AIcK8u7TvhANP4CnKG2Jd1RmIMJtyeGgFPTc3gCyUaVjqKTqXjHrad2GzBQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX6Nw+Hv2lUd/p axmGPAQ1yQuHNu0Aj9vL3Wcv16JRX2A0M88e1++YJFJBSN2lvnVl49TGDGc8xs06InWqRmGP7FV MQCPFWjTI3sB/pjtMQ8Ql9WUvycuToobgQ83tryii7IA/MhXs587Nh3DE6QCqDMzqay8JNwu4Hj /uS9ZCBpxUrcqH0DpvXpTFYbRAs+Hd95ELpeE+5MD/Y26nWSNsISuPNlDoLJSMyIk4BIlHOzJnK KfH+gUW+5qmDvjMzv/TNEysJQ2FR3yIXeHraABzZh0qZ6UjvaLys/EF6B2GTD88BxL6eDVTeneM yimZ+KCYkvpE5X68ONodDXPub0kPJLSQzFHGmsmFZnp+1HDniwdRrULhGR7VThWyKdJHBm9itHd mxS+hVs/Hw7ljbb4LxtcMMyxKtiigwjAjKTiO6aomBw1vBR7pqlZOSxagjF0RsuPX9cDfLraygF dKEw8wIImKFOXhe/a0w== X-Proofpoint-ORIG-GUID: BtthFeEj0aWh1FKu4_GO_6PGL8SLxWe2 X-Proofpoint-GUID: BtthFeEj0aWh1FKu4_GO_6PGL8SLxWe2 X-Authority-Analysis: v=2.4 cv=E7v9Y6dl c=1 sm=1 tr=0 ts=69f095e4 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=7Gl3-_t3PgB9XO-mQDs3:22 a=yPCof4ZbAAAA:8 a=NMmg5B4swMUXEhaZ7owA:9 Content-Type: text/plain; charset="utf-8" Add support to create a cdev multipath device. The functionality is much the same as NVMe, where the cdev is created when a mpath device is set live. The driver must provide a mpath_head_template.cdev_ioctl callback to actually handle the ioctl. Structure mpath_generic_chr_fops would be used for setting the cdev fops in the mpath_head_template.add_cdev callback. NVMe cdev iotcl handler has special handling for NVMe controller commands. In this case, the SRCU read lock is dropped before executing the ioctl. For reference, see nvme_ns_head_ctrl_ioctl(). This makes having the SRCU lock when calling not always possible. To handle this scenario, add template callbacks .ioctl_begin and .ioctl_finish to be called around the before and after the ioctl callback - if the .ioctl_begin returns data then we know to drop the SRCU lock before calling the ioctl callback, and then later call .ioctl_finish callback with that same data. For NVMe using libmultipath, we would take a reference to the controller structure and pass a pointer to the controller structure back in .ioctl_begin callback and use that same data in the .ioctl_finish callback to put the reference to the controller. Signed-off-by: John Garry --- include/linux/multipath.h | 18 ++++++ lib/multipath.c | 129 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 72186ab220083..3ac77c089a58c 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -4,8 +4,11 @@ =20 #include #include +#include #include +#include =20 +extern const struct file_operations mpath_chr_fops; extern const struct block_device_operations mpath_ops; =20 enum mpath_iopolicy_e { @@ -37,12 +40,24 @@ struct mpath_device { =20 struct mpath_head_template { bool (*available_path)(struct mpath_device *); + int (*add_cdev)(struct mpath_head *); + void (*del_cdev)(struct mpath_head *); bool (*is_disabled)(struct mpath_device *); bool (*is_optimized)(struct mpath_device *); int (*get_nr_active)(struct mpath_device *); + long (*cdev_ioctl)(struct mpath_device *, unsigned int cmd, + unsigned long arg, bool open_for_write); + int (*chr_uring_cmd)(struct mpath_device *, + struct io_uring_cmd *ioucmd, + unsigned int issue_flags); + int (*chr_uring_cmd_iopoll)(struct io_uring_cmd *ioucmd, + struct io_comp_batch *iob, + unsigned int poll_flags); enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); struct bio *(*clone_bio)(struct bio *); const struct attribute_group **device_groups; + void (*ioctl_begin)(struct mpath_device *, unsigned int cmd, void **); + void (*ioctl_finish)(void *opaque); }; =20 #define MPATH_HEAD_DISK_LIVE 0 @@ -58,6 +73,9 @@ struct mpath_head { spinlock_t requeue_lock; struct work_struct requeue_work; /* work struct for requeue */ =20 + struct cdev cdev; + struct device cdev_device; + void *drvdata; unsigned long flags; struct gendisk *disk; diff --git a/lib/multipath.c b/lib/multipath.c index 1232e057199ae..69e48ca3169c2 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -462,6 +462,122 @@ const struct block_device_operations mpath_ops =3D { }; EXPORT_SYMBOL_GPL(mpath_ops); =20 +static int mpath_chr_open(struct inode *inode, struct file *file) +{ + struct cdev *cdev =3D file_inode(file)->i_cdev; + struct mpath_head *mpath_head =3D + container_of(cdev, struct mpath_head, cdev); + + return mpath_get_head(mpath_head); +} + +static int mpath_chr_release(struct inode *inode, struct file *file) +{ + struct cdev *cdev =3D file_inode(file)->i_cdev; + struct mpath_head *mpath_head =3D + container_of(cdev, struct mpath_head, cdev); + + mpath_put_head(mpath_head); + return 0; +} + +static long mpath_chr_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct cdev *cdev =3D file_inode(file)->i_cdev; + struct mpath_head *mpath_head =3D + container_of(cdev, struct mpath_head, cdev); + struct mpath_device *mpath_device; + int srcu_idx, err =3D -EWOULDBLOCK; + void *unlocked_ioctl_data =3D NULL; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (!mpath_device) + goto out_unlock; + if (mpath_head->mpdt->ioctl_begin) + mpath_head->mpdt->ioctl_begin(mpath_device, cmd, + &unlocked_ioctl_data); + if (unlocked_ioctl_data) + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + err =3D mpath_head->mpdt->cdev_ioctl(mpath_device, cmd, arg, + file->f_mode & FMODE_WRITE); + if (unlocked_ioctl_data) { + mpath_head->mpdt->ioctl_finish(unlocked_ioctl_data); + return err; + } + +out_unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return err; +} + +static int mpath_chr_uring_cmd(struct io_uring_cmd *ioucmd, + unsigned int issue_flags) +{ + struct cdev *cdev =3D file_inode(ioucmd->file)->i_cdev; + struct mpath_head *mpath_head =3D + container_of(cdev, struct mpath_head, cdev); + struct mpath_device *mpath_device; + /* error code copied from nvme_ns_head_chr_uring_cmd */ + int srcu_idx, ret =3D -EINVAL; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + + if (!mpath_device) + goto out_unlock; + + if (!mpath_head->mpdt->chr_uring_cmd) { + ret =3D -EOPNOTSUPP; + goto out_unlock; + } + + ret =3D mpath_head->mpdt->chr_uring_cmd(mpath_device, ioucmd, + issue_flags); +out_unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return ret; +} + +static int mpath_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd, + struct io_comp_batch *iob, + unsigned int poll_flags) +{ + struct cdev *cdev =3D file_inode(ioucmd->file)->i_cdev; + struct mpath_head *mpath_head =3D + container_of(cdev, struct mpath_head, cdev); + + if (!mpath_head->mpdt->chr_uring_cmd_iopoll) + return -EOPNOTSUPP; + + return mpath_head->mpdt->chr_uring_cmd_iopoll(ioucmd, iob, poll_flags); +} + +const struct file_operations mpath_chr_fops =3D { + .owner =3D THIS_MODULE, + .open =3D mpath_chr_open, + .release =3D mpath_chr_release, + .unlocked_ioctl =3D mpath_chr_ioctl, + .compat_ioctl =3D compat_ptr_ioctl, + .uring_cmd =3D mpath_chr_uring_cmd, + .uring_cmd_iopoll =3D mpath_chr_uring_cmd_iopoll, +}; +EXPORT_SYMBOL_GPL(mpath_chr_fops); + +static int mpath_head_add_cdev(struct mpath_head *mpath_head) +{ + if (mpath_head->mpdt->add_cdev) + return mpath_head->mpdt->add_cdev(mpath_head); + return 0; +} + +static void mpath_head_del_cdev(struct mpath_head *mpath_head) +{ + if (mpath_head->mpdt->del_cdev) + mpath_head->mpdt->del_cdev(mpath_head); +} + static void multipath_partition_scan_work(struct work_struct *work) { struct mpath_head *mpath_head =3D @@ -504,6 +620,7 @@ void mpath_remove_disk(struct mpath_head *mpath_head) */ mpath_schedule_requeue_work(mpath_head); =20 + mpath_head_del_cdev(mpath_head); mpath_synchronize(mpath_head); del_gendisk(disk); } @@ -526,6 +643,16 @@ EXPORT_SYMBOL_GPL(mpath_put_disk); int mpath_alloc_head_disk(struct mpath_head *mpath_head, struct queue_limits *lim, int numa_node) { + /* Do limited sanity checks on template */ + if (!mpath_head->mpdt->ioctl_begin ^ !mpath_head->mpdt->ioctl_finish) + return -EINVAL; + + if (!mpath_head->mpdt->add_cdev ^ !mpath_head->mpdt->del_cdev) + return -EINVAL; + + if (!mpath_head->mpdt->add_cdev ^ !mpath_head->mpdt->cdev_ioctl) + return -EINVAL; + mpath_head->disk =3D blk_alloc_disk(lim, numa_node); if (IS_ERR(mpath_head->disk)) return PTR_ERR(mpath_head->disk); @@ -555,6 +682,8 @@ void mpath_device_set_live(struct mpath_device *mpath_d= evice) clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags); return; } + + mpath_head_add_cdev(mpath_head); queue_work(mpath_wq, &mpath_head->partition_scan_work); } =20 --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C34BF3FB07C; Tue, 28 Apr 2026 11:13:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; cv=fail; b=oO4eD3CUqMYxLQkaTbgF8zSj2kpoNSMYuIOSXPCJxl10rjh1lG/AX17Hx2+iyv4QoEtzo3plSB509CIbckVZWIHfdseW8LrYWW9czQvzEYRtz/H6njbw+p/hL5oLCg2SITdm44raf5J47bO09ie51pVKz1vYp4IHnycMF4/Z5Wk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; c=relaxed/simple; bh=AqtCCNzAzS+a2zplJXYrhIscr+ibX08xkgHt3r8kNh4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=V1pNN/OEVMmkmQmLwDFoT9h1WDxhXTIdLe8QQImzltbz0bC9dotWp42DrXFZjna0a/xmxhSsO+7+akgk59irvhPsbeY/BHT6WGTELYWRWE4gnJQNRGZcabnTfrYipP9XREew7VPU02+RWxSWcXJrtlKUX4v+/Vw5xnLUCmbT21M= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=WJ4DtQjm; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=jVTyilvr; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="WJ4DtQjm"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="jVTyilvr" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SB4JJi1905228; Tue, 28 Apr 2026 11:11:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=J+fTTfuXXagzHNA00pfeIG70ZATpM2PEUYnH3mefXDk=; b= WJ4DtQjmcNQLTq7fHGMoVDENha9TyXj873qMAc6oR9vjiexbxF7Qt6JASrQdorxW 0lP/aohQLt6EGyVSf3izDPaGTCE63Zh8mt6/rTa6ebhO5VwBn4WYbBKwoejUJCth WMP7ZibKGE5ml2ZSXCFqNpCvtwq5qqNGNXIY8CKwOoQ8ZSDL2YYjm7PLOKLKdKq3 YzY6R8wVTPRiuefHH+9wqR4lZkMNfdLg6g56xmvDxV4aV40o5o14fV/WClNx1mO0 2gMMxjOK4sSS/q0D0i1MlQLbdWSob8b8c1Zf8z+u8ZVFDhKtxvlOBcrBLjUb34rM jZ6UvFT66Jo0qtwfZ8IYxg== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drng8fcnk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:33 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2kNo040801; Tue, 28 Apr 2026 11:11:32 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudth-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:32 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IUQlBY4mtiGiv1kogzYpZEjWDMA5HrsXVi+zjLKxeEkuLQ5UMOpB5aQAE7K2I/VCBUpJp9CV/QhFxYC75cdtZB635Kl2Z0F6ZHjJzvJDApwDsOGWO8ABrKSTI86YAT41FOnp45N2DJcmFLtx25w2xQs4on7hayBjVShB5n/adf7XrwIsqaD9CUynSZjZu1cV4Bg08AAye9dWY02JNciIMdhALD3UE3Q8BU2CvieHaFaKNbDumWtNvFxvmve5P948l4E3IV3+DzwfKIc8npuz4V+yyX7ukvHRSTptl3QBnv90vMP31Hja48e+UHnzl04SO70jhqhTBiLPkDYDzYpZdQ== 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+fTTfuXXagzHNA00pfeIG70ZATpM2PEUYnH3mefXDk=; b=PNSPna7sjCSgVHjKxCZtFR2+edEm8u+q7mSzqSIIpHDQF+nwfMWmZc9Bu88RI8O//wYqQ5y1F1G2DIddD+WIBQBkSywDKXO/KwZy24X0ph2oH5allqM1JM8HULmtwoCH4+6myxna+2g5VBQy8XN9SO+qz3BC3QhKG6KokoELxuXQAKOcZg6cHfK39Z9cABovOmcUCUU7wlh4iXNi9ayRQdrGan+olS1+kpct7lT+EtRQL2oLnK5vlX1JlD1L9MNC6hbrva5RtbuuxMo72SzWyiLsBMBY0NCaI1XWa1N/Up2gWnzOYRgQWiHQcpJU6Qy73/9k1OEeR/+OXdMXpfr51w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=J+fTTfuXXagzHNA00pfeIG70ZATpM2PEUYnH3mefXDk=; b=jVTyilvrNTPQgLDH3A7j6klcNciO3B2so+QVlaOiUf+nnqi9Gezw8Q9BGe0+X1jhJFIiSzXOgiwudRWfXmL47Gf+IcVqNRjfAjJPpjriWuC4Wyhf+8z9WzyeBPX6dklompoFg7v9AqRdIJLS/cqqXm013XsljhMHYZZ+My2S//4= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:29 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:29 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 07/13] libmultipath: Add delayed removal support Date: Tue, 28 Apr 2026 11:10:59 +0000 Message-ID: <20260428111105.1778008-8-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH5P220CA0001.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:34a::8) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: cd71a154-09f7-48bf-0cf0-08dea516e588 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 405zQJs/EhB8827tGNPVcB16y3jm9bUqAjIsbrPbeC7zPJ26dbzQxk1TWjckXcOYO3Ct6aviUXK/F73YpaJZQNbAy2Lqc7jO8o7lg9+tCTrreA0RYuv5lXa59tbekQa68Rev068iIz3SxPBZ4iLoUs6tJVwOS+qtn5jKMizqXGppjJp4QBg3T9NtzcGsQ4S1NZ5N/suinDTUQk56sI9xKTYw6F+Udtgbq3ZqbzuhjFMj/rCUu1nOrgwFzYYAL7+okLyEVqaRoIShVhYM0TxdKcSX5M52irYGHGDQgw1YLL+S2M43X/NA8AYb01FwnjjUbxKIJJToG6K44CiiobA1STd2cswEj76/R/T9n33sR5om3cy+RdplypbQpiSsagH/jCr11RZZyw3nZmtcDeAvdjkqchRV+uqY3yxqDYPN9mRR3YZri0ctaCTD960vcky7/d9MKFhLJ/br+Kf6ztmwI0EVCCrMa1ay6+C/bWD/6MQC5TS9vLNyBGOcB09PP/tGQ7pBXnzPRP4p8Ug5qj9xUZvyfK+Nh6kPNWro0qj9AID0x88/YG38UVhEl9qEVNRJNBjcP5MKGzobepnkF7vMZMz37gutdrxdSUHdW2yi4DjLwiA6ipHLL2hacrhfnhqse+qn2JBHHfglC+bsRLoRvfJgcsxGSO9wI3MF6M/RVf/LpOQVr8GHk+n61MAlyXfQ8oJ6BJ8IbumT0MPLZThYlbqQCguKm+M+w3a5+VBMUeE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fpzoJUFymEvx3B3QnRI4YfdE0x1gRmV/EXlhiFNYgYp6NQ7G2SAjNSwdLe7h?= =?us-ascii?Q?K/VJALmW+My/eBxG3TWVIuzsjIuCVB/Ulu9zz5kQfP4lXZai1jnYZiRbMJXN?= =?us-ascii?Q?nQL/vbqrsoES6x8yppzaHNVrt/7yYxBQMT1Cqs+S60Md9Sjk50Jowce6fDQj?= =?us-ascii?Q?xLEE6XVgRhuypleq9vRNgvJeePgQNF8SUXPdtG9vxrRbKku49jXvV9yda4yd?= =?us-ascii?Q?R5YFCpLA7Qh4TRSnIhjR3ovqyInklOlrLv6PKlAhYdWDwVMhDa+qz1bohtAp?= =?us-ascii?Q?bJqbe8GuSD6sT+1CV3LTkddht3MDB8I27zUs5qCcJnmQ0iUSq6wVDP7gOyji?= =?us-ascii?Q?vX6rIJvVZUWKFwoyCiNM9ZLHx2XpdjoTzSn/27NF4i5+vIMQOz5izr5/JS48?= =?us-ascii?Q?JNg27XDU365HfFJwbeomMl08FH4p2/YwPLyMiWSyruyCgdt1EPql3LYXmK3g?= =?us-ascii?Q?YoMz4nrOfmy4iBRkLjdApheCFT+wb1ceOo8Cm2X2cNG/byX6lWeNarX9pqwT?= =?us-ascii?Q?xQzNI+05K/VbQQb6ELJP+Jq3YfXOmb47I+aOgq66HO4rgsy658e6HVBNNkKC?= =?us-ascii?Q?uNuVSUlVBENV0r6A7erMBZ1QdG/sxswAUAa8vFLDrAGUvN7GGVRVoA+dlPko?= =?us-ascii?Q?RHIXLDOD/zPtpGhZOO+WRbBSLxOzDVyFbM1n4F1ELqnBh33erqFwfadIKaOm?= =?us-ascii?Q?YEdJJXSydugOnbhClyWIwGlbPYPoh3iztC3Wrc43FE3nRp49DPKNC4nnMo5+?= =?us-ascii?Q?wHsIW67n4qP1XKMmcMMLKGthhHKCMVU+mUevBVjnzxQjxPZNO4VjwivdXbxc?= =?us-ascii?Q?n4q5MNmbV2/9qQq86X0+UxTgfPZlCEBV1Ta31tD5MlOcPkKjA+kB7J6RJDGs?= =?us-ascii?Q?48Pww7zjZUStWm2B5rx1HZabVK/mFLcY8YBbDC9qFS97vcGKPf3AuDWX7k0I?= =?us-ascii?Q?biWN8teoUAjBRjcJn4vRq+iEOgrZxAYboDeG9NYlYQckmgoN571lHFT5y8ho?= =?us-ascii?Q?Ktxpx2bStKDGhslf1jbC9gUWV0IVeOjQby9gXrXrNuaXI4YMaaCOLz1VyZn/?= =?us-ascii?Q?Jqy1C1w2PrgifzlUhvYW6ivy0yOsVOyWENeMNiBhKKRdTXZPXRkG/QVFDm2a?= =?us-ascii?Q?n8SsmDIAXqLTGwU1NEqvqxUTyaquc5Bnf9AQMpAafzaynTC0Rm96C+z9PvBZ?= =?us-ascii?Q?vdT4EZ6gNLQ4Exrlg8xIyHFODN3FdDHNW7XGyq2jdXJTsfNo+tHxWxtOPkMI?= =?us-ascii?Q?A7lJ2EOox0yUMShMjaK85mIximz0qeC2axKQ60R5akEOMPxyGbJaaDxTfd6s?= =?us-ascii?Q?eGzy8u9+jkG4Kn83PSarpw7EI9XW9+dREfmru33wMK0n5ImexawPqtxKv5wD?= =?us-ascii?Q?2WHvhzE2on+03iRVQRfeMQtgExy20I0g8zDq3u25mkUVntQDU0Xvi6WfvMki?= =?us-ascii?Q?bXk7R9iJO72HA0WfomeZ4qivjs/JujxTrGHPi4RkTRTWGDEh2/4o26CGKdwb?= =?us-ascii?Q?QG1KCvBjdBxwzMyJLESfEhhyJUmgcOcba/hTXGPZWfXPheyrX23NHieLnIyU?= =?us-ascii?Q?+ncmEePkeU8XBKXYgkSF6vuoF0kl3Oxj+k7yRrcVd40qd3VkB2ox1xkDyY8I?= =?us-ascii?Q?ZNVAfMTggb2klHLAYkuWWZI0/+aKTe6yuP0c1hXJQ2uIAww2hyF+isYduGK0?= =?us-ascii?Q?2FNRFzMpQiuaOlFCEa4elrikfwiL08e+GjOs6tuSZectat63YvxDlGzVFT6C?= =?us-ascii?Q?IZ4kuQAkfl0REogRgON3/eVTv9IA9JY=3D?= X-Exchange-RoutingPolicyChecked: k3mJTicO26tayQNOKc1QdRxmPh0Tf6TkuKQYhQklhFlxaYge0a+tF32ozyeE9AB9C0ODjVjE3rxRa/MubmjAngzi8r1A8gZpmV6bTqyqfV0EROYeWujUNgTBePD50TzRDAB7SR99gsg4MBSNOi9K6Iu0rqEEbSOPH7vVwjTNcaaT3ns2BNNdN9KqRAYAnhM9+6fO7hfKhsSrKHoA3c08iey++d5AStMvI+TilY+9ZVT9lY/sa8O0CkK3bKrEXPaMdA5MF5btbTrcqH3HdwBnYhi5UzleMuOp5lCwr3q5X61eS5eRJBRI04zneOwxE73ZqOCadY5TwFIXyNd6zSn61Q== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: eJnQaQiCd6n6+cCQ1FL0qHpamD8EdN+7skY0vIODFyIPeToX7L04znO18L/0kswbwziTxbE04fsmaBiW2Zz3OeV0L3XhzhT640SjEBJH5uOsB+hDHbgKeZvk26uO853UeJmQzE2oTu3Lkh/Rh8t7AEw06W/9B61Rn1V/BCzPuH6p74VgJfjoVd30oo+oTQOBC6dj11+VNhn/mHVYmcM8YgVHZ0oKiACxhjigA3qMijJZWcJuZQISQxBH3n/LsUX+/QyY5qFh8RMDTm+yEz+Qw+wE4yr6l+QgK2dsb66znNUgE1t2whQ85WKlCAUeH6+Y7Mfnt0k6X1eBk1CZbBaKIRHDlYk/4FbP/13hmgRvCgGWajAIr9Mfgp9SqRLVTXvdyiQclW54Qzx7umQNH5brFVeSbjYl5aDRbdMtb3iS5gm1/g2Fadu1RwatQ3Y3PXoiPZcrZiDEXzNqOJmTbH5bDKi6lOFoyro9B9VbBHgn5ehYJAJyPdl2lg3CzvimHcBM6bPwyuhJii2GQchwxeWgKaG5BWnWVtHgnjSfjI+hDMtuUF7wUVSJWAiBOyoue+5Nn8kAWH8rGlJLkc6u3AptP3p2o1pKHXfchFluaAVpsso= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: cd71a154-09f7-48bf-0cf0-08dea516e588 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:29.4869 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hXifTYOCnr1a6x5gxg41v3MHy+YQ8VznoAl89v912z3XX8eNE9VUC1oiEKsi9Y6hNRAysEGa4xz/olVlvX62zw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Authority-Analysis: v=2.4 cv=U7uiy+ru c=1 sm=1 tr=0 ts=69f095e5 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=EIcjfB9IiI4px24ztqRk:22 a=yPCof4ZbAAAA:8 a=BfxcaXdt0Lgmg1IeN-8A:9 a=yzZZxD1ETDaWDB-n6lAJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfXz0JetD5YVxaU jQByfbfiGW8WBgzmLMUXBvdAocXV6KG/W3s45Yv6AzEt2AMdBimOkb7poh28NBmKWwhh/mTimUd w4R5tiqk0BC/fIWPEYKt85L5vwrR2q5dQiSyANAjrovoYUKjVtNV+zlK9BoBuqU8NuG2s+YZwQb cAB/f9vsR79gPCFtNjKgEefAJ+JOHwm4HPT7BTTjDOyii+byFFUV6mUUpYI8YEoG25356V5SqDT mO35dMgabyVskJbdSbeUDLpPtRK9+BKMwU1LLGhL3kjSfknJnVUyQ4yU0vYSiFIQe3BF4SJWfBe LFPs39MB5Tc6rH0UkFbVGQ1pES6a+sVjDRLvnWdvWEbpAR0g2hQFR4RUwShnqy4QY9srqvLUi9G iPDEIj7BJhsyr5QxUUoo268Qpj67swzgfGdYwlNqyIIprMq8e/OB7nTBE3aK7gfRXyf3+EugOrU OgAmtq7/jDuPPfitiFg== X-Proofpoint-GUID: S8T5TjtCV91HXEKUIuCqrTG46VWoM6xb X-Proofpoint-ORIG-GUID: S8T5TjtCV91HXEKUIuCqrTG46VWoM6xb Content-Type: text/plain; charset="utf-8" Add support for delayed removal, same as exists for NVMe. The purpose of this feature is to keep the multipath disk and cdev present for intermittent periods of no available path. Helpers mpath_delayed_removal_secs_show() and mpath_delayed_removal_secs_store() may be used in the driver sysfs code. The driver is responsible for supplying the removal work callback for the delayed work. Signed-off-by: John Garry --- include/linux/multipath.h | 18 ++++++++ lib/multipath.c | 91 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 3ac77c089a58c..6afbf6ae1d2a9 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -40,6 +40,7 @@ struct mpath_device { =20 struct mpath_head_template { bool (*available_path)(struct mpath_device *); + void (*remove_head)(struct mpath_head *); int (*add_cdev)(struct mpath_head *); void (*del_cdev)(struct mpath_head *); bool (*is_disabled)(struct mpath_device *); @@ -61,6 +62,7 @@ struct mpath_head_template { }; =20 #define MPATH_HEAD_DISK_LIVE 0 +#define MPATH_HEAD_QUEUE_IF_NO_PATH 1 =20 struct mpath_head { struct srcu_struct srcu; @@ -76,6 +78,10 @@ struct mpath_head { struct cdev cdev; struct device cdev_device; =20 + struct delayed_work remove_work; + unsigned int delayed_removal_secs; + struct module *drv_module; + void *drvdata; unsigned long flags; struct gendisk *disk; @@ -133,6 +139,11 @@ void mpath_remove_disk(struct mpath_head *mpath_head); int mpath_alloc_head_disk(struct mpath_head *mpath_head, struct queue_limits *lim, int numa_node); void mpath_device_set_live(struct mpath_device *mpath_device); +bool mpath_can_remove_head(struct mpath_head *mpath_head); +ssize_t mpath_delayed_removal_secs_show(struct mpath_head *mpath_head, + char *buf); +ssize_t mpath_delayed_removal_secs_store(struct mpath_head *mpath_head, + const char *buf, size_t count); =20 static inline bool is_mpath_disk(struct gendisk *disk) { @@ -148,6 +159,13 @@ static inline bool mpath_qd_iopolicy(struct mpath_iopo= licy *mpath_iopolicy) return mpath_read_iopolicy(mpath_iopolicy) =3D=3D MPATH_IOPOLICY_QD; } =20 +static inline bool mpath_head_queue_if_no_path(struct mpath_head *mpath_he= ad) +{ + if (test_bit(MPATH_HEAD_QUEUE_IF_NO_PATH, &mpath_head->flags)) + return true; + return false; +} + static inline void mpath_schedule_requeue_work(struct mpath_head *mpath_he= ad) { kblockd_schedule_work(&mpath_head->requeue_work); diff --git a/lib/multipath.c b/lib/multipath.c index 69e48ca3169c2..9a1a8cb4a417f 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -53,6 +53,8 @@ void mpath_add_device(struct mpath_head *mpath_head, mutex_lock(&mpath_head->lock); list_add_tail_rcu(&mpath_device->siblings, &mpath_head->dev_list); mutex_unlock(&mpath_head->lock); + if (cancel_delayed_work(&mpath_head->remove_work)) + module_put(mpath_head->drv_module); } EXPORT_SYMBOL_GPL(mpath_add_device); =20 @@ -363,7 +365,17 @@ static bool mpath_available_path(struct mpath_head *mp= ath_head) return true; } =20 - return false; + /* + * If "mpath_head->delayed_removal_secs" is set (i.e., non-zero), do + * not immediately fail I/O. Instead, requeue the I/O for the configured + * duration, anticipating that if there's a transient link failure then + * it may recover within this time window. This parameter is exported to + * userspace via sysfs, and its default value is zero. It is internally + * mapped to MPATH_HEAD_QUEUE_IF_NO_PATH. When delayed_removal_secs is + * non-zero, this flag is set to true. When zero, the flag is cleared. + */ + return mpath_head_queue_if_no_path(mpath_head); + } =20 static void mpath_bdev_submit_bio(struct bio *bio) @@ -609,6 +621,39 @@ static void mpath_requeue_work(struct work_struct *wor= k) } } =20 +bool mpath_can_remove_head(struct mpath_head *mpath_head) +{ + bool remove =3D false; + + mutex_lock(&mpath_head->lock); + /* + * Ensure that no one could remove this module while the head + * remove work is pending. + */ + if (mpath_head_queue_if_no_path(mpath_head) && + try_module_get(mpath_head->drv_module)) { + + mod_delayed_work(mpath_wq, &mpath_head->remove_work, + mpath_head->delayed_removal_secs * HZ); + } else { + remove =3D true; + } + + mutex_unlock(&mpath_head->lock); + return remove; +} +EXPORT_SYMBOL_GPL(mpath_can_remove_head); + +static void mpath_remove_head_work(struct work_struct *work) +{ + struct mpath_head *mpath_head =3D container_of(to_delayed_work(work), + struct mpath_head, remove_work); + struct module *drv_module =3D mpath_head->drv_module; + + mpath_head->mpdt->remove_head(mpath_head); + module_put(drv_module); +} + void mpath_remove_disk(struct mpath_head *mpath_head) { if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { @@ -660,6 +705,9 @@ int mpath_alloc_head_disk(struct mpath_head *mpath_head, mpath_head->disk->private_data =3D mpath_head; mpath_head->disk->fops =3D &mpath_ops; =20 + INIT_DELAYED_WORK(&mpath_head->remove_work, mpath_remove_head_work); + mpath_head->delayed_removal_secs =3D 0; + set_bit(GD_SUPPRESS_PART_SCAN, &mpath_head->disk->state); =20 return 0; @@ -705,6 +753,47 @@ void mpath_device_set_live(struct mpath_device *mpath_= device) } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 +ssize_t mpath_delayed_removal_secs_show(struct mpath_head *mpath_head, + char *buf) +{ + int ret; + + mutex_lock(&mpath_head->lock); + ret =3D sysfs_emit(buf, "%u\n", mpath_head->delayed_removal_secs); + mutex_unlock(&mpath_head->lock); + + return ret; +} +EXPORT_SYMBOL_GPL(mpath_delayed_removal_secs_show); + +ssize_t mpath_delayed_removal_secs_store(struct mpath_head *mpath_head, + const char *buf, size_t count) +{ + ssize_t ret; + int sec; + + ret =3D kstrtouint(buf, 0, &sec); + if (ret < 0) + return ret; + + mutex_lock(&mpath_head->lock); + mpath_head->delayed_removal_secs =3D sec; + if (sec) + set_bit(MPATH_HEAD_QUEUE_IF_NO_PATH, &mpath_head->flags); + else + clear_bit(MPATH_HEAD_QUEUE_IF_NO_PATH, &mpath_head->flags); + mutex_unlock(&mpath_head->lock); + + /* + * Ensure that update to MPATH_HEAD_QUEUE_IF_NO_PATH is seen + * by its reader. + */ + mpath_synchronize(mpath_head); + + return count; +} +EXPORT_SYMBOL_GPL(mpath_delayed_removal_secs_store); + void mpath_add_sysfs_link(struct mpath_head *mpath_head) { struct device *target; --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2FB1A3F7A8B; Tue, 28 Apr 2026 11:12:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374779; cv=fail; b=Wi17a+mPEgj31+GOfUyhUkZizPW0hq3gj+ayOBBNGrZKmbObVnRVvrkGNxSu0AJ08LUvDvfXNinrfxAFweciwXs5gJoTapqHlnXQqIO7wjJEOP+3R5h74eOcoJ8oTDl3wUaf44i6XiX7vhreJk9+fbewLn8LrNcv/gXP4hkQcA4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374779; c=relaxed/simple; bh=VPK6aiR/klbopf63n2tFt/pm9eBFrFl+MBB3C6hgrvs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Nv5ILNtMbWWr1pQ33TrmQ2NGvWU6bVbAq9smxofY6WsFgDG4EF9pyEzwgeU3iZ4tZKyaIK5bC01VoTFEK1Pn65VGAA5KeG5phrxfOYYJI65FktqLT/97FqWTzkXwPbYxY7g81ycAqkUbNPFjNh+w78EveYIzQaLXYgB3pdC5p6Q= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=lXfHxtj8; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=VMXJMCYv; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="lXfHxtj8"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="VMXJMCYv" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S9pvlH1905709; Tue, 28 Apr 2026 11:11:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=fDVU/yy7jbne+z/SfvCkQxCfhvEB3zC4l0nCXCTR9To=; b= lXfHxtj80S0IbyD7xvSjSwv8kkqGyV0DDVqVG/UK9hwCHKtWkQapVrbo5OWJ4IY4 6lm2q649POfB9brJs7657+/WmA4xFSh+5w0q1N/1yPnuUxpA8Hjipl4OBpZ4v1d2 DXHw8Yl1CaS8rJURvcCXVenhWaKvMtiFR2Vc3+Xh9+huay2ECsVpj3d3EXmNyw8j tU3GukGz/2kjnU3p340PjUMdeXy0E66BhEddGaVQWGXq7Tj7qro1MTuL0pPUAbRT r8HlIKsqNH2ZZ0IhzMZFaPZUiy3OcBvGUuwoX5YSwG90lXkHUenxK9+4aFrGEFD6 z4Cb0BIJAyjjrPCRKADxiA== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drng8fcnq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:38 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2jRa002822; Tue, 28 Apr 2026 11:11:37 GMT Received: from sj2pr03cu001.outbound.protection.outlook.com (mail-westusazon11012034.outbound.protection.outlook.com [52.101.43.34]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cch8u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:37 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FU9XbyshGOt/llJaoQvVZvdN7TKiFJ6UWinWy1K7rj0Os82D4UP7QCA/D/RvDW1EST1ANb3Kh8kI6aRipltZnpv4ikYH7thCZecF79/QhZqVzkXzXSeKCX5Kg7r1ulRXyPfKvOcUfh2DMOsdavw+qVn2B2DzJXJyepeQGpBC3t9U2ShsqHRmYO8EpvYiugktWF8HfRuUkEBbP8Mxat3OiB5xB6u++f8WNsOHtgMrv8KGt5QPo5BP0eIaSq+dhpvgobhdLwjiCZJ0gMqkuOgya9ZQg9bCazboka1KKiNPmVJba77Sv9XUr9L7qKgVADeor+qvg06X4F6yzsxCjeuA+A== 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=fDVU/yy7jbne+z/SfvCkQxCfhvEB3zC4l0nCXCTR9To=; b=mk0xMXYPL7DQbEEuKPdxxryuHIr2UM66tq0oqZvwwLxXHspSDf5h1xVuuiNy2mS7rdCS8tVG5l1n43QYLUrW5hpjhbNnQaTMcQnXm57m/pFFOI/x5MUT7WS/9x8K7ED0FuRKET8JcMAHbJlBVoXYPgqcqCxhNIxpEbym9WiC+YpLHsU4rQVQwer3vkBDLETVRQ+nNr7g0Q6nKE8y2BguPqOVXvhYasalsxbiprd+jnI+3g3UNumLBZ+z/leFCXpLu+sRpJ9HuBpYKkn7HzliEjBulRYva99caBG7WYkVPCO5+rIOnWIvj1R1ar25DtafDG6b0ldxiSd/kvlO99MDGQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fDVU/yy7jbne+z/SfvCkQxCfhvEB3zC4l0nCXCTR9To=; b=VMXJMCYvPJXZVQXyWE1U1eohpC2khjhHkWGS33EMnsjV3cYErviFd0JbSzBWo1DXOkwuiSUMZ1nKz8NAdzQ8dWnPFMhWUj9F/7qqexQGF6bsQEBLNlgHornOw4cQSwP7vbjn4mHLdx3sr6HeMvltuU39gLMPYWlo9Dcz4kfw0/U= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by BLAPR10MB5073.namprd10.prod.outlook.com (2603:10b6:208:307::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:31 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:31 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 08/13] libmultipath: Add sysfs helpers Date: Tue, 28 Apr 2026 11:11:00 +0000 Message-ID: <20260428111105.1778008-9-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH5P220CA0010.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:34a::13) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|BLAPR10MB5073:EE_ X-MS-Office365-Filtering-Correlation-Id: cfb54f7f-f25d-44e4-d2a2-08dea516e684 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: BEU5iwp4COwogH6+4QKL2kMu9KIqY6qO7Wv6AJpQNefPfF9eeQw4L9MLfe+nMWAhG6gMGGd9IKyjeDxIpR/UqlSi4oBngatQMcXhX3vsdzBKicwZ+s4SpR7u6DvqiYOmupF+No3uuO2+xGWAVerlH007chfOmJ+HZ7hQLUyWP8wtB8JILEQjFuafkK8amuBJAV4O/RYUMHDGpa/s5oWwtC6Ozqxk5P7QY+sIp5GaHMuNv2nPAP6MGakH0gYetgKoSmcr8Raj+51VfhMWPQ84yeErHbe9M5UcLplK1VU8DfrJBmbqsdQIPE1kC46JJJ22/UMzrGzEwDG9bfjDFuV703sVyplfezTyDV0jdvdJGA1VuLN31c0q1J6ZyN2UwcAgC0GGx+gAA934FWV4BIX8s0mR/uLRjtxY4D2iJEUfSc602xpM5k8wKtBmMflmVtu5wUFTmiVz4pPlrgT/DtOcWm+7p7lfhI2oziTiNjlH7vXxEhi0vKkELZVv5zUDq5h7YTwwfbWL3iEHk1MIdBkF8P+g/b0ygmgXUNzA3HyvMqQMGPz/O2PYJgEBKa3Qh5rpFyb1v8iEsD41/imMid6O37bKpk6h7O7PNr2lOU88QdE7KquFKIEnpF4aipYmgU5zEvoB81hir0wuERbFWMKiNNZm2KoNHlREJqjlUpxAQyc7Lwstbn8Z/QfBjV9S8WYG2+Yu0PYSQyW/etOJdwalYO9pF/ZizBYwUUSRk2+Gd7s= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?INhsSoxgxg8rJ/R+tdk+LX44NsDLYpNy2WvrmSs1qp4raRYgCZcut30e7Q3o?= =?us-ascii?Q?ffeqDoIrwkTkJFy5v/ENwTsY1J6gislSzimY4SbiF9pgoIwY8oZP4YqVBr7o?= =?us-ascii?Q?HvEVA9d1crbuQh5GdxFq+0dntRQq0c/D6JFHaWLtprftJAhbWnEAOXMDW8qj?= =?us-ascii?Q?glsuDgrVUapKYr9SIHeLISDl8ZwF091RD4FHdBNdH+J19Be6JvQr5C50K1dK?= =?us-ascii?Q?Yh6nLQVnH47Tz9mRgxsoLk+qE2V0Ht+iTuFeWfmFkJp3RyZJUig3jveAMLlS?= =?us-ascii?Q?Y7z332Fwuh4fip+1Ok4MSQD1GWtaTGSTTyGHDIjqh5QhCQHeayg3jghpAH0t?= =?us-ascii?Q?98gmGHyruipCHg/9oajmaRlBskyNR5w+Z9BB7CB4F+HmWddoTwLsAAHDMbS0?= =?us-ascii?Q?I0G0xnt8cSs4mNa9u3ED3UPl/tQT8wELNLkEpsIe+DBKNGZI//qG13HdhRqH?= =?us-ascii?Q?RBgeqA0MCIK74mIk1byLDGdAfR28BQx00s13SGlU5D9WvRvBWZI8Bdw8Go3V?= =?us-ascii?Q?W4BYh0zU3+PeaofJxoWR2/HkjK9AM2ocvP1HYfcoOElgesSsD9hcOynjn5KR?= =?us-ascii?Q?GpFoobD1ynIOSefRJLypXdftRMUAy3BfxCvR7ocFlqr6nVaIwT9ZZPQ1OOs6?= =?us-ascii?Q?ntVXyoys2AezzfEPEUfGZb00BvgEHHeirgMEDpRJoi+raNsKOLNyUXNy4zJt?= =?us-ascii?Q?6oi01sYLeY4tYE/s+gi3xlsXQI3yB5PKjoHrKmKglzOm9XC5qP2g7FdL5N6G?= =?us-ascii?Q?27CA1zLwdnJ+ODaFD76c2tUlgMmLLuTxAOayOvSkl3c58xsCQEwPURSe1bPI?= =?us-ascii?Q?LLjhkdKnB/lPQ4n7fXKCcn5JF+wTjXfJgWGvqG6rsQxo+Rr6zf2GtXQiFVXj?= =?us-ascii?Q?a4Fq5chnC2tcm0jqyF8LcR1N9G6GA+p72NoCB4sh4iv59mF+QHntEfijk2wF?= =?us-ascii?Q?Zri3IVSX40oYhyg7Y3wKsw0vjgApUPE9VXQmn/ym6KoIqle8NoHFuuMOs3Ay?= =?us-ascii?Q?ADmwwXVuvlZQtZQ6OKPs1Pug6pQZPRDy4EBEAJ27uErm7N4Bb3BijdTam+Zs?= =?us-ascii?Q?CzQA7r0OqWSNeUXPZRWrGboBCrhA4adBWdeYxLvxwEMzkhk6evDR1xkFNqe/?= =?us-ascii?Q?pkv/Gf59O5d4IrtiudaQyHcolcUUEnHfE9J+6BttkhZ+r7YhiaRtGWsJnprA?= =?us-ascii?Q?TwnBD9mSg9YpG8Pe8TO4sDQc4itJqLE9Yq+IyBHMB6NNjtcAAu22FVV9SRUl?= =?us-ascii?Q?fJNYIuznTgK8jkpbKRck9shcUFY1Cg9KiJtBkt0ZU9REDJQluMBdhp4oyN2s?= =?us-ascii?Q?YtE7MzLcsRnZMHV8kBs2kNIpfDFH0s2jmznL2ytCcgktrRX+gu71ERgNuZTk?= =?us-ascii?Q?KgaUx1Ng8LfmE9i+wWVmHQvGrRM70y1CkC9WKf7Vc8UMinx/HfFJegJk6QlQ?= =?us-ascii?Q?Uo8jsTAL6vgO2p3D7wlUNoSr96pg9hboQdq7Bst2Xm1+6GMsag//YiYRVp1j?= =?us-ascii?Q?4wvy8m/PKarrLAmoVXVn6xZz24v+as1n9UQDoua2roUP0l0CitnSyGF0eDQ9?= =?us-ascii?Q?qwzWm6TFg1AQRlRY8086WiKs4KJ+qM08zYn8srEtYCrBkEOYvDLS89e1sAqM?= =?us-ascii?Q?3AU/C7kFpbrgrKww+Po3TVRyF4TuL1FINbp869S8AwK58eZGZlnHbErMUn7D?= =?us-ascii?Q?dPhz0tr7hKPFYWXNTiZyNzxwXcy/cNzhQ58A1jZ4OTcniQ+UHMWyK6fWOB+3?= =?us-ascii?Q?TLj9DBiXlWm1vSvHZV9blkNHa1L+kU8=3D?= X-Exchange-RoutingPolicyChecked: MFXyO6JxbjIiY3roTPExf1rmSKZWnCiymLkg4UqU4LOT2ZUJgbgXvLRFEmLSgxXrwpWvHH/62qTIjHc4HCLbwW4VouPf3UnQgg85uY7H9fwF9F1kJEFat3xW53y9g2v7WcNdWvDhrtzYQ7nbbVKWcRaj4QU6MfVkdaSEfgmxdGIAppN+fjrvQUsF3ONngUOz5cKXWqWhQH/c7Q0nP/BZtWPdZvWb3RPlRMFOYFy7U+hwa7y+0Td6mpXm1NeW2DD8Xql16WH4TlN6T3pNmoQT3nB8ZL+2R/WnyowYFrOvvdPcnjXYfLq92LmB2f1pzwn5cCI8IShSVnVSKhBEzSQxqg== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: PzD5fEf/Sdwx8RUHHOuutwF5ngExrOya2zEnFtZ5UCIcx5zlwiXg0/XqmJ4ES3vS1pWXyv4KjS9Ukd3aGaVUbs8qDRtSjpdWPh3cUC5aY54buZgo3d6qFLAjKuP1yHzfbkns7OB+dvG85JpirH4EGdHXX13EgoVthv7VN1BMMAF6xSEJ8ozUUs+yR73N3wxf2rLc93K8Zq1wdL13srS6TkbaPnUvmI///M8od2rJ+BLV+//ZlvLoyde8pbKpYlJVzTDYrnmboyyxFLhhP3B3KkLQWEDX0zYQ8qtklUAEHd0iasEOxi49JoEdtcwfOipkt1MTjWgUAQ3OINAGBSSnh5AdxayN9FIp9rFJ1n4cP+B2O8oUHdBN35qtVYsaR8Nxkb4MT5p/eNTMwrmWq8O/D5IYZKdx9y2CJpEXrjES8p4wxIjTOwCOqbSmZF4XRS8JezRUx0595BMxPhiT3VWHMNpw9KeSHVJq5l4DQqv9ByzMlkLjTi8lt3mc4H0c2oNqbbEDcNKI4p6VSNPDUobHr+zBQFoT5L3TIO/M6KZIVa4sNZ+dcwMw0t4AU7vtXGw/uikPP7NICGP3JQEPUQqqXGUvFR2Q6oxxx9kcsdCRqY8= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: cfb54f7f-f25d-44e4-d2a2-08dea516e684 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:31.1263 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: saefgbsZ6nalENUzLF5kQa4lQ0pcaMVpGe7tywEefx2C3c8o1XwBJcVkk/efMpVJZGwI5OpZIxZhMMgLL5qB3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLAPR10MB5073 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxlogscore=999 bulkscore=0 suspectscore=0 lowpriorityscore=0 malwarescore=0 spamscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Authority-Analysis: v=2.4 cv=U7uiy+ru c=1 sm=1 tr=0 ts=69f095ea b=1 cx=c_pps a=e1sVV491RgrpLwSTMOnk8w==:117 a=e1sVV491RgrpLwSTMOnk8w==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=EIcjfB9IiI4px24ztqRk:22 a=yPCof4ZbAAAA:8 a=JWw5DRbbQmmJTouRsXkA:9 cc=ntf awl=host:13844 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX+uu5tisPdipE 8UkLgFebFXTiqCN5q34LadW5MEBHFkm8UEuwYzKS7Gr6d+PmOPB4tUGudmjg910IAAUpDLAz9n/ CSKi9J4JjZoQgWEga1/bjZbyaX7cM51FZesDRz9s8vT4uQnhB2UqaBdtWNjacsZoNuqtS+wBPhK M6NjNSpnw3ZBtOFcsKxVNcUFG3+wO7Xz8MyQeMRJ90ZAsTouVaB4j+6MtbCJvn6MCD0oRSEvosp sLIAzFH979iVquo8n7vgc+307GksjGYIkXAUjgMpadwK21Yoivznv9MQTVWqBe9Yi61p0XhINC4 E2w+goTx/7QwGSMzL4SYU2fEMHncwLP/8qMWgQrDLszGRpLxbVSuL0YGysmYao6KiuSmgVTJ3tk hTlf1suqKAxTPHf9l6FcooyNg8IoBuKQry/F50SvBTRDKsJJXfOgYUHoTGs7bSumRI0IqevNhxu 3QWE6eep1ZZCGjdyq0j+j58sVivLM/CTOZ7LzoB0= X-Proofpoint-GUID: _bL7H0AcLGW61SuiKCfEZFLnUm3kCIC9 X-Proofpoint-ORIG-GUID: _bL7H0AcLGW61SuiKCfEZFLnUm3kCIC9 Content-Type: text/plain; charset="utf-8" Add helpers for driver sysfs code for the following functionality: - get/set iopolicy with mpath_iopolicy_store() and mpath_iopolicy_show() - show device path per NUMA node - "multipath" attribute group, equivalent to nvme_ns_mpath_attr_group - device groups attribute array, similar to nvme_ns_attr_groups but not containing NVMe members. Note that mpath_iopolicy_store() has a update callback to allow same functionality as nvme_subsys_iopolicy_update() be run for clearing paths. Signed-off-by: John Garry --- include/linux/multipath.h | 7 +++ lib/multipath.c | 96 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 6afbf6ae1d2a9..b18491c1d077f 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -10,6 +10,8 @@ =20 extern const struct file_operations mpath_chr_fops; extern const struct block_device_operations mpath_ops; +extern const struct attribute_group mpath_attr_group; +extern const struct attribute_group *mpath_device_groups[]; =20 enum mpath_iopolicy_e { MPATH_IOPOLICY_NUMA, @@ -140,6 +142,11 @@ int mpath_alloc_head_disk(struct mpath_head *mpath_hea= d, struct queue_limits *lim, int numa_node); void mpath_device_set_live(struct mpath_device *mpath_device); bool mpath_can_remove_head(struct mpath_head *mpath_head); +ssize_t mpath_numa_nodes_show(struct mpath_device *mpath_device, + struct mpath_iopolicy *iopolicy, char *buf); +ssize_t mpath_iopolicy_show(struct mpath_iopolicy *mpath_iopolicy, char *b= uf); +bool mpath_iopolicy_store(struct mpath_iopolicy *mpath_iopolicy, + const char *buf, size_t count); ssize_t mpath_delayed_removal_secs_show(struct mpath_head *mpath_head, char *buf); ssize_t mpath_delayed_removal_secs_store(struct mpath_head *mpath_head, diff --git a/lib/multipath.c b/lib/multipath.c index 9a1a8cb4a417f..680bb4f0ae237 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -753,6 +753,102 @@ void mpath_device_set_live(struct mpath_device *mpath= _device) } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 +static struct attribute dummy_attr =3D { + .name =3D "dummy", +}; + +static struct attribute *mpath_attrs[] =3D { + &dummy_attr, + NULL +}; + +static bool multipath_sysfs_group_visible(struct kobject *kobj) +{ + struct device *dev =3D container_of(kobj, struct device, kobj); + struct gendisk *disk =3D dev_to_disk(dev); + + return is_mpath_disk(disk); +} +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(multipath_sysfs) + +const struct attribute_group mpath_attr_group =3D { + .name =3D "multipath", + .attrs =3D mpath_attrs, + .is_visible =3D SYSFS_GROUP_VISIBLE(multipath_sysfs), +}; +EXPORT_SYMBOL_GPL(mpath_attr_group); + +const struct attribute_group *mpath_device_groups[] =3D { + &mpath_attr_group, + NULL +}; +EXPORT_SYMBOL_GPL(mpath_device_groups); + +ssize_t mpath_iopolicy_show(struct mpath_iopolicy *mpath_iopolicy, char *b= uf) +{ + return sysfs_emit(buf, "%s\n", + mpath_iopolicy_names[mpath_read_iopolicy(mpath_iopolicy)]); +} +EXPORT_SYMBOL_GPL(mpath_iopolicy_show); + +static void mpath_iopolicy_update(struct mpath_iopolicy *mpath_iopolicy, + int iopolicy) +{ + int old_iopolicy =3D READ_ONCE(mpath_iopolicy->iopolicy); + + if (old_iopolicy =3D=3D iopolicy) + return; + + WRITE_ONCE(mpath_iopolicy->iopolicy, iopolicy); + + pr_info("iopolicy changed from %s to %s\n", + mpath_iopolicy_names[old_iopolicy], + mpath_iopolicy_names[iopolicy]); +} + +bool mpath_iopolicy_store(struct mpath_iopolicy *mpath_iopolicy, + const char *buf, size_t count) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(mpath_iopolicy_names); i++) { + if (sysfs_streq(buf, mpath_iopolicy_names[i])) { + mpath_iopolicy_update(mpath_iopolicy, i); + return true; + } + } + + return false; +} +EXPORT_SYMBOL_GPL(mpath_iopolicy_store); + +ssize_t mpath_numa_nodes_show(struct mpath_device *mpath_device, + struct mpath_iopolicy *mpath_iopolicy, char *buf) +{ + struct mpath_head *mpath_head =3D mpath_device->mpath_head; + int node, srcu_idx; + nodemask_t numa_nodes; + struct mpath_device *current_mpath_dev; + + if (mpath_read_iopolicy(mpath_iopolicy) !=3D MPATH_IOPOLICY_NUMA) + return 0; + + nodes_clear(numa_nodes); + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + for_each_node(node) { + current_mpath_dev =3D + srcu_dereference(mpath_head->current_path[node], + &mpath_head->srcu); + if (current_mpath_dev =3D=3D mpath_device) + node_set(node, numa_nodes); + } + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return sysfs_emit(buf, "%*pbl\n", nodemask_pr_args(&numa_nodes)); +} +EXPORT_SYMBOL_GPL(mpath_numa_nodes_show); + ssize_t mpath_delayed_removal_secs_show(struct mpath_head *mpath_head, char *buf) { --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 531C3407588; Tue, 28 Apr 2026 11:12:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374733; cv=fail; b=LwPvrHPuXSr6rAyZFnKFpBHZNSnDHuJutejslG67rjvvhEXTUQaMjtq+VkhToCjvEGIIq2RVFWK0dbPmgWwgAdVYSkBmmZuk6s9x+olXTLb5zoxctdJCp2gJFn6EOC76nmQf8xkfGBI0WAT4ciOmlPP3BBQbrPgDm5ImgDYKeJg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374733; c=relaxed/simple; bh=ZvL+ebxL6zHRLFgwfZ52a0Pcvn+ygMsc3D++Qil0PiQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=hIL9qT71fq6X3NYOzAnKYg/9DqCLu3RZhVgcCw1+AHaI1E+HyDeYvjqnj2TkkBWDN1AbkHa9INaIfpTfmBlko29/DwstTFvxTGwZYeMOD4EkhNlIrcFWWLkUKocZowf6/j8C7AydeJRYSwJ4R1kFVphgMr5HMhF4Qz+yr8Qr+ow= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=QYiDbOPE; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=iSD5aGNh; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="QYiDbOPE"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="iSD5aGNh" Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SASLeA3055306; Tue, 28 Apr 2026 11:11:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=o2bzohmzWs35G1bLcemxkwopQNnYgftFu+fbc6tgD4k=; b= QYiDbOPEn3xmuUZSXjybeHDb7FYDACYfsMLJc2SP62vp9Q4hH/qPO21Br7qPfJ0v rAjloFzm/QjaIbwXLD0jEKuoucYQqwzgIXyo3wswphkO/QyfT9t0YqqJIUwJFM2w FTHeB5lpXU3UnM4CX+4VGUk0LFK9i7gYI/QN+iUDFcqY3RjtszJ90JDEdleKapQ5 5O0i9WbyhAT/r+ohqz4TXZjolvTBqLIlrnTA4x80eCwbUgdxM8TLiGsQSuU8XL9y 9/LE0aHFlAMeGq9QHaSUfZwcXXB9NOSLffEhQrH4A/PENnb5sKNB79QARZE9uY/1 JscbBT30bOEGH9QutxWuJw== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drmd5ybrg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:38 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2t2P033493; Tue, 28 Apr 2026 11:11:37 GMT Received: from cy3pr05cu001.outbound.protection.outlook.com (mail-westcentralusazon11013049.outbound.protection.outlook.com [40.93.201.49]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cu2dh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:37 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=evT5ZA4sM7H7jI9kv1VKX9uQjPjlOhyj7cesGpUCzDJQErzPDbbw7LhdqC/rlIbaFf9Jm5sfUoj80Hqk4udEH4qAmSJQ5MzX4+LH/S6tY7uNaIPXT5cnOYoQyY9KQ9qOYNaAil2QSm2tItfnh9uP5AcUPsZGNy4ZZU/jhXwEX/HRyKsvzLOoATGxJU7fijdVS9/crx+nM7gLbChx+k1wT0As/bBFf3709+tyKR7C/7PCVNf011wtE0s28xQZ9Es+CmcVh3bc4/EXrJwEeq7KCt/itC6yJsLmobMxAmuKAg4Xvmav+JR71rvMRBjJViz+huePzWv+xefElb+RCvge3Q== 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=o2bzohmzWs35G1bLcemxkwopQNnYgftFu+fbc6tgD4k=; b=jzKvWEqZT6Ng1wazIDF3/X46t73+OvyHNlnlrkvbOn0HOCru2zNaATsj+rvbXJfGdRUn0FgcuKTrGO8m+44HMbK830c9FiUY8k4slZpCcaIVGpzm/bF15Fscdknc7HLzc3Fk4ihBnwPCC64FTDQSOAy99sg3mEZe3jpIHCKerDg/5lZp+fqaGEicr4xOg8x/d/saartNH3ArtZUNICSt4Rqcze+WneCVXPM594vNWP4bgDHY0ifPRAA5BEwomy/uwOkN+GsCKm5K5lF95F1iAXM5l71bGb5GRO3iD5MBQfmrygxQ4/XjQHxiPF9wrg4O0kcRTm0kghCNJinNWey7uQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=o2bzohmzWs35G1bLcemxkwopQNnYgftFu+fbc6tgD4k=; b=iSD5aGNhrOgThxzrNhGH62JCVfZvOf7b/czNJfg7gZFpw2fMGW0Oehuuf1Yf011kF+xOHPo0804R9ncEVsCH2DNAO0TrNb0u25S60GJXMEQw91Ov/JZBxSr0bOhwNUKw3HdSZ329beBbsmIJGdGxoejtnOhXMH68bGraojIhYss= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by DS0PR10MB6222.namprd10.prod.outlook.com (2603:10b6:8:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:32 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:32 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 09/13] libmultipath: Add PR support Date: Tue, 28 Apr 2026 11:11:01 +0000 Message-ID: <20260428111105.1778008-10-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH7PR17CA0058.namprd17.prod.outlook.com (2603:10b6:510:325::7) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|DS0PR10MB6222:EE_ X-MS-Office365-Filtering-Correlation-Id: 25aad70d-f5ef-4660-f265-08dea516e778 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: aZ70VOLdhhahnEPHiMwWC91+fkkwBFcQpvQ8PooxY0fNO+AliPuc29tcDdEajKwYHEDS/+5otwbX+rcCRQUNP527B6cPj0tf1vcSdeZfizXCDUlM1Xcg/kI5ZgLjbLymHEh5tBOYh+mzP9hIgxGNQKKLDe4fVky2LWBJEEoVaY+c6ZYumZGy5pGjvjc6xeegHCXylA/O+vijIKT42IaLVkGq6FgRzlfUIAeIeiFciIZfJm6V2YGq9pCFn9wzYtDU8TUO0VwCIh8PY4d/YZalmTyKnZTuDsXcomBUsErE6Nis99AIfTHpGoWEgJ83ACvafot/vJhCFT245Txiv/vX08Hd475YQdhU5rqYdbpftNQrfeu8D0YfG5Hh4aqN8Q7cNqGvkwBKTnS5CWWDgp8AKUINfg7ctbtq5DC7kYO9mEImGqukro8DiJ+BqTtEDv73beR2G7bjmL4bdBBSJy8Lde+Da7NnvBBwKUQ01TwAnD04T1+jv6hIoTVIhfl5T+hrZG6rDowXjnbFGxFN1/m3zqvckEzONT8Z0QcCXJ4lB8xS3FsabQ6mWqt+xhIWIU3IZqF9A7FuK1SkbqwKWtIYbeNh22lQwlwLAjlz6Ib+AJjMpN4wJq9uCCUUnubG+wt82/M7h88UVXIaLypcon0iB3KRga3dLMV9zKyJCW1bvgtZeD+Rku6nTfGmbzVpLL+DUZej4sCABCdTujxm/Z2jIENCtar7gjgh+Duy77rlnyk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eRxF/7svV2uV0qyiGXczigEk06oM24Z4P0ddElT7GAx1cFTmJtgiHmbZATeD?= =?us-ascii?Q?KNhuULaOLHE9RsEhgRqaN0DBWRm7BkcV0+XvhEOTLi7sbw3LvHRrdXYYU2MH?= =?us-ascii?Q?6PUD4JY9oXfA4LzE/zxdRH1dZqeq8Io4MbMdwWUnY1SWxnwf/G/4JLxA0/Uj?= =?us-ascii?Q?jUiObQzCQADb+/NpzKlpCzodALe6LjL1sGsgTRzFfQTHRhkiE0zzWS90QphM?= =?us-ascii?Q?RC0RAuNeg5DFHktb69trsNDOXYt6sgBNf/XKB3OKGCypeqfMDGIhuPeEtdf0?= =?us-ascii?Q?3N7eVMS+hLCblGzGUaWe0coB/BRccoHqZyvuhAWJ5bCEjlrYLdRVwjAKIgEo?= =?us-ascii?Q?CXGtVBlTla9CYuWPNxciqJo5kHd0ns02+9pnqpEbbG+jqBrrxNMc69Zq0S3n?= =?us-ascii?Q?9QB4wbJty4IO/leYIZ4+Rk+aAUE0S/aBuGDZetS7+unqK/4GmzOfKhFKISKM?= =?us-ascii?Q?1tH4CPEGsMK417I5Ic+F+qx7exP3nEfev6MCquit48bduIjqcj2SnmK10a8d?= =?us-ascii?Q?gG17zF+GjQetJIBQRTtLaKDLkr9fo/gCInhSa1TarstnY9FiLRWg18zNrmGh?= =?us-ascii?Q?KoEDE3B03I7g+QTgtDhqs5YNEuNlMbWGrU1C6+bO7O5RsOZdPSuv5KHM3X6n?= =?us-ascii?Q?Rneq9FaSwVys0KnIC7xQovDRSIPS4Mv9kzuEt6D/3ZuDv9goCSYNvbBw8cOy?= =?us-ascii?Q?f+Xb5iv3N5J70ezPBpl9jd8Kb6aL4NK+Ga+9dOuN1XBYqT2RIea1SQd5NvAV?= =?us-ascii?Q?vdxJxhKv7PS6iscqHSybALQjLoAxfPkr7DMj+BfEQIFwAtPHwl3DNlEz0iRa?= =?us-ascii?Q?wNnDp9orGchN1I+kw+lqwOCT2GOtUf/yofXSrrWf5P0tbfVbWDMNYbFtfbmz?= =?us-ascii?Q?dzv5tja6QrA8GGk43r+27M0qnQpg4OUZuIiL7/47hzI66pc5bSnk/JeM/lwA?= =?us-ascii?Q?Oa2gWkjESK+jdgDqnLAkCmG5bj9i2De/1+RsmHXNIOeeJbuyaCFnXAP4e/et?= =?us-ascii?Q?I3NSoOWyAAftgk8ayaK9z5bC+7xuaCbRrpUshyW9ocTOGdLmWNCj3bmQ8q09?= =?us-ascii?Q?jG5jzLs0MkgwpB4m7vH92P+6k5NE+xYnKXYQ1nSo0YWpyWK7yWJchqOQlvn6?= =?us-ascii?Q?EYHHrGvFEwDjne41uOfTXnZqbQw1VFdwPHcmk1//OML+CXYgvpqDkCACasgs?= =?us-ascii?Q?lomFXe2CL7LGePYYol5b2gwfKO0PBlvWQhYsrjX7+3hTe7lr95e8/0EVfzwo?= =?us-ascii?Q?Ev1uW4sXkh2BFxo9mbautIApXu09ORstu+O0REgTkWmaMJaSVm7AaXEJ+T1N?= =?us-ascii?Q?f4NBU8bFq7w/VlZNbOMbYJv1mZD7TEZvp7+VYytqrFyQd2aKUWz7fHIpyDfq?= =?us-ascii?Q?OwRCel9yT/FoNxrkDFtSxjGghZYdf6LX3CThPXwcDIHUjosa4ieR4iSnvyr2?= =?us-ascii?Q?5gp91kHSjc6LFzg182XTBjAfngH/bCO9u+Zu3a6D2gAKaGaAK22U6FOo9uQ0?= =?us-ascii?Q?ukSVqUtnwEcwimmJThU6+WUqLHoSpcrH8nEpIRJSctRNaSBC8qHia3fm5SSD?= =?us-ascii?Q?PobyQ7pzwz8NEgRziH07GDtM03gur0o+1v6SwgzvGv9AgUV8DwTRk+SFz7J9?= =?us-ascii?Q?ny8/WkBGxiaefRgbJbneFpFi37vI4+22mEEQDP2/H97r+siszpppoxi4bCBY?= =?us-ascii?Q?1dGBW6rczXBcoBOi/LI9DddBb+RA29wVBbAlzAXwrSR2KmupyCFTO69J43JP?= =?us-ascii?Q?UoPApKZdQK33L//MCtxZ7bxO229tsf8=3D?= X-Exchange-RoutingPolicyChecked: AZEQnq+22is/k+3YzhgFnXQv18pms7+M3hfu5luJHzafPICGz0WoM/5iXa6NtDRw7TJKSdvCfFF1m1fR7SpaSxQYIajX7FwcdLucMw1YTbL0vvm7dDnwGNXg7tc0Y/ESeKQQ8ZmbpJGyp46qpfYbdzQM8RM4vmYTWFvv2Jy3YWjWVPp3Eg9hUm0XaON0AdPAur82hcXhvBFzGNxbP664BBjYIRlZushKzZ7PW8wauMxZjEp1cmbyA6oDX3nBwUPYbXqU46yG1LUeJ2cywcn+3iNKWf9IsTQHKazRdEsMmvElXX5Nq6eMn85EMxMaaruM7gnaTiShGzgmFYHvsY5AUg== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: adcIz42J8kBFp8ZPq6jD6rbI6rpKzX8hg2mOuY6+60XTaJsOBWUXyF2v4AuymToqb/JL7irwsiP2qcLBOka/Eq+PASWlr8aJGugCzTXLaWPM9keFCxUgLLQguMIzHqPeuKtR5Si9XO0C+XbS60Sv3wIsfPNO9s3GchLbwp25ZMT3WgfbF+QIVMbElClbPm+92OoBmuVZxgp5R9fIomzaG+3AHfKye1Lm66XZ+osZ0N8xUJqnTUDhe27Gz9IP5Ve6d5JLHFgjRysXJLGukmIRH7SZAxnTd9qdA26FWq7pjdnWnHbaI2u2MlfUNfDLMd08oqkC0xdzesq0Sccxy+gSE20haiLLWGeaaGgY4XW1ms1xgADSno5uj3iRrEt7nnkDNIwTOKt56GRQam9IidB+myO7sGYBvHUiyr7lXaWjv57vYGB99cxV1Q78cBz1TuM9JhCG2IGLLuniRIj9Rq3X5WmKKSk0mDRLIkSeXuSrUVRhypQ78XbrQRmWGTC3ONpg9o14TLUoY+xQWHU/HJq05w8o4EXqRuDtn6vi8/zGstkqAj/O1HgjlS+4vClVQkLWeCGJMY3cvu1VTUFfQl1kuf3Og+Il6DymLW9kCFqzkqI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 25aad70d-f5ef-4660-f265-08dea516e778 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:32.6243 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7d6STmijpgY5X3aN5J+k220o2pUdIfJ4QqICaRsDI6O5q4roZkbEKg6A9eavHXFyJZ5TRcB+g/lyhPans7nHlA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6222 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Authority-Analysis: v=2.4 cv=V/VNF+ni c=1 sm=1 tr=0 ts=69f095ea cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=o5oIOnhZENCTenyL_yNV:22 a=yPCof4ZbAAAA:8 a=zSmYoRqB51LVswEeA60A:9 X-Proofpoint-GUID: 6cYKHBIOVLx4LRDzaK6Htwx7drQvSkrF X-Proofpoint-ORIG-GUID: 6cYKHBIOVLx4LRDzaK6Htwx7drQvSkrF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX09LSZUE/sO4/ IeG815C7QvudgXy3VRevehVvnY9Kf+H1Gx2xtE6S2ZOXm3Qh3Gdo8+AEyG3buRdIEJfuksCr3IZ lFs/2IRaFewIDQj7hhYIbLazu/B67RINSO3plX92IrZkSpQveZGc5IW5PRljkxaOb4u/ygooVwI oajrH6xVPq5+rBemcOAOwdqdtcji6ZScuEt11C4BwC+HL67WDKbC1SIWfUGxolRhMIQ4mdAPGC+ NmqxDR3SdQevNUdqHD/IVKKPmBEqOzTDE+TCpJgjphiH5NoEOaOykCb+UePoQQoSBhsFsMxrxNJ UO2IJrLUHSYdfMQao4Uk7VdlJ+B/ZkE03qDl7PvhxrUFfg2SSIEicgs0b10ycyCu96wKlE/dtIg ZbD5qeYsvGaI1lD/rbcQr/St20jeYVI7iWa6LfRoB3G7KdQLP3KD771gI4FsUcseP769appftvD 6tvTcnXhhopBC+rfQRw== Content-Type: text/plain; charset="utf-8" Add support for persistent reservations. Effectively all that is done here is that a multipath version of pr_ops is created which calls into the bdev fops callback for the mpath_device selected. Signed-off-by: John Garry --- include/linux/multipath.h | 1 + lib/multipath.c | 182 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index b18491c1d077f..7464c94fbcc3e 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include =20 diff --git a/lib/multipath.c b/lib/multipath.c index 680bb4f0ae237..d2270c70b9913 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -466,11 +466,193 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_head(mpath_head); } =20 +static int mpath_pr_register(struct block_device *bdev, u64 old_key, + u64 new_key, unsigned int flags) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_register) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_register(mpath_device->disk->part0, + old_key, new_key, flags); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_reserve(struct block_device *bdev, u64 key, + enum pr_type type, unsigned flags) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_reserve) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_reserve(mpath_device->disk->part0, key, + type, flags); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_release(struct block_device *bdev, u64 key, + enum pr_type type) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_release) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_release(mpath_device->disk->part0, key, type); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_preempt(struct block_device *bdev, u64 old, u64 new, + enum pr_type type, bool abort) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_preempt) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_preempt(mpath_device->disk->part0, old, + new, type, abort); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_clear(struct block_device *bdev, u64 key) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_clear) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_clear(mpath_device->disk->part0, key); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_read_keys(struct block_device *bdev, + struct pr_keys *keys_info) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_read_keys) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_read_keys(mpath_device->disk->part0, keys_info); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_read_reservation(struct block_device *bdev, + struct pr_held_reservation *resv) +{ + struct mpath_head *mpath_head =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + const struct pr_ops *ops =3D mpath_device->disk->fops->pr_ops; + + if (!ops || !ops->pr_read_reservation) { + ret =3D -EOPNOTSUPP; + goto unlock; + } + ret =3D ops->pr_read_reservation(mpath_device->disk->part0, + resv); + } +unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static const struct pr_ops mpath_pr_ops =3D { + .pr_register =3D mpath_pr_register, + .pr_reserve =3D mpath_pr_reserve, + .pr_release =3D mpath_pr_release, + .pr_preempt =3D mpath_pr_preempt, + .pr_clear =3D mpath_pr_clear, + .pr_read_keys =3D mpath_pr_read_keys, + .pr_read_reservation =3D mpath_pr_read_reservation, +}; + const struct block_device_operations mpath_ops =3D { .owner =3D THIS_MODULE, .open =3D mpath_bdev_open, .release =3D mpath_bdev_release, .submit_bio =3D mpath_bdev_submit_bio, + .pr_ops =3D &mpath_pr_ops, }; EXPORT_SYMBOL_GPL(mpath_ops); =20 --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C28B40759F; Tue, 28 Apr 2026 11:12:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374735; cv=fail; b=NQ0icjCxANsQt5i28omG5ZFWcAW8uPt6QCtxMCMQgmWIiq9Pes4cr66zFb92NGOza+EC9Msz2vbBmDxhhco7tFdbK5b3TEz3Kh1saEqOKilShIp8+Yo6zH4+CAIv7o8hhpSU8VvvvU41hWFzGHfjlNF++NmRyHFsV3xbyh6tDWE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374735; c=relaxed/simple; bh=NUjNwHaBLFn7URh87DnY7+y65xCD8AQTkyHP/VSZLU8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=hnaopqnALTLycxUwDhNM2hL0NWDoQZC2+H5bhJT3VBQLgDS4BrcRCfzGdu1MUGam1eDVRz+4U1NO+cEG/bbeBHxp/9slfOF++vGWZ7FL9rnTAZWTS858MJH9bJbt0JHCnhYn0ct5SaM27ejC5PGiVuJFOmMshAQxjuYp413+heE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=olLJaaV0; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=n1AXbekv; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="olLJaaV0"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="n1AXbekv" Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S8qi1A2128105; Tue, 28 Apr 2026 11:11:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=fEfU7PLmbUBy/Yii4Jt+qOXwsvuXoah8X9IYRHjBLm8=; b= olLJaaV0UDzfI8rZJJJGCGEjYnQyqwNTlDcXRJPvv0yQ1tpWc7y65EcWSZahiih/ RbmRK69MiJpVV9wuuYpWcIlfLNg4dhMCQ7G6qmAymzrRHkweCEe+ze2Dpudh0WJ3 d5aZJZWLpzADDDfgKLTlmVhN2LRcq06awPacz6Aor/r04C7ULyBBWpv4yvg+Q3/U XVl1wAS5LJxr8dMy3Soc+YnQMQQ8MSoHbkFVze7HcxxHkVkfa0TfugbesIFiUZQP PIlYOyh9Qh71ujJZuk5yHTF/th9sJXB/1iXQl3IhNxHxGJ1x7bVGjiH7MsTCDCCC WxooCHaGUk7tE9bk7vFb3w== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drmha7jdd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:38 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2t2Q033493; Tue, 28 Apr 2026 11:11:37 GMT Received: from cy3pr05cu001.outbound.protection.outlook.com (mail-westcentralusazon11013049.outbound.protection.outlook.com [40.93.201.49]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cu2dh-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:37 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=svlX7V3jC3eU+Uis8chJDb1wakOUj6JCH6oLKKXSSZ2VSONbgXGRc3l2k/OTl07Sx969QSQWJkDooI5fNvEI57HgmChYmAU2ZPlkIBUqd7WC/OO0pL1eCYQ6KlF69IzH5mUC78KOV8zLDojuda3KhKY2G14Oo97Jxes8Q3/gtZFruQFHW4TfNWC3KHFi5Retta+uEzYQ8Y5WemHzFrgKMiy+CK2AiMHnuxzfH5UzQOd0i2SK9jQtEPsSVFPky6e/cRO/ZIxyB/nQbRE0oDxJviShNGZ8NaI27+JAQnOITxqVsr+qLZDKENU/E/b+2MLiEgRNF+5xg2Vf3OQy/gWfXQ== 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=fEfU7PLmbUBy/Yii4Jt+qOXwsvuXoah8X9IYRHjBLm8=; b=liWocKZ38PMemY/enaSEUFwJTegYkbEJWzWAGqWGl0aSexq6dQcZJvjRlrGbKX/EVFP2AeHn35WoE0ib6Od9Hnhu9JvGkuGo8f4CoPDAQMRmUjupVi6i8k0m/yeMYbAiG756QmEI1SSzKCcbwix+ZFsIqrcuaSlrQx/HVEi6lRT9ygSUYbgcTCJTVSOEt7lB9znxEBXqa6kV3BQ9COi2SivIw1ZUFubqsnhZbFQm/lFivUeoTfvUYrDC256IHSzvkVGHMdjZp62J7ZtXco+hYhuDZvPIqXqJIQHVttPytLh92GsH48qohi7QdcYTE9f1Fe6z3LUa6oBk5Agi/qVFzQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fEfU7PLmbUBy/Yii4Jt+qOXwsvuXoah8X9IYRHjBLm8=; b=n1AXbekvskQsdjw3Hv1YGuvoFZ3uvTvaoFYkzWzMoZwD2SLNZMmcjiUiJ4BhIY6Q8+E90kyXbRr2tGF7KhDgJW/cjlW2LuLltwE7bJuPAfCWOFre2V2JXkgbosO3qxPTXSZAY/8HgfJRiLfm35ubB4TZd8UfCgWEslsQ1vwIUZE= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by DS0PR10MB6222.namprd10.prod.outlook.com (2603:10b6:8:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:34 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:34 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 10/13] libmultipath: Add mpath_bdev_report_zones() Date: Tue, 28 Apr 2026 11:11:02 +0000 Message-ID: <20260428111105.1778008-11-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH5P222CA0010.NAMP222.PROD.OUTLOOK.COM (2603:10b6:510:34b::11) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|DS0PR10MB6222:EE_ X-MS-Office365-Filtering-Correlation-Id: 861b12bf-4795-45b0-6aaf-08dea516e865 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: i2lokoVy2fRlzVMQb4it+GGKtBjsL4tX/hlJQ6/HF9IFyopM1Ar00OM7ShF+dzepreL5YhhDM6xPGiI1Nil6Qrf7hMjKDwTRxZoTFlrvkF8tn1bl/YyJ8s/dTT7Bf9trDeHP3BPQq+M7x8r+w+jZtjiaIrKtYKoiqQByUoYdwTzMVzoRjGq5fevK0AZPjS1HnET7J9FUyzrzbDeOHqoYZpggxTsivjRQghncCToQtugvpiozuu/je61pnszQXNUC12zQ27thzPF6AaVT3tYSZGiy7P/YuCHQO000l6E2roBy/QSjefL8FPNent2WbXLcUVp/NEjYfXIszWNM8M74Mc4fFSLORL8EcgtBWyE5sNBYNnVJk/Bht5CtqcXZ5dfBD2nvD3ooDqZkl8NQepROMIc32434QWthxB8/epYRcGNiBetvf5+Lx3/7ds4EoYAKjK/vnIKnV2el4jUCAoCh8g9t1m4YBgVOLBu6gc/54f3foy38NRS6aLoUhgiRGXHdtFvNUSIA4INivaruOfuWrYB8sl85vpFwaYn/CNlDiqtfbfUlDUmh0VqjdoF7KiWo9dFjZBHme0g7MJ2uzpewDvvpVXrpOPOXB3y4xhLkUV2NtHPjub5hsToOiJHoLWdIebobgTwifMtJIDqJvqga89+IqxrCbAE/2Qvw3ts3c1RSxbZ5Y5g8jTvkNmN/nDWyrioXDtegJK56wXewp/TW4LQdFIB+hX+FcL98p1Rqaq4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?2IEYMmy/fD1vzlqqXHXf3e6cW88jYvMk26Mk2TQZ8CaQdPHZkM18h5oykVjn?= =?us-ascii?Q?3TMZZpRbI5wR4MIL1A3PHtdN7xbOgtqdRtz2uZktdR8w9ly10598YQhfERH/?= =?us-ascii?Q?UpChc2XX7mcT0EZazkuFD9Lpr7Phl/QM3BstW7brRlhColygcQ52mOad1AYQ?= =?us-ascii?Q?YnYpE/pc+4X9d5Aio5v0BEYHOuY+fkUSqDsV5U3rRqoGgtQdztwFNioWv8fV?= =?us-ascii?Q?WY8TfFq2dGpiLaCINEuRGA7AesqZhha2yUmeyXPC5cN9Yj20RJtDV1dUg9IJ?= =?us-ascii?Q?a7vaH0NkMBhGrkqgr2/kmIlIpN2JLD+ecTawNKUpQsncvm6fFl+MeXhKUWXJ?= =?us-ascii?Q?K3opEDDTEJZkWgCIgMZIbMTM0tprjRag6jISjEMwIIfcQDrV/YnTiAzca+gv?= =?us-ascii?Q?5idcbG6n1kabFZtk2tkH2jpF4GNj3Z668ftFeShvl+3R6tJS8d1pK/LrME6P?= =?us-ascii?Q?87H6rKduw2YEVL3WguGLECU6VA3LDhWwWME5hupQlhp0vRSDU+xGvA4k2EwS?= =?us-ascii?Q?fZLiV6KHczYMYz6RgyChDZ1zISUHJamBLl8EK6r+c5jawGtpYBDRKtwaP88+?= =?us-ascii?Q?F+fVP0eIM39DvAqZ5M2Me32zJ0RUcLLP/ycdxa/m4dMgH+Dn0FU0dZjMQDv+?= =?us-ascii?Q?sedV1rTSUn8eHO3nI1UJg1jgeXy9jQvbVmvnWjAx++soqYXEHhgCqEt2+z/e?= =?us-ascii?Q?NNm2a6bDokHC7sh7vSchkdh98VuviHlplSJwDk8E0+752SwK1e87vQARX4RY?= =?us-ascii?Q?JDE4Lzdb3S8k/59xbImW7C3WtIHGgMtGqx6DCAMF1MjtfSiTvFPSC9MS/rZE?= =?us-ascii?Q?gvRmreDfx+sqVL12BCHlhDA/hvkZOQo4gnyZf0lpKMp6TmVAyHu46cY68E5e?= =?us-ascii?Q?cOJ0dWdJ5QF2PZWUj0JgkValmdn/o66PMdYEU6phkP5CRJbChyzitBxPOOXS?= =?us-ascii?Q?3lIIKMNwmUfWKV53kBKWtr9nIknCyFCasFQdgXW88soStAMz0TmNmgImvO7a?= =?us-ascii?Q?oqYPcIwq1NuG9DnKzMiflkNiujP1eid+vcUTQ4NEWIMvZa2zEO3LrbqHhI8b?= =?us-ascii?Q?MszYybh8WIR8gEo50yvmiLCU39Bm8NtnfcKm0N7Uy9O98iHaG1dC91tDl4lG?= =?us-ascii?Q?WUlRKTX+mYdrTTHlXuH9ZIFGB5PngdQ3TLjAATYOH5UOmviCliX8hxWasywn?= =?us-ascii?Q?tm77q1Ab9gTsFCPj3ftLOwA0tSNu6uMBTJTHXo6ti90Inu9wfC7vgl9JwaX3?= =?us-ascii?Q?yL7FhUm4UmfNni7G4iQ7sjdJLCCSzbJOlMnnCmv0ppkeQoBcg2okNeR4u7L1?= =?us-ascii?Q?1P5FU9FmQySCJkGghWS/BcAJT6psf0YcvAgy/N+81eSxWOvUO1O0AN+DfYdQ?= =?us-ascii?Q?9vTvJd1VBJpIKkWgtJ6HDWNKjkkNaQulPdcQqvYrL34Kq5NvgS58ebKqnaQw?= =?us-ascii?Q?EkZtyAlOi+M6WKMvEpArDg2A1IDtIwgNQPS0JXGtuRKO/7zM+OcatK/aR+UF?= =?us-ascii?Q?OsO0ZWdWcPi/jj6Zuqx84jIzGKSvAJa0I97qvHMY5mgK4vkOhr8nj/3HyKKn?= =?us-ascii?Q?aTg+vxN568ZfbUBEA93SgB6Sdzz/eOxKHdgPUSklPAY9eqTJHtr1Dudi83Az?= =?us-ascii?Q?Y9Tw3DnR6jlvTxg4nlt5UNzsTH43MIUEPn6H2s4iJzpldJcLG7b8StMVUkhS?= =?us-ascii?Q?TrUoJIJexhopKo03z7DNByqRETORtrg2+U/jGamgZ7dJYAwhz5WvQwvMUrie?= =?us-ascii?Q?hg8fTT7wK2u+fhj989bYbaXDipW93lU=3D?= X-Exchange-RoutingPolicyChecked: DiMMYFUF5c9BqpKewI6tt1QjDkCcZFhCn1FzQFLKton6mvg6bXmZdGGayQcrESVUDknH51ZR5FS446oi3I8URS54X1Nq1B0PhR4jSlE+Zn4RHCo66zK+IPMLwWCZMhhlhhdtWeMMDem2c1P0VMFdqoCZKAK2gIqlSxCn4LSlsw3lej9zLs/TxTgp/CGwMbgXTbH44ePCqHtkcTNG9OYujULRVk5BZ44rcCjvuYROVvi2awUgjixBJX33CXqFokOqjEOdharliTlFnt57+RgxOWLEG+exeJ7ia7p5+RXT7yr9vrYP+cIElNMvgv8QABRoxusG/odM1e8aSMfrENWOQg== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: DQz43Yaeb+5E4/tOcD0xcvpOdjNjx6G1dOkdkzLARizgaoK1NrhY1+w+P6T+s6Dn+amOOFYM89WOikfdvJiWB7lEdqQV1tVTMrwonIEtkD4J+jCdeiV1PeMtZNA5INRVJ1P74lIc5DDS92hynsP+VJOAE0/99IS1IqkMcDdMRAxjhogvxt1cm+HArn+Xgy+Cnx5sqQveSB8LBnfGB1kOc8HytiPmcQnsKBE2hfwytWa/PDKV88NkUlaauDk+0sF6tZlBcvC4WeBb2/rMnf+hxonUvYm1sJdSGDTxDeaDdFjqxnxYohfKJtCN1P0qynqduI74osuCHXXIBMrIQYcPiqWikICclQ1xhBZJiUfvm6r65Mzy0D00NVSx9ktnZFOaDvEZAMABDOWCRBaCWC2loUPQBvm1jAp91G2H/vp1BmCHzMT+z8HR6qDTxq8DYN+P4ttRmV4J42H4pNaqWnFl1iiCE45ogQvME1/sMK0uMMb36Uplgz8HMUvNfLYfGIH9yY6l6aicOZ551wkdkevDsje5ui2iWSeXgktHGODgXjWkfJXJChi38gj5cJPEbSMUs6V4/cU55Dbl2gcfUFqCtrJTb4YJh61KzzaYXARboaI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 861b12bf-4795-45b0-6aaf-08dea516e865 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:34.1843 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: sKs3MVdDCzjCFyakRZG2t7Z3ZywR1kvPzzuDI945UyEcFhq/V5q+c2/XSpjMtwEixAvruzeN3QsZeKsNLDjFSg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6222 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: 2jB6GF3w2VjiIb1oybnRB-OLwlv-heku X-Proofpoint-ORIG-GUID: 2jB6GF3w2VjiIb1oybnRB-OLwlv-heku X-Authority-Analysis: v=2.4 cv=CrOPtH4D c=1 sm=1 tr=0 ts=69f095ea cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=x0eKOSpe3m1H3M0S9YoZ:22 a=yPCof4ZbAAAA:8 a=hSvAkUGrqjTGy68UynwA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX2xVMsPkUlTWy ambPQzeRT/wj9Ir/A7EHBYRyeTQstGJ4tUFpHUSnkYqZsoSrJU2FTakD1G5ETyUsMlBHvc4HkPo VCw+4+GYE472Hstl1tfSWrrIukUoqjQx1TNJTr5dCR9bCpTcV7Ng19JEltdIUmvUybHYvfY1Ijt UbhSWM+MvK/xDbn2yRjhmUr+dsXKp/mkGjcRDKXwAwuugy6XkmHMQVq2ey5EhUiBb7opPNSfxJW xaSLoMfLg0OBOj+QrOvwiWvGoEUFemL/zVmeLamjfv7yOJgrfLqbQF9ppGBJTaNGWLGdfOtTjRq Px0GK+YDwcZdJPmNOXk+O51EX19Vj4OJoMm2Ce0zQ3qrprWDbNRevlOJO25xmN8dJpoL0qTTt0r BW+OFpC/iuR+nx0uYxrHcRUxCJK47uobs8L6ZOglb5tYmrcS+bdLX471AzNra0DEm0MOrY3kecr 2yne77y8LKoAjriHbqQ== Content-Type: text/plain; charset="utf-8" Add a multipath handler for block_device_operations.report_zones Signed-off-by: John Garry --- lib/multipath.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/multipath.c b/lib/multipath.c index d2270c70b9913..c72f35e02e2ab 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -40,6 +40,30 @@ int mpath_get_iopolicy(char *buf, int iopolicy) } EXPORT_SYMBOL_GPL(mpath_get_iopolicy); =20 +#ifdef CONFIG_BLK_DEV_ZONED +static int mpath_bdev_report_zones(struct gendisk *disk, sector_t sector, + unsigned int nr_zones, struct blk_report_zones_args *args) +{ + struct mpath_head *mpath_head =3D mpath_gendisk_to_head(disk); + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + if (mpath_device->disk->fops->report_zones) + ret =3D mpath_device->disk->fops->report_zones + (mpath_device->disk, sector, nr_zones, args); + else + ret =3D -EOPNOTSUPP; + } + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return ret; +} +#else +#define mpath_bdev_report_zones NULL +#endif /* CONFIG_BLK_DEV_ZONED */ + void mpath_synchronize(struct mpath_head *mpath_head) { synchronize_srcu(&mpath_head->srcu); @@ -652,6 +676,7 @@ const struct block_device_operations mpath_ops =3D { .open =3D mpath_bdev_open, .release =3D mpath_bdev_release, .submit_bio =3D mpath_bdev_submit_bio, + .report_zones =3D mpath_bdev_report_zones, .pr_ops =3D &mpath_pr_ops, }; EXPORT_SYMBOL_GPL(mpath_ops); --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 284FD3FBEDE; Tue, 28 Apr 2026 11:13:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; cv=fail; b=mN52MSMpEZufNo4Umfli+iZCavCR3iLBg2tQVDbTFH1SYnYsdN/TkBPUeVnF+IEuM1AXA+AMS6Iuda74PaO1bHaNvwq+8o2zOaLxf7XbVHBGyuJDQ9M8JJFFe9KB97etDipg9RDR4o2q6Sj5STwpDemTApZly6mpgVM3k3JDNck= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374798; c=relaxed/simple; bh=q1rQSXoFlm67ilN8xlKEg0iOQWFxEap5U9XPPlkwoLA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=oFo2TsGX5QROhDM6sHpI8n5c8WOoBBbj/6u1gC5PDTNL9oZBboMTZoGzTzGDX8EpE3OZaMtL41YdzUeroBtWCT1oVb1t4AYiXURKz5vLkfm2TsgRvo/JZK41uOuMHRzRX973jW13xsvj3MwG7wQxeG1AhkkkePb4HzJjOjIMM8U= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=GuhTEMGk; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=OEAP/HJs; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="GuhTEMGk"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="OEAP/HJs" Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S9ruHW1015433; Tue, 28 Apr 2026 11:11:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=/ggwr/FpAHTuoIttWBimz1s7obzLE67Tg9XwALR3ekM=; b= GuhTEMGkmK5jV6Apxav3xW3hm0wzgQuNYfW0dsleNaMUVpGUn9bwAR5X0aOQaYRF UCaf08wQybuAxGZgRHboPAeu0ckZdBYYHy5Lma4BJCLVmkT6P6Q7AhUSH4KBKG8O pf15FtBCYJN7G03Suhp6d5Nm0OGeV33yicEd3g2eQLIkWERr/S2Wfw2rLaD/TAOB PED7CWvmR2iRzor5ZwjmC9o3Xe30nxFyBFrBHvCSQmjMAmEWodlN5Je2rH07MNFU +sjEBk73Qz0yPO4DLWDD0NohGjLgwTpq1wnT1WBDTkqlpTUBmO3Qj5rZQ/z7NYBU PIhtkJrcuttCFTW74fEw9w== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drm6yyjvs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:41 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2jYB002800; Tue, 28 Apr 2026 11:11:40 GMT Received: from byapr05cu005.outbound.protection.outlook.com (mail-westusazon11010004.outbound.protection.outlook.com [52.101.85.4]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cchad-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:40 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nY/Fr3XZuuZQE1gnKZI5zPMM4k6G4quJnkGxuoLNJYjX/E4Onm4H5Adx9cr+xunIRZx4G79alpVmYruwiDyC733ZQMSPnM6pPogMMbQEg7Rd8IW6fI2hT8BBD/LS1iYAZy+guqzhx3mw6DG0BXPCXEHAuD0SsXYPA4C9dhX+1H5uQ5Wbgtynl62ALuF3dsTe6pV2qSAJ59GrIkc77acqxN/BPKumH2FAi6wDw2yzwMoCuWjccb/xveiVLG034SjEeWErQWiNhev7oTJgVt4viNjiOzXXFszvhRn1mCvNx4U9M0I1qeOZiLnMvhrnrvBcQYGBMVR9iACbKN70DQJnuQ== 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=/ggwr/FpAHTuoIttWBimz1s7obzLE67Tg9XwALR3ekM=; b=UuOGCgIc1WzVSmTSfP/tddT9JPfEXGT7mnfsA/6Ou0alOGrXOZ+IZH1lIGbsgEfLTddnYwekCt4pEsn83mt2TiTqIHNU+7z73d4Y4MiJ3dDTK8Rd8kwaOw6B5MSnFtxU5KruNHkdfAoVykVVcLUifxgEGKEyoHs9tMC6eYTLUMUlZunsrhCGeDdvq7InIu3iQaC3EjbsLoSexKe78ZbxEE98d3vxK2f1Ja9dMcQbBHxYnqWDIpf++ZSufL+mv0CG0alq2xbd/ZisNST2Ii7lYRN8gt8PsenjCXWH/GX6UymrbBbYGdywWTJYeh9GCjBhk6UMw6aqPicZC9Fi89kphQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/ggwr/FpAHTuoIttWBimz1s7obzLE67Tg9XwALR3ekM=; b=OEAP/HJsgsnX0X4LSrHa1yHWsgLvJL8jwkDMiTp+lHw73kRvG/2cH99MqXRDXoaDrqE5J5BOR8ytjj+Jaqe4s8oKEZgHZIs2doOjFWY5/vhAt/zaHRrL/McGykZD9eqG6SB8KVotbsrIkm07XFAhmzU09Iew+BmC9Jnz+AGBpcQ= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by DS0PR10MB6222.namprd10.prod.outlook.com (2603:10b6:8:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:36 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:35 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 11/13] libmultipath: Add support for block device IOCTL Date: Tue, 28 Apr 2026 11:11:03 +0000 Message-ID: <20260428111105.1778008-12-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH8P222CA0013.NAMP222.PROD.OUTLOOK.COM (2603:10b6:510:2d7::15) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|DS0PR10MB6222:EE_ X-MS-Office365-Filtering-Correlation-Id: 5338a13e-16b5-449b-1766-08dea516e965 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: QlJv07KgEhBdZ15NGBXs8JeIZWphocTy2JdLCeVXAjbae0pQj2rhglkV0mAGy4wYbZDMEjIvDA4MwNZZ+11etpOX1UQkkXblQQQ1sLDwPJ+gmWLcekFTl3JEI1S4AliBb1ECgA8X2Ex8/voevU8T6WCLuI9MsZp5MvRF120dSsP1IAPaS8qwxWjwIGXbG33xaxx2ghxdW2RE0mx/KtySNzCS8tnx8HSYQXstXovCExzStE+WLKAGfmBdhwuJ88FTfxPb5MId9CKjzkznwcWP0XA0W5ysoS7nMJSfIl4qrg0FR1R7J6WHMamP/NOHY0Lc0F/Xlej00vUwEzr5HrXuM3x0NQb1doUXA6ExBDwD1rmLRJZPcHvjcxnjdkTerDCJB5RnDyJlKaQNcEN9YvHU8SbFh8JLeTl31UB/5AkPli2SmFQaRsyBvIHJMd0tMT2ulJ5+ZENVDCu/4SaXLHJVu/uxyA2OIAXZoc123T5GFpg0fuq9c4miZQ97E7QKwf4fL7ixRctGzsRlXWjP9QJR8V6F65SX2K5y1xg91kGQpx0ebNV1StCHORH+Nh/9h/EcsUNf0V0sW1ZjUX5O0BUx05uWHw+/KRkHmkGrvT9hCCHDy/UH/P8lzQZEX7FE+dYke7eU+hCltTaLW7fa6dTjK1BMcQxq2sR8WZ88FsAmcoFGBw8AflMEcnzQShPR5qNzF0ANXAfvBUMg9YAHAE2hzjO0GRPG7Nkhf2M9Hfu1y3E= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ze+IFWIKXlUhPhhj9CVqGW5/WbZezEqdMMtGJKB5V2meugfsJhfq3zwhzoUg?= =?us-ascii?Q?AJZFpB+lDQZDP8T3rQNejMnC2I6ztR73YOxMkPJkE9tCEPiO/AAp01t3Zxdu?= =?us-ascii?Q?V86Z1i8lOwNR3gwKWxjs+Uoc6i2MtDcVIlB6IRbAgvsvtUMQZuygIv7xaJYz?= =?us-ascii?Q?qr1wzEwmNt7vZTvfLef64BWzSYXhQjcdrHwLUQkatjvid0StRxJPqUFKZx3e?= =?us-ascii?Q?7svYRUPMIdT7N5if7bypn/t7VRWrVlnx9XgHr+lmUCbW/FkBSiqQlxmH/LHt?= =?us-ascii?Q?8N6Th429gQpVlPAhk7PDn4LbHNWKQieI+LgscTAkMWSEwC8ytfbO0wPi4Fwt?= =?us-ascii?Q?MDT9CRUiJCIEl/KwH9s2Gc9Sdy7fOLfCwApiK4HmiashlMjz1yBqXK5Onjqv?= =?us-ascii?Q?yDbTUnjZr4Nu7KU76p6JtiGci2zrkpz3/TvFbMXDDTod/CprTNd86G6l5+1v?= =?us-ascii?Q?HU/ksg4bl1ixG7jFw8d8C5gwuNi+4pffpkfi13Ns60XjJ8ahk7SmCXOqLxtC?= =?us-ascii?Q?VCHs4uehTl4+pBh1sIf77iD0eYOlkQ9KybO8/tdaGgdaDp3P0C/SP8DCFUV4?= =?us-ascii?Q?AyLA+jtyc543A7XmNSqu+guDB/WCoL3wmiu8bljUmlDlTzCSHLpd+czyyoAu?= =?us-ascii?Q?bLnjJxRpdYpp/ZzssaZ3Tmv143k47htweS43mgzLuuRbUesBa1SixbVOeeA5?= =?us-ascii?Q?jGQ4HpNAM3bhY2i1EQj5St2Fzql+Ywlex/fcEJPuTp4e7temCFw8ydOzQZh7?= =?us-ascii?Q?wP3YMzVd9rqqHt1PhNNbfoL2Nq/0wZfMLKRb/ezQT7LhsMv1sn82ZBP51vEy?= =?us-ascii?Q?57+61Rd46gvvmknrLIqp+znokKzMuuFiARXgpJdQIh1Uaw1sQkP125DXvMLW?= =?us-ascii?Q?7//XkHZfD39TSSp12ENfS7ImjRk/VDf/IeUVAAJI6oyC+Uqc70qXlDpYp2gD?= =?us-ascii?Q?qz4nlsl8cR6JAmX80z2qkPAt3vhFYkfP8oN1i4Sef4t2/TlFyvEpwol3BWfY?= =?us-ascii?Q?5AqA83Q8VYYC/1vmyi0kQ3pqBzuUMAvqWFfkMHpaWtUOlrhHspFJLqQYAdXz?= =?us-ascii?Q?NWbzI4hffCj/irBTB0kgtXsixSAlQFIKO71s72p4ujh+uncG70MGAbceUnTm?= =?us-ascii?Q?Bzl9L1JpeVU8PeGwQ57hNw7QaudMNXVGCoKrh1qaWtAnxTrM+fx8jLV+QmpJ?= =?us-ascii?Q?29Zpkt//qmqcL0KT1Sl01NuvRc5pCrFNI03XEiFpMt6tYyJv2VXqOsAt8Jx/?= =?us-ascii?Q?Aio9QqgMtwTdQiD5BxXVxuRj3PCkZeh1JeJPogAgE+KTiL4zRDrIlQYsRA5T?= =?us-ascii?Q?ESNoflXyvQiRDv9wMA54+OZkZFByJr8H2oRcusjxKCW9P/Gi8uSGvixZFEd/?= =?us-ascii?Q?FmUh2Q2XOYCfaSY2prtqLh4V0cEurBhZb8aEvt3J63Gu5Brlc+LDw/eHpSuy?= =?us-ascii?Q?pDdkDQxjWIN4nX2JKFRyKtK3erqeranDhLtO5gz0iqefhT+tuihcUipkCXL4?= =?us-ascii?Q?R1XthFto6g/l5mvUBTB6REqjHefZdLZwkiNoqW7a5WN6RnIj6n+mvy/sVHYH?= =?us-ascii?Q?lym6TljN+yfdS+Ll5Esl/tAY6kozJHrUriclhxkZcUsVw34Cb5qXFRGFNeR3?= =?us-ascii?Q?bwRbxRQpX1KAX0ufh21Oy6n3Dph5UMWHM7aedC1qhjxeeRWWEdSb66muCykT?= =?us-ascii?Q?fFj8GOQ7Et8LFJsKd+6E0SstGp2I3oyfhUkDgFTXLqBeezWXKmvyeqfZZ1yK?= =?us-ascii?Q?yfpFchI4ub8idyfPKdlhxwIIsda/TZc=3D?= X-Exchange-RoutingPolicyChecked: kOcnUtr84dQEikNcQBKTsqMN5mngCV5uq0X8jX4G00I6Bys2TJGofni+0Z/CdQmrsJhvYh6PWHbGJQEIrRpcRXJNA0fW2eVh4zjYZi5xCCgyzKIw9ZBU+rwgFAqdQgPNa7e2rT15gO+eASfn2YXdTai9y2W5l77S/geL9tX+aYkIcHQ3a5iDVL1m0W3vzYvcFrd1eyMVCwmTSyvUNp1xuD4wELswIaNkP2FJ0n6UdXU7PNFSCkqoPLAoOnIJr8KCIZNh66bE4z1giaiA71Y3QUpOFWyUn0qQI4SlyO93Y8vUwsdbXgTIG8gtiAFQk2hVNjZk1wxxqi4nfu+gWMqOog== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: ILazpNNe8YLErdi9mvTp5jKrvMgNCgxIvvvSkkE7HZfsWVtcoqsg5GTNQx4yRCE0M6lkEeSvUnd8zFHDTfiiZ+QRTiSnUN4iJxPWfHPTpfC0NADKGOha1Uy8Xw071UtPnDJ17JmacyrV5GexFR3cg5y20hEpKNQimKUFIBe90adFyYQuG6yHsMlP86CkJeaoasIE5NhSjUYO256P+1QAJMUUoTN2jmttJYiMwka7BrZFPuJVVWecjdKyvmO7VbYf+12DJhPSHolBOUx2S0CxPmVya+68AELC+cvKPkjK17R/ophlWh+Yh3jeXOdcjvhtGpSlYHXMGOpvoxB0UsL1TDXZF1uBkir+dZ13sofV7M4oUA+oW6kxOz0qLkaLVWcqHinPGx9vN4KpX3FN1i9uz6dzfWG8yLu4Olm4cHuZH13M1iN4mtSp/IhEjxUl3i3bPgi2jw9akpFAiDGhc/xUJBwmA3b2tS79WxASgntUxzsk8q9U7ZADguYedBcZyaldb8q5Mw+ktY7Q/1u+Ya+feLuYnPWpbheBm7uIfcYIb5b4TjczmErQQr+sUn/ttlShZld0z75FrK1juYYhx4wYvQmhlB4eUKn+nMwrab46G2U= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5338a13e-16b5-449b-1766-08dea516e965 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:35.8515 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KnrMT5/6ucW7ct7qy6wuDlRbeDSzMwY5hFqNQ+bY9IDrNEYCDH8JmB0GRSh6kE9Pfo46hbC+7AUvOymFyICprw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6222 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxlogscore=999 bulkscore=0 suspectscore=0 lowpriorityscore=0 malwarescore=0 spamscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: Cf0GDO49aGmO4ur5RXu63k7kf6i6jQut X-Proofpoint-ORIG-GUID: Cf0GDO49aGmO4ur5RXu63k7kf6i6jQut X-Authority-Analysis: v=2.4 cv=BePoFLt2 c=1 sm=1 tr=0 ts=69f095ee b=1 cx=c_pps a=e1sVV491RgrpLwSTMOnk8w==:117 a=e1sVV491RgrpLwSTMOnk8w==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=RD47p0oAkeU5bO7t-o6f:22 a=yPCof4ZbAAAA:8 a=4znCJx2T0Qr4yWH2F_YA:9 cc=ntf awl=host:13844 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX3/TaWZcUcLZY gntQfbRv+UkqBZ8B3RCXevd2Dq641gOBwVRSAAKip6Fd6lBX4jeHvaBx4N2dSTmauu6eEaqmREc LpopMMpzHNUtHT0HHLki4duMAIx2t9iirskXi5wBhLXSbmhBYWc5iWjsa1JVGAhIrpLyYPMBl0e hVk2NtHfrpJiysPSdMgn702qL9UKt+ZwzJzgAdyeYRq2DQO87Fo+pXEBpoCW4xZqod5WNWkhZUj SN8Afy8sSAUj3SLi5WEJhOa/X/nuoNMIH1DRjMi0xVgu55kK64XAAAh0V3vI1AL2zOSJ/BVICPx 6w9cjZ/+Yxar1Z5via/M8WIwIOrTV/hQwr00xFzHBMfEGaON39gZXDbAffe+nrmrSea1oQEEbbT Eg3iS2gl4LqJ9pVr040tXBtJmUwy2PvdY5Wi5ur+2Fd8qgw3t9UACf3VBNorXZPqaeo1z4Gy7jx VCaklgQ7vqSUu/9D0Xg4V7TndsZiwmHmrwsxiPaU= Content-Type: text/plain; charset="utf-8" Add mpath_bdev_ioctl() as a multipath block device IOCTL handler. This handler calls into the mpath_device bdev fops handler. Like what is done for cdev IOCTL handler, use .ioctl_begin and .ioctl_finish methods to know when the until the SRCU read lock - this is for special NVMe controller IOCTL handling. The .compat_ioctl handler is given the standard handler. Signed-off-by: John Garry --- lib/multipath.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/multipath.c b/lib/multipath.c index c72f35e02e2ab..e2998c1b277c0 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -490,6 +490,38 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_head(mpath_head); } =20 +static int mpath_bdev_ioctl(struct block_device *bdev, blk_mode_t mode, + unsigned int cmd, unsigned long arg) +{ + struct gendisk *disk =3D bdev->bd_disk; + struct mpath_head *mpath_head =3D mpath_gendisk_to_head(disk); + struct mpath_device *mpath_device; + int srcu_idx, err; + void *unlocked_ioctl_data =3D NULL; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (!mpath_device) { + err =3D -EWOULDBLOCK; + goto out_unlock; + } + + if (mpath_head->mpdt->ioctl_begin) + mpath_head->mpdt->ioctl_begin(mpath_device, cmd, + &unlocked_ioctl_data); + if (unlocked_ioctl_data) + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + err =3D mpath_device->disk->fops->ioctl( + mpath_device->disk->part0, mode, cmd, arg); + if (unlocked_ioctl_data) { + mpath_head->mpdt->ioctl_finish(unlocked_ioctl_data); + return err; + } +out_unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return err; +} + static int mpath_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, unsigned int flags) { @@ -676,6 +708,8 @@ const struct block_device_operations mpath_ops =3D { .open =3D mpath_bdev_open, .release =3D mpath_bdev_release, .submit_bio =3D mpath_bdev_submit_bio, + .ioctl =3D mpath_bdev_ioctl, + .compat_ioctl =3D blkdev_compat_ptr_ioctl, .report_zones =3D mpath_bdev_report_zones, .pr_ops =3D &mpath_pr_ops, }; --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A1494407596; Tue, 28 Apr 2026 11:12:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374735; cv=fail; b=JYMOBB3izPT6+igx3drhPDhXqs3TKWlc2dJSvfo6EV9LYlt7zr4ubSR8eBxNLoWkZducbPlTCHumNNVAv7OY3uhPCwG18OT65hGuR2DxiUQzeQbOKNCXbiFvyfExzH4NT5vWjs089uyzCXKdMG01gqt4dGTqm36XHcFDk8SUOh4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374735; c=relaxed/simple; bh=to8jYQLa40ZL4drVyN88K4ZNlEPtoyVKFznFeuIgvOo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Xbh/idzyvdxmygSTvNOHM7x+u5QsGKq+RrZWBaFq6CpQvsfMwQiJmigTr/DlS0i4Gt5nbSTLoQiflpHcVDnznWqDnd2Vez+F4zpxj4L8+tOkHz1edrK17fbKHCLZkm3i6lc3JlFzXIvMYEGfXtS1JFIv9j1wP1YYWYylxmt5W+Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=EC5nAe+e; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=qJ3rrzTU; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="EC5nAe+e"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="qJ3rrzTU" Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63SB5Pl62128102; Tue, 28 Apr 2026 11:11:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=5oz3teRtOZo4OxH32EmV9Lb3dXZ4ZwodM1gg/85Ugfw=; b= EC5nAe+e2vRa8xTLuqFKyH7GbHBFr3foCWLWLHy4zVA/8pzUGll7YOtHBGHRard7 qiYmiHI4Qy71CmtsawJ2PkKGN2oNnqULlfJOMXD+Ez2/gPvi2o5ywuz2ReLbbRNH xVdyEzdPc9GHoCWd6lzSO6fUeY8/9s21ulktCQsOuJ7KJV2Jcdd64a2tO3/RAkLF 8HqrKYFCggFc7Rwo6vzTouXOmyVl+5NJxwK7OZzuN5EXZOi4z6YzNnU2+E7uUwAY ps/DkfElsFcA6KvcAYzIWIAUlvmkCYo0Ea3qb7pkRBrSDoJ5vuKRFFlM8ft2VBsE 7/5UUyTsH5LybxLRafcBFw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drmha7jdh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:42 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2j1b040736; Tue, 28 Apr 2026 11:11:41 GMT Received: from byapr05cu005.outbound.protection.outlook.com (mail-westusazon11010047.outbound.protection.outlook.com [52.101.85.47]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cudxy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:41 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rXya56z03xFYIdmf+aflSNlPY2r4RTIesbTQmOfRYoq96gEMN8I7mQjbhW+HghBKa84CuMyeG6F96Fp0HRtI3uRcdb0rUZlxfInm2QFLMhFPo6q2Oqvoduhm9Vb6xnWTa7mu5794cNfLyZGjQY5J3gAZXT9ip84rcmuWuUuR6TcLPG4wI7F132hYQw2dao9MNuWjGvVMctDO8+yhSztgN0VEjFtgv7oEZjmTNXRElnq8bXGLtg9Yy2jPsqx+Vxt7MEuzjPEQlnEP6+elu19JbHbNQiGtTAnHtkgSZhh0awenafFpQHzoODr79J854lDkV3rv54gT+C4dsvcl6v8Bng== 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=5oz3teRtOZo4OxH32EmV9Lb3dXZ4ZwodM1gg/85Ugfw=; b=tJcOLbKg4S3W55kCEyS8TAIaxHyFuvC8J6M1kzuSyKLtsJ2xpY4dFIrgLmTwAsqTkXrGbbn3+CXmv8S1ozYwpGW+sv4pzDMuA0Aw5OXp324qr1rPYXyoE8P2AMx4E61hoE+ViX5XPEVJNTmna0IwLz/dq9o/oU6QvS1ahpNGP5ubVZ1m86BesYvqJ2p9iz0hfq2+lK9QIpY4164VlzA/xfFMw6dY9z7eEBFDPFFvPYBGJFVFNuAu8yeiPjnF79Css5SObTzl0/gim3jCnKZ3hh6tMYv60VoOkGM0yYf6yri06lMoqSGUIxikwtwxiGGFyMppF9eEU3wVqn4oAK/33g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5oz3teRtOZo4OxH32EmV9Lb3dXZ4ZwodM1gg/85Ugfw=; b=qJ3rrzTUMZyGHEyNxF8b113koJJ6J8QorLfjRdK+Vax4ClWpGUwYe5z/DOM9chxH/CqGeJW8kWmlPyrmDgCS8OWt3fbkgbcirJMOo9hOdWZeMPRszzmWOHIS5xB9LCr+eohYyoPQtTDBBdt0uQ343zmXM6x1gcUIgIdwZ9PcIhw= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by DS0PR10MB6222.namprd10.prod.outlook.com (2603:10b6:8:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:37 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:37 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 12/13] libmultipath: Add mpath_bdev_getgeo() Date: Tue, 28 Apr 2026 11:11:04 +0000 Message-ID: <20260428111105.1778008-13-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH7PR17CA0058.namprd17.prod.outlook.com (2603:10b6:510:325::7) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|DS0PR10MB6222:EE_ X-MS-Office365-Filtering-Correlation-Id: 2149bdcc-2b0a-4603-5b95-08dea516ea47 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 9iod0rY2MwrmV/9+kDEGgbJlfX0HDUN4XM6IMwILp2dRrq/23E0I84gwfWZgdlt1DZwcZAnqSHwn6OUz/Bf6AV6G3ObQvapouTI8Dx5f4Hzef3I0ShWHoBCSC80Hoi3DJs32lXKwnnTPf2JnPvToC+Mty/jgrgSsGtuFmkciUBsKGkQDKavjTPV7Gj9ulV4keE0W19d068Zswz5s6fi1MHlbWaMvq4PyR0ezHwCoNkQGB0PJ6SqJ/0FS4hCA622rczc/K9QCrvU+2Q1I3hBUuXHmNZ3GUu9xad2KOhQbk8fYssx/EwZNft9THNThxYgEqGDhVC+Wa06T7/Coz6P7s02Koiyo/GZ+qn5Z/vYyAYKME8yaCRDW8ZigQvhXAMew4J2TPhPvlt5GNdSDUxT/NsGDFzx/V459j/QjkjDgDOXuAtetyZAuFmU7+GvXWbAy3OGGRqLaoL+vf7AKckp2ptbIJbimCJyBycNTx49LPrxcV/mg+EogsT9dOEv+GftavanfNQxSR/SWo1qxOKsfcEYMrd0OTFsAyltz3qz0+a3N2swC7uqyfJizo57ilYIzeVkiRsSDy2VBcoL4dTrRXzbA5alijQ2J6Z5S59lzRJIUYMa6DHNPxIqLqH38UUNf1Ie4RWfNhZO9DeWlW9hOkeix8EEqGpAgGvMykmr90INjmE8mK5CPOI9WowD5YYSjer9btxiSOyz4mTlFm4gVKTN+0bqNiPJwi9HN7bnaByk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?YF14pZRRgn6t/cTWNPgISWMLDu9MOUC00QfYODID+GqTylRniZR+AEFwJXR9?= =?us-ascii?Q?gGVieTogc2rfDd0O6d7n5ugLRfjt5sD+fy4yEnGku+dO2Vq1LaP1sR4/hVZB?= =?us-ascii?Q?x9JFfHP5PFpUdIAeLcoUk9RQxqVUUDJcW4FbX2CyjqMtQShDTNhvgSA/wLk0?= =?us-ascii?Q?VsSVi0+Ozi7dWq5WQXkZBesaQuxg4EtmUvClyuXC3XogRfSAZermcNJ54iIi?= =?us-ascii?Q?Fo+uUuYypY7DXpytNoVGfiVxxl4p/0vViiqj5FEMtRJBQlZVGJ/SU7x8r0S1?= =?us-ascii?Q?EG8tzJ1VQJwG8enXR1/6W3ZPLjIpUc9tTIZtPMjVtZQ7yZvsIMewC+DwBeXs?= =?us-ascii?Q?Wy9jqrHlh7XEuoduVq/5VsJVIXchvRCWYWUMH4PVFoh+qiRjaytneRAfMSN1?= =?us-ascii?Q?0cYsLwZpPN1L0DgQn1Fy4kZA9wJ0AeEpUOjayEZUMfdVBUltKnBODg6zm63N?= =?us-ascii?Q?0f5Bme89LVkqohL+X+8p9W0DQd3W/YaBpGpBSPKHdJwQTNlz3Mjj1fjH9e1Y?= =?us-ascii?Q?EO3xcy6gGVmabbiQco7P4yPpZ04vIUmjmR/TxzqeRJdpHRki6liAMrlJ4NAr?= =?us-ascii?Q?Ur1+tSsvWl6FPRdQb1Umf9Ok2ZvBvPoaUQnizuHkEz55cs3v1Y0eJyFTqy8d?= =?us-ascii?Q?aur11k/4J2pF0M11PK+1K/+aEv7LcSdEJDAR2P9DJtreCVTVLNvw8VMez/X4?= =?us-ascii?Q?7ciZrLXBVNv8tnft2c5D0TU98F+a24Ra4QqItJAZHGMKHX+F/wP/sxUhMNSA?= =?us-ascii?Q?qdAX0siwhtqazcKHsWshKx5s2fYfACGn9T01rsIYDBXQyE8jUbRxg7BlJ2/2?= =?us-ascii?Q?uaIUFvpzo5BMpxYcsSyUV2dmy5x3paj9WlP7oxqXVQ8OnKKpHtovrB9p+mt9?= =?us-ascii?Q?TPSnalKHmCq0a8w/NJOIyX1POIkpV0BJW449HuvBLrsTx99+NuH0+eMpLvVr?= =?us-ascii?Q?Tcx03Ff7CSFkO47lTQbw5dKTLsNqWStuiq/r2JecNcRIvt/rbrK4ju0mvIvn?= =?us-ascii?Q?1E0GEUMrzpT6/H628hddV8ZynDglhLG+7pHl5QrEdggGLo84BjdyzFVaa0cz?= =?us-ascii?Q?9ZFZGEinVecW1Xm8ZnVMNQXZodl1lX/JBSLO9BlzUG3A1UlgR9fSH60rO3yj?= =?us-ascii?Q?ixX4fETB0ue0ig23NQoAEZWWFc4158/2iLNbZeKMfbVzhDAKcWs/Mfk7VTI5?= =?us-ascii?Q?dlGg89bWaYdXtevMdgWd3XjvAhrgfABas3bBpRnRS81R7saXxNFt9c5GFAkU?= =?us-ascii?Q?yWmj4iaINdP+o5O9DhMxgQJerZs5l/QVG1f1kSkCl/TKwwlfi80wSNgtGqOF?= =?us-ascii?Q?thjQhtNq723jb8bhAnTJKfAQ0sIKh05cs6P4I8DZwf14HQCLQtJgBWOpALno?= =?us-ascii?Q?jPKgKvsURHQW9ug0zZZVNn73vtQoTA3l1F9OC6Dp7rgCzDcIfXoKDDOdoRRb?= =?us-ascii?Q?7IweYMwvhdpWV60K8kedjUhBtMloy2Y8isfXWRNn3zTBzwkwX5YBTj++pdkK?= =?us-ascii?Q?PG/cMYWmJp4xwEQl095rdeolyZj7Wavtxl8hYmGE125c6DQiy0k+1jsMXZPh?= =?us-ascii?Q?1hh64XQUFYf5xWvIpjEATgPF37AhAViiWDhHJY7VO5yX6uu9qTkXK4eqxdQl?= =?us-ascii?Q?s0dfYiGA8ZlHChKEoGHsckrxamB/hmFhiIOAPFN7S7QKcR68CEOs8H0JIWtJ?= =?us-ascii?Q?YULuaEbCkV14TorroP2mzpT72KI30SkWHIFIPLxjvMuyynGx4urhffqij6KE?= =?us-ascii?Q?Q9SzT9NS6ohlTClsFj4YTSu9L+pxEXU=3D?= X-Exchange-RoutingPolicyChecked: KSalwCHTHYWNoVzIevOqOa1uqSAAyPLihZWvy98jTsalCy6XzHna+SZBV3sCB0m4u9jzigPyWT/DSOHpFpxqlTR/kZc5ZZ1K1vXA7CYvQ5qKOGVNbF6uF6Vo1KYR5sA338U/qBaYPU3T03KGTAz9fZZ6OgI9TqIQc1KkLusrqPNkZW0RplWKAgN9qIcBLwKjoljQ5fo33hXhBwUAE1nWOZIgehr+DwwmZLQzsioj9xkFxXfyYgKKyj1pDMY67EG6+Da+xfL03HPDXNnbZcfu0VWTK11LuzQsTLQd7msTj3opNX4jar92MQ44ZJlgtX7w6iwpVmOrDbDUTZC2PCoCRQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: HH6A6Z4rJh/WP4EiBSCAgoI5vpIBKj4LKHcW8UYVZpf7mcayxIIv57jtNghHVrUb3p22CARTX+wlFtymtWpF9Y0JHzfGv6FvmV569i85Ez4uFZj8QTU9aeSIWA82n30H4Nx/VeJFtYwaLBdC8jOR4q97omTz6JI4vTqhPwq/+QW6Sdr442luzpboVcQd2ldDVbHzgCCJqxk/5eaRbrC/+W0uZE4oVwRs6PmoMD8t/Bp699nmdlRn2Nzhs3ev8lgn3GAArN/eehgahRzXu5exlkuokwQ3g2OV+tj8f5G2oUiQ8p21ihkP9WAzxFdY4+k+yDBCma1RzozIY/LUgHSfwXxJGHiRF/fpc3RAkYAO1fzllTFofrRhoc4fmykPQZjudAxT0hZGNhdXlfwMCakIroPBG9vOQwUs5i2MBoX4uUe+rxMtu26RWvvP1GGixHJytkHqSckT6Lrlrdr0XhxYrk8+vXFylF8OQEXlZZum8AvSa+pnAbh481wXI7LfN69xocZhSlmM/pAGmKKSqq1d23EFp1/UzQOaSnKOlJdCj24GKKkoKcD0mKm6UwVAi7Pztw4em8tv6Ai0vYUB0HlSHbSbyRxsF2gvJi/eEB4yiCk= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2149bdcc-2b0a-4603-5b95-08dea516ea47 X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:37.3939 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NAqCqeb7i/LaDk7lVCNqoqXGe/RTFdfAv/aUXdfIUlTeNbUbOgkUJpYJTw05dx1a+i6gFYx6NNrpsXGfREZCmw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6222 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxlogscore=999 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-GUID: VoSJ2XfSeAyfy6mR0LGk5lAWnyORLrYK X-Proofpoint-ORIG-GUID: VoSJ2XfSeAyfy6mR0LGk5lAWnyORLrYK X-Authority-Analysis: v=2.4 cv=CrOPtH4D c=1 sm=1 tr=0 ts=69f095ee b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=x0eKOSpe3m1H3M0S9YoZ:22 a=yPCof4ZbAAAA:8 a=j7YgXOqi6RBO2FshDZ8A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX3IbAHshcDuVl +CoXazb0nCKBTeh885O4sIbcrDNblZQH2+TIoU19MNvBWFaPCsojkLWCF+aMJgr6eDd60NwL1hu RfJsstISIk4xRgwttLPjF8pan+6r6aRapcKeM4jAOTOo1e0/lBQtW4n6U/rWPXfTU7jtAM+P/xO 00vhAOrNPP/jEKUM55YgfJ5wjKVqG8I/rvz7dom/xtGqbzzdm4EDeKy7c2veooHlqDSO5GNaUuw Ic8sEz8e92r0CH8YmgHlC3PueTi49dWwWySs41dC+NKTWRgTUi+XCKzJHf/6usth1oZwlepRlRW 2ODX4zssC5Ri8fFz2nUz4wamzgiWlMnE5LfnSpZNrzkt0c+AndG+GV7RG2NgQrr/QgtmridiZeO JAYeCPhGAuQnNGCw0uU9MVodeMNgIcdf+b0Kpgnlizp0vsxjZHpQodlQT7BTYGmM5cpy+yiO5jJ N9UiSi6cb5fQWASpzwg== Content-Type: text/plain; charset="utf-8" Add mpath_bdev_getgeo() as a multipath block device .getgeo handler. Here we just redirect into the selected mpath_device disk fops->getgeo handler. Signed-off-by: John Garry --- lib/multipath.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/multipath.c b/lib/multipath.c index e2998c1b277c0..1228837e5eeac 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -522,6 +522,26 @@ static int mpath_bdev_ioctl(struct block_device *bdev,= blk_mode_t mode, return err; } =20 +static int mpath_bdev_getgeo(struct gendisk *disk, struct hd_geometry *geo) +{ + struct mpath_head *mpath_head =3D mpath_gendisk_to_head(disk); + int srcu_idx, ret =3D -EWOULDBLOCK; + struct mpath_device *mpath_device; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + if (mpath_device->disk->fops->getgeo) + ret =3D mpath_device->disk->fops->getgeo( + mpath_device->disk, geo); + else + ret =3D -ENOTTY; /* See blkdev_getgeo */ + } + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + static int mpath_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, unsigned int flags) { @@ -711,6 +731,7 @@ const struct block_device_operations mpath_ops =3D { .ioctl =3D mpath_bdev_ioctl, .compat_ioctl =3D blkdev_compat_ptr_ioctl, .report_zones =3D mpath_bdev_report_zones, + .getgeo =3D mpath_bdev_getgeo, .pr_ops =3D &mpath_pr_ops, }; EXPORT_SYMBOL_GPL(mpath_ops); --=20 2.43.5 From nobody Thu Jun 11 06:59:51 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C94C03FA5ED; Tue, 28 Apr 2026 11:12:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374725; cv=fail; b=dE5dpv2Z8OXRRo35aMbgXfsb61XVx8EDJ4B25s9JyZHQEaA9AZd7Owx98gqZbjid+ZWR8scdfPvClzwqiuGAeensDtNGzPb41IIgMGAAfl0cJo9NAHlPziskiXcQguXzWzGRVGMpRTI0tRdnTQ8Wy9X/txbWF3znk4UjrOUYc/E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777374725; c=relaxed/simple; bh=9qV9osS6jHuk+JzdpzNB6KvWJ9cum6vYNnGSaV5tU6w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=j3AfuA6436snfpRgW5ljsUJqYOVUDY0+O78OegmYA+qDDgvStMmACW3APCYlBGwAiXrQWf2Madgn4TGvQottKqI0aLtTNZx2ABqJg4jvQ0K49pgingSLD4gVnmSIJvD314h0McJpJ5x1n5RR3JzaPshws+CUX04UI/HXuPpVEqA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=QQQRy/CJ; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=ghpPDMcS; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="QQQRy/CJ"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="ghpPDMcS" Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63S9luBb2721997; Tue, 28 Apr 2026 11:11:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=uXFj4gmCvsSHWzsGEb/WEbCEbwURGCJu+WkMecZHPd8=; b= QQQRy/CJXDPZIZl9R2wFg3Vp1WL7DHHJltQHsPZZXBuxqSdrGtVoK9LzmAITIbTK HykRF80WFK/ZNNncp3wzRxLUdREgc9MuQvRoaBDeZTCQnkUQacpzUmSK01MFmYpc iTAbck6V0WR9XCwoHwSfFS21+C7+vkBmMP9igpkq6p9dSAQ7IkE++dilYdQnK2kl mZmHW1y0KoEDVdPKuZ4U5F4H52WRTsRp0osEMn/284F8OszUQIXiY1BjauH64ev6 z2XJA1+FwBg0FV7DZX5BYFNtmvkEaHbJ7UJh2Hl0N6CWP09j3insesmXbcqIZF9V 16SHDTaEej2qMpAlZgIFYQ== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4drn7t78e1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:45 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.7/8.18.1.7) with ESMTP id 63SB2te6033460; Tue, 28 Apr 2026 11:11:44 GMT Received: from byapr05cu005.outbound.protection.outlook.com (mail-westusazon11010023.outbound.protection.outlook.com [52.101.85.23]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4drm2cu2fh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 28 Apr 2026 11:11:43 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ofiEhxk1kP8Op+ev6F1vV1gPgSlSmGuhl6Vxy0etXDSUF/L9VEYaWCk37T89CypyfQC5a2jRUd7/tvnlMK38E7jZZWhqyxqDuRlbDZj/66gRR8lqYc9rpJ7NxwmPtsBM3KbDi6SjxTLDRXVBgBuDdv1+qNcQ7MgULV0bt1FMhJNqA1Xw0rHptUrfJsgPuTtCbhsrNzh/bodDmusBMzsHhdKbo28V3k3gQWCwXG8+4c5CvCGjaMS7LfAggfn7REO1lfn8D6gHG0pT/aU4HOQYz2tkSp0CtvzfW+PvvxwhrCkSCRXfKscCA6iyZhD3kKPV+LUFPSLJ4tHSkOEy2T/vTg== 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=uXFj4gmCvsSHWzsGEb/WEbCEbwURGCJu+WkMecZHPd8=; b=dJGQglA/4rgEeY7RbBQ61ViiT2JO0K0E2bLPRzZvnyic7FloECX4dSAChgbn62ywQFtInO/ANyNQHAcZROJKNR+wlFoRgLslVT2hClcoKR2a8iSOoS2Ir2hdGaIeF4R4/tJxvB7wiDz9a2BET4lm+MBt4EP0wO5k4sx+CV2UabTXsLCLk8ZWozdjKeqa++t2ZnqgPmrIcqNrI3iWbl03qCg+qq9PKqs+oUtyu3Kfxy919LlZrWcD4sO3ONo5uPp+Ij/F/wFddsfR6KApMfotnzyARCmEZi8bGpPt260zJLUazh+ZYsXitKHaAc/sMc3vE5R8QNINhFqoGz+xqlx04A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uXFj4gmCvsSHWzsGEb/WEbCEbwURGCJu+WkMecZHPd8=; b=ghpPDMcSj8b39iLMN0QqJcVTXg1HEfbWfqSHuwlfZnWkSgvOOYfinttB3kU598B18sYFNUluR1P8F2cSXHIucEdzdeh93VgJ3vEGvoJ06EARYh19vIMaFsHiL6qsAVS/Gkf4+YzJ9Vld82wXon6wmpeyFt0q3vHf6xy/UXgntl0= Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) by DS0PR10MB6222.namprd10.prod.outlook.com (2603:10b6:8:c0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9846.26; Tue, 28 Apr 2026 11:11:39 +0000 Received: from PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16]) by PH3PPFEDB06D67A.namprd10.prod.outlook.com ([fe80::234c:e047:21c1:6d16%8]) with mapi id 15.20.9846.025; Tue, 28 Apr 2026 11:11:39 +0000 From: John Garry To: hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, axboe@fb.com, martin.petersen@oracle.com, james.bottomley@hansenpartnership.com, hare@suse.com, bmarzins@redhat.com, nilay@linux.ibm.com Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH v2 13/13] libmultipath: Add mpath_bdev_get_unique_id() Date: Tue, 28 Apr 2026 11:11:05 +0000 Message-ID: <20260428111105.1778008-14-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260428111105.1778008-1-john.g.garry@oracle.com> References: <20260428111105.1778008-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH5P222CA0011.NAMP222.PROD.OUTLOOK.COM (2603:10b6:510:34b::15) To PH3PPFEDB06D67A.namprd10.prod.outlook.com (2603:10b6:518:1::7d6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH3PPFEDB06D67A:EE_|DS0PR10MB6222:EE_ X-MS-Office365-Filtering-Correlation-Id: 09d38051-68d4-4137-7551-08dea516eb8c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: c0u/yRgg4ZjR0w3VZrLtSNDjLdERFBhwMsFRvl0H5eFm2DhrS+rGQg66TpCI/sDnUOnGdOePdDUxFxJOIGW9edouw037Z0sGcoziY9hx000gOEpudpgsLPmaTKjsmU7x+Ledg/xjs1LsA2YGZG1G/q9+NUDiSZ20tIMmR7JCF8HJ8Hj936RvhRo16bf6PVqGHsPTrESJaRtFUA1yhfTrFWMBAF1U1+lsImLaOFiuequIzRSC/QmRtYo+esYjXQOl11IUpepzVFhbnNH+NeZwRM5ZdGEDH+/iQIU5F9ln5uzVH+LkI1Y5LeUGYx72sDea2DqFSu180PAdEHK48XRdY4z8yb1BSg0NiVPPWWWI/IdARZc2uKD/sTcp1AALCRFxFprvsMWko7x50ZCWZk5I1j8D/RoJ0nVphIbk10YrFJ+Jt7lDMiQmClYUZ9nTnAZMl8XCw3YBQs0nhqafGZC4oDUXk3uBJqzITS6ohpzGUcucbEw6/zhQUYAmgQ9oVvQfIQ1pBHl0ti7YAcNj5qtyCHfm6VVbnKqLhDrnT0BY9IfZSx1bq0NJM6197eEn8Icklo7J+GaKzUWIh6+NqVMYXan0ZZL0mMIlHDnjCH3Yn5QWRcCfqG8juzkIaFlZQ3nnPvs7mGao1VP3b1pTXxIxNnhoOFTBPuA+J6hSLjNKN1cOd4Do3uEVVFF0qb4aRLo1PX9QEa+zuuPlvTR4G5GwkJCmAOPitKRGRmadRuPVhvE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH3PPFEDB06D67A.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(366016)(376014)(1800799024)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?lA2BP+sK2O4IdBmdJFt+6CKh+hUJqMvzRb9kLSD6Tq7K43LHwtEInuYfEERs?= =?us-ascii?Q?gbArgJNj8VEwr2rKA0gkSUseQgpovTbxfbodW1qUEwXRm/nlLySVjvk5Ycio?= =?us-ascii?Q?uOx1ZYvWjI2+6+lH3U1YSbzxUu1SW+gKjdsDZa6eZOutr5uoT9uy5wLOSBxz?= =?us-ascii?Q?N/fDd9tbzoVFbFum8ox5nbTgiAQHBcgsnfAQlJJ8iXCKFYWPXnfFzd5Lp5J/?= =?us-ascii?Q?8HWYdhGXa8uJgrJ4l8S4+oqM+MrYEja79gO26BZ5+OvjEa3b2LPNu/d69pkC?= =?us-ascii?Q?GJjZPzu9+zFKOwHthjprLOudgx0+hiW0P0118xgZD1T/wkNcwMQodBRwn0UU?= =?us-ascii?Q?XbSEKQL2RgMhO/FWQqipVvkp84wjP6Z5mPwKo3ogRTrATyXDk2dhaJlNS3hp?= =?us-ascii?Q?zH1V1aCuZOwHY1MtPHVFsOoTLwdgKWAYRgrVrdOlJE/CEsVhQNvDgdxa150P?= =?us-ascii?Q?pX0NYkpiNfiB9IYYK9mQyhFerQDKWaj2ingHbr6USxMx03JjhsvgRSYaDRPz?= =?us-ascii?Q?gj/Kwanv8JXAenP8AjjKbD+nM1mmZ2j1YyrBTFsqCRoU1y3x/vShm4svNI/w?= =?us-ascii?Q?6EjUTsJ7NDQXX4XIzKBOIUQivmLWTaONHdsUD2LPp9Bx3KQdgCznYipe/s8M?= =?us-ascii?Q?xrBoTFWznTQtZbvWziOdJObhrZBrU6UFL4NnvqldfVuzcbCBe5fFTlkklqmu?= =?us-ascii?Q?vCAVfAVpAI+/q4ZF03tvh3JMxIjzpE2RD9ofCNttFLmGKTDCK0yJnkA7XUW4?= =?us-ascii?Q?DR/rMRgWwOxLop3STVDn7EdtH6XYqJIw8PSaXhdlPobhZ4rbd6q/mdSONC9k?= =?us-ascii?Q?9IhFcLTOpiJfYzKrLvDS19KGKAz4td2JZtSaoi6ugbFh+aubzyWdFIbxqWnn?= =?us-ascii?Q?2yXhsJcMkuHc1P7nI9XS3/u4z9GL73CyLQgsdKChvzBq8jsi5/2A2c0g747+?= =?us-ascii?Q?dbGJ47Q+eAISyrVkQEAzcfHLwwecwLWS7wo1RadVx32ti9Y8ZkKzoAoqiGr6?= =?us-ascii?Q?FfMde0tATJ/IAkjczml2LoDPoaW80tj9Zm7vTb/M7aeLWZhB793xBMTUo3Uj?= =?us-ascii?Q?tyN+jx+UQj5ADY4ma8HZh4SmxMlTbkgdW6o9JycgkEIge47EIjKht7Kk7RpY?= =?us-ascii?Q?lGfJ40RJagLW/O3bxDlxCwl9xjLUiwKD2OUBWWwPcJPvYPTU+GxaACOY2yWt?= =?us-ascii?Q?pV03LLSr8iRV6+vjKtKPQdIayfQpxvVwRDeoP9Ksd0jA8x5rXMQYC6T3/39a?= =?us-ascii?Q?cfCMByOHXCu5tONfxrIlfa+H8kL63eC91e1gQNhMXbJ8L6LrPsFbzyqii3fD?= =?us-ascii?Q?q2R/rnPduf8EHLGqn3v9IU05Ps3p9xVnJCg/EVOAEigbQth6ub21zmiW9TJF?= =?us-ascii?Q?0XYGVjQhsOfRyUh1CwUaXGYjoJT8/91Nfg3DIIdm+XGLibPmUp15px8pkda1?= =?us-ascii?Q?cbd4wyHDouZyyTR/xwR2g/hwacPYezA+YWh4+muYdWP25pHtKuZsx447MIjh?= =?us-ascii?Q?0ANb2dj01md2iwRtnyddBaAinAooVg4DxBFOE2OOYjAALXUfVR86Qn+PvIfI?= =?us-ascii?Q?gm3DL7173MNnE+GhIbvlRqMRvxGaXVFnB8d0UZ1CfgXIZ0nAdv/PN2K5hhNi?= =?us-ascii?Q?2LjYH6QZiSCHjvxUdusLNOj/reVexWvQ3T8+umya/h6eCfIBZypdki8+US0E?= =?us-ascii?Q?IHkU9Vi8POetMF85Vzh3CoM/Vh4iBpK0LDiPGYQMBDI+KZFOgl+jYK0KUzYM?= =?us-ascii?Q?lK0AULfytauplEiRSFfsHOkUrqgvicE=3D?= X-Exchange-RoutingPolicyChecked: VMogZj/36sWAXqqDYC/jYi+wG86e7nxwxLzfMMSiN8URadkXKroAjFudr2EWjOD9PvJMkirvMQqeK7IuGdbpuLpnKaBFS8WQhN2Pv67WlCJSg8RwJLV5xVeL2o0f4dAXQZ6mq7wdQtZbEQ5NBCi+F9Qbya3hIZmeqv6K3SGVLZuo4jjda8v0htISV4ykzHHmo41H2i/s8WajQwl8lRu/BmHWf/JFm6CBXeGey8EpuA8FFKP57LbbcJrsLqDcx5mhW6UIOz5jNJ/ub+G5aeSXkCf+WxLlfgF2yf8Vcpp6SiRpgkWovHPV123NYPMnd+rDa9/me9WWZKfNwOWyb/uXrA== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: FYzdSDXTW/RGACBSdeuQtPID7pN1upLwZ3pQGkqi5eWJkX5oZOtw0CILCYvTzG0V+rjANMo6N+9HiD+KYYg3KLrt4OfWHgBLW6c7PqruV3+Z16VBMcAUsjPZmhaErPROhhY1MNIwyAwsMO20VHUB1yl1C4KGi+vlka7oKU/wBs5iAV29k5Hs7JeBUg66fdpH8Be4DOT7SeX9+MBw/Wz2X/MS20fKBkqqToJTKbYKTLMkYZfEe1CAQyIawGu3b7yu/r3ZXvs8cTblDyrC94Cbmh5d+91xiUKDno+p5T2UoT0lnL87LZZ6vWSfef/n6CSn+r3DMaCA/ykx/mjEoaZDkFNYcl1QcNEjuoGLzDOIGAQHRmG/pXuU0NhVoiJbURwh3WxovfIosEEkqY+Irskaw1TtVeQIqT3dFHdYcmFCz7f2cWXVsefukHhy2Jwu5fGrhIzD3MI0khXuJD8EOhajQESbaiSVXwHIbeFLbsqNx+WAXtYwd07wYAwNN5ttl9kPAlleAAWiM4eDXl9HT8Y09VzlGoVtzamcWF0+MTLXatL4t2BbCJSP2RoP7XCkP0me28JySbIS9gvxLyoqU/h/zSjghHexiOVmsoZh6bwi5tI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09d38051-68d4-4137-7551-08dea516eb8c X-MS-Exchange-CrossTenant-AuthSource: PH3PPFEDB06D67A.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2026 11:11:39.4927 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Xf3fWED0dZMdK1onYU9uF4M3+/fGw4FE4TdM+UvZMzKvAfi1weHiUdTMSwGpc73xFhcWkLANCjWQLge2uGAkrA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB6222 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-28_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 malwarescore=0 adultscore=0 spamscore=0 suspectscore=0 mlxlogscore=999 lowpriorityscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2604200000 definitions=main-2604280100 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDEwMSBTYWx0ZWRfX7xGhVQqSX7w5 wDq9zS/6Iu5J/ujyrxgxRJFeHkSwaD+RhJqjf5+ExJ8/QRonQ3luEWzzHGjB+/EiIKyaOhwCefw L9Zo16i3zs92RTszAn/DPwcbfxlBmbi4kXqQbhflXbzFp/YoyqQH69Scm+hAsblTBuGr/v6Ods3 uUimA2eBPQ105wCvewaBIDqSkj5T52F/2bilcbr6qI/na999YJPaBFu6borzP6qjq1CYdoCA5Pp mgFefPpYng3BssAohagt49Z31W0h2sl73Np0Am+cB39Dirgu9PBrx2iQkY7fvZYPoKsYjUO5PwM x1L6Tg5ahpISHmg/0uZ2AAoZS6MZoTumU0Ss4Ab2QOLBYDrQt1iNf3SW+QSF+TSA2KIhFpbh/7w E7961Ozi9xaz3d3b2sbtX0nxKirWi0ngHt77SGMaG5UgZFVqMAo5k4ei296AMC08+JZt99WpAS0 KS0nsSb9A3USiKoleOQ== X-Authority-Analysis: v=2.4 cv=QO5YgALL c=1 sm=1 tr=0 ts=69f095f1 cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=A5OVakUREuEA:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=jiCTI4zE5U7BLdzWsZGv:22 a=3I1J8UUJPc9JN9BFgKH3:22 a=yPCof4ZbAAAA:8 a=iZHHUXBEY3CVZWiF-fYA:9 X-Proofpoint-GUID: c6sP0qBRo_4llWqydpy5ISn7rKzvj7D- X-Proofpoint-ORIG-GUID: c6sP0qBRo_4llWqydpy5ISn7rKzvj7D- Content-Type: text/plain; charset="utf-8" Add mpath_bdev_get_unique_id() as a multipath block device .get_unique_id handler. Signed-off-by: John Garry --- lib/multipath.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lib/multipath.c b/lib/multipath.c index 1228837e5eeac..001a02e6df274 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -490,6 +490,26 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_head(mpath_head); } =20 +static int mpath_bdev_get_unique_id(struct gendisk *disk, u8 id[16], + enum blk_unique_id type) +{ + struct mpath_head *mpath_head =3D mpath_gendisk_to_head(disk); + int srcu_idx, ret =3D -EWOULDBLOCK; + struct mpath_device *mpath_device; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) { + if (mpath_device->disk->fops->get_unique_id) + ret =3D mpath_device->disk->fops->get_unique_id( + mpath_device->disk, id, type); + else + ret =3D 0; /* referencing __dm_get_unique_id() */ + } + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} static int mpath_bdev_ioctl(struct block_device *bdev, blk_mode_t mode, unsigned int cmd, unsigned long arg) { @@ -730,6 +750,7 @@ const struct block_device_operations mpath_ops =3D { .submit_bio =3D mpath_bdev_submit_bio, .ioctl =3D mpath_bdev_ioctl, .compat_ioctl =3D blkdev_compat_ptr_ioctl, + .get_unique_id =3D mpath_bdev_get_unique_id, .report_zones =3D mpath_bdev_report_zones, .getgeo =3D mpath_bdev_getgeo, .pr_ops =3D &mpath_pr_ops, --=20 2.43.5