From nobody Tue Apr 7 12:23:23 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 E8B433D7D9C; Wed, 25 Feb 2026 15:33:27 +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=1772033610; cv=fail; b=b7rPjKA9tAxpP+Ugnz1Ev4Smbteryxu2p9qJuhH9qwsvopLQPM4rmmWucCY4+rp+Dk+B4TUB+heAArjBNNO1KS/vCn+t9BKq9Guv5kRT4pOGLC6YuRCNThnfAnTT2Mr0jDAKfTQe3Ovd08u8D3IM+AhmqrwPZK6ZNswxlHQNApQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033610; c=relaxed/simple; bh=ogtp/WUxO7rFfC7hRGYuCKHf1gf+dj2nRFaksFJHF04=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=h/XFcgsG2rfbxl3C3Ug/02OptVp5GbF0yhdHvbwaDQ7lquLs1EHXZQW1qgSXsL6VcwJdJlSXnapZ80N6Hwk3a5nzk5m/BfZvZnuZWe9HZqOVf4tNR119pwD0bf0sIhEHAAFLhBI57MvF7iBIvjmXCSVnPlzj33tqkwCWXkCFTbc= 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=hoiBqEpo; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=UkrZKiwP; 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="hoiBqEpo"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="UkrZKiwP" 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 61P4BV5W1461731; Wed, 25 Feb 2026 15:33:01 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=nFJoHQdPCAG1Hc8ekTRp3tZSlnd/8ZtVD4icbc4N8Ro=; b= hoiBqEpowi/z47mZvZvfAI/zJdLPrZblQJC0T0wNBLozyuDY2f+YMllS6UoPzCZ9 kYuve2eQZyP/WkML4fN5HFqwFk1CLqvsAyxv7GFXKHljMvxVpdEtHGqAMrv0jhB4 8UdHiSR9KbnLFXS2QsPmCyPhiPy3L056wSt/Ghce7sLSc19DUyipO/ubdOhdHp6S 25PY2zL3UAKZZbmlV2GKca1xULsFwP/tP9kRKISF8VvaQ0VA3ZKEtGP3chVftjMa OrurC81gP33KJkoZgKa+1A+o5WBbYq6BmmuKR3iAY0USSQt2apKLh/4RfFmC8vVj 5mDBFNkzu6FjZeiwXy4kYQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3g3pg2n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:00 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEXUdk013310; Wed, 25 Feb 2026 15:33:00 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazon11010045.outbound.protection.outlook.com [40.93.198.45]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35ffugs-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MFY/PAvBOtpiXky5z6fq7owqDeGqi3OAubXXECSpB0hQIBgptmUfwyyrmyqvNJznMCVXXU+8FNaJk2gU5uN0i9YQ+UIUPRDsSulV+aiE6w2RFoDw+0R1GyoU0DMz4W+viqCTPahgAvXxIAaaCd9X6wH7MLZ0lakM5as2mqNxEy3DMCpbloJ/vECTkWPNDtwApUlxmDb+wimCPEmn1ORMx1O6TiR6F8XIMA5729HDB80pWYHnHAi9IFAahWFvPPhKt6I+cY9UUBF6eOnUH/O1KuPWygZ1oOgIvfSZBhL/+W2xWbB94opp/zvYE9BXsyXdjYInbRW6TF0Kh7bTN3wz4Q== 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=nFJoHQdPCAG1Hc8ekTRp3tZSlnd/8ZtVD4icbc4N8Ro=; b=VT8AnAjuUMRBL+3OweTLDuDLZEDgEt24+EbRPAamAy9WmHYbux1P9Rj5eHj+NWw4AlS7JFm8Li7ppsMiIq4KIyC1JmgPesbHCWy62rNEY0kDQ+s5zYuwdzMknKFyVGZs6PF38ctOK90t11hX04HuQgOIX8ZeU1NLGDeqS+Y1TsoowD1zncqwzog7VLJiZ9Fo5nXAMYIhPv9524qJDCmj2S2m0TjbFyeFsZPPD4+pY0E/1shvLpepUdzxhaRnm0G5ezhlxEGSrfyl8t7LJ8wJArKjoClV1llegBkKJz3JAouMErejbYIw7bU4KDKs7G5uurTjoyGmKCViTnlvhDmBOw== 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=nFJoHQdPCAG1Hc8ekTRp3tZSlnd/8ZtVD4icbc4N8Ro=; b=UkrZKiwPYNFCV6aU0dXUFMV/f3hkX/qfs0CFns/07BVX+TswedH9EMtbpZnDuIX3s0e+BaTXYgIinfUoEvWxaAFcMSsTvf15q5piqeR4Se6LhZorZU2bFjaE5745viwZ1ZmGjmx7OCeIpiP/uXWsb6oA1L5n3I2Wmt14tugweLQ= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:32:56 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:32:56 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 01/13] libmultipath: Add initial framework Date: Wed, 25 Feb 2026 15:32:13 +0000 Message-ID: <20260225153225.1031169-2-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0352.namprd03.prod.outlook.com (2603:10b6:610:11a::21) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: c0350773-d93e-4ca6-95bc-08de748324cb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024|7053199007; X-Microsoft-Antispam-Message-Info: rFKPGP4eUTKrZNTu9Hw172cyINXnP3EpVPFWy+EiUZEPXU5CUTI75NNQS5hnoJGSoKTsKGzBVuxUgUti/SpxVf1S8CxCMhyXhdHhOXMUCEQEnrbannrwjXtARprLW/KMKBk+zd0s67EJBZzllPEefGvawGr61HP8xTdULZd4VrMDJYf7TviXkFu2zLH38CT2/ftwZpAaHP1bGokt18qc8GRiyjuINGDBvuZgTsakh6jlo4wunWF6qXxMbNupzWh7PvZ8bYr9Ht6Qxr/n0SQbf1pWaHK02jdCygGftQvSiHrBKi48KFcClJzIbnJfoxMicze4sJPhWgOTyNto6ceRKzXT5Z6anF2Fb+0G+2j9IszD7AQCnfflaMGfsSUSmo7Zo8PIshKmnLiITnm/wRxYNG3sSoQifeyXunfqvgO4m8157ybUlHzY2nz6TgkCYLoOQYtMcI8mVbnxayO87Ki254dr6+CK9jBtgLu9YvivqTr3YNXFHB72jAgur5mEY6ZCY7sSwX81sO7VbbxT+LbuCWkXuTBFb8C2Kmy0tvXbQyeLCd4oZyKPd92fu+fltYyYjegPAG9O/MIxifoMRsHGYcWRo0zAP1pLaa4AEqJI7qO97HBeJjgbukPur9fBZ2FJXjwE5Tdwn7zIwLGwpscEOl09+yoEpKzuuza0vQZDSCAeS4mZTt6syu1SqyexLJL745B4QHkXFUL+Lp1K8zkaJL/w1ueEs62QjN4rEYRnOX8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(7053199007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?3YVCQg/Wp5Dd/wY1if4Cgi0c7DW+y9BY5hLoyVd1aRXgJ8leEi524nFiZBlI?= =?us-ascii?Q?W+yuFHFlJpq/fovluC3ahQBaGou7b0LAz0fSAOQm2nX2/uqyKq79ew/sc6oF?= =?us-ascii?Q?LyonmIFvJvW8H1WMf5FAn6Gc+k8dynt7BvVVdG/N37NwyV3dgovLnxYgmzsI?= =?us-ascii?Q?Ep0bhqVpHoc02CvFnyxzvpnt6UYNfz+4UvkY90HmtUD28i29t1Er2GlShDQR?= =?us-ascii?Q?sGqC/u1VaAbYA/1lG3xGr/vGjt2eJhx5Ltf+ljjpWVf8EwpUaGym4oXZQFfh?= =?us-ascii?Q?8Q4aODL4c/mzvLMD/tLEoeEJNs3XVxA9HFjp+eS2CDs9dehnT+S1ladr4B+p?= =?us-ascii?Q?kGjla6Ih7HIfR/RZkPVAqV/ZkjgEtvdZw8d6R3Ubk70Y+ANmwnz56L5oQWsm?= =?us-ascii?Q?UWdN4bT5L06rlYJIgIAh2QG7xjCQiDDqYP4UGVlVlY9vamwBbhRy/drCje9V?= =?us-ascii?Q?d7qdd3db1fNC7NXoORsHMt4UERYYMQSQWg5S4+0RbXeco8D8ck00YlLgkBw0?= =?us-ascii?Q?9aO/IN/a+memA+buPCzuAeXFaZjjWySDTzduyTDHMbSGggXalPn43Ohf8PKI?= =?us-ascii?Q?yBuLMiY5D+pySh/bK9BUikB/384P8ocWT2/mjN2v/6sSgbrsxzUVIqPhxQe+?= =?us-ascii?Q?tV/BqwO3yxq9yMsZDQJQf+SkSI/2NhAA0odp5shWpNL413jHkjA4Usqc2ipl?= =?us-ascii?Q?qHgcs0va67QyaOHkgVe0yvmvXp4wkU7mGjGh/0GDyKIlgT69MpFgnjbx6UfF?= =?us-ascii?Q?LtPXIoID3IRLqyKZOxupSE3j2Qi3jifjvf6cQXRt7GpiDLQnpvbEJjtoIhtr?= =?us-ascii?Q?+oSDS2pQcez997nFgtBzXXesdXEoJSzE8lovhfAzkTdUwm7pdIdMapqdphHK?= =?us-ascii?Q?nAqAPICa171TD9CnzB+SRCaCPx7zf8GuEixML99iy5o+qhKVawGCPhABDriW?= =?us-ascii?Q?nWDKNnAPDy/QEwCzBwLJp+vlhXgEvDtctJP97r+4Ask8k7RINpIPcfTqDrCq?= =?us-ascii?Q?fqaWqG/VnIxS/lB3QGtJHqfW7Bef9rG3AbiRBGccdSF8GVN+lY3ymWvXAP1I?= =?us-ascii?Q?6BXIrZl74JtkMNO+QrV6Q5RKS4HySQIqz5AFbsahmT60F4iRljTTyLlsez8F?= =?us-ascii?Q?fQOMfcRzct5/4DFm0NJfksQdRsaFbyD5F8fAq2szERHRD5s1MWLgW8gogEv1?= =?us-ascii?Q?3VFEiNepDgs06QdRwec+mSwAfOgNl+NeXddf7NaPKxG2UYQ51/hGisdEg/Tb?= =?us-ascii?Q?FoZMJDCfcCnK1pedaiHbbUpCVMbKnILg0yHE8i4cKeBVd62J6ER296xFJUTn?= =?us-ascii?Q?66pObN8GiAjDz8ixwKurcmxaah1a9r5MN7HxiYmbN8jDj6cqJ2SWu1A9edh3?= =?us-ascii?Q?lkYzzwROnXnW0f5UY3g7PmeOB+FwOid1v+9DOhpFxXqHDsCAhlMc1BxlMx7d?= =?us-ascii?Q?+ZHa8QlNLFXlVqccViUic1NWVAi98os6Wr5ptCSnLljitryZ/GUurAfGYr45?= =?us-ascii?Q?xzU57QHY/09o3RH9D11VebumcW7OuuocK7PcQ624n3etRycxdhocMkNRa5a7?= =?us-ascii?Q?myB8Mx07cbMYj+VUj7Zq1MX1qU6FfM9lXuloFRKH9ASWb/9ystmC09sQeEQD?= =?us-ascii?Q?43XlVVvGOFjqyrND6+Msg/a1oqi6pWETmk2pGmJr7EPhKazEOUDHcjsMh/zb?= =?us-ascii?Q?yHi8h+Z41urZDYSND91oRcwvTWLeg7fIEghEK2G25CmiuvpnVOI+gnfKvC1K?= =?us-ascii?Q?9RauvZlSBpJyNE62u/izvOBbEDzIges=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 3uxVgHsTPshgBkYtfGkcwz3wsP6JEXCttAOEISFNXnFGoykpjgoyV/i/ugXAlPR3f+ChAZi7P0zj38sJhg2AmzlZdfSCVkYhMNYDk6BDXuf04p1JOzZeajqWmjZuG1lcz4Xo6ZrvBVCMLUuQbuwzz82VDk+XVVnIwU99bqyaq9DFD1Zo57G/orLgApZl2cTQr1l9vMyHgExKTAoks4Wi2ExxQHaQvV2Gs23Xk/D2srPNatNXEPp/Tsoi5c4vh1fYMpM4XO/BKHw9SiwEcnY4P7i9kCEcgw2BaN649hjsOd8ZZIuotnW+aankxibc3nueNKEbPneyQ7aVV1kNJ+SRIoXzS9Vm4i+WkL1sqRon0rS2ke5BJYVailpQ41JGsJatYT0d6ikWkjNjI8p4CbuQOPamNgetxExl6/1g/4BMOik1CP6n0NMAmdSoWep7/hkZC4mtyQuODniwh9biJYDvrcADXDRTEvMsI7OZiAOnYAwG7HhJVG7461qcV8kP7Si2spzcWastqBCN3LAqtZl81S6uNMVcZOsu6OGhuUh+HsEmyCw/q9EvIgY9cETJvfAqsgvya/RFTXHY0VwsO9aBlHo6hbVcOAESrFDs+07nfqs= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c0350773-d93e-4ca6-95bc-08de748324cb X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:32:54.1751 (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: iTbYEilQ7eE85wrVr/uNoXSw1IxMyPAbIgEqcDOAJe3yjSeWUlOMNGJoRjb4LmstTj7617cmilIuC/0peOnRDw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=Y6r1cxeN c=1 sm=1 tr=0 ts=699f162c 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=XP0GnSSCGFUgwQirCqwA:9 cc=ntf awl=host:13810 X-Proofpoint-ORIG-GUID: 94XrwQ_uYmB1XXr7IMvzfCZM0Peqw6XU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX9ITm6zknlKGH h1CR34HmH2sVri2rw90XF6ZNuH35xaaogCvfXFqsB44BvDwpXikuMl1NSO8YtjE36KmRvGCL8rG OCfrz5pceH8/3Zie7yU7KKZ1IjCjAuQMUz8CBR2BGxzKZcUZzSsIki/zDn7/vQ/EnYjjike3902 qw08zUYjrTfQ7SkDHjeAxMr7myncc6rAuqPzM54kaziVecaj0z5k4x9fk+FXCEgY9HoU7ysGOOp M4DR1BzTBXdgE0xEdkkqAZvVp8Xl7Q3zGcsp8eFv5LoW2sUF4NXSZkfyyy8nG+pVvqQxXCpBVjb p1eY5JRM6+Zi87Fi0ev/rUZ8J/O7cJdaYQj2momE9RblO5Qd5CGxshqOzsETLLjhoxWn+FQEilR QxJ1qnPoJJOkMZJNmgaYAp10yKF39hAfgpLJ8WPrhHFC9YBUfiFzDKb1Vpqte+uhVPTnb6TJXhp mFB+gKpKTXCe5Yj20ZKwtjlXytGvrHq9PoTQT49c= X-Proofpoint-GUID: 94XrwQ_uYmB1XXr7IMvzfCZM0Peqw6XU 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. However a separate structure will introduced after to manage 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..18cd133b7ca21 --- /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; + + struct mpath_device __rcu *current_path[MAX_NUMNODES]; + void *drvdata; +}; + +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 2923924bea78c..465aed2477d90 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -649,3 +649,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 aaf677cf4527e..b81002bc64d2e 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -332,3 +332,5 @@ obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) +=3D devmem= _is_allowed.o obj-$(CONFIG_FIRMWARE_TABLE) +=3D fw_table.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..15c495675d729 --- /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(sizeof(*mpath_head), 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 Tue Apr 7 12:23:23 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 9C7873D7D6C; Wed, 25 Feb 2026 15:33:24 +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=1772033606; cv=fail; b=Cx8K5YYGG3qXY5tj4ziA4/hdpjEx55pXQTEDL+ufSqTXh8jKYRzSEcgX2DGO2M6CG8Fc0uZ04T1awVt+hZXI0+pxF5smiMJzdHVXKdQU/sELukbSajRwUi6wK12hjQUhCh87km/c6SpEQACVJtLMfRSyfMMNUqJozle9g/+tFIU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033606; c=relaxed/simple; bh=dKi3HhBiY+0bZDmrUi+W6Wj784TiUXYwkt/Bh/IJ9cQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=H6EEwQnUS3uSwh3hmAoaWGEnRZ02r89xbkau+paj6ZctPT7Tkr3vTl273TVYGM7iHT7EDD43SxpNdQM7gK3PrJu1NCbQ3QREp5NkUZ+CJmn5QUCvXkNADtgRqlrpYxm1EV5oJAfuKnX/9a3CzuxIfqgL5KlpkNht/Z/H97FlF3o= 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=nBJsQYzQ; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=jk9JOEgh; 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="nBJsQYzQ"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="jk9JOEgh" 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 61P9wZuT369440; Wed, 25 Feb 2026 15:33:02 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=F25BWcAudDvqXAh4GCC6p+5U7Pd3+YgjRtSaTBQoXhA=; b= nBJsQYzQNTtwUtsA/4PSayITycvR6zyO4CpWMHdHmkC/YdDkGOJWt2Bo9E1SPz72 2S1r7TCIdWXKuhLXuPMem0iCRnsZI1qc6m049fSJqQKYU60r8Zv4u2QmBdkuddRy lzXEVoDtBE1gaKpUJ9tZ+eMaEZ2oFiJ0u6ZdPzZddd+Q5duvqn2QDwO4HNyVIZGb pGFrA9RFbMF0fdqFmMW8kQEqY+3avBfbWA5hR3HhPAkUPgASJ7v5XZNijmYzhSA7 PwJP6FSVIpBBLtkhtu2YkUZ3xonnTI0I2vyhaZuJ9/dbpuP1t8HXjgvEYgj9Vweq HI7u06CEqQjldNKR9iX8+Q== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4k5xdab-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:02 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEXUdl013310; Wed, 25 Feb 2026 15:33:01 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazon11010045.outbound.protection.outlook.com [40.93.198.45]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35ffugs-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LIKPPRdGU5SEIRAnblEV7+AH5MPrh+C8sR7PadeAyQcdFbEEeQuRgvypJMN+5+OkNU0WoFml9ly5dWw0yws936Mi/UkkfjCvR5z5yR6nQG1i26WsYbPqiYrzxzxWW9t4+jF8zKUoBSoxuWvGCy9ZngTrQ/+1IHByCn7uf2B3ZywfGhhLpDyD4kBb059l7uzteJxHLdDNLI3Vdhv9cyzdDEHsNOhyuhNITm9t7TGsyyxaw9te6B8tNt2PM++91UymsXXZa0ogOXVACE8DPp2Fr3UCRRZt232AB+xRO0rpjhKDS70jE/qSLoE87rSfIeabSJaOiXVwMVdu8AexAM9fyw== 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=F25BWcAudDvqXAh4GCC6p+5U7Pd3+YgjRtSaTBQoXhA=; b=bqE2Vk2Q+SDxSORZeRImlj59P20hnsh8V8diJQLipnjQqgSAgnd5FuLhknCsUD2ZcKoo5EZga5oJuwP9E+cvGCCYIGqA80//sAEX6Y4y5aixj6ZP7/eaqsQdjBqGsTLqo+H8FjGJP/FVlF+MtkyythoiUJtPjVG0ET5mBgnSl3kq1rf8zc01VI0bByVwqvHsM0GmoIH7HMDCm/NUqb84ZkiRfqpir77819SLIEd01c54B6hIxgPulcttKZwGSlQWlr24CRnFirFFZxgU5/9s0CFnL6VHT0UAJwN7rlZBBHAjuZOeqzu0aUUnA8u9IDV1R+TY1qNByqDOjag8b26nKQ== 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=F25BWcAudDvqXAh4GCC6p+5U7Pd3+YgjRtSaTBQoXhA=; b=jk9JOEghEvqZGKjx4OiAOo0R+RuroYmA4MIenNrsbMQd9ktD8j+JCx5KfK9BARUxGZs4XBH98ce9F+AYOeLmW1lA1O2XGx1PjTrnTbe7iVrnPGEH/BTH39BED6OVT1Ryy0sih/RkrjjcXbTHEtUoTnloeYefmX9/EoErzICMyOY= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:32:56 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:32:56 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 02/13] libmultipath: Add basic gendisk support Date: Wed, 25 Feb 2026 15:32:14 +0000 Message-ID: <20260225153225.1031169-3-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH2PR14CA0014.namprd14.prod.outlook.com (2603:10b6:610:60::24) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: 06f09d48-a23e-4fd3-9781-08de748325a1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: 6ADF0J92pjTes74MtZUOAlpIiKDT8E1Nt4CetuL4ZVjUFeeeYyevjsPhmEL6S89YOkNtGZHSERkNh6xiA22xMTo6/4DbaHk2sbSELZbgN2UlxevCZlqQqA3FyK4FQc3iIXthi5EMPbb2Z2YpkdWKL/mf6jnIOAskcpu6sTxajM7dL+unMDxmDzKN5DuDBQuytT9EbJSAa3ZEMJlgHsPIiwkriWVFbNV9Haj5hMgpdn/FPX9pED9DEzGaBgn1vw7chxKdr7sF5QzppZl94fcsrMf7BTY5A18BAx97F0ALvJzOMekXygTGAdd8b5vdI8qH3F+jKPP1uPMwO1HzOanySbNFz1VFbTzU83aa8xsfGepvUO0ogjWAj14/qpN7hNfJyG4fBPtuOJaOizWNUnvV1B8ONB47lIxccaWkZJxqwHSZpqNQuFG92/AOdPdX8UZflSejFM351glnng6aKfgcRPGXH4I4gmYFdLwNtBW117Bwvos5iZQpUW9cuSAiureVDJpOmg/4a4Pb2qoS376XSh0oIfGnBkalCt0qpUTclmxeLsZ3fgGDQGkz2unfaJPQ+TA9D/v9Ajs6MudB/C1ETEbsEVnD7mDH1ljV6UglBKBhhhFbOTDM1oEpqJwPzxhH2Pi8d2MSiW7tmbyD7fP130En4FdF04NhRRvXyjY9m2LbW8eCS2Ud44nyYFgkJrwoLaHc2AD2M/BO3c8O7tSXXeJKTURNx8Qsg7CdxLE1hpI= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?3exuwk+HAIDnB/CpsxB56bb9dQKwlBo6kJMkkmfJIVp6WLV0LZoAcDKPRBqQ?= =?us-ascii?Q?r92vw0Qo8ucTsp2chir6drZNOKKS04JrZo0WALhRbjkThOsbRvf+PQXuV0rm?= =?us-ascii?Q?YYMySzJNu9y7eER814Mq4DPp63+AqdH3zi71BycdnEEjt70w26cRKkVl2e5F?= =?us-ascii?Q?SaXaclI6C5l4XKXRSfpsF8Wyin5vYepBA3k4TOm03wl+EJ0SfxzYZ/w0eAoB?= =?us-ascii?Q?ajpHPo5MWTRxELVxQYLDoyAWiupHeGmjBexyPuDF5ca4Vf8bDNDE9TvwqcKg?= =?us-ascii?Q?2dBwxXMtPpKWvf2rYRG86tT7EvMiK3s3pb2eSZoCM8OE0ViXWfcWK4bl0Lcf?= =?us-ascii?Q?bpVumbUEGrVwcca7U0ppZpSH07t6wfRras4OJjxGkoVLe7Df9Ql9TZLHHF2b?= =?us-ascii?Q?OXULBZqXtgtzLC9so24PSk8fbvFbN3YEcTTuvDsBq21h+FRr9Z+cXvOhHm0C?= =?us-ascii?Q?iRkD2A9D2HH4Ymg+wX9UxoV0W3nEZNzpi/2pMnzRzJcf3FREEfp2a3oGGYwQ?= =?us-ascii?Q?gaqEGWQso8T7fQaYAYBJ+S3uiFPsTdXEEoGHU/RzULlbjUkaS3Amdhj3guCb?= =?us-ascii?Q?wQA88CPlh8LuNcxMZYRwjX+N5Z1/5pd02RPsX8BhM9P5c+IX7V8Zn3ewcWow?= =?us-ascii?Q?/DcS4b01306gIhzwABL5rTYW1mMarnHSdL0Vjc5NQY11Wu4noTUIqQE7vK8o?= =?us-ascii?Q?wACub1GbBAVDdsDb6TSitUtacUHetY2ZzhduWvR5D2kt4/UJWzrscLhQkcMa?= =?us-ascii?Q?E/ieBEa2LGoQP9LOeuK6veYbyb+Lp8RVkjIkSuc6V2GxEUMFhah9yDIwm5QU?= =?us-ascii?Q?LDMy9ZMHnBlpbX2tqca0rCPlXGAy0U+gVBswtcfH6g/YbZIc1L6iPOhmKudt?= =?us-ascii?Q?THAz6ibLjSYxAwDR7Y6iM4195pL1wVvMm6cHrKTSVs+Bxl3zv9rq1zmpQTBG?= =?us-ascii?Q?3bu0aHaZOb0nOiklAbcQUQmOjk1EQy4sqPZMZfVwivUWxD5G32Jyq82LFzoy?= =?us-ascii?Q?TxCyiEQ4brr3P7GlHSI2EeGefz+GeUXwxHo36X0LIYTOhzJh4HIB3DqDGySB?= =?us-ascii?Q?hhlQHpboUk5x+K07CbGqdq591FtEkSzvy3mclUYfQjUroxfPrqFrcAoIH+pQ?= =?us-ascii?Q?6DePR8DHMZUCAEDau0+FktYOQc8XTADZ4nHabLEmUcThEvUFeVSKIDPnYhig?= =?us-ascii?Q?OhBhL/dJNrHi5jrOgtfDnaJk5elkSzYXdnBVB/Txs3lXR4jLkv1geV8U7fpy?= =?us-ascii?Q?5h8xgXif3bHIx61Fs26kgkNSQqFbmeiouVCZicp3EaZsP+6U5n9+gFEzZ36c?= =?us-ascii?Q?CoWFmE6owhVcr3m95Szg7C+t403dmZ3uXaka2igzE6petzeRzM9Meu6WsiEL?= =?us-ascii?Q?ITpSzSc8ELqom5n+noLxp7RkEwINfeNvcFvKQMajzCsRoiXlseqEPyuj7+AT?= =?us-ascii?Q?T+O/D1U8kJqDal1bESgUeeWD2fneGHB6gYjUHelSYcOK81gE+UDtEtppLjec?= =?us-ascii?Q?L87BNRZ/+dqJHytbd3bRiPeYZtGXV+1KAM+jSy+tvMaO75pVvE+0NuFn2NcV?= =?us-ascii?Q?fzidexHVeJRKVIqBWyJP4dd186P6MJq9BArMHA+/lU6O6huHEEqvguPxRvkg?= =?us-ascii?Q?cCXZsBPmGGTQIITwyy8WTBUKELDLfDOLHkBp6rgN8JcnnAIiLHx8PXVeTCWM?= =?us-ascii?Q?QkYmmH6J5Sie2cUVJuHRJ+BNVACqkosAo7rJKj0s18HIKeZnVUnNYarFdN7S?= =?us-ascii?Q?3ofbzF+9/gfPeeRTJVUgu8NUdmJZjJM=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 53qeF1cuD4HQpRYSsG87/94XZbn+KyOGlIwduyjsGlpDgNLYKZcLW8cA/uTUyKVj5rZP8KwyEPJp5yUnqfGCob4xumNEXcvRjuBt44noczEUYbBDnG/9IVazN4siFi7bqZpEZEXT4VsvwHO8nx/ABcEHEfowdACBfVfsfU0LGHf1yXijVvH+r7oDD8P1Dqtoy+G/qhCXw2+rG2AjyxjeOBxCW6sJvQoxHpR7yeHHeU8dNZsJOe/Op/VTgZjw7xC2LBib3bUGnpRMTBkt5ZLfNXy6puS9awAhjDINtmbcJlakhz1bGDZPLbx6UuDUTEgUKkDBYiNXh+oTF5nl9n9dHM9JC5tvMj8OI+A2CWhukFuc21u5LvM//qAcwmkMa8PWwAxvExEQkzokBvsmyQASgYbHZsnN2S4EEAYJMMycY0GSJqrDNdktUmtmqozHsr/rL1Gt02HfXo1JhB0nKnsCRetumgy40vHqB94ia9nCg4mOoPdFZySRwmvv3mJ7E/qD24b9C9Sz4ZbIxkZ5MpykedeliglvT6IOWWUt2/EM8gxrPprVySZUnHDZhhHuTYRL6tXHb6/0vO587f1aHGK/GDFnI22SGeVHr0dKA2Fzssg= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 06f09d48-a23e-4fd3-9781-08de748325a1 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:32:55.5373 (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: oLYEma9sBDhQG2SYkXuCGRUpJneSsr88znRXsmHWxu9H3cl9vLybSDLIdQHq+UA90uNtrK75+/C3uKMsFti5Lg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX/Lm9+Eg90LfI Esna3onkyPQpzCUnN/IgHqzpVM8B5P4qJni7qyj257IBjv7nrhg/2/1OGgcW3p1QNMT7aTE7Mit RNvBOha9wGmIGCRxfx38B0u2k4CDx5Zz2r258ds6rJ9xxL4pdEDVwermJES1Sl5e/PCG7UJvsem ksD87bgc6r0bFSXtao8CAprPDPHA0Q+k+QZvZoakuip7UDlAKUlQhpHEGWc3cRKNaX1+yL1RQg8 fSLIUKb5lHVuX8SwixN4p7p4HxuhRJv6M4782F8lvcw8/vrqqPst6hAEVQdJEu6s1Gbl9P8WUCx jCENmoJWlFuR05ODBqaG3rtwfVhlUh17BT5TH9uBk08oAKmh9dBg+IgYZBxIJS7sjOxhrNe26S5 1htpV3Q6cZjyB2CFGQmpax4DYlPSBe7SP5R3+2FYKi0K2iwTnM+FMjALUp1lggDd6+gInP1ka0d DuMWDXxR+T/z8QCGhfDna0EDSj5YGHnIe31WrHDM= X-Proofpoint-GUID: NHVC_G8F9OyHeHJ7MjLsGQxbxHte_go9 X-Authority-Analysis: v=2.4 cv=b9C/I9Gx c=1 sm=1 tr=0 ts=699f162e 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=B64n-4R_P9uPcH8_Qg4A:9 cc=ntf awl=host:13810 X-Proofpoint-ORIG-GUID: NHVC_G8F9OyHeHJ7MjLsGQxbxHte_go9 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 | 41 ++++++++++++ lib/multipath.c | 129 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 18cd133b7ca21..be9dd9fb83345 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -5,11 +5,28 @@ #include #include =20 +extern const struct block_device_operations mpath_ops; + +struct mpath_disk { + struct gendisk *disk; + struct kref ref; + struct work_struct partition_scan_work; + struct mutex lock; + struct mpath_head *mpath_head; + struct device *parent; +}; + struct mpath_device { struct list_head siblings; struct gendisk *disk; }; =20 +struct mpath_head_template { + const struct attribute_group **device_groups; +}; + +#define MPATH_HEAD_DISK_LIVE 0 + struct mpath_head { struct srcu_struct srcu; struct list_head dev_list; /* list of all mpath_devs */ @@ -17,12 +34,36 @@ struct mpath_head { =20 struct kref ref; =20 + unsigned long flags; struct mpath_device __rcu *current_path[MAX_NUMNODES]; + const struct mpath_head_template *mpdt; void *drvdata; }; =20 +static inline struct mpath_disk *mpath_bd_device_to_disk(struct device *de= v) +{ + return dev_get_drvdata(dev); +} + +static inline struct mpath_disk *mpath_gendisk_to_disk(struct gendisk *dis= k) +{ + return mpath_bd_device_to_disk(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); +void mpath_put_disk(struct mpath_disk *mpath_disk); +void mpath_remove_disk(struct mpath_disk *mpath_disk); +void mpath_unregister_disk(struct mpath_disk *mpath_disk); +struct mpath_disk *mpath_alloc_head_disk(struct queue_limits *lim, + int numa_node); +void mpath_device_set_live(struct mpath_disk *mpath_disk, + struct mpath_device *mpath_device); +void mpath_unregister_disk(struct mpath_disk *mpath_disk); =20 +static inline bool is_mpath_head(struct gendisk *disk) +{ + return disk->fops =3D=3D &mpath_ops; +} #endif // _LIBMULTIPATH_H diff --git a/lib/multipath.c b/lib/multipath.c index 15c495675d729..88efb0ae16acb 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -32,6 +32,135 @@ void mpath_put_head(struct mpath_head *mpath_head) } EXPORT_SYMBOL_GPL(mpath_put_head); =20 +static void mpath_free_disk(struct kref *ref) +{ + struct mpath_disk *mpath_disk =3D + container_of(ref, struct mpath_disk, ref); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + + put_disk(mpath_disk->disk); + mpath_put_head(mpath_head); + kfree(mpath_disk); +} + +void mpath_put_disk(struct mpath_disk *mpath_disk) +{ + kref_put(&mpath_disk->ref, mpath_free_disk); +} +EXPORT_SYMBOL_GPL(mpath_put_disk); + +static int mpath_get_disk(struct mpath_disk *mpath_disk) +{ + if (!kref_get_unless_zero(&mpath_disk->ref)) { + return -ENXIO; + } + return 0; +} + +static int mpath_bdev_open(struct gendisk *disk, blk_mode_t mode) +{ + struct mpath_disk *mpath_disk =3D disk->private_data; + + return mpath_get_disk(mpath_disk); +} + +static void mpath_bdev_release(struct gendisk *disk) +{ + struct mpath_disk *mpath_disk =3D disk->private_data; + + mpath_put_disk(mpath_disk); +} + +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_disk *mpath_disk =3D + container_of(work, struct mpath_disk, partition_scan_work); + + if (WARN_ON_ONCE(!test_and_clear_bit(GD_SUPPRESS_PART_SCAN, + &mpath_disk->disk->state))) + return; + + mutex_lock(&mpath_disk->disk->open_mutex); + bdev_disk_changed(mpath_disk->disk, false); + mutex_unlock(&mpath_disk->disk->open_mutex); +} + +void mpath_remove_disk(struct mpath_disk *mpath_disk) +{ + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + + if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { + struct gendisk *disk =3D mpath_disk->disk; + + del_gendisk(disk); + } +} +EXPORT_SYMBOL_GPL(mpath_remove_disk); + +void mpath_unregister_disk(struct mpath_disk *mpath_disk) +{ + mpath_remove_disk(mpath_disk); + mpath_put_disk(mpath_disk); +} +EXPORT_SYMBOL_GPL(mpath_unregister_disk); + +struct mpath_disk *mpath_alloc_head_disk(struct queue_limits *lim, int num= a_node) +{ + struct mpath_disk *mpath_disk; + + mpath_disk =3D kzalloc(sizeof(*mpath_disk), GFP_KERNEL); + if (!mpath_disk) + return NULL; + + INIT_WORK(&mpath_disk->partition_scan_work, + multipath_partition_scan_work); + mutex_init(&mpath_disk->lock); + kref_init(&mpath_disk->ref); + + mpath_disk->disk =3D blk_alloc_disk(lim, numa_node); + if (IS_ERR(mpath_disk->disk)) { + kfree(mpath_disk); + return NULL; + } + + mpath_disk->disk->private_data =3D mpath_disk; + mpath_disk->disk->fops =3D &mpath_ops; + + set_bit(GD_SUPPRESS_PART_SCAN, &mpath_disk->disk->state); + + return mpath_disk; +} +EXPORT_SYMBOL_GPL(mpath_alloc_head_disk); + +void mpath_device_set_live(struct mpath_disk *mpath_disk, + struct mpath_device *mpath_device) +{ + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + int ret; + + if (!mpath_disk) + return; + + if (!test_and_set_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { + dev_set_drvdata(disk_to_dev(mpath_disk->disk), mpath_disk); + ret =3D device_add_disk(mpath_disk->parent, mpath_disk->disk, + mpath_head->mpdt->device_groups); + if (ret) { + clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags); + return; + } + queue_work(mpath_wq, &mpath_disk->partition_scan_work); + } +} +EXPORT_SYMBOL_GPL(mpath_device_set_live); + struct mpath_head *mpath_alloc_head(void) { struct mpath_head *mpath_head; --=20 2.43.5 From nobody Tue Apr 7 12:23:23 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 7A1103D6674; Wed, 25 Feb 2026 15:33:22 +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=1772033604; cv=fail; b=LfjZa4vIkGcs7jq2ImwwHxWI+p/kiKFN0YW5J1RkU2wlzNRRtdpib/Kr0ecnucX7VA+P2FEP8TZ3ZeC397EptGw5FbS5Fdw+Cb5MDpFYFefjn+vqKvVD8Z/sAbx3BxKBK5vIZFEDRL0URNQ0iAgWENOyd60X1BFU749qBGQ1g/Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033604; c=relaxed/simple; bh=INJ3kdbK+s7+8lI1uAkr4p7poDpRdyNuxG3DfN7wxjo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=T4SNS+AWCY8dJ6Tk8Gd4q+x2fkj0lDjOB+qicmEq5jVfI3Pp3nCqGX+CQbk+HQa/Rs7jo6mSSSw5SdOV0HlllrM+4/pgoEkYREv9GfAf6JQjOF9D3MeqCGMRbIFLR5Jj/yQBua9liRJ82MZdRq7Zjzy0Rp+lUfXhesGPHL9RBT8= 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=ZX6YBnYp; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=mJQbyNYp; 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="ZX6YBnYp"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="mJQbyNYp" Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61PAcmcj1959698; Wed, 25 Feb 2026 15:33:02 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=ec4PlDAX8BzOpRhlddcLE3sP2gnftn8suce2dX9KwyQ=; b= ZX6YBnYpxZzY7OpkyA7RKQS8det0mBcNXINYVuzdwlP8q3WGAFr3y5D4vVzRInx+ MwyAsmlkVfbpExnsOJlnDx1Rq9oJxFo3wO/qEXw6DBmR63oRCrBXr3B4wm+PpLxL pRUeEbbBtfHS4IytLyjolaHB4XgGFPifKIAzS5dfW/51DOE44V4pOurUfJ6UjCuy yK6UYCfEvKVOSSkHeaTRYo+jmBYqE2uiKrWdiQLbqGNwR37a0d2L6BaYOJkNqbys labDoJfvx1Y/w2zeSk8qhWkNnW3LkBkwQNzExYGtwSej4dQjpiBa9wFVdCnarUJt l8Q4DsutP7fwfenZK550Lg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4rbeg98-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:02 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEXUdm013310; Wed, 25 Feb 2026 15:33:01 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazon11010045.outbound.protection.outlook.com [40.93.198.45]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35ffugs-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PShZ0POS2QAmIhAmwGbAdHrNK4dW5TEdSstiOwMNParZ8+zhwQ63Hk8IridmZZNJbC2pD2JDLc87Uhi9lN+uYqN+YOogrwkKY3uXactS/SeNZaFR2epxuQmZeNpzMGB7u+C/harC2rn7cMRuriNxbnZAClEP8526uLMD/HSY+HrGI5c+eSadq5Ha1R5gFpkcrttkT787+EC3YgvZwQHZWgcTKIyvJ4SL/WIj3Z/vFZuwPL1FiuMsnablTZxZD7ajKLz1+pAVCmvq8107TRCDHbpWJ4cgySBRitodHZdm487S3lVrK305EI/R3by36m2Fmz4hMOb/wpDqf6F9YaNCxg== 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=ec4PlDAX8BzOpRhlddcLE3sP2gnftn8suce2dX9KwyQ=; b=neKQpnAlAlNi6C6u+ybEKlzV6EFCLNgnjBk0RMS/r/bEoKBj8sHw7sIv+ckhYVFnIl4wL9kHWtk61Nn1WiDkeSEv5ObIT9yMzTIcp9KHtMjnpmNR7YlrV9LYHMopNfNNHxkbY+7QDeTU9dgp/AaM/hwcb9i9RUcyAMT5LVC4ZB47NrriNchUnmldMiipIX6VjyR1bzBhvdkairbsZbP+yp63yNFwnzu4bfSiXXa8LHc8oZLpg/zZoDqhzlRDYIokq9HUwVYowbJX8vrq9kYGxL5qVn2y7xmUujMxy448clj4y1iizmYhG1v7rQOyyYAPX2Nfgk+mvBlfwDMNDAXdRg== 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=ec4PlDAX8BzOpRhlddcLE3sP2gnftn8suce2dX9KwyQ=; b=mJQbyNYpUph8toYvrKSLcRlsRXUyNbqpnPP/C1EtCSlJ3quc8/EL3Lc/f1XJ1hbH0Q+S17B2Rnw19usFUBs251SGm0RoX59SgIdIsgevpgS8HbuQztYrpMg8Wvc4LETrmSi5Q/QEacT89HXYznxKvZAZkMpir2N9/iEh7uU81zw= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:32:57 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:32:57 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 03/13] libmultipath: Add path selection support Date: Wed, 25 Feb 2026 15:32:15 +0000 Message-ID: <20260225153225.1031169-4-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0P221CA0030.NAMP221.PROD.OUTLOOK.COM (2603:10b6:610:11d::18) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: a78dc4a8-5828-414a-eee2-08de7483269e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: 1/QA8m3amW+RQR/+TXVXEcPjCZ8q9QVk/pUattHUxF8TKk8MpEqK+LE+NNwdoxw1iiwfJENaipSPv+P6bpgQEnZkkpRQzbm1njtYghZjKhyUSL1lNy8ka7Zkzh4K/6D29X3l+S4L+D4C6KF45pAPMfiyY1dtCMZr6QmQhQl1G7R3QWBV0Qv1ziZtqv9na/rXvFMJn9R7af3/WmmNYl4J5GS0w8Z6Kg5niMrtTB7cCjjH0jYmMbZdgZBi1jwhgdCY2FNz3QdYDaxNC04pntPQllhAz150XT70ATmH1QKZeKEzDPD0AsKqDdkhMevpgUVeawbhBoMYF5xgWpC7zMaWJTUyBxc5N6S+kaH7WxCP35eoMvS1aX82y7z68Qa5MX3ouLttg9F86SXLDAmi1/7KQCkVTbzpQb3fkchoDP0D8/hJN2tGVlwFprbupdzKFyqSjDppTtPFKHQRq93jdoqAEouUgP2aO4m0WxxaMNOsitLjur2zFHOCqIWuFnUrmwGLiGqy4V+LqQAJYQGCkS/Mn/jntyK85Q/E7xLcDiydIbcK+Qs2PlTB+g3MQB1WA/seD9ZPyJCTkNfIVQKnoI5EfOuecCQV+3CIqy/jKVsUWLXEqugeoXoHical2Ab+CGbkkf62vqOl2ptQXmbMGdycR6cAq7zRaIhZgU9FsFgKw4yQWicA/rzU+VQ8FwdL4ByCPNk+MpR4Cu5y5jtWhrogUvaVsrNm3WqvT6QVuuR+NOs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?urAxkaet3tQihvNqm4GvQNZI7qfy22xIgeWFN9yUVGiQfJno9QWQ5R+g7DsA?= =?us-ascii?Q?TzvbbGnCh06Y1NvolAoLxrCCjFhScZ6F5woUgpM8tUkFjBLsPYo8HLU+TqA3?= =?us-ascii?Q?i18Sz6HvqTsQpea+Nri4Fg71vVp4oAdemRlsaMOyFZxErDQt09TTCrCET5E5?= =?us-ascii?Q?NNg/34KleLp/QllV+Djom9VPaNYLmNxrahWr5N8O6+qGMBMroZQGJUDWpsym?= =?us-ascii?Q?j2aL7or73h0i2MwK7pzlIBIo0Cb2YyoA1BQd7nNIfojxq7ncTdlCcM2bSe3F?= =?us-ascii?Q?frsT4MwSxyWtx+mJdKToQsP8Oa09+NhWktliXuaiZ4wORzpRGZZLXfC9Hhw5?= =?us-ascii?Q?9lXXYXtfelF5fipMHEOdegbnq3BUajkr/SAXqWVnb07ocLEZ4TW9KHbDhUje?= =?us-ascii?Q?pyAl6IHrGPof1jw0OmW9msirph3JusASvb0rwGqxVlI06vcmTgtsR5WQTbIt?= =?us-ascii?Q?XhgTNYXuJfbEb3oO5Ka3OeFaE/AMaJQB/o5idBvSucUcxr7QYjtCP4nAXRoF?= =?us-ascii?Q?VPEzGJngr8vJKMUiaEELHCEPN5EWFkNwBGu3ZBQW/RMwZ2ChEMIPdCPWD6cT?= =?us-ascii?Q?1hxNB88kXeEgig08YFn3nxdIl5ennlPFvCDo5sqSLIsxpmyro19vgwVEI6qT?= =?us-ascii?Q?0jCi0qXNYiUu7KrATwhaLqZykvrgKII5E6BJcYLMg4sJyoinSJWM/1paoe82?= =?us-ascii?Q?XMxbvICJ4PuGOQyscpPiVcjk5onGbawTCf1eWO/StnxrkhXgNXR46y8TjIGQ?= =?us-ascii?Q?gMUWUCr+unInsIojYNm9uMl1BnLrFz3Z+UhvA//nP1dHEX/czeu2sD4YpMm1?= =?us-ascii?Q?CGjNWbz5reaFLcvfodDspJQlPDzTgY/ZtYk9ALJDTms+5QDR4BhT4WDLsdS1?= =?us-ascii?Q?WuJkJfvY+2784CxGUGPn+auXY00tT9stWgSBX6wRO7hNNUDLpS+NXz1sBdsd?= =?us-ascii?Q?LTQBCHXwSwimlt/a1SmA/yZ3zoE14lvCwyYhE6/+7MGI7kC4ieXs0Bntacq7?= =?us-ascii?Q?Yk5Di274MuYobn3AZX+joIHHOT0A92mEOKdOXJER1hGgYI2Wqq21T9sTmVGW?= =?us-ascii?Q?6uVwzp/0mscqWDhsM3SKDeDqakAYjq5Gh0HtyAurRItUVqnAZ+RbqqgQTDnM?= =?us-ascii?Q?M7jbywO06bhiKwQF8EkMAaKQotvbgO0ogVZBc3MsC83d5jt/aTMxXrhVjzQ8?= =?us-ascii?Q?DLC7L81yOlanWjs+xffNje/KbhfzKjqk4x0ZZEldHZKk12TJQ0YllCutjXjC?= =?us-ascii?Q?Q8MXPqbC0zJwdf+JHC9grbPKhh+FUOLnIJOzEHq4sTIPoCpGn+y8CMnhNP7h?= =?us-ascii?Q?iuy+ThHIZ26h9kvs9nFw0XYAix9Rh+FIkpfqeVwm3vYSty9wxlZ9iWo3aFJs?= =?us-ascii?Q?O6w56eAXV7q/kAiuZfzD2PUOjNHfXtD2al+dE3wbsjzIZne3NEDKFVPP1E/6?= =?us-ascii?Q?lqEQTNrJlvyyAz1uQ4j2ac5hHrWL4/K3pwkxbPhMHVYq4xi3VNC0e5WRWlSR?= =?us-ascii?Q?TneRTrfQsfjBpfRK6WAda4aSNbIgMqvyZwboz5GpkU+E4LC8XZ+SDKTh/vtH?= =?us-ascii?Q?R2Yi7eeZz57FKgSHyDM9AbGoK8rigGtUjWPh0hvG7tukHrZFo+JzrpWTLURT?= =?us-ascii?Q?2kJ0gnljY7clhyUTxe0P4y7CJTZ2qfE/OIGGnUgfWCh51m5i6DQEoxGTUMSP?= =?us-ascii?Q?26H4/gpvvGFbxZbAXGOR7zwUUNbP1HbECe6l45J+WoLmKMFythO85hyvCM5W?= =?us-ascii?Q?jMc7zUBwXcMakfdcspgo4b3ljeJozxo=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: CRRwHvBsK5Iq+xg3qDPUJq9BivYqpe5kkX/509OkWNQ/kENzAwWpK61jsDkUAWNk+baJZOEPjFUpjsBiphIUba/En8bjCk6/8FLrzDijxKcSrSH5ScIMd/1q1mfCWO1uy0EK/TPjOQAqq5coLBKs4mqgnVwlIIEREvKscd9GXqrp1tTT0NORu4VqWnlvpPasA8nvccNVjPOmmEOAYNHcAp5cKihi6/VXIBk2EoLl0MjFlEX5y3l8i8EuwrLh5Hns7VN6S1VagGgjXnepAUSf4VR5G72dX8Fhq34ByRulySr0nLc5sV4Ypmh9lFGci+NKWNWwWoGc4OIC6WPW0FUyU12yjarQ7/risaz4a6KuEEJMXED2y48c7MGbBw61STgXXLsa8k6lb43zmNUIZxttFlhJOiHHUeeZDpogLpv9Jg0a9muEN3xvwqCuw43fBpsnXiOJUZoRNDh/0KSob1oZfgDMYOlnxsRqzfJuffJCuTiBiLzba8WPoVEO+Af7SSkLZOe7yib/k800lCUHHRWrTFTcX2ztNqTcC+U6QdA6aACnvzrxvZl4hcsI03af9AEquWNdslzzWDF//Q3VkflqDtGVhR1ZGPUYskIAsyh3Zok= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: a78dc4a8-5828-414a-eee2-08de7483269e X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:32:57.3199 (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: /nP85FuVviJ/FAurIUCIBld+nGyoVo3ESlSG/HX2yoI+gaovTYghy2Fxq5QGqUI1L8keKXZT70Tj4OTRFEW0JQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX+mIJa4p5mgT4 IXww9FaAh/mAC/AGMFdXWmit6ccxtJBhwfos9woGkTKbCDBzxW4fSr+NMPtNTcLyBuMgt3otTmL +a+vcVCuGHM9Yd9EwT6yuPTwYoy47Q4eW3IyRToz5r6iLnbhf0MMcUFS/Yxc8KHQBuwgXa14FR7 5as1x3/OCGuBcfkrDVooLJdfnqSFIA0Gb3EBvXov2Tg6NQqOrNx+j2ByOdsujvEUWAxa2YAVPik RpmnQOOhRdTV+GM7lD52Htc57SSaRx8hKzyok93efMsfPRajCmGSwZKI9Dq649A0lE0aEoxiWaT OiP9PluXzvUwckuKD6iO2bDQ08IaB0WoNgkIQ2F/CwwbaDLCcjV62kvSzserVOtmTOJnOH2HM97 7CG5comyZOd8HETJ2DY4PAXhJwQznCp0b2dj36nKC311Nd6yBiatMW/jhfyLstdgIIB4FcrpcUj 2kjwXp9j6fKuVILhIfLcJ41a42T6oAGDpU6M9fTc= X-Authority-Analysis: v=2.4 cv=S/fUAYsP c=1 sm=1 tr=0 ts=699f162e 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=Lb5UtHSxAhypNmDEWQsA:9 cc=ntf awl=host:13810 X-Proofpoint-ORIG-GUID: BmClKgwBr-_L9DsxvAYiD1BesDut1yNX X-Proofpoint-GUID: BmClKgwBr-_L9DsxvAYiD1BesDut1yNX 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 | 36 ++++++ lib/multipath.c | 251 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 287 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index be9dd9fb83345..c964a1aba9c42 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -7,6 +7,22 @@ =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_ACTIVE, + MPATH_STATE_INVALID =3D 0xFF +}; + struct mpath_disk { struct gendisk *disk; struct kref ref; @@ -18,10 +34,16 @@ struct mpath_disk { =20 struct mpath_device { struct list_head siblings; + atomic_t nr_active; struct gendisk *disk; + int numa_node; }; =20 struct mpath_head_template { + bool (*is_disabled)(struct mpath_device *); + bool (*is_optimized)(struct mpath_device *); + enum mpath_access_state (*get_access_state)(struct mpath_device *); + enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); const struct attribute_group **device_groups; }; =20 @@ -50,6 +72,14 @@ static inline struct mpath_disk *mpath_gendisk_to_disk(s= truct gendisk *disk) return mpath_bd_device_to_disk(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); @@ -66,4 +96,10 @@ static inline bool is_mpath_head(struct gendisk *disk) { return disk->fops =3D=3D &mpath_ops; } + +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 88efb0ae16acb..65a0d2d2bf524 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -6,8 +6,243 @@ #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, + enum mpath_iopolicy_e iopolicy, int node) +{ + int found_distance =3D INT_MAX, fallback_distance =3D INT_MAX, distance; + struct mpath_device *mpath_dev_found, *mpath_dev_fallback, + *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 && + (iopolicy =3D=3D MPATH_IOPOLICY_NUMA)) + distance =3D node_distance(node, mpath_device->numa_node); + else + distance =3D LOCAL_DISTANCE; + + switch(mpath_head->mpdt->get_access_state(mpath_device)) { + case MPATH_STATE_OPTIMIZED: + if (distance < found_distance) { + found_distance =3D distance; + mpath_dev_found =3D mpath_device; + } + break; + case MPATH_STATE_ACTIVE: + if (distance < fallback_distance) { + fallback_distance =3D distance; + mpath_dev_fallback =3D mpath_device; + } + break; + default: + break; + } + } + + if (!mpath_dev_found) + mpath_dev_found =3D mpath_dev_fallback; + + if (mpath_dev_found) + rcu_assign_pointer(mpath_head->current_path[node], + mpath_dev_found); + + return mpath_dev_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, + enum mpath_iopolicy_e iopolicy) +{ + 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, iopolicy, 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)) { + enum mpath_access_state access_state; + + if (mpath_path_is_disabled(mpath_head, mpath_device)) + continue; + access_state =3D mpath_head->mpdt->get_access_state(mpath_device); + if (access_state =3D=3D MPATH_STATE_OPTIMIZED) { + found =3D mpath_device; + goto out; + } + if (access_state =3D=3D MPATH_STATE_ACTIVE) + 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 mpath_head->mpdt->get_access_state(old); + if (!mpath_path_is_disabled(mpath_head, old) && + (access_state_old =3D=3D MPATH_STATE_OPTIMIZED || + (!found && access_state_old =3D=3D MPATH_STATE_ACTIVE))) + 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 *mpat= h_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; + + 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 atomic_read(&mpath_device->nr_active); + + switch (mpath_head->mpdt->get_access_state(mpath_device)) { + case MPATH_STATE_OPTIMIZED: + if (depth < min_depth_opt) { + min_depth_opt =3D depth; + best_opt =3D mpath_device; + } + break; + case MPATH_STATE_ACTIVE: + 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, + enum mpath_iopolicy_e iopolicy) +{ + 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, iopolicy, node); + if (unlikely(!mpath_path_is_optimized(mpath_head, mpath_device))) + return __mpath_find_path(mpath_head, iopolicy, 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, iopolicy); + default: + return mpath_numa_path(mpath_head, iopolicy); + } +} + static void mpath_free_head(struct kref *ref) { struct mpath_head *mpath_head =3D @@ -99,6 +334,7 @@ void mpath_remove_disk(struct mpath_disk *mpath_disk) if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { struct gendisk *disk =3D mpath_disk->disk; =20 + mpath_synchronize(mpath_head); del_gendisk(disk); } } @@ -158,6 +394,21 @@ void mpath_device_set_live(struct mpath_disk *mpath_di= sk, } queue_work(mpath_wq, &mpath_disk->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, + mpath_head->mpdt->get_iopolicy(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 Tue Apr 7 12:23:23 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 571483D649B; Wed, 25 Feb 2026 15:33:25 +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=1772033607; cv=fail; b=cw3YQTLViAWXZ50heFZJPtJpm2nGwhUKH/uLdjDCh5ERPQvbvFJzSPHqJvR8oCje4Ruvp3OuTyAFdEkNqZ0ijfQRvlxn+oROaBo6iBukIyjbkpVLYXHsjuT+s8ek6PoKkHivnvF7jVwJhWxPbRcR0YaPoLR5stTxhikUyGL6Y9g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033607; c=relaxed/simple; bh=8pc4Iu0qOyO1YqKD93l9ZsWqy5YktEvI37wQh13dVrM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=gcwidcMhQaDVOwSA5yYhVzjRXEaAzbkMpw+aZ6Gic7QdspEgNWIMQePL1bGaDFBVzosCz9A3pbuH+NEln27dLD2DvBKIxvKjBddFaV/3cFefewk3Kmz2zmoULVINEK8n02h3fzC5C9PcY3uHiJ4i2tHCXn6triOTO9zbU9cedYY= 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=STiJ0uqR; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=sEDdXaMN; 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="STiJ0uqR"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="sEDdXaMN" 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 61P9he5u3930646; Wed, 25 Feb 2026 15:33:03 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=8bgkxkOpAxXofwMgNEijDrPvW0VSFV5mkZ7D5lEm2HA=; b= STiJ0uqRy81teGs/tQScVwbkIVEEhCltuMC/ohJ22XwZ6vFxgEZg0aXaRDXI1mAq xefLjT9yg9O8KmlA9Bj/jlsCBHrtqAHuAXmfIu+7O8IIBqs2lH9713/INNB1YA1r NyL89X2JBao32E0cRf6rH8Wo+Bb1UhV3ctd42Vus9M+vXvORKZ3k9sa8sZeQrE/Z 1OcIdzPslZyTzZscSJnyRASPLxxS1mtVsl5Pgres1xzowe/wQ1X2ANCKIRIWCYcX LEatC7ThmW9iLuAW0y4snIbOpFGlx5OIvL+VFJll7ZQ2mbJwtk5U00F3UN1v4dop KjYB95lJG6skQGiNhoW4kw== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf58qedkr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:03 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEXUdn013310; Wed, 25 Feb 2026 15:33:02 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazon11010045.outbound.protection.outlook.com [40.93.198.45]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35ffugs-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZCX5LYPoKiTaK9PrkciJmz1X4OyiDvU+tcrMx+o2/pfHXzyPQ6lU1ZerhRtw63AiNT+3z1bxUdjJZcPwm1RhorY61NNafSuhlH/X1xWXNY4lnjxwakWGZjRrF2/2XH9gAX9mWG4cKm8fAegis/hj3AaoCDGJWi/QOs8/00ZR2YkkY0jRmqsOdpJtHMl2MNqEXxb0l33wi001Pnfywx/2RaAT/NYNlGM9xfLmD4FDsxeP3lyLzFf1fORGCfL0W2VL1oy0rGE2rLvZ0OG7CteOZ7aX2MalPZWy/9oHpjiSJcTSlbPZewfnKPqd1+l/u20Uh69+Qr5an5KuR9yKHuSfSQ== 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=8bgkxkOpAxXofwMgNEijDrPvW0VSFV5mkZ7D5lEm2HA=; b=zM6UYl/7f0BqLvuy+z7WLPBkx5/brqL3J8Ux6t4k/XkN/s8T+rem6W/dO+yaLkwo6lDLIEv8u62gc2WhA3qEmC8zRkqhoh4hdoYZLKx83PUSD+EPThCyorw/8iUyYoXtwDslPsahXlKn4o31hRODb1LFdXriaxDFzEOv9ePDYJszB0hNNUAC08bOgToAo8CAwuxnxfGmHVJi7OsZ50eudNYu/Ei9vys6VsjPrVvHTk7l6sjdlJf2UWwdeI2gPijTmmaW3ZIA3fk7+jU90N/VDhrWhTnwtvCepy39dXOl9LKGges1Yc6NS1KJ/HS6ieOuWuOkwtXV38sM0T2M4MiEIQ== 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=8bgkxkOpAxXofwMgNEijDrPvW0VSFV5mkZ7D5lEm2HA=; b=sEDdXaMNjtfHsKmeQU3XUPZ8XngGfeI8FmORcvS8L6x0JwH2Wu47u31IpNLpnCzKXEFJmVY2vjr2zjaVICmmO/03BcoC/qHde8BscKFMsfQ/qWIo9lE7YPYaDQMmE+QYgUoQvuWIYdKPzkrGDdNklhEv215Rp5R6Ot8Cu/YckJ8= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:32:58 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:32:58 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 04/13] libmultipath: Add bio handling Date: Wed, 25 Feb 2026 15:32:16 +0000 Message-ID: <20260225153225.1031169-5-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0012.namprd03.prod.outlook.com (2603:10b6:610:b0::17) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: e38c34d4-50ec-4d72-0579-08de7483277f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: kuqnaJBDkm+94QkuPnEKV4TmvLkc1BkENl2mR1VCKvaCdkZEU6MPskbHtbko5DhwF+xr9347i/Pgub4Zxo3lxj6fVufwST1s0kuauitYSUOgwsLhICDAxO/F77Gu+aCmwJntjvlIGJ0fcsoJBuWiBTY1beTkuSXU6ag79tJLNXgpDCN8XxBZQH1vk6Wih6e3UFRDO4dGNEJ2HFXmyGOPPlxGq2LMane5sIsf3Jq6TUra21JpEKlp2dAvspOkQEmCJlNu7V0kRrnTUrrfZdo77zPx4t/06Tqo8T/WVkLfTjly12YBs1QJpEURolWJZRZdlPzainpmAzjFnv3AozAAs3lff68xKHn0NE9SkujMyGnqpardB7H1JOT6WWwIA/efLfc68KwrRv5qQYul+yhNxy4yy/ti1nCDQhn5mAsPF9/aHRNaEZt6pkzr8EhtuCYHRXdKppAOSzq/SiZgg4gmDCKxDKWU3YWADd5+hbnyRPgDoauZGYRZs6XpG5bd/BnHh0wd4Xe4kKfhF9uBEvadil8+gFV2kKFjRrbKGAYZ2nVHGPLlgJD7YeB3Ga3nws5XY6IhV+1U9oKtknodlMxSgyIM9k45ghr+3e03cPk2ppyoXS5ZTyoUqGYRAeUVw6cJMaAMhKmp+snDakabvpK5KY3vEON/c44AeP4LqwDSD1SRt6aOtQ21Cwo8MWJK1WN62rFieToz3qv7T5jq5r1vRTPG2S4izzwHFjqFOPKyc1U= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?HWP7bOwsewQZoYhAVve6vrEhBFAXn4Ej8KgCtzmqPDWncgAeMN1UYTaX69zw?= =?us-ascii?Q?ySVdIRB6zAIE22g4c9K71LH3Mcw+aHVICwgqtW66Y46gpeHbqiUdXR9I9J3V?= =?us-ascii?Q?85oUrHWmuboTIjTNqZ3uxeKyjwT5el4a15elgWBsvdw6/wyK23+pj235ATG0?= =?us-ascii?Q?jDRqxmqd4ahSs9hsHp4JIYwvp7fmWYqHEvgdweGeWpmAbCKESUHYlOOEP5kt?= =?us-ascii?Q?WaDAdOedjqUYHXiM3jkIuW+MFT93xuDOwJtNBIO+3g/3dXaItFtFQQTxfhEA?= =?us-ascii?Q?1FRDxWgemg28S931RlMurFwVDU37sT8BYAJDEAJZd5JuN2DdJxywCa9QBI6w?= =?us-ascii?Q?5exxYstWZSDvShJh28BwH4szEA4gX94p2h4Zrl7wTmT7tevmvuf+ulUVthgo?= =?us-ascii?Q?hraWw1SUM5zuW5bXK5Xc+qBh4wj/4FLSY1zYOVXswvUHmChhSXswh/sBXLBO?= =?us-ascii?Q?MRqVEUpzN7aHMxSPERoJqzBsVwmZiyiBpowks4vopvzhX9q5vvWKYwKD48JN?= =?us-ascii?Q?25AEX0ItMww+2fMXjgnrnhpKv4k+HKuGuUJTUKcl7yuKufN/tYtjHBHcF4qW?= =?us-ascii?Q?19eIBEGhjbAsXRQ2vIxmdvSWoXGKEhJZa+vvl/oowkK7EYLZIYhOZlMBpWKZ?= =?us-ascii?Q?UlEp+AM9SeZa6BmMkXEDkx0P1O3cnrCaGTBgSCuKzIMH+9E9+Rr20gLrttew?= =?us-ascii?Q?uNMB015wwGhD3/wagZTYIPpMjEJ/tXhgqJbB2+1iPDkO85YfGJBFYekxySk7?= =?us-ascii?Q?jEcdF5UijvaAvB1c1tDVawtSC/k5reiePr18xSKuDwkQ5S9EIn5QWfaTNjqr?= =?us-ascii?Q?cpC8x1XpNTWf5ByKfCYXxhOMY9hxrumQjNaC61LQu9IozHZZZwcVPZdV5DPz?= =?us-ascii?Q?zmxb96FLbKCn2GbURSQBLzg4sGKIw9BGI3Dycy3/tTpUqEyDBN4hHTDGFlQt?= =?us-ascii?Q?TqGSk5/9//Hg84F122xerr2iGWqt0Xu8/0RjHeK8Q1RNcxfEYoxwTJqAHTPv?= =?us-ascii?Q?jwmcSZbZn5W2JobATXhLbNX1ecRkHtqZgRwINEXD4QNKRjEpZVkT1Veh9ihh?= =?us-ascii?Q?H9hjBCQTQAGpjyQXY+RCXLs8EV7pY39ELWsyDJOteMtDmd8xot4mY3n3NhFY?= =?us-ascii?Q?GRQrcNY53C9+MqEPE4zQx61WsN4ea8VoZEyZr4A3A20+tdXOxr8jBKKOPetZ?= =?us-ascii?Q?tEDVQJu83KnXNGBoSGlRw+XPTe31WOWowqRxklgMWBWP/bBfhfSW5IWS6Txh?= =?us-ascii?Q?HE+DR2crZSC/Ra+2Hfs4HrNGYWouvSgDHa7Z6tgIZ0r+6TjICCXJ1MfYqrdG?= =?us-ascii?Q?FJutEQFBToibIZuOip/WNDIcpix+2eWtbDDU4Em/Wtaa2kMp7pKXt1UgSGyn?= =?us-ascii?Q?Bxx2MyijFp1ezDw3FTwuDE5aX4u8sS6fZkhwKETPPH9UVkPWQ5MiH5fHTbeV?= =?us-ascii?Q?0xJNmNx7TvppC7YVtlkewzZO5CIt9M8cMJNNVj1GkLPgq4chvlf568ruPW9T?= =?us-ascii?Q?/VPzvYPzvcJ+LkAcjjfX9ETLccX2YVhnvdt0BNXP3aWuQZy3NozKxsbhMgqc?= =?us-ascii?Q?YSSQTZmbc3jFuGYTz71338lqiYwBoCVoeNw9o0/g1RkNFUoa2D7xoGORu5JZ?= =?us-ascii?Q?2nxyKezxqv5Pr0dk8WY2dUcL93sckBmrCOo9mbzOvgY5J92zCQOTCHeNhME/?= =?us-ascii?Q?UIhW6dSG773uJ9J79Wr9rLvDxFZdhzPtSbEeNkoQcHGQV3dL3LqbLPnvfAC/?= =?us-ascii?Q?zf5V7lU6VxVOecSa55u10Wt7M3TL8I0=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 1v7uqsY0IcZy1jv1ts8mKpt/Jb/KRKiJK7oCCp5auwdjEYt7QvXG9hm3Uvl2Nvfn0qMNEM+RYwWxoGqByLFgGI3AODRA3gsHVMqU0GDFVQa/DahzyXtNJ+zBx/VldcBmlfEzow1cchU+SKDgmDRwXj2j7Bg/rAd0V6sMuOAFAMPsnpn+BPmGQFg/rj+i0iYSU0RDP8jjmky3e96Q8ga9YeFDmYbM+hHebOwvR5dJq+21h8YbbVXVHv5lbjTBKUrfUbHq10Vyth4dhfUlgBNWgnwuxZnE4z8DS92rsiQ0xAeMHqWrtdueSZxT4tbaP/egw4vw33qJQZZ4rv7xPfxMrD2f3RMcfVIST+YjjvuXz1fAPcUVj7YMq9q+ayrGb158ZW6guLgFKV/r1DL38At1dbmS13kel3KqQusP1Q0MtvM9CdrTxp93kYhqVILHoKAHmh+VLk+rz0yKnW6LITQn6pZTn3NPRAB2Bjkmgn5ZoHXWsA1iDyOFPAwaQsGov0wQgAk/QtmXN7Tzl5yypS4M9y6+EvxTVM9we1cy+JJMApdRi7gNP5+i5e8PEUeo6mQcPd9bTahYxysfgqoksjDfye5RLoPzswX338F1XzvVzoE= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: e38c34d4-50ec-4d72-0579-08de7483277f X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:32:58.7212 (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: AL01aT0PYjFQ6nUDMQEpuHi4JPQ37FThGU6rUbwLP84xVvgsVUblLYV3e/iQaFjaItdlU4tq2/ouKHkQ8c1cEA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX3THsq/mEkqjW eMXkwfE5hdL40wJFbk8GQxq7OYxgSEgq31EjO1sd3yGUXzhBhAPP75uQOlnzE8jcUSUvX/+XGnB AtDVdrol85P1qubPAPW5Ctv3oECmHq+qM250QO1ixCpRL0uKW6Am9WQ8mZjaeSpuru4vOcO8Lty WCucSEUnxExKUlbLSZFDbfq1xKNTNNLpF9uA1pu0ryYw5jFCsfsl9nX8El9V5CqQR67phws8u5j 0pjS0XCDLNxQjl3/pb5NxbyflN14qamyJBE/h4d0EI0rh7PlOccVA5WDQDsSEMg6qiMu93ifPFs deu22hRFscVWi8/uzEulse16+Nov5KgBljvF4hSaHakuRFSJbv9ZbJNWZzimxCZkgZZkW6GAU7A KsA9yHumIp5ARoPzvO1qlXz1cE2ajYuf3QLiBhDChrcQNwVtO2cyRZGOcW070+f1cwW9+wW9O3h zO4z8QNBjKHrgGIY6wURUE6fLthwklOjP/Vr+NNg= X-Authority-Analysis: v=2.4 cv=XNc9iAhE c=1 sm=1 tr=0 ts=699f162f 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=yDs5R90Q5YeJ1ekuL_0A:9 cc=ntf awl=host:13810 X-Proofpoint-ORIG-GUID: NN0rysm0_gkMpQxnMDRmGXX-V5DP7S6A X-Proofpoint-GUID: NN0rysm0_gkMpQxnMDRmGXX-V5DP7S6A 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 | 15 +++++++ lib/multipath.c | 92 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index c964a1aba9c42..d557fb9bab4c9 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; @@ -40,10 +41,12 @@ struct mpath_device { }; =20 struct mpath_head_template { + bool (*available_path)(struct mpath_device *, bool *); bool (*is_disabled)(struct mpath_device *); bool (*is_optimized)(struct mpath_device *); enum mpath_access_state (*get_access_state)(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 @@ -56,12 +59,23 @@ 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 */ + unsigned long flags; struct mpath_device __rcu *current_path[MAX_NUMNODES]; const struct mpath_head_template *mpdt; void *drvdata; }; =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_disk *mpath_bd_device_to_disk(struct device *de= v) { return dev_get_drvdata(dev); @@ -82,6 +96,7 @@ 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); +void mpath_requeue_work(struct work_struct *work); struct mpath_head *mpath_alloc_head(void); void mpath_put_disk(struct mpath_disk *mpath_disk); void mpath_remove_disk(struct mpath_disk *mpath_disk); diff --git a/lib/multipath.c b/lib/multipath.c index 65a0d2d2bf524..b494b35e8dccc 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 @@ -227,7 +228,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 @@ -243,6 +243,66 @@ 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)) { + bool available =3D false; + + if (!mpath_head->mpdt->available_path(mpath_device, + &available)) + continue; + if (available) + return true; + } + + return false; +} + +static void mpath_bdev_submit_bio(struct bio *bio) +{ + struct mpath_disk *mpath_disk =3D bio->bi_bdev->bd_disk->private_data; + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + struct device *dev =3D mpath_disk->parent; + struct mpath_device *mpath_device; + int srcu_idx; + + 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)) { + bio->bi_opf |=3D REQ_MPATH; + if (mpath_head->mpdt->clone_bio) + bio =3D mpath_head->mpdt->clone_bio(bio); + trace_block_bio_remap(bio, disk_devt(mpath_device->disk), + bio->bi_iter.bi_sector); + bio_set_dev(bio, mpath_device->disk->part0); + + 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); + } + + srcu_read_unlock(&mpath_head->srcu, srcu_idx); +} + static void mpath_free_head(struct kref *ref) { struct mpath_head *mpath_head =3D @@ -310,6 +370,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 @@ -327,6 +388,24 @@ static void multipath_partition_scan_work(struct work_= struct *work) mutex_unlock(&mpath_disk->disk->open_mutex); } =20 +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); + } +} +EXPORT_SYMBOL_GPL(mpath_requeue_work); + void mpath_remove_disk(struct mpath_disk *mpath_disk) { struct mpath_head *mpath_head =3D mpath_disk->mpath_head; @@ -334,6 +413,12 @@ void mpath_remove_disk(struct mpath_disk *mpath_disk) if (test_and_clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags)) { struct gendisk *disk =3D mpath_disk->disk; =20 + /* + * requeue I/O after MPATH_HEAD_DISK_LIVE has been cleared + * to allow multipath to fail all I/O. + */ + kblockd_schedule_work(&mpath_head->requeue_work); + mpath_synchronize(mpath_head); del_gendisk(disk); } @@ -409,6 +494,7 @@ void mpath_device_set_live(struct mpath_disk *mpath_dis= k, mutex_unlock(&mpath_head->lock); =20 mpath_synchronize(mpath_head); + kblockd_schedule_work(&mpath_head->requeue_work); } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 @@ -424,6 +510,10 @@ struct mpath_head *mpath_alloc_head(void) mutex_init(&mpath_head->lock); kref_init(&mpath_head->ref); =20 + INIT_WORK(&mpath_head->requeue_work, mpath_requeue_work); + spin_lock_init(&mpath_head->requeue_lock); + bio_list_init(&mpath_head->requeue_list); + ret =3D init_srcu_struct(&mpath_head->srcu); if (ret) { kfree(mpath_head); --=20 2.43.5 From nobody Tue Apr 7 12:23:23 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 ADD043D6697; Wed, 25 Feb 2026 15:33:25 +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=1772033608; cv=fail; b=bKJ2dNmEzaj8Qsv88Opd1bPs4PSYdUVSaxCe7ptTQNHW0u5v1y2UlwVtyZ/oxFZXadjfk6vkABSjAeGR+Wj5C0cBFVbyRV6OWZcASoThI7lPwGcfIUhOfxAHfLbutVtaDuaQenhOr7dkdExeo8H+OW7ZVIO+YvqwNsnij5+zqK0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033608; c=relaxed/simple; bh=lNTNuUDL/tevqqEhoVpE5VS+pmQkzk22076QE52F3wo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fobxDg3f8qQG3Wg0vP6S1n+iVka5N4MEhb+YTuIsQ/rrZcWy8Y+OMn2Vr04azh11zkbc9/Y+vU0+dMRG0XHZdYiUfnogm6VTZ7Aqi5dZq3sSXUTdx2uVznpsksQ9Xgs6xHteHV6FzAcMNssk7vwtlwOBUewlRB4vCHotzUbf3iQ= 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=dzH41l/x; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=mMOBL+/p; 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="dzH41l/x"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="mMOBL+/p" 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 61P9oPug4019329; Wed, 25 Feb 2026 15:33:05 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=/waYs5J+K6nGAKm0Wn+VmXs/c0fm4MONGmFcHfqY2GY=; b= dzH41l/xCiFLiTlfK0gi+0IHX5Eh8WjrdnVr2lrg8FCPzv23ma34L0SrO2nXMe9U /I4gkaXEzEAfT+3nMeLnTbQR5vTwLRHcokNJt3Qa3Aa8/SsWM0r384OQxoFQrq/0 6v3/+e5q+DQhFyjfYHzO6S2bQMcU3V3RXRzFVxthEpPDZutKp472jGa44/0+PG93 xzLLY0xCffzvJ8Yq5Bpqffyx4asg9oHKaHu4FMFrbo73m5NlWLTJyFdB9O5S7PP1 ntiEiQskshlKxzzck8wFHp1KKcV6ph6Ih24jjWdhXT6uGuMzpW3mrAkjCZ7EskZh tW95q+CC9eCPkH35PtbJVQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3a06gw9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:04 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEE0ZK006327; Wed, 25 Feb 2026 15:33:04 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazon11010063.outbound.protection.outlook.com [40.93.198.63]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35bg4wn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ny9BOmaKtCjnJupTc1rm2EyVK+GIfO2XZxQLleHWiLYfmFugZvwdIPmKEUcX1dMmHITkyxqLEhSWt7yPuNjNfBd+WGpT33ClfTiifxylnfp5kzyjfhGiPtWepL/Q/fSm6ZsGcDQ5Hp40RK1eMb6Ugv2xkMzZxQvKJDha14YxCBsyxVdvvjwfsTQ3Q0l2JXiI2O45j//FIWlDYAVam9UF5XWrRCrO5kdz/xbSu2CRzH1RaS8xpEc7Gk+b1MtsQ3GQTOMospJK9q4mnUB4WxFLxr8nfpoFy1+cMLNvZ0Er3tUKun1sLRVvz0QDxv/AA9djXDDGhxRFq+Wp7Pl+tuN1tg== 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=/waYs5J+K6nGAKm0Wn+VmXs/c0fm4MONGmFcHfqY2GY=; b=peUG3U6cM2/5V7FYwEydOYgYoc6QgoNUHS1XkT/KhxWIdDNIH2mN7vlSzkiJtaDfQwgHgCyOdNtNisSk06QWKcwF5CTRzaGHbOadzWmeis+HVvXsSIJ9kpwYMw9noKuc04ZFVCkBrxrFmaUrd8eYPqoKNT1zj2yvvRihVAAvFh8yGrzP/i3V/67H8MKX4uA2l/kTubU2pWy32KsD7eJqtblLjtYyIJymraQ4+NuZnlref2vMHShB8TGr++35aIBEuuEOmPOdOq6rKH4VOI2fo5Qfdr7uznOmB4S4quWzchFJRSpLjaIW/H1AA4+dVkUwqKb+fkfakqNsw+FHaco1Eg== 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=/waYs5J+K6nGAKm0Wn+VmXs/c0fm4MONGmFcHfqY2GY=; b=mMOBL+/pzvsV7C0a2tN6MKFrArAGphGY9VsZYgfFQCvhSj5MJ7BIUdD/RN3leyNc51z7C+eWrYEoIFWun5R6aINz4BH70ayndq3megmzt49SNJ1cDb4uiublMEEk5lmkySRX9idDgKhIUWDIXktnSNRyiC+UJf+kOxTbHWOW5YI= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:00 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:00 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 05/13] libmultipath: Add support for mpath_device management Date: Wed, 25 Feb 2026 15:32:17 +0000 Message-ID: <20260225153225.1031169-6-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0015.namprd03.prod.outlook.com (2603:10b6:610:b0::20) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: c1f885f7-fe23-459d-9669-08de74832864 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: k8ykYFSl8opUQAg7QJLACWovQKAcbnXzkmwbDNXACpvxHupKpz0cK4JOzPitSUMFPuv9ij8eErm5My4Sui92Qt7J8/H/XJqE/K4tGh5ebjGiY6gTxKvL6XVlVF39B8J0lcfBrbJgAAErbwjVdjvuzzbQbRM1PC6hJT2EBvODpMbh7WwKZjzlAfe0Ak2aWSHCS97IAKU73sPqPw/A0wRQ+daYuAfo/BujqvnwaFsZq069YM5vd++Qh9uYwwVGJXw1qTrBLIpmCpa/JLMH2roS6b5sUVRuN3H/YDaPjY7yGlz8DW93Po9bwgTtz8eK/VUYHrGvUtzf/A7FkZV4OldMgXkyiKRxDI7DSVMp9f5j5/vVo1KhcL1+CxzNwf2tyZ3Mrek+AB4uzW5BEmF91h9D6qJ4LE4Uwr//CsgSOcSbIwcn/hVkJkgm0V0EnonrzspXM3O70fc60UYSWfiwAn9FuiWXDqAS6qKB+8T0XvID/UOffIUaJDIiY2RwU8PiqZYEe4FsC7P/1/+ZSZGqQw2obSYwGy0qJxeMJhkSJNuOGQPz8RzOt51PBEs1vVfXvvn4Guwjlox4B4lwcMhzi3R9CZdk5ftDirn7xcDNSH+SYiajqDpZsgDbQw/c9vrlm0hh5duN+h7Gb008iL0Gd9gh766bIBT2J5gue/5mOPkyD/kKdlKjocWZ0k8uorh4js3UDNgBIkODxm/zhha7MdAx2xv8f9v8Q0wPkiZBW3VacCo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?rRDg3qHCTfi1aUG7d9wQf2C6Rx4min5LJkyrmMYNB0s5gXGE3eqhZYiARhZ5?= =?us-ascii?Q?ljyCKlCG885UEX1ESm39eYz3H4lBOaV9ruAbSzq/FKVcPgWqKIYIR+w1DZHQ?= =?us-ascii?Q?4X4ARAkV1VEzVcMcOMpq4bBqibT1Nhjq60KuYcMZ8f000F5W8kYXJkRpDC5r?= =?us-ascii?Q?XqH1YQMc0LgEQcKLAsY+u3BS/dPi7CDNj6wB2rLR4LQG07yjQ39Ken2J1nsU?= =?us-ascii?Q?jqoezKMyj+jx4wbkqhU0bUGZh5lJGPPZADFMc2KVwiryyNviSlVTbwqK6/kz?= =?us-ascii?Q?oNrHYpWuLhCPQRiHBN4QKJwxz7hcsGYXoEYMYer3ULtgqfRSiQcaPl7CM+Ks?= =?us-ascii?Q?zdfiI2rHfvuR+3yPuI5owKDfD5wiWGYgQJKKLdcaAj0+1YxeBMCM7cGvFR2S?= =?us-ascii?Q?rsUak9oI8NOrgVzKenTZiFl6nsV62Bri0S6m6N4O1Ek4OkOdUR1C46z7jtLE?= =?us-ascii?Q?dsDd6hSXHUcmsYeeYMZ5lvOwz0y9ANUMoz1kNgIeT/nwfJIJ0r4pLq8AwOSA?= =?us-ascii?Q?uuYhCphMbM6HYi9JgyFXbK3aA049OHbLpX/M73g70afpUm3aNLX78CONwh8Y?= =?us-ascii?Q?dFyyKFEZ3T/DJ9kYga2w57GAHwIjX92HVyu2zkU07VgaHh4QPT7fBgn9TlTu?= =?us-ascii?Q?LBSwY6Pbniju37APwZS8A4AImOnckXuSxgABgOVHlRHfnA24BN0Pbc86B/E2?= =?us-ascii?Q?Hoa31AgEyEPPusAMCWKPv4yyRCsVJAkouGTY5I+Z1fDR7LC8xKWReLxt5ziW?= =?us-ascii?Q?NKjAHkNzLPyG8vEluqLCR74cb9uIuC0dhSa1PTVLoRse7p7rF5Oxi0d0Bfa7?= =?us-ascii?Q?BsIh1RQH8iJko2ERyavpqZpnR3IJuuuox2QICav5k6vA32Lc7ooA6eK867p9?= =?us-ascii?Q?i7cqjXNE2UKjwvX9DqZJatYzrIrk2Y+r0GAH9lT0ixqlTLmQYy9+WclkUui9?= =?us-ascii?Q?ubOxnRmbBV/47e4F0dWd49e5yBoFJtzy7jDwXjbkuIkb8l5T2g1EIJzt/iK3?= =?us-ascii?Q?96ugvPRKLCGroqUdhEiiGePuUWnVMowQBcZR5fU7HPw3vsQbTZDDwdepu6BK?= =?us-ascii?Q?XiDTCg9+44MPxFnKt6fzxyDJProsadMEp5EJyWOtgah0lNTldIlQJhD8EkTZ?= =?us-ascii?Q?RyMyAMbgelhXzBoTtdfoe8P1guwQoodV818/oBihmizNhZZu6SyPz5sJmtR8?= =?us-ascii?Q?f8fYDSI6Z300uvZ/XniogqRLahgHu2MD6KTqKhQDHFKs7coyNwm0uBjCmLbS?= =?us-ascii?Q?6eL36mv6u3x3WYBY9Wj6JMcO3e7iGnx9coms9LzLffXbOzEErfmiyfSVIPj/?= =?us-ascii?Q?NkGJyXyT8OLmDza5vOprR/LEiJJLS7bf+TPk/SA42hWREBW0K5sJaEWwNi+r?= =?us-ascii?Q?M7WVddaCk/+fMo/r3pKP3ckAbl7M5cCsaqXBLKKGypJXyjQy9MxRVsz8KRJq?= =?us-ascii?Q?bhugb32g6bl+3PWmPZM4iq3TeFt+OoYJubuhXzpONV6Fjv9o6XYgJfsFC+Sl?= =?us-ascii?Q?Jmn2bnp1FJYOkuNmvyuv3VZ+0kxrnySC9jVfXW7tlHRtDco9WkSU/IBcfw0a?= =?us-ascii?Q?30u087fs9+b0ckhdo0/JO92i2P/AXf+OQSIr2BTjJh91Aqh/aZJBS/hcyznX?= =?us-ascii?Q?bKdOrRXxPIXPLzVvrqV/1sT3hEfRX2B4Gq/YCiq759X5wZgQMRr28uTunjCJ?= =?us-ascii?Q?tgcLO8hEleSiXCahQZATkKUwyhD4Cqmxc9ftjkQ39CmWv8sd64/2LyBqG+JM?= =?us-ascii?Q?/oDIqykCzHkkjsCsyocch8GDLzTXDzc=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Z52buNLoEtOpqQ6mOf6bW3KyS2s6e8MBEuD6TEeOBANHp7rTb2eWNtac2Uhx6N5pAfHozevbmRxGvjWaj9wO1z6C6gcotz9FEoLsGOZXSfvoa307eOG/DGlo4Eepm7YW11UKC0GRYm1lm9oXFEge40fkqJ/cnxvkgieXm4QMLFO2Ks6RvTW247EQjVB8zhRkQ4+qGtup7hdMvb+U3z3VAwTkLMx/rX/TE3N097XK9lGrKzjNbZSg9hg3S3YNnCHJvvveSVY1H6ekX5jU/AKpaO4WvmiCmdIVulhLEFJZfzULcwmnGgxrv4mgD9Ze6uBTfTcZFFKtZtHqXBhFBgj9OzJXmKLNyIopfxTo9FtZrKER6bZ4p1fX/kB01CWXj0AebuslyZ3OPFVP4zVI2byLYb2uF7mHDId8zqEQpiOocqi0JY7y/pVckFACidyqmr62Xilyjsqg4MiPV247lttjoiVMnNuSSdobJ6j18th9QQtgw3RjHkIERZi7eb8r9MFY4tgbaVya+yjRQxWdrG1QYFNTnXiwkH/xwmoZFX6C01JHKWM7z8ziSyWebexR3HB7seS6F5497sISHLVusWlVSYYu7soLQ8Ugp7QlUFq22jI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c1f885f7-fe23-459d-9669-08de74832864 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:00.3970 (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: sYDWOTMVrxqW8g+rXIVr0VsJTo4YBfrYVkox4bk+0FBh7Jrcsfq1Jyr/1w5oKNM4Ap45a27KIIzWRQlVAEFNjQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 spamscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=IskTsb/g c=1 sm=1 tr=0 ts=699f1630 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=ldRTlTcT5PaS6-tWTisA:9 X-Proofpoint-ORIG-GUID: rwDpJpnQaeP9xFPuaE66H_cHnS2q6Z2p X-Proofpoint-GUID: rwDpJpnQaeP9xFPuaE66H_cHnS2q6Z2p X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfXwAhLuQYrsuf1 bCx/I4IdGkDiTlZRxOMj14PVYfVGeVw5sfVovoQZoJZGelLU2y0+YeSCbHBS0H/5ypBfb2B740l te6Fw6iYX1Sj+meD9TX1mcgYdrw+1MxERtJ3LbL/nVXtCyJAeSM92HG0r+FlXJ6RHP8OUS6zYn2 qrL+u1BX1rwBaTEkZEf4Xt/fuBR3pHfagBz8pkt0Sxuje3BRrkg1xZ16qzr5n4T0S5Mg4aCOxaG CurHXmtGGO2p9Pp+IeB7D2KPQsmyOuP7zQ37wGqd5R+mXOoYL2wSiQlXq5eD7wBFAsv3Zl7z40+ 5p3cdExOJs9biFCGrvEEg4WHYiqM7LR0W0u1N7mhFsLj6hEj6YwPuyOMM7PkdhB85eTUA1UHXSf DSr2JehFNG6iWAhl6vRnbj8rf3oJYPEvthNNhhPYcKy2OiZq95Xb3ZSXxHrXKStjVoBG8xUDiAJ BcAiYgXVtV1BHfLkIxw== 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 | 18 ++++ lib/multipath.c | 169 +++++++++++++++++++++++++++++++++++++- 2 files changed, 186 insertions(+), 1 deletion(-) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index d557fb9bab4c9..4255b73de56b2 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -33,10 +33,13 @@ struct mpath_disk { struct device *parent; }; =20 +#define MPATH_DEVICE_SYSFS_ATTR_LINK 0 + struct mpath_device { struct list_head siblings; atomic_t nr_active; struct gendisk *disk; + unsigned long flags; int numa_node; }; =20 @@ -94,6 +97,21 @@ 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_head *mpath_head, + 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); +void mpath_delete_device(struct mpath_head *mpath_head, + struct mpath_device *mpath_device); +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_disk *mpath_disk, + void (*cb)(struct mpath_device *mpath_device, sector_t capacity)); +void mpath_add_sysfs_link(struct mpath_disk *mpath_disk); +void mpath_remove_sysfs_link(struct mpath_disk *mpath_disk, + struct mpath_device *mpath_device); int mpath_get_head(struct mpath_head *mpath_head); void mpath_put_head(struct mpath_head *mpath_head); void mpath_requeue_work(struct work_struct *work); diff --git a/lib/multipath.c b/lib/multipath.c index b494b35e8dccc..7f3b0cccf053b 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -40,13 +40,108 @@ 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); } EXPORT_SYMBOL_GPL(mpath_synchronize); =20 +void mpath_add_device(struct mpath_head *mpath_head, + struct mpath_device *mpath_device) +{ + 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); + +void mpath_delete_device(struct mpath_head *mpath_head, + struct mpath_device *mpath_device) +{ + mutex_lock(&mpath_head->lock); + list_del_rcu(&mpath_device->siblings); + mutex_unlock(&mpath_head->lock); +} +EXPORT_SYMBOL_GPL(mpath_delete_device); + +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_head *mpath_head, + struct mpath_device *mpath_device) +{ + bool changed =3D false; + int node; + + if (!mpath_head) + goto out; + + 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; + } + } +out: + return changed; +} +EXPORT_SYMBOL_GPL(mpath_clear_current_path); + +static void mpath_revalidate_paths_iter(struct mpath_disk *mpath_disk, + void (*cb)(struct mpath_device *mpath_device, sector_t capacity)) +{ + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + sector_t capacity =3D get_capacity(mpath_disk->disk); + struct mpath_device *mpath_device; + int srcu_idx; + + if (!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)) { + cb(mpath_device, capacity); + } + 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_disk *mpath_disk, + void (*cb)(struct mpath_device *mpath_device, sector_t capacity)) +{ + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + + mpath_revalidate_paths_iter(mpath_disk, cb); + mpath_clear_paths(mpath_head); + + kblockd_schedule_work(&mpath_head->requeue_work); +} +EXPORT_SYMBOL_GPL(mpath_revalidate_paths); + static bool mpath_path_is_disabled(struct mpath_head *mpath_head, struct mpath_device *mpath_device) { @@ -480,6 +575,8 @@ void mpath_device_set_live(struct mpath_disk *mpath_dis= k, queue_work(mpath_wq, &mpath_disk->partition_scan_work); } =20 + mpath_add_sysfs_link(mpath_disk); + mutex_lock(&mpath_head->lock); if (mpath_path_is_optimized(mpath_head, mpath_device)) { int node, srcu_idx; @@ -498,6 +595,76 @@ void mpath_device_set_live(struct mpath_disk *mpath_di= sk, } EXPORT_SYMBOL_GPL(mpath_device_set_live); =20 +void mpath_add_sysfs_link(struct mpath_disk *mpath_disk) +{ + struct mpath_head *mpath_head =3D mpath_disk->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_disk->disk->state)) + return; + + mpath_gd_kobj =3D &disk_to_dev(mpath_disk->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_disk->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_disk->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_disk *mpath_disk, + struct mpath_device *mpath_device) +{ + struct device *target; + struct kobject *mpath_gd_kobj; + + 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_disk->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 Tue Apr 7 12:23:23 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 9AF2D3D903C; Wed, 25 Feb 2026 15:33:28 +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=1772033610; cv=fail; b=KZMUkuNzbnCS7q6J5MCKjDSJ5rtI5xCAxl5pBBvT4OeByEsXnePzaX7QCBVPCZMbFy60J3RY6qEepqaWSwwPyqLZRACMpZGn/NZ5s2hleJPuuuyEQXsMF9y7FtAv9An56N3EOXPne7H4WEim9EIur0bk2IQ+Da1m6WG38umtCQA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033610; c=relaxed/simple; bh=P1LNPMTLI5YHL/TELBQi6OqJ4Zu728rwVz0MI23M5Wg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=GV0pHo6DXG1pIZ2poxtT1MEyOhuK8OS5gcXAfKoyM21FdZ1hjb9uH9j5PtjX+YbvPLuWE/e+qx378C8YcmU/Fst/5DoOP5hWgO7CAfPzBJy1sfEg5uko0TmavKiTDnl6ko+mvNHY2mbUZ4qYgpsiCL+Tzt6Pf1JQDNhjDx/ux6Q= 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=IfnCQ95k; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=VhNx/plE; 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="IfnCQ95k"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="VhNx/plE" Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61P9TrFQ1959902; Wed, 25 Feb 2026 15:33:08 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=9sewjq4L2LhqiUC6WTr1BfLxGKsbfF+YofsELud+NA4=; b= IfnCQ95kBmtm7BW5+BBI+l9dvnHycED2Gj1Foht+FJWX4yixPdCHZvnQHt+UNrCG ucMuUzxbDDR2smhi7SWA7VsTSvgGS5CpXd7ENUexKvNROP/Y+qzcxTcd/mRl/0xN vjPcCRhheOLiEm5T7yLC8NcszwubRki+oAg6OCVu7aNt1fEF3yoNAwuJkrjY2l3z fN3fiG8JZdjk5Wlq4zZY+g4AcN3YkP8YLFDfHIYeNUA5s4db0gRNBRPEZt6OLy4Q zBpyoEdDCa1qcR8l2HbyKqRGTIX5939BcgrlVbwV8xv1Aof7OA/nldLngXOd32O7 fZzawweq8YB5x43RCWUdBg== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4rbeg9d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:08 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PET33X038418; Wed, 25 Feb 2026 15:33:07 GMT Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35nfkr0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Zfgf+gsVtyhd6js8E0oeJTSpQaClWolToxkIidfKOYpsRSQ4so1GzeKgZkuHy+fPfUElpXGYZbKq8ZUe2umYUopWiwdiGvzz3CQ8SuO8lvbxJRuyILHgzQ7rIXrbQplQhdXkDpeMmSVC/Msfa1kcH0gg221ec2ae6d+y/G4JdynzMkzeZjmOs4uCx24csVraOHx5ez9Og5QHOEGtLx+KGemUhGrLGUx0NgAgCLzexZ9/gX4TnkoOJd1EvUNqlsGr//eUhtaVRR1WyJYKvTM41cXwpirtS+zhJz5tVy5oW8U99wp5W5i64tVlS6Vnsn/jTVJEdhOYAewy9gp5tdaL0g== 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=9sewjq4L2LhqiUC6WTr1BfLxGKsbfF+YofsELud+NA4=; b=l4nv4LFANFdSRht2letbIwgTa5iRyBef8d9ChsgpwyugcnLIlnUJeWqgRbbvNaX8B+r6nnLwRAMiFf5CuF0SmGgL6eHfXA3mpM7hqT9EdHaofsa/Q6I8NNOXL4CVjR9cT9nGKbsrvp5BgLWuhU9UDhKn+Ld7YF6ZrfoM4+LarleAK2vxEa/DbhwnzfCTV8cKORMFE+kr6IKerOuSVTo+8yFMWCX6DYzsDiFk/5LRWsPtxhW47H8hv5RyGe+cBRkitIhjCZUn39XVF83QaLR/GDYbixhQUYLRoTyxAuBxrp+F4H4xoeOI7/ub1JhQN5qfgXBoSQTp17UVLY89NaWKDQ== 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=9sewjq4L2LhqiUC6WTr1BfLxGKsbfF+YofsELud+NA4=; b=VhNx/plEAvj79QUcPYj2Ot+RriNMNflMhszE56Hs4nFVL/x7CGGoK1s9qAAYjQVR96ZvBgzQusv2IIclEa4ktUtfCFYxJr1ef+cArQ6RfDdG1CeocYPKmLMKHRiBzvcAVPZtyYaQ1ZiBohCsYaGGbZ19S6W5yypjfmBiol6ysI0= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by CH0PR10MB5017.namprd10.prod.outlook.com (2603:10b6:610:c3::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:02 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:01 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 06/13] libmultipath: Add cdev support Date: Wed, 25 Feb 2026 15:32:18 +0000 Message-ID: <20260225153225.1031169-7-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0355.namprd03.prod.outlook.com (2603:10b6:610:11a::12) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|CH0PR10MB5017:EE_ X-MS-Office365-Filtering-Correlation-Id: 3f69c06d-8ee7-4f50-6a2e-08de74832964 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|1800799024; X-Microsoft-Antispam-Message-Info: Sq4BndAHv5crBGAXPmym1aqCCnQ3r5OpiREu0qA5XPVVefryHKokSMDLspPHwSSsgvJGibaZavrl+B5mvLzrjS2+V+lZfth4fyF7P+OP1SkxWrPVb9s52D6VvxSIicm6wbEuMI7u4GH5t7RXoRWhEw4S3RdzUfPvF/FFN0CjmxlEEW3PQFN1S/h0OnTazdK4xdJcw6e+5iZgHojAsLclUaT4QDD11RAPKetlu55iyY/CwdQN/KhKXkpOazLDVcjP3QIBHmexcaqmoC5Nyz+02HhLVY8MpTX4hGbD820SHy9UFYQgH6lkWtg5D5yuVM4oyuOMZxW0RW2rsxeGjq1mmQw2xdFFvnzBhNsjyP6KVlenRGi4weF0yTp+BdU0rJ1ddeiS2maksi1pVtFZ6+zqJQwUdPuV4eC7PWk0lvV8lLCMk5Cg8cx77Kd62HsVeXS0yDSOvDAko5M5ooXpMwpGkhybDx96tJtGE20hDFHF52VwaUxhfZngL5B6nrKjXAEzs86Epr3sLIMGNq8CpH4W5qCDya+xoPnGRUGF3CPzvxKGhkKaj9vTZxCs0xm+cpM3MmQLCFrB6aNyfSmd2nYvGDDvMODv3/X4YnZrUq/V3bPfOgPaI13HfRpJmuGzDxdd9I5Emcv/x1D97DjtdnA/TKLAshw7okf3s5+FBE7ErTPE+vvmCdRQ96K5c/8lb/YXT2LFs19dKrk8kxjCb7S5xOxqHQmB5b11K1lbjxtuSzA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eKJFADR/q1GklJlDHNf6cUhEtkOKsbSinA8EKqGyPWXd4dpKo6w/C1dphx0g?= =?us-ascii?Q?BEKufbnkzgEpHRuYsPVHe1WB3Bx7NiftwxgtePJC5bJln1A36ltLHlyLh/3e?= =?us-ascii?Q?mmiqs3aNQ4sy26DR1dvrPZwaG1Z6N29D2+Srwi3JnKf0CVCy4UcKJqoCDkpO?= =?us-ascii?Q?WFJCw1L4YZgvr5pH+uJVlUlLPF2vbjMFmALnARsg2FmPi7r6FrrDa1ATcsEV?= =?us-ascii?Q?slnW59S6LH6N6kV8uITTSt5X36IEEPNn1yAbJy/Iopc/ozd8rGLYTng4G/F2?= =?us-ascii?Q?V1S8EvmpA08dlJcYqDc6OniULSiXfVMvZa74AQzYZ2/bpvOEMYZWN/RZoOVp?= =?us-ascii?Q?DLm1JXMV4LvboNI+r0Has0E/VkGI4hIIKRmtEut2CqVP0kso/C84D9oiDfqh?= =?us-ascii?Q?/NbOGZaM5gVjjDMSaNP5CWAvyLIUmeDmUbqGrkYEGZW9+4lK3UPehG3Tiau/?= =?us-ascii?Q?pnn1/MXwJtbnXgNihvkmO0MHKije3jUigTHcGnobp3FkSzIYSqf5iboQp6jD?= =?us-ascii?Q?ACTTCmoU6LIYTQqcOSx1tVO/IhOehKzlk41nFQO4LcQcRRuI0VSsch5wMwNf?= =?us-ascii?Q?ZsqawlurYAxyttsfy8DfeJy2A2ufgVTMGn+UpW5MKfM/hFMfrigoLWxqlzOg?= =?us-ascii?Q?m4nUBxX6fnOqZ3dvf1LmyAB0J75AB+HJTOTP4pTP08cFvApWq8A5tVob96sY?= =?us-ascii?Q?Hh54b1rJ8IJOlVM+zoQl16NdVxc4JU2/eZaZtCMUYfHEu8Bgu3xs6zUBALwT?= =?us-ascii?Q?X3qsdl2Y1nhlBfpY6gUR7PQOaMq7NnJtDTMGleBf2xy1rg7DYmNdkFRvU1R8?= =?us-ascii?Q?7qi/CmM8iSIKRkovPMxIdLLblzQCDHfVe74YAk51/gTvyFOAkKKKR+XkPf72?= =?us-ascii?Q?59nPK2nWpp2WQwyOudPcBPfYIdONT6HGNG/kYHwLyK80Ys36R5StAKR/a4ji?= =?us-ascii?Q?VE0Wvy6vj8b2IE++irRxKlpSqsAyiH97QZaGuv6utgYFS9m2hRlbhnTmrsHP?= =?us-ascii?Q?/zrq2RAmHQ6GC4mQtmekaH0tcxuheakcmvD+r7LhjugrvfE3QMFtn0VpE2R2?= =?us-ascii?Q?FRkEm7SlpVvcewQnYNF/cBhar6qW1vdjQUsIwvgJMGyqLD/CsVOLpTBjAAiF?= =?us-ascii?Q?X/cov2WoHDreTu28j9aFTXcMlUrukPu9Typahabmn3OL2PjxCzNkjqESmZj0?= =?us-ascii?Q?UdFlkf5zfsdofHaoFRbgQuqSpNDHYt/MNi4U/R5aVkapm9qXNZ2M+zUMx1va?= =?us-ascii?Q?PZhVxreUYqmVZW7ECg7UZGL4ArkiWMFxUU03mFTx/Ebdn1SD29OchZJ6miCO?= =?us-ascii?Q?3iHTzuOiwA6agjusJQ4E5ZqFWcgMz4qxu6kdFpAiVkwWzWubMuyivEeUg9m1?= =?us-ascii?Q?a/grUMlQn1xbNnw73vJpvIB9t0Z8Eywccl7N7yT9oEpThahr+2XO7mzmLdv9?= =?us-ascii?Q?2HwzLJb34ryTR0+pivGkboL2KJBgEb1s0LkYl28vpgoMtwI0gOGuqzxjbrhL?= =?us-ascii?Q?L2NUfpkVk+QxNauYts2Vlrsvi1AkS8v/yqdp2e5HZ5weuw/tvd3/JLvaYv8P?= =?us-ascii?Q?Xh/ml2+g55mnOiIAA4NQ7/YdsPetABdk8pTb5lGEKW/SC5n5BPDS9I3efmOI?= =?us-ascii?Q?YdyKK3N/ycSMJw1yfKkI1CrTXl34ASgV2Z6gKy3ow0HEBNvUVfKibnpsib4c?= =?us-ascii?Q?ZCOPaSEhGanhmeazlZvBTEmY1AyCop5EHSlN2AWJ8drx1W+sCVqv42gNbNUG?= =?us-ascii?Q?VF5iZOFiP4VHSmfTCLHOQH1UKrWSEAM=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: fi+i2JFBH6MXnxbasElR3pyxHgLGWKtky6hgykZwYCV/zeQVnG8W8VHqOQjft68nURzeI3tZpqEVJLuFxLOGjXguviORorCRuCguuc99ve52pNPW3GsxXQfr6gaSK+NPEYCG/iIz89+mUJFaJki0aDiYyOB42dMxad0dJnS4fTS0JEfjk9BJNyRkTT67Xei23BT7flB3IpRYEJ5vJcJS4y9EgBVOMy/Lf8nU1DAlmeJkybbiDHrFAOwS2GWHkc5j4V4R8ffgyBC64acG+lp4irA7swLjg8QMUXCp5kYaa93+e2oQJvFGQ508shPkjOw1zcm6W03y+n3zBgUel4pPKxVdQ602oobE5OL9SkBFgISeY7XaG+wl8GDoZOuwuSl9JSs1WaVDO1QMoDmEy9+6Jwi1A44YJHWmyCml1GxjnnkZvGPPXXplko97FvjV3DhAUPbYnAI3ZuMb6IQ6YfcKnXuHwAbSF976k3Bb1d5qJTJneoxj+OXqKdA09mvcebWcptN08AVu48cpaI8dasfVYAZoAqzeQLNd98Im8u8C+wLOrsGZbiR1Zgin/prTYcQm/2m/Rl6UUQnIwUxJE3xaFKtYYwykOI5jGuiWznGE5CY= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3f69c06d-8ee7-4f50-6a2e-08de74832964 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:01.8938 (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: 9Ck0DZ04ezZ1/3k/753kUZbC+mUYaYCyJFK4sGjGX2mioR1PYqkpJLPfApoAR/PGZ1joiAMBwWLx34+T2Z7aig== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5017 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxscore=0 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX7xjbWfzS3vpz zCxwmQ+XkqGm8Ve5jO0hsqfZZvL83pvAApGrg5u7CMX6wowQoWcXeETGj9Q3WSLOsj/9H50Gj4W P86a5LF6W5khSw8rr/71wlZbhyVrp4Q3a/xbDF0c9dZQ/UbLTodozx4t59e+H/N+qRA0Gf7cCMX 43kY7W0UUb5N81+t9dUnheCvuHtX9k8zq1km3xfzMFX8lyFziEqz0Er2Rjtcp9m7tR7E0r40Q1Y XvY7M2/cPvt2UaaClxWy5QG+/jSFoddpNd3+A4vKz6sdQszoYglPkBt8Cp9Z7wCGQnL7/sCe3Kc gdhXlLWGGMmaoa9O5kTJykMAHvmMTLUva6iPMlNVS9vkS5ossVcU1vFoJzWXoFtEGlflu67dVjk dErkmxWoP+AYq+zBRCZvmk34CD8BRDDm1qvjjSbbGwmtSxsmTeyiEKjTcgsrSHX+EoJ8awQy9E2 X1RUcg2eai41MvS+iPo98K80zD2P6uETsJvZ/3ss= X-Authority-Analysis: v=2.4 cv=S/fUAYsP c=1 sm=1 tr=0 ts=699f1634 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=loVZsHcDvd6Py45AcLcA:9 cc=ntf awl=host:12261 X-Proofpoint-ORIG-GUID: WwCS44Fd_0EbOUUSSv2j6GxeQoNZ9dA6 X-Proofpoint-GUID: WwCS44Fd_0EbOUUSSv2j6GxeQoNZ9dA6 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. Signed-off-by: John Garry --- include/linux/multipath.h | 15 +++++ lib/multipath.c | 116 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 4255b73de56b2..0dcfdd205237c 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_generic_chr_fops; extern const struct block_device_operations mpath_ops; =20 enum mpath_iopolicy_e { @@ -45,9 +48,18 @@ struct mpath_device { =20 struct mpath_head_template { bool (*available_path)(struct mpath_device *, bool *); + int (*add_cdev)(struct mpath_head *); + void (*del_cdev)(struct mpath_head *); bool (*is_disabled)(struct mpath_device *); bool (*is_optimized)(struct mpath_device *); enum mpath_access_state (*get_access_state)(struct mpath_device *); + int (*cdev_ioctl)(struct mpath_head *, struct mpath_device *, + blk_mode_t mode, unsigned int cmd, unsigned long arg, int srcu_idx); + 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; @@ -66,6 +78,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; + unsigned long flags; struct mpath_device __rcu *current_path[MAX_NUMNODES]; const struct mpath_head_template *mpdt; diff --git a/lib/multipath.c b/lib/multipath.c index 7f3b0cccf053b..ce12d42918fdd 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -469,6 +469,113 @@ const struct block_device_operations mpath_ops =3D { }; EXPORT_SYMBOL_GPL(mpath_ops); =20 +static int mpath_generic_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_generic_chr_release(struct inode *inode, struct file *fil= e) +{ + 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_generic_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; + fmode_t mode =3D file->f_mode; + int srcu_idx, err =3D -EWOULDBLOCK; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (!mpath_device) + goto out_unlock; + + /* + * If we are in the middle of error recovery, don't let anyone + * else try and use this device. Also, if error recovery fails, it + * may try and take the device offline, in which case all further + * access to the device is prohibited. + */ + err =3D mpath_head->mpdt->cdev_ioctl(mpath_head, mpath_device, + mode, cmd, arg, srcu_idx); + lockdep_assert_not_held(&mpath_head->srcu); + return err;// ioctl must unlock + +out_unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return err; +} + +static int mpath_generic_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; + int srcu_idx, ret =3D -EWOULDBLOCK; + + if (!mpath_head->mpdt->chr_uring_cmd) + return -EOPNOTSUPP; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + + if (!mpath_device) + 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_generic_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_generic_chr_fops =3D { + .owner =3D THIS_MODULE, + .open =3D mpath_generic_chr_open, + .release =3D mpath_generic_chr_release, + .unlocked_ioctl =3D mpath_generic_chr_ioctl, + .compat_ioctl =3D compat_ptr_ioctl, + .uring_cmd =3D mpath_generic_chr_uring_cmd, + .uring_cmd_iopoll =3D mpath_generic_chr_uring_cmd_iopoll, +}; +EXPORT_SYMBOL_GPL(mpath_generic_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 multipath_partition_scan_work(struct work_struct *work) { struct mpath_disk *mpath_disk =3D @@ -501,6 +608,12 @@ void mpath_requeue_work(struct work_struct *work) } EXPORT_SYMBOL_GPL(mpath_requeue_work); =20 +static void mpath_head_del_cdev(struct mpath_head *mpath_head) +{ + if (mpath_head->mpdt->del_cdev) + mpath_head->mpdt->del_cdev(mpath_head); +} + void mpath_remove_disk(struct mpath_disk *mpath_disk) { struct mpath_head *mpath_head =3D mpath_disk->mpath_head; @@ -514,6 +627,7 @@ void mpath_remove_disk(struct mpath_disk *mpath_disk) */ kblockd_schedule_work(&mpath_head->requeue_work); =20 + mpath_head_del_cdev(mpath_head); mpath_synchronize(mpath_head); del_gendisk(disk); } @@ -572,6 +686,8 @@ void mpath_device_set_live(struct mpath_disk *mpath_dis= k, clear_bit(MPATH_HEAD_DISK_LIVE, &mpath_head->flags); return; } + + mpath_head_add_cdev(mpath_head); queue_work(mpath_wq, &mpath_disk->partition_scan_work); } =20 --=20 2.43.5 From nobody Tue Apr 7 12:23:23 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 97E533D7D6B; Wed, 25 Feb 2026 15:33:24 +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=1772033606; cv=fail; b=fi8Ghv38Jht9fjv0ktNyAJIfXBK8Y543c3tIAYPCmlpsdiWW4XyEhRtcNE7xIyVuFNEdM0E08W9PpK6LAOyvN7woQOL4bLH1Wmqp4hfkcA4mzY+vfHOdKbHW58dEbipYxAIAVAS/pQ1C8lLP78TtN0NR9ijr6BtoLy5dseaZTdc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033606; c=relaxed/simple; bh=IyfXkVWV1+zG5gJhJfQCXE8IU0z1ck0iINyc4+tHBy4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=GpbuzoNv+i93azN9gboE7MdlcplrPEOQHS21TjUAajAe12Z5L4H9jDFyVn0w0FVOYkI5bk6DHZXrjenM/XQs4Vmv+YZOO28a8GV5ZXxBK7zjtrGprMGhYtyrZWkGrmALHBVf/tpbkIu5iXoOd8Z6P7LedZMtv7wumItg2iMmNWs= 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=MjsJauGP; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=scngdWuz; 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="MjsJauGP"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="scngdWuz" 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 61P9nIru817326; Wed, 25 Feb 2026 15:33:09 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=1yKKH9A1e+gBfY5ZM7wVAowXnn5aqmSHe8AoxDewErU=; b= MjsJauGPQtaaJy6ZVbI1J2oTwJ07/EdRfiXkRKeQ45MJzMhDiT/vfTZVy06ENNS9 9QD9VepLviLyzTH1fVXTnpCV4+EfHY9vHf3IfWZiM8Ryqgfnt7o/A9QqbdQE0mAt ruVjKDveot0wgDGvWnuLjxBAaK/+jADNLcmdKy46o/4VnvB/NWLs+FZ4Mddby8R2 eo7CHB9BJ+08NvxFWSFJwa1lVYnerYIhHBWiD/N9kQKqdBbhmtGY1XVQ7LYIeS5T N2ZSzu6MD96j9/xz5sQNDPefH4UFFOkJRT2Zwr0xoGt/p3Ot27Qe9LHFjqiTr9io OIrgq0vkCoGUKxHG/2un9Q== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4areect-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:08 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PET33Y038418; Wed, 25 Feb 2026 15:33:08 GMT Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35nfkr0-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qt5ZtYEY6m1Y6DHUKJ4m1Vl4X3CfaWsE3DvSLT52YJNoKSt1DK9kuyqYjAPXkeK3HZV1HCBzzCcYvgxwktU+/auMFEA8WRh9DqxDXKyNgbKSTEZ/JYQBkBJHUf6fwxfI0hSTJEiGdfOzM8BKIwCzOeR6A+Xi0ItRAkF6UbEvGanmlcAe9FmFsEpThfGygyUiVKGCqHsbkVNhcm2Uc+u6PdkrvGBILm5A7jSoepDr24AfClH9OFEb+yg6czQCU9IjprhzJAKGnlsn6xTXJ9o7Md9YoBJzTurWR7jLae7nmU6BnhYicbIMfqlldP53KT4zW+JD7DHYpiXL2XbdYVu6ZA== 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=1yKKH9A1e+gBfY5ZM7wVAowXnn5aqmSHe8AoxDewErU=; b=x6vRXEBFkwVAgyZd2N+ElxSq0NBiFUFS3AkJNo4lbHMdvVNYypiz2M7kMl8/8XsAuawj//9Nn88DoQ2qL4RIb1gSjW9G7tUBIT1kiOTN8NEuJ/48VfjxPnGBS4DpqRYKey2I+BN8b6g6ZJbJkl8xiSdfdAde+OAYsatGmv7rI588RQ+kKvqVhRZ2q5N4Rznj9+qydLFCA5HmrHFfoz7Z8lo2hrH20sAVunsAAI4002O5q4l4f0bmDdFP3MfVK0VArGv1dOkbkXI/zGV2V9XWksOL2WKAo1mHiIVro10Nj/q8HBv9rWzFx0x2o5oxQ8Z8frIDGkak7H6c4P2vZCMqWA== 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=1yKKH9A1e+gBfY5ZM7wVAowXnn5aqmSHe8AoxDewErU=; b=scngdWuzMiv7t3lBLP0hBLiEog0emCDUlQGV2Atrbyp6XszkdtJSQnKswId3KEXxFTBkhINE8fcGg1C7CDzXIyPYYdAiQrsJtH2tu7ATryYCsrlH4Adm8L7CU7aTtm/hzY1NVowDZCOSMShXkVN68RF7j5HMjPGdu/pgDWmH7cE= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by CH0PR10MB5017.namprd10.prod.outlook.com (2603:10b6:610:c3::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:03 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:03 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 07/13] libmultipath: Add delayed removal support Date: Wed, 25 Feb 2026 15:32:19 +0000 Message-ID: <20260225153225.1031169-8-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0339.namprd03.prod.outlook.com (2603:10b6:610:11a::30) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|CH0PR10MB5017:EE_ X-MS-Office365-Filtering-Correlation-Id: 9dceb67e-842c-413a-f633-08de74832a32 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|1800799024; X-Microsoft-Antispam-Message-Info: u6twwauZpRw1MIQgnXjOiMJ38duYbLxD67s8+IpcoQwCFVOE1lm2sm4ZMDXI3cGUXvd6loOU7xrOiagVIZOpomexlcyTI9sXSMjBeBALSedB0VqwnDUIeJaouXPBtVrj1k3z8HVwaTg46veXE+d7q72a+0PGZKKJum3zq2M8U76d2nKh7LqF1qTRek4+w4SlP+1hIK7hTFzhDQ3ILq4S4hYcNpn52Z5C6Tz+vwwU9pUQ0jPXipIy88uqrVX6Pmt+V9ZNab3zHuvTrOZ2s5gLcGbMBCxU91573z2+3oXMyD2trFubyKFAkJz3IInjfyoGh5iIxgFpbb6T65u/qFwNWQF6n+km/oiJ69kaHTHPwgURs+lvQr6tplCMft5hBWap3QGOheNLBL2vPE7END82W2sNKQvYLl0CZ4T7Ip1Gc/IzsA4QvsVyJM6T5wtit8be0bbls6UtdCJd01634/r/AsZxPQQn0PjAcMnHReFm936bkj8pWOuzvV93kAczEay1MlFZiVi1+z/he/qmzYI0sLUF0jp+9Zb+oq8s0vMv+mA5Caqfboh1ctfje69z5D4ZMCCXgiZFwY1LzQIK8hUvP5oxnOr7qZlLCPm3CTV0Mn2OkgV2muXydsq8EGPFL2GjFQOnrZRkICddZfaujaUf3/KfLEKI1v4kH9uG396gZ44HNkKFwmaan7UIpsgJ+umDo0ZZbp3DahGesvUuyHXlJf1mFZjoakKD3QMLfNC9hZ0= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?g9fTCJUm6rPJA0Dw1iDSgLC4k6NDb4d43NJWdMFQQZeWxizkZ+keOPUYNn6p?= =?us-ascii?Q?20lHC+V68epo/OSEbmsqmFr1L2o+y+xQRUk8VKfLyxRQ7qSTie7IXkQlFZAc?= =?us-ascii?Q?9l9j7R2+jcYRNuNnhsotki/AuNnSpCGOd+YSs9TGpDgiBIYGJVPGMCxKQH/6?= =?us-ascii?Q?KxJleibrYT/JSQqOrsOY2TpZQD46j8UVcYrI0gk2BdXL3JDyKBoye3gHTqWq?= =?us-ascii?Q?5CL7jEJ3e76yk91nH0TehIVu1mxdJQDhZY18eOqpGT0xIdWirA8yfPp1ZMq5?= =?us-ascii?Q?Xe0c3gu9n7gimH+WI63JzNTDR6DfRBi+riRrUcqlJlLjgOSWKhFVFYNs5c1t?= =?us-ascii?Q?qJqpI2aSpd5E4v/gwjPFqP7qxHO0QZVEy0CEOrFCNXKT0oHCtC3iDT9Rcxqn?= =?us-ascii?Q?SwgMwK7SZ+HIsf+JW1hYViLUTbM/ITdFm14z8kholykBBUz/Fvh7EEwMhLsF?= =?us-ascii?Q?GWu5TA9APrM+WZpO7/EXKAOJ5lSGw25lh73G+/AviYwv+avkhobxvfY39po8?= =?us-ascii?Q?BOTde+eBg4vTi2eyjnbh7Ip17vXoOtsZF2wDcmscuuzVwUg+JnG+RWX6is4d?= =?us-ascii?Q?l38QesCP+5VW6F8Nb3Ne34pFIRsTYtxutJy9txFI9MK0SWm4IJXqILHK5bp4?= =?us-ascii?Q?Lg215Sl1xwynEMoTSB6yEqWekrtk92J0mLZ4OP5/E0I84/GZLHvCUMgELPS2?= =?us-ascii?Q?GyBLdRIYQdjnmNTncTs5lYJO0PcE2v5K6hR4YmDMBR6jud90mhsUBzd636Fe?= =?us-ascii?Q?x7+id4mnBsiALDm0aK58lGFWhSY8aZhLA4bI93EdSVt+dbQft4W5k1mpS3ve?= =?us-ascii?Q?TIYpmOB1suoru28ttHLqZp4zBJpuSeT5NfT0Meg13/di3yItmniz7qp+3EZM?= =?us-ascii?Q?2N6rRpwgMf3JBSpgFIo7JK/4ekkVHNLf/0vpeTm2kdgc4eJGmSUOfZPz4HgC?= =?us-ascii?Q?19uSYAj5nerujqU+vQ6NFfeOyvlFuWgPBRHFka66qWC43tsj/R951EspELNm?= =?us-ascii?Q?y4psXUuSndVdQxDp0eOh+dEyjkA/Cvbw9fpbQq5AHPGS/C5rA7bszep+3My0?= =?us-ascii?Q?vj2bM8/oUSgNUl0bNeQzO06usYCGUoYKHFfX/6j6P3mDB6qA7xa0xhrLNW7T?= =?us-ascii?Q?V6h0Q4a7+9BtVvGTKWFfSGXwV+oPBMY5u8dm0ya7zrWuBqvPcTAzdS9mTbZO?= =?us-ascii?Q?Xl5LhrdXH9vtPiwUQ/F069W+wCMndsY/2jLgchPVbF8sR7i58LEvh4dSjISE?= =?us-ascii?Q?K/R4cYhf5u2WSG/BNa4t3p3ZA+QAWiFgOmxyh3AQLrpT2nAVQV+5sfv+bxZ0?= =?us-ascii?Q?2mCuVJ3+f18fAX1XQ4+QqHTkgYHvF7pDYhaYCWHvHxUF26HfFq6VFViVX2W0?= =?us-ascii?Q?dEjYP0E504vlPh8FMyGTvTwASZEAdy1SkiGbZiqLOX2iI/o5fm36nKIb8wuJ?= =?us-ascii?Q?nSyKmEV3sFiR4cpPiyau9VqG2jpApT4uLOnShYwIgHnT049XiCtni8redMaJ?= =?us-ascii?Q?hdjQlSVTeQKB0qL482xDqkRRCdgLywO4ld2AFqQ5kxTiQBwn4YerjuoiAlzW?= =?us-ascii?Q?CPMPkCdNY7iqoFBZQFGdTwEMEC/wYN3mYCmRc+p6juAUH8ZzkUu+hbWmfyU+?= =?us-ascii?Q?k6vtecSRsEa7zWATjSi8cqz/+lkItCb44dMjU3ee9VOZEQ8i3BM5VCddYZpW?= =?us-ascii?Q?bRLSBi+rkHQJQf8i3DDVYxvqfUvs9LRBe9PXjl0hDSlSkFX0jM5UHx3WO1WP?= =?us-ascii?Q?Ue0PnlsC2LRlo3bfukq0fVSe1Dkwtrw=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: NXLRlHsJvN/Bx34qgMmpN9C/W2CnTaqUeWgYixGAgABy7kh1IqjBi/DBgta7/C6zSm0bzL8k1Fano4cRY0CDD+SusUCHHGt5mcGqrhyECjfQJ4Pjwnb71R2FBP/uaE5FZza7tD2vZ6IQ8EJ5XFo3cqgnBTZbHglacy+sv550vt53EsqOa8FrtIEHAxFMzxAAZkZ5R2/PimGMzVdr3mRM9X1aFkvvciL8HV067/2XSWbaoFssROMSZHWJQlsJY1z7MfZ0x91OPL+vSAlkafL6qTyttB8woR28aZM8AWM8/SglVHyexPXqldpCXk55kuPjku4DGqS5c/TH2gTL+kkk0nzh8TdgNfVyC8kDknlfoqHGm0UAf1BRAtRWACkHjt1U1p8+EctJa/yBmIH8fOX6fne2YnWpqpa7FJdliJuZcXqWpu2A4xJEyCheMJbyOFmW9hyd7oeaNeX6XO8/3xu0oWL7A4GJVtD/c8ZmjUZX/yA3YzBPxR8jyQs9XMXQqCRvrInYLkRwhczqDtFziQsISt5TELG8oBHHlGHWhcOV3tOJlkofortZBfbIttVru8cMAp6gx+PuvEAealomoBDNhJgXObj7rHVfREbcUDJ7dH0= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9dceb67e-842c-413a-f633-08de74832a32 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:03.1913 (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: jatfSxVZSH7jrTZbMt2TfCyOsJvc87PDFAjfgBp33kNkYa7nze+vnJLCTmHygJNT/Dr00oeKzR0A7ZLunv+Z2w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5017 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxscore=0 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=La0xKzfi c=1 sm=1 tr=0 ts=699f1634 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=1SMYhA65fyZpU0ymjmgA:9 cc=ntf awl=host:12261 X-Proofpoint-ORIG-GUID: mbOkBvaRnGJC0C_fqaPs1ttaocR438OA X-Proofpoint-GUID: mbOkBvaRnGJC0C_fqaPs1ttaocR438OA X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfXxvIp1YiGmf0r Ok1mvtZogqVVW7t6ARLBh3vP7JlOjzdshUATblysytx3ii8PK0GlfazC5JalL1GNYnDTYjbAUn3 /R4Z84EGD8sT4AFXwNUE2mIN3CeApqoi2aL+tCjPndsbWNvFjK1RI6oJi0WSd1ITOaiZwZEjWO1 x+t1UoMrtwIcJ/IXrdo5FR3vApvQfMCuUg8LyRwv/DOf+nKk0kV0Xz1X1AMX6w9A6r+wsB6ulSs AXTo9vjSqcc5Eq9KJ55B+kzh0T/cJxBYHNmlS7YtzmDd5ciI0uchcNGTgxEZCvkAvnUMwQtXlas dErAbnegoXANU5hpgNl7FY1aetcMPXts0W6igQMbMe8EKSQ96OUCLLuh7+ZjdDwg1pFQmT5jOz8 riCz80+2Jq/eFgX+3q5hix76InOvuEcuCqQxrP18r33MSo5wjDXk/LD/u0TIuTak8pODxCUKyEb J5/6eo3SL/QTjkSYXxXB+GdHvUNYPxyqjLblmQ54= 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 | 17 +++++++++ lib/multipath.c | 79 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 0dcfdd205237c..f7998de261899 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -66,6 +66,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; @@ -81,6 +82,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; + unsigned long flags; struct mpath_device __rcu *current_path[MAX_NUMNODES]; const struct mpath_head_template *mpdt; @@ -132,6 +137,7 @@ void mpath_put_head(struct mpath_head *mpath_head); void mpath_requeue_work(struct work_struct *work); struct mpath_head *mpath_alloc_head(void); void mpath_put_disk(struct mpath_disk *mpath_disk); +bool mpath_can_remove_head(struct mpath_head *mpath_head); void mpath_remove_disk(struct mpath_disk *mpath_disk); void mpath_unregister_disk(struct mpath_disk *mpath_disk); struct mpath_disk *mpath_alloc_head_disk(struct queue_limits *lim, @@ -139,6 +145,10 @@ struct mpath_disk *mpath_alloc_head_disk(struct queue_= limits *lim, void mpath_device_set_live(struct mpath_disk *mpath_disk, struct mpath_device *mpath_device); void mpath_unregister_disk(struct mpath_disk *mpath_disk); +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_head(struct gendisk *disk) { @@ -150,4 +160,11 @@ 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; +} + #endif // _LIBMULTIPATH_H diff --git a/lib/multipath.c b/lib/multipath.c index ce12d42918fdd..1ce57b9b14d2e 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -52,6 +52,7 @@ 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); + cancel_delayed_work(&mpath_head->remove_work); } EXPORT_SYMBOL_GPL(mpath_add_device); =20 @@ -356,7 +357,17 @@ static bool mpath_available_path(struct mpath_head *mp= ath_head) return true; } =20 - return false; + /* + * If "mpahead->delayed_removal_secs" is configured (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) @@ -614,6 +625,29 @@ static void mpath_head_del_cdev(struct mpath_head *mpa= th_head) mpath_head->mpdt->del_cdev(mpath_head); } =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); + void mpath_remove_disk(struct mpath_disk *mpath_disk) { struct mpath_head *mpath_head =3D mpath_disk->mpath_head; @@ -711,6 +745,47 @@ void mpath_device_set_live(struct mpath_disk *mpath_di= sk, } 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_disk *mpath_disk) { struct mpath_head *mpath_head =3D mpath_disk->mpath_head; @@ -793,6 +868,8 @@ struct mpath_head *mpath_alloc_head(void) mutex_init(&mpath_head->lock); kref_init(&mpath_head->ref); =20 + mpath_head->delayed_removal_secs =3D 0; + INIT_WORK(&mpath_head->requeue_work, mpath_requeue_work); spin_lock_init(&mpath_head->requeue_lock); bio_list_init(&mpath_head->requeue_list); --=20 2.43.5 From nobody Tue Apr 7 12:23:23 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 6FD4C3D9033; Wed, 25 Feb 2026 15:33:28 +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=1772033610; cv=fail; b=IDbnzU/NWnxai/imOyO9xk5Vk27+umGRnQ/qnT4BIZBdo3nHUG/bmonmfN2o4d6ODhIk9po0Ip8cna9K3VBkj6Q7sAydDiiQth6yFe51REkKcGr2sc9ixn8ZBT9RUdNg478o16F1ReBtKZYKkTxqraINFk0cWUz9ihlcKuYHvQQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033610; c=relaxed/simple; bh=UMAB4tDt4k7gBwIMz9+6q45vkbIczHQk2upGGvkcAUc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=JFVVpZhPZuzEpP4yHjQal8zNi50zF7IBH89baSyrZFaMxFWs7LWPhrb8C0UQCoTKEa4ig6h+Bv2d5rVRNdnb3/t0xS3PAGsKqgSWgUckBhAfOqg5rO5XJEOTIVYDFV+/Q7b6GDM6qdRy/RLy5X1abaEqV4bk3KoDMR2D5pBVYrQ= 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=NfU65r8c; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Cl9oDw8M; 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="NfU65r8c"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Cl9oDw8M" 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 61PAGx6v359748; Wed, 25 Feb 2026 15:33:10 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=jOCMQ+0EevgG67V7BBIXSAdS2cJ/aI6eGcpq75Gsnvc=; b= NfU65r8c+CU4r/pDMKFT9S8GldRHArNOQUdmWGNEIffwIBI06yhd58+XwzOofryY 83FY5u1v4dc1XAnw2CAdlygET2DjCiKq0iMLWeF8uuOlYqTIxigg0SOas+HsQ/m+ j+I1DYCa60Wbrc0HSWykgxdZXJfCPi/pCGCbYkIc7nOUIRfhIJ5SAs0RlqLjlYwK UGyQYQ+pvDTkFp7fgmVCx1i/XGMhpMYmh6W5UrD4B71iWpmfH9tLh735OoAz5rGX PDt1jaBTvpx+nVJlwYTljUHD+rKVGV3Vwsm5G58sYDdRSYFUXcue9J2VYbOhk8xR DIr62CzlW1omSTaRpXNGkg== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3m7xf5s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:09 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PET33Z038418; Wed, 25 Feb 2026 15:33:08 GMT Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35nfkr0-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aOUuDoq5nGa65O8QP1I05ZM2+rXmsvNb218IO1FqKt3Nzxiu3APdReHod2P4hoQwdy7SvB5hIJa1ZHF37aDh9FgzfMHO885+6mVvxbDd2h5lc2s9fSwhgfwQIFURlQJoOH+w4BMPPlxnNQmEdNCiZaW1bsCM6K0ih1l4QKxuwY8afhvVwMYdLqK7XNgooSkUNr7irYE7yBs+pn/pkEIQpIINXaOkoIYo0oN4R90lM4+8W1Z4Rrc7RA+2cvuumc8kr8fqFoYS4He5xM4p5tfFb+QX76LpNlncrYPabQJ3EoSPN7EEkACTA3rWqw+tVet7ycsX74Fr6RGZhnRrtFrlWw== 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=jOCMQ+0EevgG67V7BBIXSAdS2cJ/aI6eGcpq75Gsnvc=; b=KoFE2IlKMqDxT264qXPBWwzm4COsPNsZzYrRbDp72dTYbyLcJ/gKF63cXjowzZXguV6+ChEQVD+NyLfGwh23uCXfNOZssypNE5p3yGjAeO/uxOLuEalU/QNPegaCfNIb4E2DBlCeFNLrny7ZX1797Gl0B5rK0rkZT9dxJ8ioaOHEZvZiubanbS2ZOwZnpOUsBg1rzQ+O5K9/1RahRUJxC9QNsuYVXBB9HNw4fnfdoVqC7tDY/36cRvR+s4LB8QMB+WM+qddiYM5OC11mCKRZlwoP/pZC8MZw9fM/KWyXmIyYkIkhTRdKo3uR59aNyzMEYC0Tq+OkrO8w7Mtrxo5PeA== 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=jOCMQ+0EevgG67V7BBIXSAdS2cJ/aI6eGcpq75Gsnvc=; b=Cl9oDw8Mf+v5XDfqqAmOfHWgq18bpQelxh0dqPTPGT9FuS+9Y9chWo8TDwcPlyphc9J/dp/kwdM5RkxMolWr/vykKnR9+DUl23O0ZYTHqoZRmpLCsZjQIifQiaizojOlsjEYzOWtHukK7u2Ui06WRetWMFipTThW6UgaPHIhy64= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by CH0PR10MB5017.namprd10.prod.outlook.com (2603:10b6:610:c3::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:04 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:04 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 08/13] libmultipath: Add sysfs helpers Date: Wed, 25 Feb 2026 15:32:20 +0000 Message-ID: <20260225153225.1031169-9-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH2PR14CA0016.namprd14.prod.outlook.com (2603:10b6:610:60::26) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|CH0PR10MB5017:EE_ X-MS-Office365-Filtering-Correlation-Id: fe310499-aafc-4546-2535-08de74832b0c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|1800799024; X-Microsoft-Antispam-Message-Info: YUIaJE/jQCBz3yU2wAb9eiHp8GOZ82RrNCtwn1yk2fSI47aGlrB8bWYbsg6LfDSEoNsLWUfR/4OKCUm1Cr1vAEJugku8766yQnB+qh9jdMg2m0xJGr8Wh0yaoYbUsXYmnq/YOT2cMmMT+MOsdEaCYk+481eYnBUoeYBqfdo7Lkkmp0beYEuI0oTTKTLxiFFS+c6I0wepQZ9egqg3UDu6Iznf3VOoDmAVoVYtm6QTBo/htkmRU85c/GcrY3/zuJSz8b46eJpyJaYu8HWXq+Dew+MRW7MnEeXSmUcCyMyyNDB2WK9nc9mBWPRwO1rO1x9j8wET11ZkjWLPrrO+2fdtsAkJFXb5ggGcme1ltUzJj8bvGVyJRditcHaiMEwIstL9ItyXbOCz0w4ZCBNxBich6F/7jR+jzAwbbsQxqPCVI+ob/SrHoR8Ojq63XlrwjaEe4Gh5NWuBgT6dgN1Mg581ShcCQiWTks1KlZivdquAr5O+HPLoa07ck1S9hMWA/tNU/eaFpKXHQ9n9kjGj7zVa/chrLoYlibo/Q/rOZ2CPbC0WS+5bheKmDPvJ8k6JbO6qzNQlKkjvr65NGagc9pAf9RrG3QmFrGUuhMiYp1m3v2+R3bRnJUP67yWn2dCf0k40U8RNx/CbePbInjaIsibEMS4bzcr1PILckFU9OsdIMyrf7riJPOMOtIEnOwDR1JcR71c+hWfPop9AU3cYVuxEccfAmZSTSzCfyug62AEXK/U= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?p3tdV8QRhwYrvX1wo6M9IVqCZw1L4oSqcNQ2dbWPxjnv5YqxXjAS/KzDnFo7?= =?us-ascii?Q?IyjQ1BQBL+KV216PVXnuufStxewDSMsVE+KaUCRaaPEopKZGW47ymaMmPNvE?= =?us-ascii?Q?pUFys4HCkNaXl0BGfALDjvobzdZYH2S2j27nnVagEoayR6cE4QlrzoxfghrV?= =?us-ascii?Q?bR1O/N4Mavqe0GAXAMqg99FEC0a/oNn8hevQ+RDa6imFVk7eQbb/gSRPWxAe?= =?us-ascii?Q?zdIHxQOKGgmJ7dwXcCw+lft3YA7R5i5Kmb+WBopBwvZ1ybD+yjjNF+ciNfwG?= =?us-ascii?Q?7eiqyqY+GBGXKcRMeHFh/l729s4wpAGGDxrR7yovv3YrCD2rOhrH1PzvXp7k?= =?us-ascii?Q?4CJDByxVwRw7FGAmJVrs+e0wf/+gh/NPXuWtu0QuN0Cu2Tp9p2GItRo7ZUbT?= =?us-ascii?Q?dwhCuLEzvuMd5YApjfSAq/3LaRSsEANTzeLcXPdxatLj6zDiQ24D6lK3nJe1?= =?us-ascii?Q?8tiH6NCgS4KQ5RnhRGq5XT8qr4GWyMNAEw/E8jL6J6qLxZ+NZtBrAfPio4d5?= =?us-ascii?Q?hodTDBaFG7Q+VWeki5vluKyfmj757LZqk2X5Htr/zsETWjuBIW2wJGT2LyKK?= =?us-ascii?Q?nKYpF8a4k2LxOlSwgVqB8dNSKMCE1MUwWeYgFBLiVDujI6Lan1et2GaCx1Th?= =?us-ascii?Q?qG5aa655+q6aGOlxgIN81ACUWMcfdkS2xkaXKrWoDlwu4SqSgCFzObEAO+iz?= =?us-ascii?Q?fh9IjehwULssWk35JMHEjX/8Sj2ygnQnsFOAlyfhdcu5qIFkFsZ4JwWTr3aG?= =?us-ascii?Q?PYoaeMFLDfSGS1cx4qgV/JUmf0J8oY+APeeqUoNlwYnu5Np/XcJKpjh4m3YE?= =?us-ascii?Q?iZG+Rbm2qA5kq1qIlMegqAsCwbCb7nhHYm67plxU1gDVUn5gKqYy/UAVt5B6?= =?us-ascii?Q?VtmX8fzEqNOtjr5I+f+LwVZUGWU/z6vi8jI/JNRj1mwV9BKB5sqNRZfXmkye?= =?us-ascii?Q?jM03dRwHEEbaJgxW4gIyP9BPczM2MPx57Dzou/cbXgVUDLew/w06+GBQTq7O?= =?us-ascii?Q?9InTCWKGdz58BQ4DaN+AwgIMgyQScA8lk2GlPcEpPs8dtz0Pzxl6LiFClMbF?= =?us-ascii?Q?nKYO2TWHCRKyIleNqpBXbYBpuDjjTox2miqMgCgfRmFyNm9za19sU90GNQlH?= =?us-ascii?Q?3SShFwjSuSDm6p8UERA+FikqtTzPgKAJGph8wuU/SLRP5BUT9lQLKXysWHqn?= =?us-ascii?Q?IwbBrxMk4B+Nvh9fJ1pR6Ny5U7Afbc5K8N+fwPTyq4O8w3S8tgYH1xeGgHPR?= =?us-ascii?Q?JSDAYmxZTwUHt1vDUtE2jkxHUHTV106GydE9E32iY9xB45HH0vpNlbMf94iv?= =?us-ascii?Q?BTzA6ceLWy4ue9ngKb7pnIbT7Q7HDNwmJT8gcQmvRaDl/c9jz6WmYlxJWfDh?= =?us-ascii?Q?NlywKtZGGWcVf2K2wdbJPUU2RdE64A044FYk7NGhvgMNT2Jgqff8K1M9Xj9b?= =?us-ascii?Q?2abTZ3BtO0WKWRFuR2+Na0QdZU+xT30eQ7Tga6fbk2wlcUfHK+dx3COswHAQ?= =?us-ascii?Q?7XPKAH7DPkfs0yVHLUAh/whoYDyIjkR0kuk5Z+TSv8Uvk6TfL2HTCWjrhvPH?= =?us-ascii?Q?PnOd8B7lV2WtRBtw2AkZ4O73hHoP0V3kFTJhoztXpHnNbZ1W4y0Ay7VmeYPt?= =?us-ascii?Q?QrtWNj2LQMrVsUUM/TeQqWWuKy9dvRkKeEX32H6R+8PcnjcPTPNS+/+ZwXMS?= =?us-ascii?Q?OQKlUO6FVtO+7pWxKxYiskUONTv05a0WZv7v12jwaqoGC7aLSWlSjtrEYMj0?= =?us-ascii?Q?zNTEnaYUlVYIJFNGCvFivsrKy9HEea0=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 5JEhx5BsJ/WaDS2S8sGKQqGfxDGCzrbEtGB5GI4Z4VaF5tSL4mNrDm2dB8yHs4dP759Gm6ASpsmweES2ClvhCheZYgwtNEOglkUr4ldvPjnfe+M5peme0fPgV0h7qe9bvq6JpeiH0ZHdfjyKZsBlqx3MveA+J9JOl42OQSNBrEF+3jg8r6QiV2ewUnZYT81tJcVo1tRbLZBl/58Rt7fElwSL9z1Rp95wA3EVxAzFgnt5WDpjVtSHTK/b10IX0f+3sP2rZaa7683eOk6iKl7Le6k5dFJe6wTO2OQWY6YYZ9p9kAw4oYRmxbHBkZwNLmklK2TQaK7GlLIO2Wa+/7HgFz6PWXIZ1lGPuDiZ7DSivsTx+fqhkQyqjIF1baqEURMuDpazMADNyVson2vNIJwGbEZCbL8xslcBgOE62KNbOgwxUCzdEB94y2ukLLoToeNhDJFk2KpVwF1BZ1My7yAyDCCwRKQoHeY36kNmKNBvIGcpg2IZ4XeehkOB/RKPV6TU6sHjZiGCyXcJxfYD5z3Lwd4c1xv8uzb1jTBil8L9VDEWqieKLutLLI+sbdLG2mgIXdca93r3Dy8bLEwtdOcmZenYOsq7MDSf2fHyW6EjUpE= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: fe310499-aafc-4546-2535-08de74832b0c X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:04.6869 (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: EWcvpjKwEe8QPs62u94/1rFQ7auVarxvF7awCGlFNzITyyD/PBKkKWbd19rE+/uEhVr2ClvozqksmdGiINSJfA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5017 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxscore=0 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=O5U0fR9W c=1 sm=1 tr=0 ts=699f1636 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=FsjrASi-RhFkZEIeDJ8A:9 cc=ntf awl=host:12261 X-Proofpoint-GUID: WeZCTi4Y-LCUzs1Y-FjzYj2SgD69-XTh X-Proofpoint-ORIG-GUID: WeZCTi4Y-LCUzs1Y-FjzYj2SgD69-XTh X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfXzrJoimY6ZMzv W8GhMgcK9XkbF2vMtvm+bDpv34vikEAE4gz691xeJ7KBGmda0PyKRtnjzjCrn4hUjhwFebF1LW3 JdOGuow1Rj5giRr1TEY58fg9luR45Ajjw2xxUPSr/c3dHjYnX3Gl8foWATTQlmkTFzrP26CqLFL i8IadHg6GfpxBDO008PIj1HFDriK0/5TTCz3JdVvBW3mY8pLPGfreaia4e3eMwCftWAtmP09SVf ZgJUYU4hm79OriYI5TeV3XvZ/J80Rg9rfjaqy/OyZYCXuklef/WiwnFSmsT/2QHCjbXOv20udPi SQwM+Aygt4spmW96BEhg16arpiqCrl5AuzPGtQpC1kiNpF9xSBjzlRgf8/2MUwBXVLw8zukRKfN kiA3k2xVEw3qF++Tp/6rrZK954WAkydkDnSi/w1hn4NfM6nFnQKGKIC7ZmhJGSswvUUyWQAKyVQ NdX8N16UsUpkKHuTbD/rV/uqSOrEpFlehy3EjF48= 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 | 9 ++++ lib/multipath.c | 110 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index f7998de261899..9122560f71778 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -10,6 +10,8 @@ =20 extern const struct file_operations mpath_generic_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, @@ -145,6 +147,13 @@ struct mpath_disk *mpath_alloc_head_disk(struct queue_= limits *lim, void mpath_device_set_live(struct mpath_disk *mpath_disk, struct mpath_device *mpath_device); void mpath_unregister_disk(struct mpath_disk *mpath_disk); +ssize_t mpath_numa_nodes_show(struct mpath_head *mpath_head, + struct mpath_device *mpath_device, + struct mpath_iopolicy *iopolicy, char *buf); +ssize_t mpath_iopolicy_show(struct mpath_iopolicy *mpath_iopolicy, char *b= uf); +ssize_t mpath_iopolicy_store(struct mpath_iopolicy *mpath_iopolicy, + const char *buf, size_t count, + void (*update)(void *data), void *); 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 1ce57b9b14d2e..c05b4d25ca223 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -745,6 +745,116 @@ void mpath_device_set_live(struct mpath_disk *mpath_d= isk, } 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_head(disk); +} + +static bool multipath_sysfs_attr_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + return false; +} + +DEFINE_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, void (*update)(void *), void *data) +{ + int old_iopolicy =3D READ_ONCE(mpath_iopolicy->iopolicy); + + if (old_iopolicy =3D=3D iopolicy) + return; + + WRITE_ONCE(mpath_iopolicy->iopolicy, iopolicy); + + /* + * iopolicy changes clear the mpath by design, which @update + * must do. + */ + update(data); + + pr_err("iopolicy changed from %s to %s\n", + mpath_iopolicy_names[old_iopolicy], + mpath_iopolicy_names[iopolicy]); +} + +ssize_t mpath_iopolicy_store(struct mpath_iopolicy *mpath_iopolicy, + const char *buf, size_t count, + void (*update)(void *), void *data) +{ + 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, update, data); + return count; + } + } + + return -EINVAL; +} +EXPORT_SYMBOL_GPL(mpath_iopolicy_store); + +ssize_t mpath_numa_nodes_show(struct mpath_head *mpath_head, + struct mpath_device *mpath_device, + struct mpath_iopolicy *mpath_iopolicy, char *buf) +{ + 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 Tue Apr 7 12:23:23 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 D7BAA36A006; Wed, 25 Feb 2026 15:34: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=1772033689; cv=fail; b=PdWuDYmBlaro6bU7UMMvtSScUbj/qFWc7bImTVJ9h0suJsE3fHdVwzMnjrCOkZrMm7sn+V9JR94d+/TbL27FFqujmdPdaBnHwqHKwRTKQ9lgwaPDEUj/heeHh+NCrsEUYDyQr+6Ku4OELMgScO0FYGdjslhk11QqIiNVxz+3VfQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033689; c=relaxed/simple; bh=8ug8DxoJHvDOuNuFDRrcraslloW76BUQTAp7XkUr3MU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=imhPpo4U7lJ2na5oySbwHSDwknrGoraCAWCEAQvgJ4DOpGSTpNsq2YDl6Z7Nom70wstBCJIej/DiMI373zNXOe/daBoHqX8cjI1MOTA2sKglZ7E4b/2MwZkG6CDjeC0hA+NZawgfr+/VfuBk9HdHesuS2u5BZmDPrPOvmakRaxE= 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=mQKjk6Ks; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=spKCRMWh; 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="mQKjk6Ks"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="spKCRMWh" 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 61PA19vI4019364; Wed, 25 Feb 2026 15:33:10 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=WY9+DSmr6dD4IV6pnHm2HbrQaWIr91Df3hFgiBaU4ng=; b= mQKjk6KsuP4cta+07oHZ6V4fc/1s0g52EkBHXrj1eOg9UbgoFkxsQRedg01OI3nf tvWYzZ+mJpgio3WJn9FKoT50IXDKH859dFrtyosRdjv1SonHHEnN1TiRGKSaFkkQ Qlp92qC0yXk4CwDnS9C/u5GsOW62dG5pNMu/+RY4GFeydn8QLVpuy8f+IhES/x36 AJnWHyf4TgwALTvnoVuMONZ8GGGIbEQgl5AoZXV1QPItX2DWiXvefntpJsBK9STv rdr01gfd304laVm+c6WvLvKRtO9Peqd4w/UnGgpTvX5iZEwTGFoY5aHwfV/ugZTs XxU2F1dM1WCMLeE7Woag2Q== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3a06gwj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:10 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PET33a038418; Wed, 25 Feb 2026 15:33:09 GMT Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013051.outbound.protection.outlook.com [40.93.196.51]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35nfkr0-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IO8v6ZZSJNRAhLUOAsPeMhWpTsjM//kUMfWHfij32UgsatjUr2U6B5rSfQ+w8Wztt+aQC7JkfiW8kYXK2+ExggY1g0icBRNOl9bafgU6LSVXq0e1qwoxBta18bTproDpOrjrXkxuezKiubr7xQQR1Al8glHvVimqdAfcO4TBI+/jKZio1QWcIAha0Gzu1Q/Kbn6DdJOMXrHubELiHl+6479EqPuu2GqeoTeGSjc5MyFeif52uLzscME3NPZfIdEOjcoxkAitJkVBcd1rjL60nhbtGNIVzKrmzDr/iX7ezjECF0Dlr/Pr8k9nHd6A6RvGc6iUhtpKLikqFY0UjmdbhQ== 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=WY9+DSmr6dD4IV6pnHm2HbrQaWIr91Df3hFgiBaU4ng=; b=hmaiLiE6+rUHEt43z3jw7d/CbhpqKVf2KXlrdfBY1ckdCCECvDSum+/9DPWHwz/mn4JNZ/i1DRvUbs9aNx0kE1xEZrk7l8WDJSAcY2Onbyf5AMiwVIbtaTHBPmblXkN/kU5uL90xt/xkw9x6FfaxDGyZ28A2Y5Ol++mRPpYLMh5Xev0anztY3g3UL78yRGTamkZKJRjXIWJiYwe1gJYK7PlFcMHs7h0kJxl7zf0ShQd2Z3YRXJopkhyIqlEeW6D+zephNmIULjXIjjh/pGhAtqPzaqZnEzcMyb7yPruDME0VdRooKzyxTMFGIl2IijSgD2g6xEZgXOhD/T6E1+c7sg== 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=WY9+DSmr6dD4IV6pnHm2HbrQaWIr91Df3hFgiBaU4ng=; b=spKCRMWhRMFhef4gf4YpivSlTeZ+zxX1/P5pJMHaQe+u3iiWRGGZcn/F2OScnfmK6pgj4KggRZRTHUyPcgF+qYwiSNmIsuqyRJYjhqYmn3pCJ08cbvo6ZTrp8gyImqmLbsWE6j7ijA6LrLGXWbW96TbesRdrgEMQfhBiUBVz5Ws= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by CH0PR10MB5017.namprd10.prod.outlook.com (2603:10b6:610:c3::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:06 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:06 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 09/13] libmultipath: Add PR support Date: Wed, 25 Feb 2026 15:32:21 +0000 Message-ID: <20260225153225.1031169-10-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0350.namprd03.prod.outlook.com (2603:10b6:610:11a::24) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|CH0PR10MB5017:EE_ X-MS-Office365-Filtering-Correlation-Id: a56d918c-fabd-46a4-4407-08de74832bef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|7416014|376014|1800799024; X-Microsoft-Antispam-Message-Info: T+w3g2EyJbFmeYU7wQNGJ+Yi7T4KFxbQFiZY5/k0+JFSJMymVEVLEsEVTzQIXiLRLa9GqzGrprPlRd7feta6ZxVfYgkBrVJ5606vGl1WY1wbDWZa/BUvDqr/JWinihJgt3xdkzEErT3UgrpLHH7Z2zzd2pIrX8UymtnUOsDi4OhFd7ny4SeixXW1kRI5iIyJYsINpYJJ3Lku5bNt2s2/SMHK344dEm6aaCIqbABQoNSbTcBsRzgb3TAPtAcvv35H3yCP5hude0teY3YWK3WyDAWoH2Mj/iEEevDPI6SPmnwIpNk3iH0jY8nMehEybRzYini98ifjEWaRCE1O+CTuVaGzBrkOVWM2xI6jZEgGuryPMnKeqhslUKIeB2QxsJR6sB4Ghs5GhajqERXBYBua2IhL/RhCHVApUE12Ege+ehPeUznS+OIMffohw0oXuf0h0Fj6UvSO8QFm4JvCNbS1FwN0kEAhM/+tH7u7Io7hOXJU4pnqrcaPOWeDEUc8IP1tbUafvwmoFQFvJSB6tKTUr3tmfZWl2JTOn/CGNxaOzdik67i+lwZ1E0qY2WsQ01NhoWuHecwr+q26pAmqk20atJKNQFQbaUBmZ9QVw/fcXhmpTGRWxlbCtRpAK8woAFGfypP07z116tN0fKJc50zdX/iblJP+RgJSVrfl0GkFUYOkhOSkoWIugqHMUt+j9i5O4S/6lOOuevldzixkqBexLw+ZlH12ScKQL39gcTYj/64= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(7416014)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AoT9zzdflGzVId04zEYG6R5+/fOIe+EU/PhPEjLeGfURVn14/9lBgg5xUJg8?= =?us-ascii?Q?KLSaHsBVOz0fyTQtwF16nndOZXzENz8urI7iwnaYRX6xDZxL2GIa+Iussey+?= =?us-ascii?Q?8aekHD2GjwDnX6R8KofqG8BRowbUM/kp8u1eXhvV2N829/Jvz6VP9vKLBPl7?= =?us-ascii?Q?qBpyerOFG8ZNGIzyY0TJSefJplL+yVO/gMo6fSQUJFor7ClxQWBB7PwIJ73n?= =?us-ascii?Q?vvNCwdOAUaghU6dYfkOnrHGZBGxG63XnVgDwDK2NAJ3v763IkY2jVxi60mVB?= =?us-ascii?Q?QRlcUPS44ZI1YqIcvF5I6CZJVH5MB+bj/MIpZz5aAn0cmR95uZCVmbwljVTN?= =?us-ascii?Q?PBSc57pre1GiDbsXkYwVUa5B0mQ7Y1JQLdb8BilFWwoqzmfr9Dm1gYbaFpVT?= =?us-ascii?Q?Yo19f7c0/Sc/S6Ds7178XQ3Qs/J+zTfTmTiNNRDb21AjOnPRHcVZLMu82uSz?= =?us-ascii?Q?hFx5Oi+D4JDJeMRYUhlbeJWAzQi14Lv3Iej2gPsXjR+KXuUSQzeIpxLicECx?= =?us-ascii?Q?FySibPqYK1hjo1OyipAYW25CUbDjrqYW1NQiDpWsQukG9DhefBViI/umpcD1?= =?us-ascii?Q?Jy5I3OUrtYhinkVbHtU54rX7KHsiyEENy8232LoxAfodGhbdNT1xcKOReNMx?= =?us-ascii?Q?6Vm55ZkVFak4r5m+CLVduc9vMKQV3+w5CMcGYVTLN5NP1EXoDPXtD8vefKfB?= =?us-ascii?Q?OlYPu930zeVghH399Bn0KkAKya5zUmFUm+R/k545TxoEr4zHrs5gaUiNnqJY?= =?us-ascii?Q?gP5zhM42/1r4I1ejp8g8Ft1i1B5LmOyaaLaG2Mev/eBY9H7ZfW7BAUIhgmy5?= =?us-ascii?Q?CHQari6cY3w288al69ru8hgJUjAzw/qsC5JdapkoweCNLRddQ9dN2zdImpTt?= =?us-ascii?Q?5HiZ1aEot8VRR6bVgOaMom8srhhsntCbyNulo0o37iUh+GRbQ8Dp/MAqM42k?= =?us-ascii?Q?p/2gZ1tkHBCgljSfHpnJ79TXYNKPQCj8cqN1xfNpKtxn3nLgMOMON0Kv846S?= =?us-ascii?Q?ogHvXDkoUlMZh4kAIjCQ8rkQOgnuFblnUOz6nwugaVwJ67UfYf0br6VWcHRq?= =?us-ascii?Q?e5MLcoHOhVu2/+ySVIYPv4HNr0pCB2vCDBYnR7zKXrl06K3E+byvqcC8JWoK?= =?us-ascii?Q?gchnZaa4e30JFrglsH6uXoZCnG9V702e4h4JNQ8m9NV+9q97uS5cyzk/Gr0C?= =?us-ascii?Q?9kxBGsjr8tMFFnSl6Q3WEOwsHSGhKKhuIdFnmroONFFzygUeWBhXyXXu3YPx?= =?us-ascii?Q?XrIyBFRMJ8JSkDsXAE+LFpTkSJo/lDieQBi5uwaSRzMzsg4e8txznXq3VXMM?= =?us-ascii?Q?S1ARPuERlryRcFT7WERxn0D6RTRRgh8K03FKro6BxU+An8uok+rE0xD+mYEA?= =?us-ascii?Q?Ix+GnvIWtbkoJ8IXW5AWdUZ51S/gDoiJQ0jGg1uqLb0wmsLLiABt4oeM5m4S?= =?us-ascii?Q?x3XXTYNUkOACTkZed/TLREJ4dvoJlF5Wq/f2YJSGgXBN+YdiPHGmYT/Lde9O?= =?us-ascii?Q?Z+qFm8+/Z6GDUeVg1YTwvH4tRJvn9o3rYcgwm4311rlyl5jcJucBD/pNW1au?= =?us-ascii?Q?lE/+TQWbqFjxmAnvzIP0IynUUJW2Vs2fiaIj13cxqC24dyek21h2r1tT9DpD?= =?us-ascii?Q?eD2boH/xRHD9G802nzIwKnm92bj/NZGR6bEDdSAvxdj++LB9uQ5vd0JOuJR3?= =?us-ascii?Q?ZEsiC8Y3cufjd8wjr4iBnjM3022obHkpUho4JfyMSAvJMktS12q/Tv9ACRvN?= =?us-ascii?Q?AGLEGRA0o7ZBGNfPtTofp4O9MuIGMpM=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: pAwUAQqrgSR2hlBW5F3fkYB4MVcYl08NNyoljBkig6U7BGQPVNHI6F7IvGzk4aY22plyRWn87i0qb45pbLcAezaLpwGn3Q+Lxzh8DOUg7KcSDD5yey/aHP1WZfVuBwI+oZAeOG0vTbnBFpYo4MKKCNeNqBPU9Zd5ix/OL2PRwApv3VB0gP57IEJEVs30O5z7Rpdoe5PHbMETgr/XEIlak7DMM+7COfxU6if5FRd294UmLubnkMNSe4QN+g6rHTr/wzEB2mua/pPcmuFwG1wqvheiTyGzzaJ0e2p5TjWFU11hXceg7KB6FGyl7Oss1IGDyzSqLHJ2h3ywvCTLMyvD7fJMQAR14pb0HNg/x3DOy/UprvApMpyt+3LePFmMhofSXYtoIbssIzs+fbnWVopP+qv1UWjafr6P6RGDx9TZxbJUz4QPPxABGOwyZBt2im+TARhFSrTSG37gj8jNRTJR+gPDmsCTw2DXaIebebhm6sFE/louG6PYmk4pm+vH8i2YxJrphlprBSNTPUr7CANcjN81AR1Do8HufePR1+0XzTsi//tvJINHtKVF1o7lBOCsIWMTkSsMNTsCcqF3xqCKZw9to5NPYOuWw6DKTdQc8pg= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: a56d918c-fabd-46a4-4407-08de74832bef X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:06.2620 (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: bJTXTCuXaHDdr6IosbRGxhU5izQrP8LliY21QRMArNvk6mMhhTQbRESY1oVb2LUt5l9RLPdKGZv72SFCYeN5JA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR10MB5017 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 mlxscore=0 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=IskTsb/g c=1 sm=1 tr=0 ts=699f1636 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=1b2vl6qibDn9V8LZfFgA:9 cc=ntf awl=host:12261 X-Proofpoint-ORIG-GUID: vI0NzMzja29FrAsWUny05eEEJ7o43KZ8 X-Proofpoint-GUID: vI0NzMzja29FrAsWUny05eEEJ7o43KZ8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX7XX7pI73xXsH zhIuNioQDi6MkDqcuUEzx4F9XKwVL/1NNVoTXlywXOuWinjJnlBSn6tBuiW5Uy7cinVK4bWbQ8M 2vxGU2M42Ve+6uCY0sL6Xskl03ZKhYVrtpIIbl7NMN0gHXRp6NyunzQjhrtJRs8kD9H2rsJTPtU RZZBKKR1epT8IR37CuALS9BU0q7qpnqAHBO6Jp0UdDJjYOOZVYLgeirsFa7DLkOB0ftD9+Rs/wu qJhZw247LPbYKqeNtr4YRJYsoFk5uWg92tp0V8e/V5unRqX45FnXfkH0WB+o61kYEelCPZeKtlR /ObRNBWr4lFOTOTA6TwGA5HfI+wEy4m4YR3KMEHRmvZQiRxShnUizwLyec1opJMSrU+LsOxRx9V ctJzUY5REboUMVRPhSz2MwZqWRAk31CN4J/nZ1bKpx0+ULpUNxytfWMjqfDxhCc3jm1B0C3Aitx QW/ikbbqav7wzpsd84UePcE4LEL3rpYx4eL57Co4= 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 driver version of the callbacks for the mpath_device selected. Structure mpath_pr_ops is introduced, which must be set by the driver for PR callbacks. Signed-off-by: John Garry --- include/linux/multipath.h | 18 +++++ lib/multipath.c | 146 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 9122560f71778..454826c385923 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include =20 @@ -48,6 +49,22 @@ struct mpath_device { int numa_node; }; =20 +struct mpath_pr_ops { + int (*pr_register)(struct mpath_device *mpath_device, u64 old_key, + u64 new_key, u32 flags); + int (*pr_reserve)(struct mpath_device *mpath_device, u64 key, + enum pr_type type, u32 flags); + int (*pr_release)(struct mpath_device *mpath_device, u64 key, + enum pr_type type); + int (*pr_preempt)(struct mpath_device *mpath_device, u64 old_key, + u64 new_key, enum pr_type type, bool abort); + int (*pr_clear)(struct mpath_device *mpath_device, u64 key); + int (*pr_read_keys)(struct mpath_device *mpath_device, + struct pr_keys *keys_info); + int (*pr_read_reservation)(struct mpath_device *mpath_device, + struct pr_held_reservation *rsv); +}; + struct mpath_head_template { bool (*available_path)(struct mpath_device *, bool *); int (*add_cdev)(struct mpath_head *); @@ -64,6 +81,7 @@ struct mpath_head_template { unsigned int poll_flags); enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); struct bio *(*clone_bio)(struct bio *); + const struct mpath_pr_ops *pr_ops; const struct attribute_group **device_groups; }; =20 diff --git a/lib/multipath.c b/lib/multipath.c index c05b4d25ca223..8ee2d12600035 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -472,11 +472,157 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_disk(mpath_disk); } =20 +static int mpath_pr_register(struct block_device *bdev, u64 old_key, + u64 new_key, unsigned int flags) +{ + struct mpath_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_register(mpath_device, + old_key, new_key, flags); + 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_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_reserve(mpath_device, key, + type, flags); + + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_release(struct block_device *bdev, u64 key, enum pr_ty= pe type) +{ + struct mpath_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_release(mpath_device, key, + type); + + 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_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_preempt(mpath_device, old, + new, type, abort); + + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + + return ret; +} + +static int mpath_pr_clear(struct block_device *bdev, u64 key) +{ + struct mpath_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_clear(mpath_device, key); + + 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_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_read_keys(mpath_device, + keys_info); + + 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_disk *mpath_disk =3D dev_get_drvdata(&bdev->bd_device); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->pr_ops->pr_read_reservation( + mpath_device, resv); + + 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 Tue Apr 7 12:23:23 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 3E50134EF05; Wed, 25 Feb 2026 15:34: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=1772033688; cv=fail; b=BgXNyOTZuceBXxXb+tfsEcnihi3d03h95VzoFkMiBCQn5OdmrKjGVrbiI+XoyS690IUVZgakpdL7UGzMbUTCMC9I5GdhUF19uf78U6aKon0WTf0qcsLijWNzLNJNBxGoAHVy84svI9hBU+nnlS+b2ian2lTYDPzP2E5i4FUgZkY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033688; c=relaxed/simple; bh=HWp/8F2/KSt/PYmKtaJg7t+PvM/Lx5qHKs/eqPiGIpA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=jm4INPZ8U63M3++S/0V16VItIqH5kbr5OhkNVaF45WVLow+gxR6wH0re7TkTD9jVK8C0vb82pWgUVBy8Smy75KJrRGUf4bz6xKAvw9N83hQatEQh91eAo0Kz+ilVzLQlUcDwmzwVpDSUTbdDpxJITH6Aft8j/A31cIrWVcvu+mQ= 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=ENSGA/5y; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=DOg5LcnV; 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="ENSGA/5y"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="DOg5LcnV" 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 61PA10S64019325; Wed, 25 Feb 2026 15:33:12 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=sQU07vUheAsYkUyfCAtTf2Ha6sRvtwEPVUrgsTH7d+s=; b= ENSGA/5yA9UWc3qKwtqeJeNQHzt6ucdshFnpHBph5w9Y25WkClNw4KtEJS1eOoYv 2VvyPhts0ACRs01Oguq6946qgsDf5rRkcIuqs4Y/CSQarOjIpx46BEhTE05ogpVr UIeIpuBxyBM6gyBMpy4PvcFMnN35xisbYyyrLHa35SxPBkVjLm26T4AhkjI7gt55 ockSDTNgBsRh38eErtxr87+k9rdP0AFhKgqIpKrx1v3ezVmavcjBjnrSmRHoNUKx V8i90pXoOudtOkF2CjV3N0jRuuMlMsiEkm+1konexdzjioqbysxrIvTiXb4J0NC0 SrXDdamuOrm0kRS4oR2SNw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3a06gwk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:11 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEE0ZN006327; Wed, 25 Feb 2026 15:33:11 GMT Received: from ch5pr02cu005.outbound.protection.outlook.com (mail-northcentralusazon11012021.outbound.protection.outlook.com [40.107.200.21]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35bg51d-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:11 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FzoWF9leb88veGnRXFPDodloOr3q+yI00Ys7iUigOa6hvEUnb7wzarwmtsas6IuQoSFmiMrhPSVp6t4ldRqHtOo+fdZQtOkToiVHLhSTZxhx5251kooqWueCsY/cLfF2lFkttUpugDge8VbOVn2QasL3TveqchonR+KLyIxGxbh7eptt+2GQyjwHrWG2OdwKezTcGlEHj3UCDN9uLYmVcZhxJSBKm93d845UVCRzOpUW1qQWh/IRgXmLLiNOlwwq/eIYp4HPDF+JociEfnDw3a7MZj64mUYC8iNPV3OH09q3lZuOeizkSS7/nBkmQXjocrSxou5ncetf5CEevsglCA== 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=sQU07vUheAsYkUyfCAtTf2Ha6sRvtwEPVUrgsTH7d+s=; b=CgG2zde2M1tGaWS8EqzxUk/r02TvLdhxK9S3ZmQuUEzLHxa7tKUF0yoVBDV7l8dx/uBQAePlLjJYxBVUoqqSKg7VXSLGR9ptz36JGvqWVhO6yRuPgSK9cvfEUZACT6uP8i9ji/dbn5zQR6hd5OWr2TN8AotKTWaRIIuoS7D3oCNpQj4AR6cuegjyYLFvqZJ77lxq+RZ1stuIT5W4/XQyHgyUm1eYbwc27PLU1pJSwO7/uR91FsNqsWJRCVjvtwmfNJlITklqklTW4+MSrN+hYQ2VDqZjlXAblcdlPD1XlePOqgP+VtDPQ6CiaiPQ7N6MXbx9OKk/u4WIUkBhrCQvzQ== 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=sQU07vUheAsYkUyfCAtTf2Ha6sRvtwEPVUrgsTH7d+s=; b=DOg5LcnVNFbck2a2nhpm1rni0L0fz2pBMa9xowJYbS4WVuYjegqQYiiJeoSOG5mp6dOxCTkkc+z+3Wff7o7xD2dpdJ/h1VZGJms6NM9Ny5xEJuZuqQRJD/S2Rz1aanbjNXhJqZdxPZHp2LoA0affmDIYnPIgHjjq5OOD4/cCYVY= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:07 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:07 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 10/13] libmultipath: Add mpath_bdev_report_zones() Date: Wed, 25 Feb 2026 15:32:22 +0000 Message-ID: <20260225153225.1031169-11-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0PR03CA0265.namprd03.prod.outlook.com (2603:10b6:610:e5::30) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: 5275fcfb-f158-425d-2b5c-08de74832cde X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: iLnLO1guR6IgKKncoY+QIGzhJ659m5w9JOCxA2dcCTFWP/CdQrEHvZcCf5yUIEtltQxUfM6RqIJ+SDKgLKo3TzTl808shfbOyfAec3SJYsNZA6eegxAByUvTLMta2l8NsViJNijKc+l0/ceocdMyjC4B2g5ofYFDNL7JyO/2+BaenPaJ4ODs0f2SZ4yST5fd3fJ1gv5Eat+X1cErQch79r14YOBAaSm+i3JKgz6tQontXBrczQ81WLVHjmTAlnyOlDfIq72DNsFi9vOnBYJbrd1RCjTTzCws2QmzL559gvxssUvoo9RzH+9WgchrdKND03MC01yKkMmIQDd5ivyYzZ+KmnD0v1NEvW39xVhi7YCszGkfD94OWRGHYC7bI4w8AnHwjV8qUXGaI1rke5QVVAnCxGFsNqiUHj6J538rvn9bHZL8Bn4ob+ACcfEwLFVEqzSq5iFEvjkkjrJZ6B38upIBrQogdGA/RCzmMkFRKXL4HhrWTCKzCQ+3v/vPESAXtcGVERHEQZT2/MSlIK/N68u+ePloyHu8A8T2LIXmbcqFMTSbtepaXI/ynSLMMnPxFNQxV2Am2eIWzx6y0wPmByO4Zd1kKpkWRF/73oGSThP1lcWWJ3S+Y3QXB5ovL5KIdOYobv1kXBu7jomEGCyWmKlAN1zbmXNcy+RUPA5/T4jHwQr0lpIOL1fVNYlO2FdNC5qrKHo7H0oYo4eFMNfPVbeCcOUbGEwNskA2EyOSbTA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?phQSG9TQr4oVktvzs64ef9FBT932c1gNFOIePp/P+yT5SiX4k8O7AIELvC9D?= =?us-ascii?Q?cuV7KjhfvsxfKMjsJs2SQswspttLaWoPfD8ccGdDLLxoRYm9REJXeFQBp6Ee?= =?us-ascii?Q?RKTrnXKzwXkxUkCC9SnI+WXWJuuSY3DMH1p7r6PnIwSK68Y1yohrC93t8+38?= =?us-ascii?Q?aLnKau+rueBttdXs6s2KVgQ/6trhf1s/ER5UX8MYxJONaXKXo/Y4skT3/mwD?= =?us-ascii?Q?d+nC8Atw9foLESFVGl7aIjDYWZeBAkYUqGFOcl1RUn/NINPATNKdj+D2PjcK?= =?us-ascii?Q?5NHbz3ak6pZdBf2OEvyZmkdOI5bOBSDDtiKfi4R7DPXzhsHG8gXKb2xntRW8?= =?us-ascii?Q?MIg5AiogIei3kFqjB896filgaPafZMWOiw91z6k2Z/+s0bsIjkAWrjSv9vKd?= =?us-ascii?Q?3eXGuTsY7l5ZrxPDFcUm5SH4gWo585JSDr3dAdH0jPfjAlr734r4bImtJl08?= =?us-ascii?Q?v9joH44tXh9CSwGZJrg2VP2ZdlemdqUfFQ/7kAskxfxCe9YAbwTd6ygsFaaD?= =?us-ascii?Q?yMn4wyxyhDLqNd8Bb2VVHTA28oAGoSEvJja3Isa4m9CUigXgV7UA6szBYMON?= =?us-ascii?Q?MqyiP7aMvIXnChTqp6G9A1OoCOVsjAm8KJpn1YKwUjTcbU35gMdKS7GIARH1?= =?us-ascii?Q?zhfAxQ78BXQ+j2d6M5C7xQNpYH5fjm1R0hNMNFuxj6/oYPCHgmAyc9n/KGL5?= =?us-ascii?Q?+NW/xnqD05nYtk1OyJ59KyT9zIiZdV6GeTNzoL1GxQ8rtENP7jPHikPbQI4z?= =?us-ascii?Q?ZPbvU+BNoGM1nFPUqslzJNjd5Lqn15agzdXGoZ4a+NdGrbGyBZmNRKJ0+j3F?= =?us-ascii?Q?ULnjEMgrGcvjiE9X1wibhEhVrv7ZH83vzloMslkcmQLETCo7i7mMG7Ge06OV?= =?us-ascii?Q?s3jr94M6SEfj6mxruQnhdc5H18v84hevK5EmF/g5iTaHLyoEB8Z/t3VOUmNT?= =?us-ascii?Q?3w8P7YuY09AeNnYZyKXkhn/3ZnSQTZ8t2YaB6/PlMr/71kfxRA2S6u+7qwps?= =?us-ascii?Q?iQ4WYpZqropfVK3oy2nVNuwx6tZyI39h5sqZB9oCsLQS7SVZGMu/01N8beH3?= =?us-ascii?Q?YZYbbOCIMqcvugPfW9GH/lYqK3atuGCSQ7QgQkpkiz92RRs/c79jvblNu6og?= =?us-ascii?Q?YJon/MadBB+KLG/aIAw/fqmCz0za0EHNmdgBMdHHWKWHxTKttDhbH81VyqdF?= =?us-ascii?Q?0Bq4qHA9sDydZ9psamoh570Fsalp7e9VuJkjuDhJQ8p0gYSuFIYgR68UQUkX?= =?us-ascii?Q?aPZpefWkgdtP1/T9hhCSbF5eCF8GLDSLCU45pl3EQuDi+nVQlpqs8rempIOV?= =?us-ascii?Q?BVd+SWSXwScVRZD2HMvYSPVXTmexoXljY/5keeoqARH/cqL9mBlW57PAlKc9?= =?us-ascii?Q?sZM2pFPkTIV6P+9sn14X0X1u4/LnK8bt7hdgO6FEIKuSkvKCRiqTu6//4Lvl?= =?us-ascii?Q?9X7aNo+cdXD/smg+tB63MrzNzPzemKUx77Neo6L9tWYwk3L4FftzmgWc4C7k?= =?us-ascii?Q?BaQS9AEW58Jmifptp8s6Dhb1aZ1FtavAUEvmnLfduvyppX6OWreraJ2FoZnm?= =?us-ascii?Q?rNztF06sE0jdzCQS+sI2DXq2zbS4qB7e1UiPPtXHlIP2G/2JgfM/2KNZLulv?= =?us-ascii?Q?JzGOFbkX+BTe86wLlMGu46mxIb63kq/UyGCUGVbnBSQGbnM2d3Oq+mMprNrh?= =?us-ascii?Q?HbaUipgKu/7NWdEas9/YJmHcDo3uvL2x8JqWriwQMZtoFUcy1cjshJt1umnx?= =?us-ascii?Q?m0sA4LDhiqCCMJr9fDcwfn/a6vlRwd4=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: ugzIRq9ROXuuN0YxGJyPGEV1C9YAg7H5Z4fbIuwyx75aKSJtBGP1sHcBavyQg7gKARkygzJLfdPCc7Ay0SY6wTBv/Oc8V1mT1gF2ykNlnZenkSdzOrbGQU2kMfI5svL8NkwsECW8KHCtY8u6xAS1XHhe/6YtqkQz54yHZXnMgWSgb8qomHyJNyxqh9HJxf7UCk4uLD00Pf7ukXhpFjBT9MALaIOfDusGU+YQUvq+kSKM3GZDbkuQOP8fzxVRsvhsQ1cl17huVvNeKrCQxHYguftO6xkk/5nwWFDRLuuSb/m+Pu50Bm4QGEdrweRNZOx5U98y2NuiLMrFfeNAyqvwLd9SHYnZkCnoQveWvcPdRyN/S7HpOQ3w9vMIoIlryDDnNa/xcjtC3P/Q5iBZ9bs1xUdAmb7nLxveQAmMNoTWB8znI4EZItUgRl4op7au2rZvbJUxj5x/PGXycW+Pq7l81kyn4pBknLfvFEfd3cvSezgNqkYrYgqvHLHFJ0UIgxA0JdvDnAd7aiiZmeWO/mCxpGEFHlHE8zUkQCOUd/WhbY/G7a+gWc2YYR7afCcmI5LUwAkbMzFUVYy7sDyxV7MpDWcpEbCWSBYCDD8gNU91BpA= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5275fcfb-f158-425d-2b5c-08de74832cde X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:07.7282 (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: O2UTAk4BBDlPcIOtiTORw/6STwZxDnteaz1mqHtU3+nfe5AgM3iu/NuSSV7pnFKbEdATg7zNMvOBmm+Qz6Fk7Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 spamscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=IskTsb/g c=1 sm=1 tr=0 ts=699f1637 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=gdRrClqiTsHH2txTDKwA:9 X-Proofpoint-ORIG-GUID: p8IABHmkSdtH5fCqxZc9bM7XeF_X3I5Q X-Proofpoint-GUID: p8IABHmkSdtH5fCqxZc9bM7XeF_X3I5Q X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX+rWvNPSC5trQ 1V60UPFS5rglR7xcNrBHMgtyKjQnt9Pu/zEoiro93YpRjtFW1u+TyY33/tlpFtWrwl7TxUMZNyX S/hJbo/lN1rrTbdonP1ieTokk6WJQWH/pSpMkpCRMcSdQQi/1FiYhie0LSi8BeLaKPvzmNcGBKt Xc0PNsu4I2g25f6d8zhj6B46n41y2cuk0CwA5XJgsHGVQBJoC7bG7bdMqB3M6E3EFMj2+vjkgtH 4lIxCJ/2NsFUwmk6uA5UH5Wq7+1uWwHvyPcNkYBE0FjHsTvTKKYp+4qRUY0J7tKIVexfOZltWG+ 5Snws5/c+82Ov4NAcijzSKr0sCc/A8jpWBi4pbeTwL5wo58otkLo+gqGm7SNDiyyZpo5Lb8f44L hqfwMNWo6WCmG4b7XbzECmVi0ogblpmvV5556Eb7BEo+stpOezVxfvEY3CZ2rm9+bAykS51CKty i0olPQNOt0YUl4MBNqQ== Content-Type: text/plain; charset="utf-8" Add a multipath handler for block_device_operations.report_zones Signed-off-by: John Garry --- include/linux/multipath.h | 2 ++ lib/multipath.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 454826c385923..3846ea8cfd319 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -74,6 +74,8 @@ struct mpath_head_template { enum mpath_access_state (*get_access_state)(struct mpath_device *); int (*cdev_ioctl)(struct mpath_head *, struct mpath_device *, blk_mode_t mode, unsigned int cmd, unsigned long arg, int srcu_idx); + int (*report_zones)(struct mpath_device *, sector_t sector, + unsigned int nr_zones, struct blk_report_zones_args *args); 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, diff --git a/lib/multipath.c b/lib/multipath.c index 8ee2d12600035..4c57feefff480 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_disk *mpath_disk =3D mpath_gendisk_to_disk(disk); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + struct mpath_device *mpath_device; + int srcu_idx, ret =3D -EWOULDBLOCK; + + if (!mpath_head->mpdt->report_zones) + return -EOPNOTSUPP; + + srcu_idx =3D srcu_read_lock(&mpath_head->srcu); + mpath_device =3D mpath_find_path(mpath_head); + if (mpath_device) + ret =3D mpath_head->mpdt->report_zones(mpath_device, sector, + nr_zones, args); + 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); @@ -622,6 +646,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 Tue Apr 7 12:23:23 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 DA16C3921FC; Wed, 25 Feb 2026 15:34:48 +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=1772033690; cv=fail; b=h2IEMGgB7Jr15ri11WKV0D5yZhwsdAMLzSVgBTbDayJl/r0JmMTGT9tetSS5jcEg/ltv2UtVv291uO8giNzypsyk4z4BtCprjI0HHGulvABEz9X0mxWo6Ne77I9mNpClzcxiiaB/+4pI8CXEkh62YPmB7umEaYP5m7L8os8PUdw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033690; c=relaxed/simple; bh=eg3E7knL45WpbrRoXRHb5W0TxWZvvev5o3rh7LKJWlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=L+Y0t0LOpLdP5QjUbsG5cpR6hXMHOhG+EcmsqM2OgVhpzbJi253W36oV380TcFHWLCs+nXF3SSER8hR1+vUNvoO3YIO6QmxPBdqQ/epVaXkZRH5g41Hf5PuypQpNXf+XA+2gTfTq87+26p1iX2qudkqdHTnM+7kXyT1wSeTQ6rg= 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=H9nPUqp3; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=VngltbtT; 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="H9nPUqp3"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="VngltbtT" Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61P9TrFR1959902; Wed, 25 Feb 2026 15:33:14 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=t+4v5/q0Wif+JxoAXxp1VL3U66W4APvpKrTun90r7xM=; b= H9nPUqp3fUzqMY7jYxtcLrUdrGwi/4tyoZTjkr1j0yWC5jJ0V70v/NXsf+KK4SIy RVL15ZuE071ObQbwA1JA223Rr9NcjWN6V2pGne22RPuGgOssmCUm/lfoN4APftOS h9dvnNABCRb5WHvaDPE4hnV5oODwgL+yKR09asEZqONofiLnsOYi3x9VnAZoQpQc yuJM4uyffQmXK9ojk+3ACYlDtsZuynt9tGs622CNtJb7DFUF3V5fIW6FT4erPhkB 3lgO7ztIfBXc0u0oIvC/aKnghe2p95Waq4rUK1QawHGKac5fhwA7Dc9YbwKucVhP ApoN724OwHSddyh6fDz1/w== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4rbeg9m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:13 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PF0tiv006261; Wed, 25 Feb 2026 15:33:13 GMT Received: from dm1pr04cu001.outbound.protection.outlook.com (mail-centralusazon11010046.outbound.protection.outlook.com [52.101.61.46]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35bg537-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:12 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iVM8h8HqHQsv6oYBSvZKBqqOCD09MDbz5FmJXag5F1PMiCppMsFF6ZAA0VwjT4XC4E7CxHwlvxbhmEKz8JMlCry6nc7ijfr40c7x6e0WBT0oKCtKkMXfWnBCu24kj4WM0v3u7p0LnJRBS3pFnxmD/gn3fVPIaVoo1bexGG0DDzkbcGA+PNy3HIowzo32O+qXn/gvnnemPGgOQRNPeGdaIJqxqzQ0LqrrQlfqSN9rnfrGKl2jcO67Ib/sZPmF9tnBiWB+PzPXrlzD1/MlSgnihjeyO7sNDPHPbEAats/dBHqdFZxtk9Z2puRg1AkWu/QsbODYWgUmhOCsyeIrESeBSw== 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=t+4v5/q0Wif+JxoAXxp1VL3U66W4APvpKrTun90r7xM=; b=xiwfKaqVDEACN4Xc1kMGQetXdqdVaQj+JC0nkIEPE0dTSQiZva0ss6wKHlEOrUsxF++1VkFACuGwYMf1mLih1WXdiaN1H56k+yQueQb4l6iNcpQzf1A1l+zrtPLwGDXgmL+1QRaEWwWR/IZbsrOnnarzuGjUAuuLuaTzZod3amNOEuFAkEG6cFf8DecigvS9psHOyr71GyzMBWQ/CspWbMHCdp9PLjjE9DJClXqrh3o4na5uxvlRZk2lk6/eLkJMQC/zNxwuUat6aD4E/JRcfQpHcMJ71z9hLWgC+u4sxM7nKxAchh/pAm9gUKRw+bmgZjf82T9baK8zhTE6Dt4Zfw== 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=t+4v5/q0Wif+JxoAXxp1VL3U66W4APvpKrTun90r7xM=; b=VngltbtTVLdoJPJgxU3HtMQoz95oCeVfk2iJ2jBHXe3I95/aoQIx9fVkGV5OUs2eL6Fuc8c8+lG0GnkMwI4c0vQt2a4/zDrX1SZdjZI9ao8VL5l2nWqHdyMZptKR2+bD1qufEMWDsRf7hxTv7wNbx97Z1B64lsUtIrgqOcS9UD4= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:09 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:09 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 11/13] libmultipath: Add support for block device IOCTL Date: Wed, 25 Feb 2026 15:32:23 +0000 Message-ID: <20260225153225.1031169-12-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH2PR19CA0011.namprd19.prod.outlook.com (2603:10b6:610:4d::21) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f3f2a3e-713b-463f-5cd1-08de74832d9f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: Yx8BniJzWo+R16V5+OrQIzU8gI+4wfUNF07WWLmvOGPYbeFp+yw56LHPAjyhLljriUWyWqmfv/lK1SzU/TDS4OQnY1Dq/B3bWCNOi5l/X1x6hmmbN6fHOKBmzctG2OlNUYacKEtlX0DmCine4Kc2ZR6kKxIsNzOVzcVKaGSdKzE0Wl1Is/PEgX9drX2U7bc2QjqYebuwBfjdcwybfYf+Phe5fuKSfpw/VZHZNKK/ls00IehtzT4713rKuMC648yoSmfREEXziw5uBddlx7mp4ASvp5bh1O27iI+Oh2JM5NzKcjYpAcYTYCRZkUqsG6rbjl6v41X7w/2RHM34zldeUi5rI3KavUt+ZKCtuBoMhFQMQdgm8H0jZws0tr10op8n5v4XcYipXOlnGfpy04m1syqitTJfD9Y8oel0tD1XEf80KZR2K+cM0V340v0dMxBV4roai1/tCri9CyJts57Wr50PLgOxgAcLfqsOb0dt2cZ+/lWwpUs2gj8NSm5d/PS7yAiA6uouPfgja2XBOovI7CyRHlOqfXQu0U3NJ+qbcaAZieEAbFjMrN8jzHVVrX/PoBzH09xxj5Iy5yMaL+MHtxujqw2oYHHByVlZphUuihKDtzPPefrf5p2cct7CuiMGCJ0fvvMEzyBYXOMDOFDoSyCxrUSjxVJGUMfymBMMtt61xg9dS6VGfCcz4L/F8G87ZkxO0kMubhrB9VLJEht/haBRfIo5nUYMD/RpsSdnDOA= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?63kmcYKEkv3o0ZCVZkYua6KMVqx6UztZL+rgtGrZEzNNq02ZzVP/fk2hBxHv?= =?us-ascii?Q?xwjmHS0xiQPHA7y1mgGFhfz8Wrlo/rQqXSkaBc9o+QYtxUtsGC/YgHrfi9V6?= =?us-ascii?Q?9rMAArDk+seo7/xWJCfUixslTB1e+xCR+k3LfNh/0qAyjNIM2ejFJMU/uOq5?= =?us-ascii?Q?0BUhCRcnXTx5vnfEGkQnNY9BeS7La4lAofIE+zFFk6qAhGu0fKVITRL8El6e?= =?us-ascii?Q?xhuO8/SJl6YLYN3vfaWdmEZ/vreHBF7Psq0cjajUoS5cfT+jBWXjUh6lIYBR?= =?us-ascii?Q?/XK/5PmyJELKBB73SNkyEasTcPxrttRfymrrOCDOzPS/eAKDGiHyGh9730XO?= =?us-ascii?Q?bfwnWo5NajeAOR+/dZnESsdz1ynuUe193Au+iXjPH+JCR/ZKrZ/6bTHg3eBE?= =?us-ascii?Q?3SoPzJdG5FP8Yclerfmu7ntI0omsAOw6lkgmHew4WQyDySFv2XLcdPkdWLZN?= =?us-ascii?Q?/LQn6enuJZLCsUjhMqVkz3klXbfkyt94d7GnKDf3aRQs52l31WGWvSlTTpSZ?= =?us-ascii?Q?V/XaKVoU3THtqo2KfcM723F6xUNmK5yL1ZwVHyqC7O9UDFJE/Ice7FHFeI8J?= =?us-ascii?Q?KdAUUhX/s7VX9sVL4s7HmJjAGzTT4cUgzg9pnlybhJjzMkUJzOmk5WY+yjC1?= =?us-ascii?Q?H/V5BToiQE54oo0JsAHUXurDyWHJ2e/04WFRfTofp8Rx9MejqZPq0tZzECkt?= =?us-ascii?Q?vaVPGGVpnzsYaARbOIQJpZ75zMXK3pejwraYWihNDqLpbG5UizxAvZFME3qU?= =?us-ascii?Q?Ow9YhCH3tBZ97RkpiNNDkCLSxAsAXtSz0B4lznwukImBbDDJU3OlYYfHLLTm?= =?us-ascii?Q?k/PNAXUzKxjMHjnkgbfnzMgN5iRumK4/KWfoeb7HvW+dp3Slt9SPQ83ZrFgy?= =?us-ascii?Q?yGIxSuqe0hRzF3xeJlqeBRTKBui3Un7KDC47nkRvkJfldGLgSbL8m1fzp4ps?= =?us-ascii?Q?+0t8+VkzO9F8OjXd0SrYURxBah18nisgOsiM6PLwMfQfmJB4acqDK4WAG042?= =?us-ascii?Q?Pps4YGTDHNXUX3GfLR9p4w3j5cC7q6g+Sft2v3GV+Csl13//Q3JQXo5y4/2h?= =?us-ascii?Q?6NBuqQITOxtKMFDMextDcEtwdV9vtKvYxG2WHBKaZxYcpbouQRg9yOadM7Vr?= =?us-ascii?Q?m7UuNmOs8SutgvMIaEgILYE128YkyfI375iOmAUjiYJshMYoSxZLabVCrOSu?= =?us-ascii?Q?U1XSXLAmN4tiQUjZS8Tcg72vGuk7wgL5I3XkxYp/xfY39dAezr17zhhFRDmS?= =?us-ascii?Q?iqiAyb99fHDFxBCybd/ATGHCmIx7sHWUhbtIWt2WAXHQLkhM+VEB3tn34PbJ?= =?us-ascii?Q?CQhFrcfrnbFLSxCo4VWQ+FgAihO3pKyN5zxaqSdy8XltCh0a0+7AoTlj9qpJ?= =?us-ascii?Q?qMNfV/HSBDqFNukyoZhbOhuGn2fZsCpaO5LZu95Qie1MwkzZDnPi52pOnM2o?= =?us-ascii?Q?HDQhBsEDdQjKqIJpjyPOU9l2r35TjwBC9L4yphcLALR4uY3s5qTe6qM6MyxK?= =?us-ascii?Q?zMcAVDpj40zEkzCkNMBYnwU/PLEPI3W5zGHt6QKfmvjMMGa/eKgeHkKQSPJJ?= =?us-ascii?Q?QliKsi27MHp3GwoNGEOpDZY/SK9IjGVn3UugWwOPJmsZtc3WadSIZ/pcgCs+?= =?us-ascii?Q?rkkSZZuih/Mk1/2ypSvMNsm1R+G8wCdkZNw9wT1veSL0Ha4mCWTbdeyCtTUo?= =?us-ascii?Q?dTW4PKx2ZoPQF1n0FrrAiXBRNiAHwPbx+HRq2IHUQzHY/lVzo85Wx7mvAfI+?= =?us-ascii?Q?c/8bltm552HHVhoWUuNoxG8qNmhz1w0=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: +48MwOQwv+4ColK4v6pndL9pdoGXJy+expxfnBuKRtMiAT29dz0biS0afO0vX1OvLiY0c6mIoqRa+pkjmO3rF7c68GqcvD4dQvzWfkxRvtrfCQTodkBD2xj/+nVnN74KhvJlt9H2AcJooYQzNf6ezvBMmKSDfR+pbmEhLNX9KPeKjHJFHokDaj1CJOqW25wjV5vWOUkHtUU9foKu9EAA3UDPna4xzRB4kNrarrD7XSf54geBEOBCfoBH291tuUVJkw0/Nq+Bt3zqW1zUI29t8hMI8hx5jB6JxdSK2Ufwnm0/ViKVIcLwQn8rTcuREyJGiAl7yOY7LI9MWNEjNj/YipKNN+gNmbXILvKVf0mQMfzpPkCrP3f4C9c0aMqVGHrx+gB1X7EI23h5VO78pVcNUkLMIAS0I0lQzud6Ck1XAVVd7wxSpwojUJfLLHd8S9LSrfBatKOvAS/pTLAvVV0RwQbrYIuv9HViig+yeQCpq5BTWKgTuGLJFGbHXJBT4lyt8oPswSPxygT7i+XBW1rV2b0gp0pr8Ks34CGSb6LEtF51cGjnBuKeZu0KYc0/PWzJCd02wxsI7Qy8mh/2XQJX4jYd7gwqKNSC2Xh+IYO4gFs= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9f3f2a3e-713b-463f-5cd1-08de74832d9f X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:08.9624 (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: MaNfTlxxUkaCigJutFBQ+mA/gB61cP/UbC6yGosC0at0sCAA5pkwcfCt57r15Oux72yrwk0lrU03VThzd17xJw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 spamscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX0DKYFqoKOt4U zAb9hUXaqNIu2Sk+o9ewsrquaqRhyOtOQiWbK8mOa4hCMyGcWLP8SKDMW3vPjpL7tBIyxUrXPEX esFIiHkmCqOMhc2ap1Cfs/hBwP7FBVSMwnofNesvZ6pi7s5gbt+bX0bTx0/FYH0MxRg2yl1FQRw lyaVNdpmyTwEvKPdFIaxczll2EQafEN75L/4TdAmaOSvjPURx6d5DWv/HKpSx09AfW/ijesphED bferz/FltFwqkpK7LOJd4Med3EjG4A+7LdbmdZWGgnZANsiDcit/RLUHDkVeTNZ4kDJo1aUN2+2 BB9kv/pN8qkHH9AxL26sReMlbJmOZDgourZwWLo7yBsh8H9baWW9cAk4Z4oQW3F1cIm5k5bT9tV WAqVXEV+KYrPQdQwwYn5TqWQc/HUPcb0jQ0EO3MOa0zAPqZaSRNDwADcPyjjebR3t/1BwUfFXL0 gnW1/zZulWsVWvaD+Gg== X-Authority-Analysis: v=2.4 cv=S/fUAYsP c=1 sm=1 tr=0 ts=699f163a 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=cwoSvNeAA6Kl3ZbOCS8A:9 X-Proofpoint-ORIG-GUID: sZBe3weaB449HnxzEyqA1_AN9E4i14L- X-Proofpoint-GUID: sZBe3weaB449HnxzEyqA1_AN9E4i14L- Content-Type: text/plain; charset="utf-8" Add mpath_bdev_ioctl() as a multipath block device IOCTL handler. This handler calls into driver mpath_head_template.ioctl handler. It is expected that the .ioctl handler will unlock the SRCU read lock, as this is what NVMe requires - see nvme_ns_head_ctrl_ioctl(). As such, export a handler to unlock, mpath_head_read_unlock(). The .compat_ioctl handler is given the standard handler. Signed-off-by: John Garry --- include/linux/multipath.h | 4 ++++ lib/multipath.c | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 3846ea8cfd319..40dda6a914c5f 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -72,6 +72,9 @@ struct mpath_head_template { bool (*is_disabled)(struct mpath_device *); bool (*is_optimized)(struct mpath_device *); enum mpath_access_state (*get_access_state)(struct mpath_device *); + int (*bdev_ioctl)(struct block_device *bdev, struct mpath_device *, + blk_mode_t mode, unsigned int cmd, unsigned long arg, + int srcu_idx); int (*cdev_ioctl)(struct mpath_head *, struct mpath_device *, blk_mode_t mode, unsigned int cmd, unsigned long arg, int srcu_idx); int (*report_zones)(struct mpath_device *, sector_t sector, @@ -154,6 +157,7 @@ void mpath_revalidate_paths(struct mpath_disk *mpath_di= sk, void mpath_add_sysfs_link(struct mpath_disk *mpath_disk); void mpath_remove_sysfs_link(struct mpath_disk *mpath_disk, struct mpath_device *mpath_device); +void mpath_head_read_unlock(struct mpath_head *mpath_head, int srcu_idx); int mpath_get_head(struct mpath_head *mpath_head); void mpath_put_head(struct mpath_head *mpath_head); void mpath_requeue_work(struct work_struct *work); diff --git a/lib/multipath.c b/lib/multipath.c index 4c57feefff480..537579ad5989e 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -496,6 +496,46 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_disk(mpath_disk); } =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_disk *mpath_disk =3D mpath_gendisk_to_disk(disk); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + struct mpath_device *mpath_device; + int srcu_idx, err; + + 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 (bdev_is_partition(bdev) && !capable(CAP_SYS_RAWIO)) { + err =3D -ENOIOCTLCMD; + goto out_unlock; + } + + /* ->ioctl must always unlock */ + err =3D mpath_head->mpdt->bdev_ioctl(bdev, mpath_device, mode, cmd, + arg, srcu_idx); + lockdep_assert_not_held(&mpath_head->srcu); + return err; + +out_unlock: + srcu_read_unlock(&mpath_head->srcu, srcu_idx); + return err; +} + +void mpath_head_read_unlock(struct mpath_head *mpath_head, int srcu_idx) +__releases(&mpath_head->srcu) +{ + srcu_read_unlock(&mpath_head->srcu, srcu_idx); +} +EXPORT_SYMBOL_GPL(mpath_head_read_unlock); + static int mpath_pr_register(struct block_device *bdev, u64 old_key, u64 new_key, unsigned int flags) { @@ -646,6 +686,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 Tue Apr 7 12:23:23 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 0D9EF3E9588; Wed, 25 Feb 2026 15:33:33 +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=1772033616; cv=fail; b=n73MvXG19ZCX1qPZ0E+Z31uLMcmxi4egiG+NtW8iYAQMycU771wk3Ln+buG37u+UGzsBdOCdVb6tNotEXL4c97TH8G2tu3ZqvYNlPa1Et1kNLDP/LdoXadLHtLvLtMCXMa2ESR5rdUfdjtyiYj1GqfCT9X6PsBkVmEiou3v/rdA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033616; c=relaxed/simple; bh=Q++pX0tksdtAPOB3/6zVd1eYyLrIU/NalTU4IF1Nv8c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fxgJsWe5xosoturvB/5BrYTT0o0KDEcaIFVVdB1JpW/E72ltOz13x8RZG+j4xWjVsafi40gZpkBbs3zB/eTnFtuvfxFp+/M7CVAEZh5K5h1DVwReuy75f9+wvuafMWUtizqTc9c0LtrsGUWFrvce+HzlVVHd9G6CEk4MHEdDNXw= 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=pau2FD4F; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=cISqY1BY; 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="pau2FD4F"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="cISqY1BY" 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 61PAjt6j817332; Wed, 25 Feb 2026 15:33:15 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=5S+884VTI51q8PYnMTG+jRcBo/DcyKqpvTpi9U6WS1M=; b= pau2FD4Fu2Vv5PRWMfOF2rdWjreb/B5+TaMYjXoVss6knkpeknAVeS2FeBylC4w4 OI/yZF0986FHggjq7WpyWpCuIblii2cBIB2CCrZaYXpIvJ4JBWcm2eoUEnbt2vPV eHfQWEOtA5CUBB4uqKo2XvMaK2K3lUen9PxeIIH51RT3YIWgIex1TaUTA+38jjDa 0/WZRE/ol5je8/0f25ke2qsqPFadkUSrq41UvhEJBNnQ+Z4Iy+JDXhGUHU/XrIpx PyFlZnbHBtEJtjGO3W1RbRLHIXZu++gpVOhIe3jVBQ7uU6MR1Q7DInre/4343XJN 1BWPWqYaUyv6/ZCdztspcw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf4areed0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:14 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PF0tiw006261; Wed, 25 Feb 2026 15:33:13 GMT Received: from dm1pr04cu001.outbound.protection.outlook.com (mail-centralusazon11010046.outbound.protection.outlook.com [52.101.61.46]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35bg537-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xkztH3WNdtMSJZb316jow53JaRIbwQO/8YNisa/Rj2y4TqncMlq72Ese0LjfWkmGDte8MxpZ5rosDBINMU3xfL7Zz8TIsZRE/FJZH9BU4FHa48UxtOe2T2zWVXxeYlTxoicQx182XV/9zi4EnjYsgvax+g0tiexyUIkDW4V0HCYfDS8pLwsAu4se8JIgKFosatNamy8PgWqJ8mMVa0miinbcKrcYLtQPO1aN5MtVuLZW8ny7VGsBxxwDM6CNWxVxg5MB3N9ocSAfsK4/54R1g59K8GYiXO8BuoF9b9ZO1gYaLsVZvKBC7gswKDj6nYSIpQc7haiWtvsBdwdl3P0Q5A== 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=5S+884VTI51q8PYnMTG+jRcBo/DcyKqpvTpi9U6WS1M=; b=Wk9rkfzunkBTUV3/mFgAQceGqG/uHO77y3cBAUojI3E+dliaJiBSwqKFqNdnC3R9DoWPx7AGAU97Gv3u96jVcAFg5Tp33NW36jHrbXJJyZXnxLC6l9ZHgx+LCXHiuCA59QVhvD0E5LuA0QvfjCPg9ay0DGe04xpap04QDRbjja4bWxhTK+jo0ovPBe8aboPPh4MBMzXjCoo6/bLWi36FS4Z1rHt5D8X0XNAdsS1mrfV3sclvU3jN0ljCIetVAnv59bxhipVFZa1QfIqoy3PNNPu1P5udIOucTmXBg/20FEsyjD2Qb8spK/SObq/eSxFTXqaG+p0UdakwYtz5PS2EwQ== 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=5S+884VTI51q8PYnMTG+jRcBo/DcyKqpvTpi9U6WS1M=; b=cISqY1BYTP0WMWJoccUB/Rz8CRD3OAi9KSPdlRwPdrFFpdebT2A00iu0M8eB09Pf+2okdyuosMxGA0PR/MIYJUfR7YEZ5Axpixwmm1TFxScqTxAHpuhqURg5zNCZzyIlYdRZD1RyqKLKYRKD8CnKkYwU2r6V8pHPT8Ym2kwZTkQ= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:10 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:10 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 12/13] libmultipath: Add mpath_bdev_getgeo() Date: Wed, 25 Feb 2026 15:32:24 +0000 Message-ID: <20260225153225.1031169-13-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH5PR02CA0010.namprd02.prod.outlook.com (2603:10b6:610:1ed::22) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: 26a03bb5-1d23-4ccd-dad1-08de74832e59 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: xK5YlGBNqChpSNYbJmdsb18hH4Mt1N2I5uKEjQ43nh8PzqRMQe6GQ7T9E1OKobOoKIRlKn+kEs1sTxtNMJVU+qfiflbj9JMaa4GGTXM4RrsS1YCrL30GX69KaqE4CyMgug1W3zCKuAbm45LVqfiqNViE1eTA6lq1AZULKmYPJRIviLdzNFa9Gaio+G8nJiOhlaCVwI9XU4a4yMpaKsyBxBB3N1JsUhJmtaAFPgxybWYxMiyuQPYbDN9WLsrFF6cPuB8DDAZebUS8oDkzUEqdVrK8wUnWaPWRap6bZF+PiWmsH5rgUUVxXGmuWh6Ww1MYj4cZx2dp5zsk6BxHXWzHZw7k32QDf4gFIGQNuhtoyl+kL63/etRwatOkwLVI766KU1Dc4Gb2dGj5oJe6UOg+Rw54zrtALBdO/+pnCP+E7F/YUjIzfiWJysfCTffUdLgsPol1GDJfsCkd/x9CCugdT95K5GFIHCwgAqM+SrhSMhh0u6Fq4PiX0MgRNxMYOGj7sN6GRN1zngkzliG4oEs81ScWI4D/1jbqp5Ic+J3IvbK8bdS3QBktFoK48cELG90D7YsXSBQw1erXkG6yWGY0OG3viV1x9cf0UvmWhXfRky1aARbZpPoXJUBaB1d7bHgae3uk371qS4HtSBju2tgMNM/sifuaU0lsnML0rmwrkPhJhiuEmeYGexEbiHVFWRvx+QFdi9PPq3ZHDbARmmssnq7SdB+EyyBR7YFel+j9rhg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AuwnJ91uVrt85Sriecjp2lY55ywgE6cTQqoh7taZ1g5MNoAHdYvspzitWXmn?= =?us-ascii?Q?Bagye/ian5xPFGUnvbNXcuQR3Zw0NDXbSyk+768p5pExih1EyIDW6dvGminR?= =?us-ascii?Q?O4GiJC5pPjx+3nHk3UVJT4TIdAuCk94EiAh7jmBqNNFCkfx9KZAWZt2OfmNJ?= =?us-ascii?Q?jTyW4IcoFM2EovUL7X9bnASGRYBbMrhTNi2kHxoAXnlRipuxtDiSlF4V9IFJ?= =?us-ascii?Q?ZgxgJTK6NE3MJpAnq6iNzT+GK2/V6A7MnZPdNBSXq2ODYfmZvxs1SXMs52Us?= =?us-ascii?Q?qJVOQOaHhXUWqJf7tzyOZFfyKMtXt40hTO8QB5ySNIs7SwyHs1IEv5l8iVhm?= =?us-ascii?Q?Xbf3tvnbmZRJWdHaf6jBYc9xE6Y9ike26r0yk11O2W+2A/xQUYDlcCCdBzM0?= =?us-ascii?Q?LuE/lvIhC5hI1+Tq2OL86I/SHnn+Ri8W08ubvD3qJF8Jh1+PjIcYUMWvizYD?= =?us-ascii?Q?fUknBi8Y53cXY97KSuhWOpfdVESQGxBWF9gdfFFH7pJsQFdJQcWgWRbt5vBy?= =?us-ascii?Q?ombQLoSvUXH1MKAIn0Z2G2YjleaG4b/J2l40+0KK6Ay8d3lf5ECTj103Bpqt?= =?us-ascii?Q?TIlNN5VjbIq15ZFqeQLWqFXPZLnBBq0L0WTV697qlgSS5PZEzXXXO6S1DSIW?= =?us-ascii?Q?DcMIYted2EKyzd92DYX/3U+Q+K1TmyngUOR0CkHo7mkTesShqAqnphCsB975?= =?us-ascii?Q?0Hjl8ce3QxK8T1GJuIHaF7Lvt3sIptE2PESX8F/fYFZaMM56RPt6483Dvaj5?= =?us-ascii?Q?RpDakrdMXKYrAaHouMLb20OzJSalGTStIe+teUYGDQMPjmN5c+RL6LW6lvYM?= =?us-ascii?Q?qrHaBzEPouhuBmTsWFedB5WOADZez3hGSvD0ZkUfx97WuMrYOv1z0n2cl3lK?= =?us-ascii?Q?gTReF3pn0kTEhx1ujIUxt3O/dv4r2DAhAq5eMT30f1hj+mhtb2zS7ycD6WNS?= =?us-ascii?Q?QVklIirTZXyhXO5dgZcl3E0noUXOny5ThoomlBtjNsbn/3MY6+qv/AtXN+MN?= =?us-ascii?Q?CWfOz/9G/aWEzr8TNRTV4pldIxX0aOK+Mry1cI6gyqmcAgLD18asQqNVY4BL?= =?us-ascii?Q?dAEoOn0EW6M/eLnkeuCcKSh4dm1ipi/MPO5FPMLfvqLMcRumXmTTJzOz1J3A?= =?us-ascii?Q?XNKslNLmk0qnmn8qnlCMEzaM5ZYWTqgu5Y4s4hZSdHkmdayaeFpkV8Mauwpn?= =?us-ascii?Q?dcF5xkCpTiZFQ+T5soaOEDSdd51wTmGJwTJHn51gp96PsYT/YKZ7jHis4uMb?= =?us-ascii?Q?VFalGdJUasJko8fR+qFewW5A/Q4hV39J4UBXmHAbpPAGtmqKe/wMRlk+9aDl?= =?us-ascii?Q?JihC2su+U//chpzC7f050CETqenqwlCXozRqR6CiceP9rb10mUaWeOm9zXwf?= =?us-ascii?Q?LgEi64YX5v9sdyzDqCSAJ/XgAEFBVuM2z/ipXuJBWJFiEeA7XSK4G02JSfRM?= =?us-ascii?Q?Dw9Z6zuJnSx0lk+5s6r48H1ZpjlrHmOWix51jAYGTO3IiI8CwXYNDO5UGwgS?= =?us-ascii?Q?7h0Yh5l19LFf6UIjNz5ZGUateECGrzmxiwzNqxJhJZGfedH5Jaet3r5+Sf0c?= =?us-ascii?Q?2W/5TDzqhi1TTpdNToVwKfU3lCafqqTfMSppKN6oIE/dqxKDxQaItcfrVLHD?= =?us-ascii?Q?afVIeTL1jK/PMXUXtWlfv3efW+rTZ07XYdVOUm2DY/bXOI9B2EXcS3W/BjtP?= =?us-ascii?Q?lfn/8xrR8dYsC7T7uzt8uvknlDleHOSfjHsSIhxHmRhLcW4lJtJkN5V85ASv?= =?us-ascii?Q?/EgTT+WczZkrkbmYtAfDRCYYZBQcjxM=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 3ICvNtsLm5c6kyyf82Y5NHmcMrViwxGohD+s2pqtkC42ogZ29IXch5wDSD+03njmbWZxbsgkHj/S2lDmU4iEBe5eIJN9pBUzBriJSYJsFUJ7TsM9bflhGJHaGOLpOfoTHidkfmFVYnfGa0r2zv50bj8NJCborEFnTow+NFif1jqa1pzZUz+nk8J54X1C8iF0ztAG0zVM0z23YohThS+K7YmhltNlTYatydJt8q0jZJIfWxojqM9fjIDXIFRFt72/C8Lnu3BQztlkV/XH5vdbq+qEbcaRu/VbupsR0TkjRwf0pXvKE91bEBLcqMjwidXvy1eE7ASV9kc/YcVl7/i3OOMkno3EALXK09xhboksjNRy71dYJlT+NzUwqfh3qtPDqILQv5+evFlRTMH5PilAeTNQlKnV5ZPYUVBeFqmmo+byUG4XRYrm6c/uoIo9y0WdIdDQv4ZNbKwi5GF2ubeWauTRZ7+UzzsgaTbnA/LCzSQ+OpXDAGOct1ZiWu2yHmY0o7SOm6dHeeYRkm7KXrNI4ufjTzPf1zvCPyvGvazymbTk7ilX/2EtQKRHBTkJbw27ifyudbV0rdOg2mK9Agz//lDSTqblo3Gw/7z0X4OwDnc= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 26a03bb5-1d23-4ccd-dad1-08de74832e59 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:10.1990 (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: FWbZBi8FBDMCYCguHCsCoOOB0vrmYCEMZUEnQVudC/Zgpwfmoq+A3hwIqlziFUzSSvC6PgjR6UgSmKG+7rchRQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 spamscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 suspectscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=La0xKzfi c=1 sm=1 tr=0 ts=699f163a 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=SJyMSP20wIX46-KvpqMA:9 X-Proofpoint-ORIG-GUID: hwsdY4RIIuZHEBNYa5WkYl8GQ7E3tZ-T X-Proofpoint-GUID: hwsdY4RIIuZHEBNYa5WkYl8GQ7E3tZ-T X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfXxFwnrsJ/TPMe PWeLDfVzRYSKJDHePhK2LOnS1EwRPdEMDLJZi5KM1ABbNT23dtmvnRW3HTtjfnHMaowBqbveEDs lj0ltwu5mcd9o1zh9CiyNbAx7lRbMwPxD7eQnMKGNjIQ2RHGKP1+y8njdc5qMuBtoSUlwoXXbeK teG2A2b72YmN+xPNlC4zGRinIC3AIzcG3HchW3qK2QqOO93vzR2FKQqTRo1pUBTvg28g11BzMV8 HCqnnHSmdO9ZgbyKru0a86Her9J2jaJy+RNKi3BnrWeFtBTZjA2d9HAC787GjkfsbCByY4NBXqj FB0PPoCgATrYrv+gT0h9lZa37R3ygJ1dGnENSKZ68TMhLlgIhKFl9SD29aQwZrVz/Xmr78w3OfR wKxPYrqAsBjl0i/w/CqC9cK1UONtDIezIrrOz3lKL6liaomzH37/ihi5r46gOgFgmhRv0HWPsUq uV5Mwr3KQnB5XG6B9MQ== 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 | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/multipath.c b/lib/multipath.c index 537579ad5989e..192ecd886b958 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -536,6 +536,22 @@ __releases(&mpath_head->srcu) } EXPORT_SYMBOL_GPL(mpath_head_read_unlock); =20 +static int mpath_bdev_getgeo(struct gendisk *disk, struct hd_geometry *geo) +{ + struct mpath_disk *mpath_disk =3D mpath_gendisk_to_disk(disk); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_device->disk->fops->getgeo(mpath_device->disk, geo); + 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) { @@ -689,6 +705,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 Tue Apr 7 12:23:23 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 8074D36A006; Wed, 25 Feb 2026 15:34:55 +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=1772033696; cv=fail; b=BiUpqpD5Fk+1ez1USXPeP5ECKGfSjr61DqV1ePjyfz2sdnocS3RP79p86457W3r6HlJFTxp9kJsKYiYwSH+4/Td1tES6DfoAyrJkhLeYV35RMCFF8xfB8YDL5m12yVH7D1UouSsF1zbvQGWeI/LbWB64w44AULfuAZ4MANhctLI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772033696; c=relaxed/simple; bh=MkimCx9lzjJnzx/cYKWr2ly8CEXwtxBfGlUzf8MBFCA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=MiEAFZFw/YwpIugbQTyl3TeAdY0YNFM1DnUgsYUcKpOknDbmJetr5UnnCKvEB79nWyknk+Ff+MVdOk9NODSqcKSr/QH6jxjYOB7YlxCmWPu0CfgfKW5YGDyuquIdsHBoZGw6kG1zKcGqS+qjO2d5oQUHo0hdoC4vo0CTuNrWJSA= 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=oPD7Rj2J; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=se5kroy0; 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="oPD7Rj2J"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="se5kroy0" 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 61PA10S84019325; Wed, 25 Feb 2026 15:33:17 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=lmelC2lBtXL+7MGPYzhgwFbZKY05WyDVoXNnULTyg2M=; b= oPD7Rj2J9Z5k/wJAWI0MK7OM+nVPk1v93s0XLMwDd+rXIs7e5LLmimH+mHOxoBLi SbxDS0A5OQTIBQtc+9LeFuoTFj2XzOyHopsn6rlUPz+CBljDqbSnVD0rOE0lS1rr oznD8f6vS59DgFnM7yR1RBo/Ujg0OGZJUBhQeaxIOVtA5Nlgwxou9wTurvuim2kD Qp7D1ltxvDjFeU9fReW1zu+1fSVuntUHamWF618BVptWoG62PUoJumboaBXkyAfi re44bDNkDQQ28CKR125FCTOO2Ev+6xsmLUI/UOWqodeusOkPMP6rqVFL9IYUoO0Q 1UQrqjEKdEhhiMGBFvnj/A== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4cf3a06gwu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:16 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 61PEvAt6027868; Wed, 25 Feb 2026 15:33:15 GMT Received: from ch5pr02cu005.outbound.protection.outlook.com (mail-northcentralusazon11012008.outbound.protection.outlook.com [40.107.200.8]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4cf35g8ntb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Feb 2026 15:33:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Rj4+JtY7TSGADNNDEzUC5v5jkA6jaIYXiioVNZ7x4e2wSgR5ryxS/T1o+rMN3549y4NwSMbd2o+h9zVocfDd3Qh/sFZHUayjkSET+waPwCyqVvxRAQj2H8RCDo1ir8di+QOXuREy+R6NZ+nFtc9PdiorpA8J8ryCvoWUevsjNEmVK+NyAAYOMRg0wm6JK/zWDPRFFZAF9nVwl+hDExHx9/1sa7tZ0iF0wkKLYPuOQhEC5plWTJ3vJQAiy3uhVg6L7grsQTJib+MkwPJGknFPgTZUyfQqiMUf1T9fAs0Xc625Oh0qDMCpBtSZqz0UMYTXFHbrHoR28Nm056Ye9/xEIA== 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=lmelC2lBtXL+7MGPYzhgwFbZKY05WyDVoXNnULTyg2M=; b=rSkOvzVXj0ddTCANaYClXXZVwvzqh5cYOWKTuSHGs3E5Rl7ocVp5RY6JHNDX0d7HQQFExy/44DBA3Zogiw5yDHuMovR/MWyIi9/0I/CZZyuRg1vG/3qz7RvSexUFHFmQ2AitYu97uPfIdkG2HLbjbzOheN58ewXE1qs53Gtoi9rQXVjZHn72f6cwILcbq7VXQIWnGDJV7s4LOQBoGcAw+BI8xo9mMzzi2D3qzJGnbiZjYQC/ff53bVnZhdtjNMH6/MIt8YPyHUVLgX5UoykKKk4NWcHWv+pkdaOWjQ5gEdRF99gjwjTCCFHN4IbE/2WyNdccaeB7bWcqWYivYyCFsg== 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=lmelC2lBtXL+7MGPYzhgwFbZKY05WyDVoXNnULTyg2M=; b=se5kroy0QWRtSg8wJErFKkg4x3hwJ0W9C7YPzDA94PWKO4ZBGGUiH/ZSmDvpdyVuEWZy7ik8rJqR6bAkwGuQr/62lC9ReI+QNS7U5C1d+Rn0s2yIoprUuRRVcPOpBTUhgpnAWAbuAxI3lc6wJ6rfMBaPfDqFELi1E0f28iqlGJQ= Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) by SA6PR10MB8208.namprd10.prod.outlook.com (2603:10b6:806:435::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.22; Wed, 25 Feb 2026 15:33:12 +0000 Received: from DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a]) by DS4PPFEAFA21C69.namprd10.prod.outlook.com ([fe80::5266:1601:5598:3f0a%4]) with mapi id 15.20.9632.017; Wed, 25 Feb 2026 15:33:12 +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 Cc: jmeneghi@redhat.com, linux-nvme@lists.infradead.org, linux-scsi@vger.kernel.org, michael.christie@oracle.com, snitzer@kernel.org, bmarzins@redhat.com, dm-devel@lists.linux.dev, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, John Garry Subject: [PATCH 13/13] libmultipath: Add mpath_bdev_get_unique_id() Date: Wed, 25 Feb 2026 15:32:25 +0000 Message-ID: <20260225153225.1031169-14-john.g.garry@oracle.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20260225153225.1031169-1-john.g.garry@oracle.com> References: <20260225153225.1031169-1-john.g.garry@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CH0P223CA0016.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:116::34) To DS4PPFEAFA21C69.namprd10.prod.outlook.com (2603:10b6:f:fc00::d54) 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: DS4PPFEAFA21C69:EE_|SA6PR10MB8208:EE_ X-MS-Office365-Filtering-Correlation-Id: 97f02147-e35b-4e3b-74d9-08de74832f43 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: YesmbIDTBOENlJBYvLaW4Rz7kK66Nxht4It5X8M9h9dp2FAm8C8qaQL4wGKLczjevTmbqS5cN5vWulwrTBB0uEikhIXtFconLd3X43YDEG7ka3G3sGTvkyQuMHEkgVx79/ZDZkRm8TCvtVa6Pr+SvOSUYFckSmJZI+pmwYP2JxzYSGKcGm2VOu4QJ/SqWceJY/1/zPzXdPhQmII6vzvYMdHWUih+QWC7WCk5fFBiEJ0w3R5sANakNBQp4EfEj7mWsqKoxBpTSnaZ/b72+g40l7UyYe8+f3AzEAcE/PtNHbsUTynlre8oQhxkCTVwDhs5GwlU8dIgk/Oo6ZIAf2SHT4o+eZ+LrYtosWPgtAVSTBTTIggcp2D3nlcDCmesB1BcOLZIIwo617gQvuWs0WPM6NCSXR69o3TTDIX6DUnk5U4/XkIA6FvRmfGZ39klb16FZ6JLU0jBFbMltplaxPiYfOiKJrHUaLd9lGLx278uZa8HmHUmy87s0FlqV7etvQPPmcIxxl/AOiTaypIZLjpG+fym2RLGPA6AJTWP9PoFewigiBtgA7b44Lw2K9b6xI/562gtZhjt0AHav3us/eWpQvZmhSLL6DJCBOVg0AYhDnj3mq3Ag8bLyYYl1B50nnTSp7KFahM9PQbXTk/4JU9Rzug0ISmahSfxL0Lf5PfBwR/QtxnK6FSM0za+zArkRD2o4Bv7lMC6++9CAv4dZjoCOl10ldmugez4S5hPeI4iic4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS4PPFEAFA21C69.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?RWeku9JnHhv+IiOcK86oY9iu/X/wc9DZV8sLg3Ng3iW9h6J1naWflU8/htbw?= =?us-ascii?Q?CoUO8+5eolcLUxMDlWfwPeOaxKaPMKtGRiDmcAlcxE92nDxxJF7UcSUiuhfx?= =?us-ascii?Q?reIP3NZoi8G07JkaukLpcEzlq7Wod9Du/JKBwd91mYbxD0adYONm0W5usF4V?= =?us-ascii?Q?ZnbhAYcPrMxGw0ht19rXOsqM1u8GhWgAC4zBGTdOdmKJqWsoJZmvHXRUTEUH?= =?us-ascii?Q?E6DZLt6eulzq8UBmxudgf+SvV2JvT/junc2D8Xwoaqe9XI0g3nYal1q8uZ9w?= =?us-ascii?Q?/YDFBQjxuPAqslWEfyqpgVBL65ju/d6W4jaq0dFjIxW2qg27Epff7ooEdPxD?= =?us-ascii?Q?xWvPgPyjzZ76LeRBZjbkI4khlW2ywDxbEVZfPLTqRG+I/qhf1KFUOrX0DNE8?= =?us-ascii?Q?Y46pxQ/OjKWpp01LS6D4j8U+l3uWXO6oa1tCLlxmNjbkZNnKTlURMyV2RDcT?= =?us-ascii?Q?irDawk8UtMR8zP7O7gwPkNlVmIziDxJVaX5VgYf0rX6vUN4idS3eza5HDSFZ?= =?us-ascii?Q?/VmpRxEdcJ3u4xK6YyOaSfMy/is4uX1gTa36ScpcNePtqR85oLNVvnZBySzT?= =?us-ascii?Q?Ib8XpK66IIvbrqFz249qktChkQ8xu7faQ5OXXM6QFLKlRnF6Iv0s35n5st4b?= =?us-ascii?Q?a/1Mh6Bzf7ZqQh+5KIBjyqm2RG4rXVxI/o10LxwQBbC8BX2guAWaf08hFygk?= =?us-ascii?Q?KoBOao/Z2eO7rfIhHCCVmcVaYJQkRX6xQBJbT76QRxwwJLF5vNNFb5qqefT5?= =?us-ascii?Q?4U/f+RkYlQzeKDnAVNAiC1yv79vssBHhpmkkh8k4aVAaDFogEJsH8hOugDBu?= =?us-ascii?Q?sMjou3FVvJiYML0BiTr2EDx6muS352e+zNm41irECvlO13D3KLv9c5J/QnW2?= =?us-ascii?Q?yes3qyxkxni2cMIkpmrdhrNEAUL8YzLOykxfTiS/pXL/J8aZ2hGx3ydDlxDm?= =?us-ascii?Q?dXn9Fnm0Lhe0ql4JUHVjHPsbYs7jKy/Hz+p6FAyHNOp2iCdM3H0WkiGFC4Dj?= =?us-ascii?Q?u67cA2mX73Zgu19QwGUQrMuLBLRc1c6KMDfe1HwCTvWwhH2T15m/Zdgga2za?= =?us-ascii?Q?owRcgP2zJ+HBTYbTegeS2xh8XU1WVSe+oF7l7TGlm+pkUCd9cXZl/iJBlyDR?= =?us-ascii?Q?cqD/4cVZHZMnuLakVkLy1aaYhXRI7Q5eqhNVPuP6ormCEZM8PhJN63wKpUzA?= =?us-ascii?Q?5t3a0aGvSsUW1Mkqh5HYrA0OqBRSggoBWkaFYEYMqVBIUHq/ju9KUwg2JEoI?= =?us-ascii?Q?4s97BMW5MVA/c6jZfAdYqD9ecE8mu+FpFLuWoWrPtjBiEzwQpFZFLX68WLd/?= =?us-ascii?Q?JgLcxEHCQWxHhILw4btkZQ+36aeQV2d7/7fU00bEz0LGrD4dXAWJplnOfJYu?= =?us-ascii?Q?QoL4hYKXJ3Mj/1A0RLXMYUIw6tZPA4LfR86+dUAmUAcKhD5OazUnOuJPuJfO?= =?us-ascii?Q?uJ6RkwNkWLIkXkUq+Qb8MUk0a6BW3CVaD6sBHpbjbGnqZDuNPbkk2MIkqqIy?= =?us-ascii?Q?HCMuxebSTRrelGYyBVAga8QwAx0u2fcog0NAgkwF8kKivFwvpT65mTwM/Xur?= =?us-ascii?Q?ROZH7GhJhgu+yGUEL4cOvlmowWRInI2i3C7WH/TR2ih+Avop7pNon8Fi7r7S?= =?us-ascii?Q?YQvuyjvpwYT+juQz2spKbrcrlpnN/5GeKM9ND6wfzgtATeKJ+eooqfRjRPcC?= =?us-ascii?Q?hvm+L4YMS94avHXR2Ep9Gw/ztiiNAFEfx+3vvMZp5mC2jn2Vfq7x8z7q7gii?= =?us-ascii?Q?ZuIfxOBZLqzRDvOMG7Cx6vPvLXy4N40=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: xow4bpwZdum6oWTXDYE1eDDxRnzcM6ltFPtxU51MX7b1cvjx+NDBmH3dPEolBbo8pNPao9YwD3mL5yCz/C3bIuKR5ZyZEHJqbrrgtrbKaTpHN/EhYKnffrrrVuAzOYHnjssSkGzY4tEisdbl2v4d/iiQFuM0L1hv3CdWX9a6XgWCHmLgo+wN9NB3VlAEj0TAgB9UoZ6mw95sUmZhiV+7SdoOdE5HSU3tsBqFfK63MN4Ea9ElWvUjpNRdcjOjk/j6MZboAcrbBljHIFiX2+Uf7W77iKkGwAajB9fDKGfOupaVcdpod4eiAb75QxP4qIdtcmcn2g1bK29bWmM4SbUb9Zx7ZFoEe7fk76QJu9pFSGFAvI2qCrUy7cj0y06cRbhcH8PxDpuQ85FZi4E3z7oXCBEzKsMeRWbdY7RQbBr9kArx1eyT2LGcwCLt+qi5e3/JXatFa4NHn0iMsECS0YqgCKUqOLjQ5gWE92FHmQFYvHMbfxlc8VWZVsdYp7USMS1UaRzZOogV2JaK+FjGnxZ0tiwt4m8WzePicpiRsiXk5dJj9Kp7beXgoiJDK2ApS/Tt/VShLeCNraH5cKZ7BiYYpg5EnAQa4gVSIhSCXOXW/gw= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 97f02147-e35b-4e3b-74d9-08de74832f43 X-MS-Exchange-CrossTenant-AuthSource: DS4PPFEAFA21C69.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 15:33:11.7407 (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: Tpr6x2YvVanNup7JxfYk5oofhXNEhdOgER1laAO9nv3qPuaQ8dl+WAR7TbFn9zH7uxvoIzUJBzMGZwoBIwGLFA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA6PR10MB8208 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-25_01,2026-02-25_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 adultscore=0 mlxscore=0 phishscore=0 spamscore=0 malwarescore=0 mlxlogscore=999 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2602130000 definitions=main-2602250148 X-Authority-Analysis: v=2.4 cv=IskTsb/g c=1 sm=1 tr=0 ts=699f163c 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=HzLeVaNsDn8A:10 a=GoEa3M9JfhUA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=yPCof4ZbAAAA:8 a=cYe3JGuVRXpH4XBa9ckA:9 cc=ntf awl=host:12262 X-Proofpoint-ORIG-GUID: taxJfzMH1KxQjzT-4eI9riQUICC-G81C X-Proofpoint-GUID: taxJfzMH1KxQjzT-4eI9riQUICC-G81C X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjI1MDE0OCBTYWx0ZWRfX0izk9mM5ZRnR tnK/gqaN6pNJwygPb9IjdxWgwIL2XyXdiT1qG6e2AOMxxe9hsgoN/EsfO6Tf36iutkV2xjMrzDq 3d0m/t4clwK9PnVA2CZsYEdVHe9vL5xy20PTL3cYFVPc+CqlqakinOWjptn1gRSq7csEjXNqFlk 9+WByzTAXD7Vzx4ol7kal+PQcEEKnfxLYN5/rRhy3Cm6e0zCCat/Q1Esho7xWOrUs1M/sKZlIn3 fPb5DdNtp/r8z2tggTOKr6C9GrzvN1x9sElFitCRrflMkrC5PDr+0qHPHAgU7hdtKbEr/PJsnnK TrVMPUG7e3ml90AuUioQPmFu4VArj8nQnE+D+UJVYjYHKXZyUde/A6pRVWBnLKDqTIm19sFVo+M cwIOCrxDTHAz7rXIi3JOvgQh6IDTH5OpGrzUxXx+nio6tHSVDRE5IdMSFQUISpgVjecDDIuTjzM 1PkqpfNWg8cPPLflszkg94gdTkvrpiqsoy7iB/V4= 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 --- include/linux/multipath.h | 2 ++ lib/multipath.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/linux/multipath.h b/include/linux/multipath.h index 40dda6a914c5f..1aa70ae11a195 100644 --- a/include/linux/multipath.h +++ b/include/linux/multipath.h @@ -86,6 +86,8 @@ struct mpath_head_template { unsigned int poll_flags); enum mpath_iopolicy_e (*get_iopolicy)(struct mpath_head *); struct bio *(*clone_bio)(struct bio *); + int (*get_unique_id)(struct mpath_device *, u8 id[16], + enum blk_unique_id type); const struct mpath_pr_ops *pr_ops; const struct attribute_group **device_groups; }; diff --git a/lib/multipath.c b/lib/multipath.c index 192ecd886b958..bba13b18215ee 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -496,6 +496,22 @@ static void mpath_bdev_release(struct gendisk *disk) mpath_put_disk(mpath_disk); } =20 +static int mpath_bdev_get_unique_id(struct gendisk *disk, u8 id[16], + enum blk_unique_id type) +{ + struct mpath_disk *mpath_disk =3D mpath_gendisk_to_disk(disk); + struct mpath_head *mpath_head =3D mpath_disk->mpath_head; + 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) + ret =3D mpath_head->mpdt->get_unique_id(mpath_device, id, type); + 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) { @@ -704,6 +720,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