From patchwork Sun Jun 2 14:09:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 801216 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 5615443AA2; Sun, 2 Jun 2024 14:10:49 +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=1717337450; cv=fail; b=PLEbzwS+Q1v/DCLQlyDaOQV6R+av6Mfsa1YoLYY5VLo4LagvU0WQv1I0DaiOeoYJD9+wbasY1m88o31Jr/FB/OaQ0gkOmI0SCMzok8RIr8Q22W+9GwIvmAvebbMDzfjnwRny75rjWk95EG3cMyiMFYSGG3NCZbY/LEseDLw6uO4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337450; c=relaxed/simple; bh=sYzv2/7CLjhTxrPCvjggytRPAhhChubeQp/fn06W5vk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=HxHIjH9WuJoVCt1rO1n9uqEiardsxpBsaayOVr2RwG77rvTaDVC81GzUwGUdBmsXH+h/yUhIJWjYWi67cCodCccT6gFSGA3I1euHrVX+b39KUC/HzHL91i+b37R58jgG1Xfu0bb4b6/xijJTiNNYtHfeRFVhscmo8gAEru3eMCc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4526dJic025050; Sun, 2 Jun 2024 14:09:44 GMT DKIM-Signature: =?utf-8?q?v=3D1=3B_a=3Drsa-sha256=3B_c=3Drelaxed/relaxed=3B_?= =?utf-8?q?d=3Doracle=2Ecom=3B_h=3Dcc=3Acontent-transfer-encoding=3Acontent-?= =?utf-8?q?type=3Adate=3Afrom=3Ain-reply-to=3Amessage-id=3Amime-version=3Are?= =?utf-8?q?ferences=3Asubject=3Ato=3B_s=3Dcorp-2023-11-20=3B_bh=3Dshf0PkL9/9?= =?utf-8?q?+tX8AihW0X6p7w8J03sVGQV65DSX6gEZI=3D=3B_b=3DJ552+MdzbCZUZK8+GmBob?= =?utf-8?q?DlqajZJMkq8wz7Zw7i1HZfbDR448iLB6qXsaqpb8sCIRHH9_zJeOKcJedjGZqG7uF?= =?utf-8?q?Gk0U2dYv91rgEsHk8pSYsAw6ng/y2BNjGQULkjz7nZL4an6QP2P_E11v7H0OuzUa9?= =?utf-8?q?wwx+zPMOETo+T14HGoyaki/bbD7nnidYxEx25fWkPLZXlfn3YXByW1P_Jz/edJPEt?= =?utf-8?q?jqk32qXVx8y34IKIHwYRfiT6NHCN3TJl0rSqI+xEvBDOLGcZV1mmfVxf1FH_irzjP?= =?utf-8?q?pfuuNvG8FKi9eKfs6NctVCr/gAnlBaJaaodr7nU2A2Y+hfOtAqq3JG2nrrkLqhB_z?= =?utf-8?q?Q=3D=3D_?= Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yfv059d9k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:44 +0000 Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 452CUmeN021076; Sun, 2 Jun 2024 14:09:44 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2100.outbound.protection.outlook.com [104.47.70.100]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ygrt699g4-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gsNL3p/qjJ/ZY8kxCXC26DmzxQ+x6sBwxZeda+wMTkGW4oAK654sij8TwCucIo7GfHyOoc8ctlL0lV+KMWeTvjMu1YpIqWadBnzUtICobEtXTIvRRQscEms1x8aHBML43Lo2tt+aIjckr/zjHfUg/JF/lG0Ty1xNvPXNyAHLJjkK4CHtntoYA4KtOkEE9XiAE36iqs2WyivFuChNAaY2KtTa69ITNtUgzGM7T7LWgqmXp2r98Vzzlikmu0n2IC5wD9TSlDK3v9cF91UvAqafpa61KXaMLMCy1jBb5xc/xwuBZCobGC25kMfAL2fLgpra6Lpkmk5ppE2TJcOP/zvvvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=shf0PkL9/9+tX8AihW0X6p7w8J03sVGQV65DSX6gEZI=; b=mrIPK4XaCHroaonE3pddl3DEQUj/OOk7sKkIof23QSSt3in3qiyJFYvmr/0hTaVFHLEsAKUMB4FJFS3olNUcTOW3ZasGquu0sN5maAes2CPZbmB4XwzurLu5ywaw573zbZzpnDCdZi+uatazS8kWxVYfmx0I3JKb2PT/ra070GgjZPmjuruTZtJcCHNseo9IpfnTeF4TRh7W6XGOZ6bJ92sNO0huLueGM68fobTpAWBv6t5SvsrH58Ti1oGY8Wx8g/QcgVigwAViv5vLWX/dq7N/VyegnYybjM1Ub+MNgpA3RiwKohMHSNNhKsdkI2hUYurtyYXcvDJIF+8CThqScw== 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=shf0PkL9/9+tX8AihW0X6p7w8J03sVGQV65DSX6gEZI=; b=CN/EiB1jnvUrDJkE3oLLLpibELLdtbaXcl4YhUwcbQy4ijFyQzgdn/90UuFbXjGLCMvAb0mUnqiaVMgxO+J6xQq3DHv1ncrYR83VYaBqUGxR+88J2+WqqldTQa+vCqHHOT20eSxU39dPDa47oKC6YybBVOYcn1VRi7z0YlFEcZI= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by DS0PR10MB8078.namprd10.prod.outlook.com (2603:10b6:8:1fd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.25; Sun, 2 Jun 2024 14:09:41 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%5]) with mapi id 15.20.7633.018; Sun, 2 Jun 2024 14:09:41 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, John Garry , Luis Chamberlain Subject: [PATCH v7 1/9] block: Pass blk_queue_get_max_sectors() a request pointer Date: Sun, 2 Jun 2024 14:09:04 +0000 Message-Id: <20240602140912.970947-2-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240602140912.970947-1-john.g.garry@oracle.com> References: <20240602140912.970947-1-john.g.garry@oracle.com> X-ClientProxiedBy: MN2PR03CA0011.namprd03.prod.outlook.com (2603:10b6:208:23a::16) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|DS0PR10MB8078:EE_ X-MS-Office365-Filtering-Correlation-Id: 12608b5c-3d3f-469b-1c62-08dc830da59c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|366007|7416005|1800799015|376005|921011; X-Microsoft-Antispam-Message-Info: /YLMP6mVh2qbm3Af/mGaVRlZjTCfi8bTr9oeuZ+EHIHCLtq0ICqAyow66yHbUVjVsS9aTuYfsvQ+V7yWPSqndhIa2XcH1thfU5VTr07HG2MGpfJ80BoBar4HYZkEqtU0aacdVQtMHHmJyjpQBvsalFf92FH2+Sl/Yi/G/kYxLd5v9EqupwdIrnJeX4rIx4p7d5BcYtlz918edKPNXH0EF1HzTh1lbEK7G+1MFAez06V4PRbhqM9s5Z9WZkwYxeqzOD91uub4KPCBuuAl0IQMyzdckT9O+cJbC5hQp0tDGMoEMIWjAcsLC0V3KFNdosCl6rfF15ujUd290phIMNpVikqwrP8WOxCwPZ+TtYe59TIGU4/vEQOdvttH0AY09XJj7hnZSfI6BYyihh7Wn8qO2t5Ot8WAFStnCsuV9+os90FQK26FgWWlqvlumDdo1yGZWOpYBZCKf+dGpBCUSiM9gB3dDFhHiukKMWU6SkZ1MKM1Mqsdptj5ec6sCIuM8x3gWOfs+d7aYyWnB7ax//jPIEGRPvv0uGmnarO7yv/fuIwsa9AyugS+PRJUCpXiBK2o+d++isi/1yqQQIvyyspnLZvKBhnwi+ZJbjS/xBwGSEvS8Y50nleIuH0RKMAYZYpNFjueZ5Vz2wYpKm77LilwJBNXcCk0SNk8KPBcrszIEtk+GJfNrQyMj42Vre6DN5FO8s6Wqpyywufbtsc0ntYkJWXlqeDYjXKODyzHG7ZtME4kXMcMRMQneUPFN700bLm6AgPbV07UMI2VtVIQghPOXRdSfey4n75eN7fNhxe0ZO6FXgicc4n7T1T3cZiw5iGn/Y/4DA2pFV75wiFXdwGFdrJlAqIAG1ubGma8fXgIB8nUl8mpTF9G3mQ3jNfhgypuS4tpefn1zM6jAnueRZs2ei0jVv0dn9rPYCjoLVqEvEIhwbvGSb0+/uYqgNFfGjJvBh+GvhZiNnmAeb2NvBwzvBKWJ7vA3JjRpiCdIjG388rRPID/b2rW3T5lA6Ui+xsuANitYR1Kvj2DYGDoB4uC4FOlOCK3rHbFlkAQCTPiNpe53Fw1siduYXFZevU8qdB872cWmfdCLctJYaO73CyBT0jBcVXrU+CpPPrAZ8ZViI+YpgNolEuHLUohtv/ial6hdU5BM/q+yN5eeBLMd6KyYveUtCVC1YMHAce6hlkUa/QITS/2OVIfh63qyAC8VG+0vLOsbV4j8YPFNEdRDvrcFbonRj6+R/CSR04zzRSKNBbstum6D4edI0COwXQCWRzzvOU0vmr613OYcxOs4y1U30xi2nc9+1DJti9Ug0WjKScemLnWlhZG67/bp9ZRhBxR X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR10MB4313.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366007)(7416005)(1800799015)(376005)(921011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 6s+t24iazTHLWrhWusf4VTKG2TIXrgyYBuULTKnlSTBgKn1PxUjsGFa74J+/PihjxxAICotsyl7E8IqCYcNW2rjdtHI511ksSTcnk6YJcDmO6a84cW5jOlMPeaWbPR4PTeQoNJEeviuKeRLY8tbEKrFyzNNr0s856qlnRwocaTe6LD9tB4RxC8XjdqT+Ji0ZBw0dmRRixGgSw9POHZTgUMyVZBSo+9lZB1SSCGPKqUyqKuaVHFK9GF2G1xxlFiT2DhCOx1KFWmxbDxzSCPPyCsPkQbGWcXronoVj7Fqg0Bg1ek78+xgIKPQQbkA02Srn5r3bUN2MZ84f22+GfJa/xcxrKUaAZ8dFJYLmpq4vgulV8WX6iNwXMsTJe+0iJNSfjRlGyRPgRn+K5wHMagPJK5KwLgkv3oicTBQvrDVolvFS+4KGKsSIyiywQxT24CxHdz+fNd8WbmQKIPeBt36dhZ4T8xHgSSFgQYpIRL8uv2ksH8HYpXjAvZnG5G0ESJk5TjXjf9AZMGkgnykXv7bMNt4ju5O089DMi9NTrg3mFxMjEkrI77/cEQO7JJRAzKkpfSLDm0aCrhmSYLBt8UODP+ThCkZMFa00Fye1KUfzthgXSdCi78uSnvpgCTy54jEkZHV+j/iXumLtX6Uriu6WRLXcKKz3GaNAVkArWDx934vqurfShWFGAqVVlvh5wZTySkY7If4u0PihnVBvcIHpq6qOxxWDZXkc1dqXgjfJjpD8ch6D1ztSfKeUBQUQxVB8GJzu5iQcNsPkugqq2N/HfoYCMJZjEWp6lKdnGUHhCe0A0/KfMD/Y+/CZ103vQRjOpX6ZyL5e1PEXOACBYpOyA510dBBl4jZnd2NL63/YxeY8UlAb2Ht8jg/jXo1GpSWYRilKhRWcmQHkybRzPTv0Gk7qHfHXVrTQeRkCEXHI/bs4qTdPStj5kjLGlYSPKJfqhxaLPT+LdYDpdi+RbsnGIb4n5x0dB4+oE7l6REoBnJrEZ0uNQIuYX+32c6J0bkWe3NkY9R3SJLz7OY8zNszdUKUfzVqo0taBNYLs7WyfcSiTFq/EFM+U0LiB053SAvTozMFx3bL7dg08TBVD8u8LFtcTZ9kddUp8OFrHJ0Kjc6+MC9j9HNiqCVyuiGpCWGRDcGhgLcbJqqKgCUKE/m9UYn15CTAUIvRGKAGc4qNcO9Re0Ju2D27oFAba+zZTrLSf6jqTk2aL9WgP0B4+pVxGn8bqnqCoytmQNWpw7UGckFmg4/OW+ZZcBP0+MRyqZytdcjC+nfeS/6c+reTFQBCHaTPY1l4pX3sMetH9UuSo5di/aH8Kkkp7NSDs9w6F1q+OeWijr+euMfBrifJKPEKwULzTzxvi0n9aPxXnxAF3uKlJZmPS0tB4Yw7dlUPgE27/QZItOa2scHY4ynpnCCTFGxj9Lg/RqZJv9Re8nOdTMMERACBOkXSnKxqeuD979Xbg71lQ48rqC4FlxltLuqkqrNlfrdjQoRxxTzF/XyxTIHjHo6iZhsDYDdja0niTdEdYGG3SjKoydp3cEBJCaWqPM+22Eq28RIOY6zkNRXvkVoUne6CnbIb1sausWFtSBSkC+wKD/NkgZFDMY98RbTldNw== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: OtQzp90l6P/Xx8C28Dj86FtQQ1qrbWh+kOvXQwixkOzSnEvQnTUGkJGxy4x3tS5axMIPIaex8rgRRiWMw/nT8j+AlrzhH2WXHX5Zx4NyFS9Y9Ki99TaSAzlMQ3ceMd5mf1Rs+In05sHFNIzuD1ITRODx6awpgjs7q4sEnN/s7cK3hygdlhcKk/5Ra0pGhxZV/VIkkHP/AfDtqU2XJEmQ4+dNplxHr8zTwLMKO5BRo5Gc/W77z/t7577JoBncrl5Xz9vJ0Yw4L8JUKtmkoyNWIiBmt8edVDBg1yVg3GnIlasop8AGDyg/6Dc/SZcnHMUyoP+U95j3SUfDAKz11suyUJB3+cptR/kc04pfQ+gk33W6TsKHFoa8q7yzhvFWil/px+jfTIAEQscexBWW6134KZ8jqnFcEe3AQnKmNy2GnmPFK4ywBMJw8++sYbv0oUgK0bYLKH5+2UQIZ9TmQ2SW6tlx0sAGZEr0jJ5gLstG61aNolU1Mv/xd5wIcaePH594OW+UJWrvhlf8jKP1uwI1olZ/Hb2rOXUbKBEyCCrrfdiAZ5VJ8orQZAv19zOtJlpdp4IdiQ0kSVTnqG8RI8rTAsMMhPFoOEzeBPRjgcL69TM= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12608b5c-3d3f-469b-1c62-08dc830da59c X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2024 14:09:41.6924 (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: jy9M7cz//TSrE0/gVpvYDaDk7rW4ofu6RYB/kw7jO9lu13TQKIjXycbqWCrElk4+yXwQ+BsQCP3Rx+RSeTgZ7A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB8078 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-02_08,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 spamscore=0 adultscore=0 suspectscore=0 malwarescore=0 mlxscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406020122 X-Proofpoint-GUID: tNLQpRcavaH4ke_hQFDmm3k50oEcTbBV X-Proofpoint-ORIG-GUID: tNLQpRcavaH4ke_hQFDmm3k50oEcTbBV Currently blk_queue_get_max_sectors() is passed a enum req_op. In future the value returned from blk_queue_get_max_sectors() may depend on certain request flags, so pass a request pointer. Reviewed-by: Christoph Hellwig Reviewed-by: Keith Busch Reviewed-by: Luis Chamberlain Signed-off-by: John Garry --- block/blk-merge.c | 3 ++- block/blk-mq.c | 2 +- block/blk.h | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 8534c35e0497..8957e08e020c 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -593,7 +593,8 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq, if (blk_rq_is_passthrough(rq)) return q->limits.max_hw_sectors; - max_sectors = blk_queue_get_max_sectors(q, req_op(rq)); + max_sectors = blk_queue_get_max_sectors(rq); + if (!q->limits.chunk_sectors || req_op(rq) == REQ_OP_DISCARD || req_op(rq) == REQ_OP_SECURE_ERASE) diff --git a/block/blk-mq.c b/block/blk-mq.c index 3b4df8e5ac9e..e690b9c6afb7 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -3041,7 +3041,7 @@ void blk_mq_submit_bio(struct bio *bio) blk_status_t blk_insert_cloned_request(struct request *rq) { struct request_queue *q = rq->q; - unsigned int max_sectors = blk_queue_get_max_sectors(q, req_op(rq)); + unsigned int max_sectors = blk_queue_get_max_sectors(rq); unsigned int max_segments = blk_rq_get_max_segments(rq); blk_status_t ret; diff --git a/block/blk.h b/block/blk.h index 189bc25beb50..75c1683fc320 100644 --- a/block/blk.h +++ b/block/blk.h @@ -181,9 +181,11 @@ static inline unsigned int blk_rq_get_max_segments(struct request *rq) return queue_max_segments(rq->q); } -static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, - enum req_op op) +static inline unsigned int blk_queue_get_max_sectors(struct request *rq) { + struct request_queue *q = rq->q; + enum req_op op = req_op(rq); + if (unlikely(op == REQ_OP_DISCARD || op == REQ_OP_SECURE_ERASE)) return min(q->limits.max_discard_sectors, UINT_MAX >> SECTOR_SHIFT); From patchwork Sun Jun 2 14:09:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 801214 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 EBF404AEF7; Sun, 2 Jun 2024 14:13:19 +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=1717337601; cv=fail; b=lheeeUrKQ3mqztwCyPJvuGXMln5/lNvTB88dAmFjQ0uTQ7bysngzAxbijhaPRS56FdQwof1ix+KmxMNk/oqSmbCuTniicG1iOXJ37hGhI3aD8ANBWQj2tc2xNZGJ5n9njFJ0pO0x11I/kQ1A8DD7cjUjloQYpJldb9BSvkJL7FQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337601; c=relaxed/simple; bh=cs1lAGOXS/s+ADTn4gc+U4ZLgh0qsu65lnSFfvqb0gY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=d5YZ1IecsWTsm42hXA3QNLorFxOxrwNR/0eUgpLAfvKx23PVnQQkPWZ9OeBUg8nvwLMS34MsEgw+cg/sOBBRLxJfB3P/lzu9U0ObUbW2KbLTBuXQO0vuq8QAmk4ME2DUkfrcB3fz5x9ylRB4zXv/lPoiO4pb1/wywgVuqBw1vKg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4525vkdJ010962; Sun, 2 Jun 2024 14:09:47 GMT DKIM-Signature: =?utf-8?q?v=3D1=3B_a=3Drsa-sha256=3B_c=3Drelaxed/relaxed=3B_?= =?utf-8?q?d=3Doracle=2Ecom=3B_h=3Dcc=3Acontent-transfer-encoding=3Acontent-?= =?utf-8?q?type=3Adate=3Afrom=3Ain-reply-to=3Amessage-id=3Amime-version=3Are?= =?utf-8?q?ferences=3Asubject=3Ato=3B_s=3Dcorp-2023-11-20=3B_bh=3D3x3fBTARvc?= =?utf-8?q?wImSuH/7giSev2Encuy8FIb/yqy3w5BkE=3D=3B_b=3DNQYx0td/9M039UTeDr0Sb?= =?utf-8?q?aR/la+RE1EQYygzSVcpHc9/FVbVjCCstN3uHk0h3eqR4uqK_J+aFxnXBbEQDzsSgg?= =?utf-8?q?fL3qcCytnNCxPNMmhIz2J3IQCVseFW3NjISRUplSRrjfRMduiGU_juVVDHM5Eoxrz?= =?utf-8?q?19VlRw3BJtiEZZ1cmxmTym3TGgYu1LH5D0IkJHRGegSso32oDHnPnAq_jhLQKbtBf?= =?utf-8?q?tJ+Ra8jGi9650DrndNiq1VAt32v5J0cxQ2BR0EeTPtj4jVHvDJA2Id4OcBh_hhvt4?= =?utf-8?q?MwL9d8jHyzQ20lZ3mn7ZSIcnmQG5Tq+4p0KA9qw+JJ+xBLDdJiLSjDY1wUTwJ37_G?= =?utf-8?q?w=3D=3D_?= Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yfuyu1cm0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:47 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 452CPQWS003692; Sun, 2 Jun 2024 14:09:46 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2101.outbound.protection.outlook.com [104.47.70.101]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ygrquhb3r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:46 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UbUxhCDNJqH721R5YWLeBn1OQdbZrlea3L24f2OgMfOh0FC9Yr0fV0FXHmEQkpEZdREraE2dcOqAbhCOwEB6H8PfKfUnrQoHL1T28ylfK36nx9/BC6a+PN9qQ6aNJnZRUA1TkE9ch1X1mQmOu9gEPE/iWjgJeyRt7HCSVPv42TEq6JczJPkeoNwCbnp04Q64hManlvGg/dd5GtUZRlFpSBbqfXtacSb2DPg3Ykef0s9RMz/mxdsEHtVim7BBK0BGzZLkAj3/r3nzKQfVXhIvMoNrDfzB3xVxEB+xaphtJhzLA/+9YYCZyzIiutuZ8aVGRlgfl6gSbnv3DdOCv0IYnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=3x3fBTARvcwImSuH/7giSev2Encuy8FIb/yqy3w5BkE=; b=CgI0jvoAJm1CsVespd0LndsEtf8/DiAsCMuHIpR/5Af32x4CWn9T1l3sNkwyfQvvKUyVW79zkJtB67JuG+o5BV5P3x61iG3aox5eeAOvCxp24tfeG7LjCIV18TmSSj/VknVwe+bKZhqqAt3qIYegDkB8El4IW+ffIgWfb1rPPenhHTj0jlP7EiAXbfDvrSS0o25yhVMKbbfL1n/TCKahAB5JmdHDlIGW+MFKXZHvAmOmdnibV8FE+LvcOKBTzxcY17uvxAl2F2xlmpQZGA9DgCa+0vLad7T9N/hD4zabXNq7hXG7g/zU6N4bZflsTVrYBB6piqI1jYBcd+TrXpgY2g== 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=3x3fBTARvcwImSuH/7giSev2Encuy8FIb/yqy3w5BkE=; b=Zh8nr3VMRrvjmLZvd60daLcwt5jv9WyTTKJ73efvNZliqRbBDRhRqaMRSLYHBdB9s2i7sbusO2Spu6Sqc5GkkjBFFWtFhDEGdWwwlhmRqXPuClNf9sbyal9ID/5qLdu00UgGrqp1WoGz0+nkAncTfwM55a7sS/6z0XnhPWt4l6U= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by DS0PR10MB8078.namprd10.prod.outlook.com (2603:10b6:8:1fd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.25; Sun, 2 Jun 2024 14:09:44 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%5]) with mapi id 15.20.7633.018; Sun, 2 Jun 2024 14:09:44 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, John Garry , Prasad Singamsetty Subject: [PATCH v7 3/9] fs: Add initial atomic write support info to statx Date: Sun, 2 Jun 2024 14:09:06 +0000 Message-Id: <20240602140912.970947-4-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240602140912.970947-1-john.g.garry@oracle.com> References: <20240602140912.970947-1-john.g.garry@oracle.com> X-ClientProxiedBy: BL1PR13CA0175.namprd13.prod.outlook.com (2603:10b6:208:2bd::30) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|DS0PR10MB8078:EE_ X-MS-Office365-Filtering-Correlation-Id: 112d470e-2a08-42dd-e430-08dc830da776 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|366007|7416005|1800799015|376005|921011; X-Microsoft-Antispam-Message-Info: xDnLcn7oxwKXo0YBQO4Zcvz3CMbr3+1pzXgxwhko34WS8ojcpOZ2sdXDF9l78IgidXoeeVuPQd87ZAiiFTpxw1mNg0lzduhyWhm584XGQnwOcWXlCMLqrP4qP6AlKMmeFRNFfTnF8HTCDH/FGqWZ3w5BwT4ILhA7q6usefreYGKfsdRKfMrgWteTY291+6KVPKRb9Etu3U8MFD6sWclb43e4Qst4CaRKssBBD+32vHZzh3X8ozgalwKPM9s/k5V+i2Ru5/cz/oxgdVfFMINrp4FafKKl3ZK+gnulbh7qt2fu1B5d0MVfMe2GPVNa/zSSSqHOJ7A7zB5c2DJo04kvSKLA7UWP0GPThDY30PE98ogtUpc4vpd6Z0yjQu07NjdENUab3rfAXUYw287dCnPY2LXy9RI/6TjAKHFpvlz2nG8Zl+OolvYhxvA9laRcHSYJLHJkddoZXjoRWusWJGsLDBlMyqrI+GTWlBefjlYQGiOepFB+B/Pxr2dQDzsO/XZH7NqMKzU1ivcv8HyD2g5pv5AC6DwLrnYPw6OnSBfLevL063DBJJx2eJ8bFuHK1XQwLOMycNBILxEfQW+TFiIz64AQO0BpkhYG7KF3H+xAp3tjsE8OTLY11/T+xyiBMvg20Mvyg0d8Dss2drvZTzfjbpv9YaPeD1So9/eTULaK8EegFwRUgwTMmn0++qcxBvyhx3ODJvURAccD50GeVHMQFQNGyzSMHnqfUbw+E/1bw7HmfbQz5OKXsIdWpw0AG8afm91JeE7K1Ay3L11hZmUhWYndn3xnFUoq1dg2xPgkqQGlSiDv4b9InLbZDu8bePnSrNky00PxAzazwJDXz4rS/T0v3m9o8yBVUC9VKkEOStS0IXpqEFtVXFK8j0AERYbaIA054Euj/aPvUQt/IgBIaL1ehZdP/FW1HKI+qPGqiveh7wFALSNMySF9bRm4etPavXkw+1XY8vACzymryuccB/D53N27NSqeEEt2gUh5acncVEk1di8cAigs+EjF7iGLaq8YZ3s0Pk+ebRVJRMKYu2W/rw3Kwy/iXvY+FV/HlSlHXn53DwPvA93asK+eNRNfyMrC6aUEKCjbXw4yCldmWmHcgAnVs1I4awpgpvq0XZ1W81h2NZC3MCqhztIOSQS+V5aw3EHZyGaI01u0+hGajx32l8TS7Kzmx8wmj58qdvlg/bqaDSxzU2v8JiEVHGxDE+Sqz6hcGnNlfKZC1PwdEGfyMBztMgMMfAFbqzPMiHTk4bdsJALU87+AT6YscqUP8iK6YqOwDFDrMxn5Iiv0ZcEEsQjdD/b9x0RkD5BlYwMct7iicqOiCMsZ6adqasW4 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR10MB4313.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366007)(7416005)(1800799015)(376005)(921011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UqaUQYcgXHA6CRwodNiZUqANwYzKbzHffFjK/zJiQz3hQv5214fSniWwYzn1GCelmeYINtcS8gfbMnu49AMa70KTTR1i07FKXkSVH4ZCv+n86p+i84bXSq8ayw+4jFfUU6gTQdRFwLaCWne8CNBmJSHr3Q6dzD2vwB8OaEFjqARgFP8m5DoXSGFrViFhO+Z2tiQeD+Kt832ADysMd+2YTZIn9zHc8owYaJFM61Ta+4ovrjKPiQc7iAHcBqLYvmTzR+D13lZEblFFtBVpWOpJ6xgbcb7vqPLm0/JwvUrMnw8K+7uDON9Y7qvT7vCmOcJk44M6uBPfctlZU31xUR6OxVaQ2LL6AUa8434x2FyUSwOa+60jPLsu7dEhazDx1lrWK29a42WgM+eYprdTDPw/cEx/KsZozUn9mzCyVO582Wc80ByndIlfN3/0k+XKv+jyNUe2cMi5FhPf8vhEfiBeHIzxinUy7nVczt0lA/ZMCZ9ADBcqJWRPe6FT2743MrBgjEHr9CDT1pQ16kKwJNW9swyfKBv0UbQur1ohc/7y4x9o6fOgi0+4q3gSg3yyWNMxMZpF3yaRO+Zj6pb6dvlfrXSUQLnTNZ8vfUbqLHnzPKSYl39tsAk32rXDBs3fKhdwJi+8mIsg6LG9iRgCIzpPzstD71NWP4cUVv1peWxJhVVsi2j7HeSpdsL83FyMikkklYxOtxECUi3cNQKJdGZaWJIBoEjYazWRnn8UNbnkpy3tanv9V7d0EeAroyjL8MOk4IdKMtZM0eDR7C4FiR5VRQBWTw8xt06iCAp6AFyX7NE5RFr6u7zz8YG5o6fUnbo8/eiBNO2++cr/0tEE70sZZYMk7y/SY1N3sJu62CkDmRiMr2LY/br7zOUCMWc8RSMFeaoI3Pmiv+v16DNbvDNrgxoBbjnYxYCXhNoMdjPowrQGLF3Wsd+WBrV4t1XXgVkIHM8AYa+Asyyju+kB2mzX2A1wQU5KkUiN905ArVMOPInX5a/64/sAxmutaZXrBacoJfBNXkcJTD6nfESo9/1cQeMpMzlnYuHV9/WBm833HWhG2NL7c5/1+P9l9vG5s7ccu+pe90mR3mWn7vMPeme3ZvaIRRm8Bfl1wocWb13XdRvVd+3xlwj/jHA0Kvbiojs6magHhae7Xv2sTOTDAxt1ZLbWAyKBGoaL8Rnm/wqX7dKAdcliTAu4tIl/rvThlIEju1qF45DQ+UUkFfquec9dqt3FNRYKok4d7DLM/vN8fE+8tSpEf2yDlDDR5gMvCMESOywbZMyDrh3VmIX0P2K9FlK1+hhI6u71bKgyObNN6weowk8bEGbOeO+3N/EjqcYea8xA/tDIFIp1xxfWOaTL+9A9Yr1GdcBd9Ju7aEri8YrHJWvu9TI786iTTM/H0Zzd1e94Wk3d1i97ELGAM0f86mIemN7FoRk0v0l5JMTgti1uPdNv7O3/x26eFKM4GoY+R7gZG5pBiG4zMrtwklW0p6m6XlNR3CLll502OHsX9q5SPJzwLcwCAmTNsMBIE9pj0RxvWVPAt+vTN/t0Al7vwetkxQdtI9yFaKe9tLECWDG8mCJRoVqR0ytp+4G0qBN53Rkshn/fRDcf8cwb1UxG2w== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: HK05NMy49V/+A7j11XXjvEapzkflJD6X3vDrroRkrBemgDDCxhu7q0zBWm5U5en9GFHpA30cGowM8gtHLso5xkSOOgTR16cp3K7rzQnSfCTpqjVXxmW423FmDqjsChMYXzro+HyatYE3i/5AxmIpBjyevIAxc2+ktnGJKZaDHI4Tm1Q31Ck4UvKwOndlcO4/81APS4QA7SZYPd3KQUlE01JgB3qaoFkwXoYIBkv96SJH+D1XP2gdNTdhDpbj/18yRbs4Z4slbRvAFW3moIP5KrnFw73SZQQ6DcX+zSLLrb+DqrWKj/xnszQJhITXVba82Kh2OA3OV5+7a2+RHUZ4UNsbeAFCDQDHQd/W5Q6IjRPELJ1pQ95HYy/oPRSapzaA+6UhVwbW//Dnwb50QJnvTNlAE14fbZ9lL+ylMY3MLHb1geMn9sH0MyOUKPaY2VMnXdA0vRoaYuZ0ACsp/oFRWeifFbQZtXmg7BLayYMTnsIIbPccagIYmAgDylG7ydQ6zD+D5oPK1lbjHFSDQr9HMwGP1votOWB7PpX962OoQStndOnKU3a1wgCxfo0hI0n78+rN8AgaGy2NkvNbuiRUZuT3Fo3rT57hrkoDTuhv1Fg= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 112d470e-2a08-42dd-e430-08dc830da776 X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2024 14:09:44.8468 (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: 5npuEjeX90N4l11n4F2DgtSMBlwps3Gdc75qGzRhtsO/yKucZDXVCRyXHNLX8V7Mt1RU5U2mMcazsyVFlLHqNA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB8078 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-02_08,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 suspectscore=0 bulkscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406020122 X-Proofpoint-GUID: ftsO0iz26BdwfI48PCYMUCV_Y1KjigEX X-Proofpoint-ORIG-GUID: ftsO0iz26BdwfI48PCYMUCV_Y1KjigEX Extend statx system call to return additional info for atomic write support support for a file. Helper function generic_fill_statx_atomic_writes() can be used by FSes to fill in the relevant statx fields. For now atomic_write_segments_max will always be 1, otherwise some rules would need to be imposed on iovec length and alignment, which we don't want now. Signed-off-by: Prasad Singamsetty jpg: relocate bdev support to another patch Signed-off-by: John Garry --- fs/stat.c | 34 ++++++++++++++++++++++++++++++++++ include/linux/fs.h | 3 +++ include/linux/stat.h | 3 +++ include/uapi/linux/stat.h | 10 +++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/fs/stat.c b/fs/stat.c index 70bd3e888cfa..72d0e6357b91 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -89,6 +89,37 @@ void generic_fill_statx_attr(struct inode *inode, struct kstat *stat) } EXPORT_SYMBOL(generic_fill_statx_attr); +/** + * generic_fill_statx_atomic_writes - Fill in atomic writes statx attributes + * @stat: Where to fill in the attribute flags + * @unit_min: Minimum supported atomic write length in bytes + * @unit_max: Maximum supported atomic write length in bytes + * + * Fill in the STATX{_ATTR}_WRITE_ATOMIC flags in the kstat structure from + * atomic write unit_min and unit_max values. + */ +void generic_fill_statx_atomic_writes(struct kstat *stat, + unsigned int unit_min, + unsigned int unit_max) +{ + /* Confirm that the request type is known */ + stat->result_mask |= STATX_WRITE_ATOMIC; + + /* Confirm that the file attribute type is known */ + stat->attributes_mask |= STATX_ATTR_WRITE_ATOMIC; + + if (unit_min) { + stat->atomic_write_unit_min = unit_min; + stat->atomic_write_unit_max = unit_max; + /* Initially only allow 1x segment */ + stat->atomic_write_segments_max = 1; + + /* Confirm atomic writes are actually supported */ + stat->attributes |= STATX_ATTR_WRITE_ATOMIC; + } +} +EXPORT_SYMBOL_GPL(generic_fill_statx_atomic_writes); + /** * vfs_getattr_nosec - getattr without security checks * @path: file to get attributes from @@ -659,6 +690,9 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer) tmp.stx_dio_mem_align = stat->dio_mem_align; tmp.stx_dio_offset_align = stat->dio_offset_align; tmp.stx_subvol = stat->subvol; + tmp.stx_atomic_write_unit_min = stat->atomic_write_unit_min; + tmp.stx_atomic_write_unit_max = stat->atomic_write_unit_max; + tmp.stx_atomic_write_segments_max = stat->atomic_write_segments_max; return copy_to_user(buffer, &tmp, sizeof(tmp)) ? -EFAULT : 0; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 6cb67882bcfd..069cbab62700 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3236,6 +3236,9 @@ extern const struct inode_operations page_symlink_inode_operations; extern void kfree_link(void *); void generic_fillattr(struct mnt_idmap *, u32, struct inode *, struct kstat *); void generic_fill_statx_attr(struct inode *inode, struct kstat *stat); +void generic_fill_statx_atomic_writes(struct kstat *stat, + unsigned int unit_min, + unsigned int unit_max); extern int vfs_getattr_nosec(const struct path *, struct kstat *, u32, unsigned int); extern int vfs_getattr(const struct path *, struct kstat *, u32, unsigned int); void __inode_add_bytes(struct inode *inode, loff_t bytes); diff --git a/include/linux/stat.h b/include/linux/stat.h index bf92441dbad2..3d900c86981c 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -54,6 +54,9 @@ struct kstat { u32 dio_offset_align; u64 change_cookie; u64 subvol; + u32 atomic_write_unit_min; + u32 atomic_write_unit_max; + u32 atomic_write_segments_max; }; /* These definitions are internal to the kernel for now. Mainly used by nfsd. */ diff --git a/include/uapi/linux/stat.h b/include/uapi/linux/stat.h index 95770941ee2c..887a25286441 100644 --- a/include/uapi/linux/stat.h +++ b/include/uapi/linux/stat.h @@ -128,7 +128,13 @@ struct statx { __u32 stx_dio_offset_align; /* File offset alignment for direct I/O */ /* 0xa0 */ __u64 stx_subvol; /* Subvolume identifier */ - __u64 __spare3[11]; /* Spare space for future expansion */ + __u32 stx_atomic_write_unit_min; /* Min atomic write unit in bytes */ + __u32 stx_atomic_write_unit_max; /* Max atomic write unit in bytes */ + /* 0xb0 */ + __u32 stx_atomic_write_segments_max; /* Max atomic write segment count */ + __u32 __spare1[1]; + /* 0xb8 */ + __u64 __spare3[9]; /* Spare space for future expansion */ /* 0x100 */ }; @@ -157,6 +163,7 @@ struct statx { #define STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info */ #define STATX_MNT_ID_UNIQUE 0x00004000U /* Want/got extended stx_mount_id */ #define STATX_SUBVOL 0x00008000U /* Want/got stx_subvol */ +#define STATX_WRITE_ATOMIC 0x00010000U /* Want/got atomic_write_* fields */ #define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */ @@ -192,6 +199,7 @@ struct statx { #define STATX_ATTR_MOUNT_ROOT 0x00002000 /* Root of a mount */ #define STATX_ATTR_VERITY 0x00100000 /* [I] Verity protected file */ #define STATX_ATTR_DAX 0x00200000 /* File is currently in DAX state */ +#define STATX_ATTR_WRITE_ATOMIC 0x00400000 /* File supports atomic write operations */ #endif /* _UAPI_LINUX_STAT_H */ From patchwork Sun Jun 2 14:09:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 801217 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 CF1564F218; Sun, 2 Jun 2024 14:10:21 +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=1717337423; cv=fail; b=qepBTZ1rmKCb2Q5s/qRiZiDj0RyRvoT9hvwwNCd8hAc+aOgAYMOiLEK6SwtfjYoVUCo/TguQs4vrZhW/nx9DmXUDlKPhS2R8pHLYFu/otS6gSapgy0ytL3fOHGG8qBf179op+A5GbdB8ifND4OqVBz8eLkqoB4E/Zo0FOaHw32U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337423; c=relaxed/simple; bh=QHxe9s8GCPGWZazSCJRxE5rMNrX90duQt8OED3FGRxI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=LE/442IrAPUERVVHkznadLgmsLjtSsBL5889alVkZCPFuwBGqC6bp6eCFF6Dhjlw2NNe6TqQL+HEKPl20R7FJlIyp8EfjBwFseyxhl5y5YpDgWK2uRC7FZfPLTP0GsWp4SheHZY1HHb9M5Oe8+EXqGnEkTqyrFdLn2o8DBjnH5g= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4526uFoT029377; Sun, 2 Jun 2024 14:09:51 GMT DKIM-Signature: =?utf-8?q?v=3D1=3B_a=3Drsa-sha256=3B_c=3Drelaxed/relaxed=3B_?= =?utf-8?q?d=3Doracle=2Ecom=3B_h=3Dcc=3Acontent-transfer-encoding=3Acontent-?= =?utf-8?q?type=3Adate=3Afrom=3Ain-reply-to=3Amessage-id=3Amime-version=3Are?= =?utf-8?q?ferences=3Asubject=3Ato=3B_s=3Dcorp-2023-11-20=3B_bh=3Dd9Qfa23ePk?= =?utf-8?q?gtLUCVNK+iNN0Qf5oqi5S/3wN0Hci0F78=3D=3B_b=3DHXa8ihV6WNwZsMjk5sWiO?= =?utf-8?q?huWNOoJP6wcNIkXjYkHRNQZcGmrxDf45Qs04sRcvxhXLH5J_LCHam/nr4Bq/uJb8R?= =?utf-8?q?g4UPwe7tOFEhMh9NMzPd8fYqTqvMOn2f+NNHnva2bpvDJMrjZL0_NKnWPEDouJ99T?= =?utf-8?q?FJ4s5Ms4O/+YQrxs5FEfQKZDOMPoG27zuGBuTXpihqkCKL6h2FJSgnv_ad9KkRyad?= =?utf-8?q?7Dmwo8+MawGf8r3maYUtxP5CfmjBQZ48wgbYVkO13lPoCsdEfSwf2TpJsfl_uwkFG?= =?utf-8?q?j1cZ1y53n8I3ye2u1eD3qVeSJZYFJlsSBu0akSKvPEn16x61AEEDe/tgWKdc2H4_/?= =?utf-8?q?w=3D=3D_?= Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yfv3nscp9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:50 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 452CPX3K003837; Sun, 2 Jun 2024 14:09:49 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2100.outbound.protection.outlook.com [104.47.70.100]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ygrquhb43-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:49 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Fd2Tgg60qhXwm9vYoct131UL+96nEU6jaDApnnHVb+kzj8um9CPnf2V01GO8JDrxazvDFxT5qbzfhTin+BY7I6ih2/ZLiBPPJNI3d8744ah6ofgDTIk+j8ysYHr9lNjrzzgrZV7VfsDpWF1tgc16zSNWjl82oKV3MXKSu9O8DCzdIBHpIAXgXG80P94pEVktOi8DjKBF0VGRDsBQF5j3NcEhJTLuOtL4eljlsHFY8vdAZCaGk8CV4lSgza2T5CPTcLvQbiB01WDn3P+RkPapQhY7M8X8tTmmsPrT8CxQ6Eanpqt88e0MKMY4Ykcz2rAwUW2gMeSAyF5mTvv+qj5hrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=d9Qfa23ePkgtLUCVNK+iNN0Qf5oqi5S/3wN0Hci0F78=; b=nJH1izv2bUZgImI2rBPjKbufHVvQI6An9mnyKvBIlqLO9xiGTg/3C1hwUsWSrvga7+YTVLLdUI6r3h+4/oYedmpqx3mhf7R3vnx5X6czHFBddkCuBLImEcM36NZ7SLmhxkqr0VaeXNB7Sw6Wu2cVBhlDO6hKlEBsB8gzMgpTEY3Erv0BJ2syxFHwZDE53rBo3yOtRHI18oS4AKjgOCZimmvPqLvQ/0aNpwx7WI05gIGv8KG8RUuuJXFSNr6pBa6fPQ9zrWckzfxJnJ3QI9Q498j4vbP2v2vl+r70VbP7elOc40KVeZziDdWCTzUvibA1mvxm94mtRqTqqrmLoVsMLQ== 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=d9Qfa23ePkgtLUCVNK+iNN0Qf5oqi5S/3wN0Hci0F78=; b=AuVr1/sUu8BkrgVFh9wcIUiTIC34Y7ub8LBqaenGsXmSpTHkbvBXe3nSyfCSqeeeYKcEaKF5PoBBa+Nq9yF8MS5yQMCkDPezdXMJKScj9YrOLO3znMfe/eZtvJOJsxlBZYnjmGijTQHLWcP4Ik4g4t3V9w71ouHyxFGfbpsuimY= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by DS0PR10MB8078.namprd10.prod.outlook.com (2603:10b6:8:1fd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.25; Sun, 2 Jun 2024 14:09:46 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%5]) with mapi id 15.20.7633.018; Sun, 2 Jun 2024 14:09:46 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, John Garry , Himanshu Madhani Subject: [PATCH v7 4/9] block: Add core atomic write support Date: Sun, 2 Jun 2024 14:09:07 +0000 Message-Id: <20240602140912.970947-5-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240602140912.970947-1-john.g.garry@oracle.com> References: <20240602140912.970947-1-john.g.garry@oracle.com> X-ClientProxiedBy: MN2PR03CA0020.namprd03.prod.outlook.com (2603:10b6:208:23a::25) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|DS0PR10MB8078:EE_ X-MS-Office365-Filtering-Correlation-Id: 71133b53-c448-44a9-2d89-08dc830da843 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|366007|7416005|1800799015|376005|921011; X-Microsoft-Antispam-Message-Info: MtfExUXDBPAclnMIYsBe3PjgA+HaiXrQIbtiawFazg7nmE4OvHokBLcp+hwT0SWZkrYoDWUnmWOYR2wXjuFfNMj8tULtWFKOM9fwH0QGfP2n2/WoT/Rt5gIkte0SKzifwfJmlOA5MZKXv9Wdi7CG/7017o33aWGSOp4Dar6KW8Tah2XIQnXRjtzZgWIjs7Zv4S81hkislJ6RZCogwBuYXhdfMRDBLdwltxmp8gB8zeh+fF+GLyJ4CTOEdpVVmYlfKG8HjcniCyVALKxKNII9F+eBhmtFLve+d7mQ+At+JpiVSmE8w9+m9xfpR/HaBsWYen1gpDkrBgxUQ++AhMAerZfHV5uKSNCUqsWDiMoUXjalDvjQR8mPa99elWCkp11hvbi0VW4/iFuG+wQvC0fiNU5ii/8SLeA5XPv5LxYFGThGOiibMpjPA6Ph9rAsb7oqfozzcVYXRNVjLEubGcWlqc776u2ZrfCdi3Hg/E1tnAsHdD/Oe3xdzd4vzrl4WftpkzeLNQ6ibUruk8bQOfeMpjHeI2Z5m2N7ogcVtvVpr/6gQvu02u7m0yuo+XFSkeSwSeGxCPQWRo5Rr7gpKgk011GnTfCtZnoWsKgVQZOcgt1cG4sMU3IYCYCIHYd0f+BuzKO7t4zA0X8ybRklN1bqs2p1qDXe/gomTl+5xs0I2vVM2EK7Dk5g5JG6zq/w3l9lOq/72MLj3DTiGvDTPg7rU3XNdG0sB65Id2Bn4QcS7ec/ZJUwVbNSgG9dAAE/J1yXZ2pH6BI3bik0/vMOoU2b6LAPJqdE6kw8jfT6PQnzv693OM+3JlHErXp6cUnzrhH/uhhyXqT1aDw8M/ww2Z1xL6RgBghFUf9LSepA9yPsOcvTmgAeSlSxlSjDdoLaWAaU9Lp/s7wRedeOPd6uGm5jPgDIipNFK8sK4mpXRt9c314dOeulTdkBjxqzMkJ5Ivpkk/jtrAtJE2qB8eY872+oDKXJ9d4+P1M1XAZbG2t3YZ+YUiP9COLYIUhPCE+63NKqqBDoBj7evPpU9sdN0R/VIPmkPKgv42hOm916ENqPR2E7ZHY/OucHkBCW2g4YbY8xsg1TO1dW41WqQYtiFoqjHOmnaiI/Wouz34SfIJhRDp+ISqtXT9zBe6w+kmu3HXRlr/HOqaeC8xtwHhBnQwFBocL+mzVsPocXF9XyrPQqZ+eV8iWy/rAth2QY/G3Gdx9/Ns+yuLakLTaSMw4p5QzC/B+MAAWQSY00bvN68tEKyUCJfAW5HaATxdG1rpAv/fHdEER36VXbvQj0aaddXGBngSi51ZqUvXTB//5e68XWcIMwlLBvp3Q+0hVXqa2PBSWl X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR10MB4313.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366007)(7416005)(1800799015)(376005)(921011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: sk03nJaHkTvqIqG01aznJL8Ul/K9m89dgC8ZYlb2iE4jzxn0bAuE1SB0KVnENuIJC6+5OPbX8iaObkWFKVfhaWoAI93IRrsECDe5Yr6Al+pC730NIteD9pP2M7ictKQJ8Yu4SBC1JIqIvbNC9IHLttEcHQqMQrIZ+/0e3LUJl9cKCdqdjX5dYUMl0G7VO9vigigVxGc21VJ9x3aOIQ/hS40uZ8yDQtn1bv40tIYAS1a2J3ZDeVwuj8eU92A1Zs/GnXcgsNVycJi5/8HqqfEAM8depNhzyeqJaovDOrgrILIYdCS7dsKrozS1sich9FE0ze+lmFAC/NybSgdR78SdohGC/Zpv8+mbaSxUR2pBOAGo/ftfUmRRecQROslOskJl5ukSmqnIQOZrUgrOAe6OptWiUFuFh25XcU9l33UzwjHJQlXNIkLI9+Z+IETdR68kUH/QBQ0a0OoOQMlTrKItsNTRk03Omdgy1AwkCRBXPtyqM3S7NJHY+Vn0ASSdPQD5rCAntcqwxL4H1nz8c6jq4UKa8e60dr23y3yAjHx+vGvIXY6aSsSbDJxq+DOqqXIk4FAg0sOPnMZonz+q+eTgSq5zlbvchwnKcqwLeoUYer/ds+NWK0HQ5pAqJ8IrIOYoUbdBKrvVWeLRU/VX9U4GEur9koL8xrzGg3GJPw/AO+JZ+NSgSdeUdIRCpzubUwu+1oSiPJv2F10GPr2ivbWydqYdvplxTMOlKPUqdHhr0uIPTMy2a+FjkpfcnjPKKbXr0slIUEYMqtOcIUO2BICvi4bo+qVxE9jQHdp43jTQ94oe5Ce/whHPwMsGf9IlXOMLJzjOKb84jhiXdoP5vYB3QGxaesI8PZIWnyfJ6pWH1Ri6jahEvz/SAlx845cLr5we8oerSYR7g4dvVjJHq3caEvKdDV57h1UjSY/ksEIJ+abiQakoSbv1PbQU9AtkTFjwelldtypQ+Kop83RMvAk/h5IqTZMdrOX9VeJ+WBVrrOw6YdlZOBH7QZ1iEENNxHciTwQy7vMObIyU026fu3O+Ecc1+XPt+0Ve9rbnCRiNCHNfxvq6VqatfarxhwAmd3GYKCwmdv4rJ+sI03mWG+fs79J9TR0difxzLyKy0oO8LgTIN8wPTxRzKCp6q8KBeXUhAqvg0THydEZEa04fOz4Nqas2HD8ITfvz0B2NCy6k8f7BAjKA9HoO4B0P8/w23mQMck5rElUCibCCQqzPALWs5KJS004fEPRu2XalMXjMLWDG+PJS6JRdbh9sFbIxCFCCd8k8Q9IQrWffmdC/hdJ818WL1G72MBIbs0gRC7A2kwOPfiLnD0Zhvp/pOKS7dz4dWl5CA8TMZNmOv9Wxd4mY3FSOXGlF07yeLf4zYucwbVUTSfsaG/MIgm+LLbzmk4yh1NSDldEQo+vl8JBylZrpIPsZLsIhqllk+3C9F8SiXvG4A/BBVbqPnB+DH1WGc+4TfK7hmzJsOwxMpr7MvIm3n6oQt0wcUxisgCsxvRbOOrtJW0dHrgEdIVgjDh9UJKRg8hXd5YufMcX5WbD1FMXy4jUnCvX/t6nqBb2IRIDG1eWLzmgPPEwbY7hQ4qkBVUlyKp0WAs6NeiDoCsj5/tn9Ug== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: uCKODXjylMeMSgFTG0huSC6bDMQjROvPFrXpqvG5osVcBpM5QUbd1pfpS6fokRFLGbcWn51mUjDG72LEsSV6PZI/qPgGGW+yQE1HK6i8xvm1YnKDxnQQxrkeSZrJ04cH/8DdRAXpghWsDj9ZD9GLClk6U4+1cY8zRhgfLAm07ydII0S7h73/y+PwKDZM7CxBmVr1BJGlujtSVu5qQ+aJxkDwM+V4u52s1w5aH/JqvUv6p3SSkbGlGzN5aVGe3u07CzCoEGIAnSGlHmF0I/1U2OU5Vdvm5n8eKR04/K5jHZttgkAX2GzmbLoLYpgwY87946JoeZPtNI/xrHGqqpzPTLqY6ebFQb7U9DdF1zlO+Ae2/hDFdFYOz1pmFMKfpG7vMWQOMQ620Wie7Jxt3maUrs6Qe7aEa+wfVuOsNCTRqfZqmN6GoDtYE6BslPY3L5/pJjHXVMMEtRfAQLzYZKWCSUzwwCAnXiE5JwFkqtRcbNNrXDmROeiIttHW7wOt7R0Nhvrc8jbtTLU1q9rxEfuTfL6OKyRGb+mq+FkINaNyGD8tSCd5v0qu3mW/CIEPuUSDr1dc5fyrb/6OP8hfxdwjXGm9zHIjK+cWeRbrCtqHJak= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 71133b53-c448-44a9-2d89-08dc830da843 X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2024 14:09:46.2001 (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: QR9cnwDW7NcJZqLhY4jXTQb9v/TZrRv8z12XD9CPHBgJO4bQtl3CW+tr4mU/3iy8Ig443j4LCBYQ7pu8saJchA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB8078 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-02_08,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 malwarescore=0 adultscore=0 phishscore=0 suspectscore=0 bulkscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406020122 X-Proofpoint-ORIG-GUID: 8FcAO6973ZA1DzTJ73-orK-OzL5vx4um X-Proofpoint-GUID: 8FcAO6973ZA1DzTJ73-orK-OzL5vx4um Add atomic write support, as follows: - add helper functions to get request_queue atomic write limits - report request_queue atomic write support limits to sysfs and update Doc - support to safely merge atomic writes - deal with splitting atomic writes - misc helper functions - add a per-request atomic write flag New request_queue limits are added, as follows: - atomic_write_hw_max is set by the block driver and is the maximum length of an atomic write which the device may support. It is not necessarily a power-of-2. - atomic_write_max_sectors is derived from atomic_write_hw_max_sectors and max_hw_sectors. It is always a power-of-2. Atomic writes may be merged, and atomic_write_max_sectors would be the limit on a merged atomic write request size. This value is not capped at max_sectors, as the value in max_sectors can be controlled from userspace, and it would only cause trouble if userspace could limit atomic_write_unit_max_bytes and the other atomic write limits. - atomic_write_hw_unit_{min,max} are set by the block driver and are the min/max length of an atomic write unit which the device may support. They both must be a power-of-2. Typically atomic_write_hw_unit_max will hold the same value as atomic_write_hw_max. - atomic_write_unit_{min,max} are derived from atomic_write_hw_unit_{min,max}, max_hw_sectors, and block core limits. Both min and max values must be a power-of-2. - atomic_write_hw_boundary is set by the block driver. If non-zero, it indicates an LBA space boundary at which an atomic write straddles no longer is atomically executed by the disk. The value must be a power-of-2. Note that it would be acceptable to enforce a rule that atomic_write_hw_boundary_sectors is a multiple of atomic_write_hw_unit_max, but the resultant code would be more complicated. All atomic writes limits are by default set 0 to indicate no atomic write support. Even though it is assumed by Linux that a logical block can always be atomically written, we ignore this as it is not of particular interest. Stacked devices are just not supported either for now. An atomic write must always be submitted to the block driver as part of a single request. As such, only a single BIO must be submitted to the block layer for an atomic write. When a single atomic write BIO is submitted, it cannot be split. As such, atomic_write_unit_{max, min}_bytes are limited by the maximum guaranteed BIO size which will not be required to be split. This max size is calculated by request_queue max segments and the number of bvecs a BIO can fit, BIO_MAX_VECS. Currently we rely on userspace issuing a write with iovcnt=1 for pwritev2() - as such, we can rely on each segment containing PAGE_SIZE of data, apart from the first+last, which each can fit logical block size of data. The first+last will be LBS length/aligned as we rely on direct IO alignment rules also. New sysfs files are added to report the following atomic write limits: - atomic_write_unit_max_bytes - same as atomic_write_unit_max_sectors in bytes - atomic_write_unit_min_bytes - same as atomic_write_unit_min_sectors in bytes - atomic_write_boundary_bytes - same as atomic_write_hw_boundary_sectors in bytes - atomic_write_max_bytes - same as atomic_write_max_sectors in bytes Atomic writes may only be merged with other atomic writes and only under the following conditions: - total resultant request length <= atomic_write_max_bytes - the merged write does not straddle a boundary Helper function bdev_can_atomic_write() is added to indicate whether atomic writes may be issued to a bdev. If a bdev is a partition, the partition start must be aligned with both atomic_write_unit_min_sectors and atomic_write_hw_boundary_sectors. FSes will rely on the block layer to validate that an atomic write BIO submitted will be of valid size, so add blk_validate_atomic_write_op_size() for this purpose. Userspace expects an atomic write which is of invalid size to be rejected with -EINVAL, so add BLK_STS_INVAL for this. Also use BLK_STS_INVAL for when a BIO needs to be split, as this should mean an invalid size BIO. Flag REQ_ATOMIC is used for indicating an atomic write. Co-developed-by: Himanshu Madhani Signed-off-by: Himanshu Madhani Signed-off-by: John Garry --- Documentation/ABI/stable/sysfs-block | 53 ++++++++++++++++ block/blk-core.c | 19 ++++++ block/blk-merge.c | 95 +++++++++++++++++++++++++++- block/blk-settings.c | 52 +++++++++++++++ block/blk-sysfs.c | 33 ++++++++++ block/blk.h | 3 + include/linux/blk_types.h | 8 ++- include/linux/blkdev.h | 54 ++++++++++++++++ 8 files changed, 315 insertions(+), 2 deletions(-) diff --git a/Documentation/ABI/stable/sysfs-block b/Documentation/ABI/stable/sysfs-block index 831f19a32e08..cea8856f798d 100644 --- a/Documentation/ABI/stable/sysfs-block +++ b/Documentation/ABI/stable/sysfs-block @@ -21,6 +21,59 @@ Description: device is offset from the internal allocation unit's natural alignment. +What: /sys/block//atomic_write_max_bytes +Date: February 2024 +Contact: Himanshu Madhani +Description: + [RO] This parameter specifies the maximum atomic write + size reported by the device. This parameter is relevant + for merging of writes, where a merged atomic write + operation must not exceed this number of bytes. + This parameter may be greater than the value in + atomic_write_unit_max_bytes as + atomic_write_unit_max_bytes will be rounded down to a + power-of-two and atomic_write_unit_max_bytes may also be + limited by some other queue limits, such as max_segments. + This parameter - along with atomic_write_unit_min_bytes + and atomic_write_unit_max_bytes - will not be larger than + max_hw_sectors_kb, but may be larger than max_sectors_kb. + + +What: /sys/block//atomic_write_unit_min_bytes +Date: February 2024 +Contact: Himanshu Madhani +Description: + [RO] This parameter specifies the smallest block which can + be written atomically with an atomic write operation. All + atomic write operations must begin at a + atomic_write_unit_min boundary and must be multiples of + atomic_write_unit_min. This value must be a power-of-two. + + +What: /sys/block//atomic_write_unit_max_bytes +Date: February 2024 +Contact: Himanshu Madhani +Description: + [RO] This parameter defines the largest block which can be + written atomically with an atomic write operation. This + value must be a multiple of atomic_write_unit_min and must + be a power-of-two. This value will not be larger than + atomic_write_max_bytes. + + +What: /sys/block//atomic_write_boundary_bytes +Date: February 2024 +Contact: Himanshu Madhani +Description: + [RO] A device may need to internally split an atomic write I/O + which straddles a given logical block address boundary. This + parameter specifies the size in bytes of the atomic boundary if + one is reported by the device. This value must be a + power-of-two and at least the size as in + atomic_write_unit_max_bytes. + Any attempt to merge atomic write I/Os must not result in a + merged I/O which crosses this boundary (if any). + What: /sys/block//diskseq Date: February 2021 diff --git a/block/blk-core.c b/block/blk-core.c index 82c3ae22d76d..d9f58fe71758 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -174,6 +174,8 @@ static const struct { /* Command duration limit device-side timeout */ [BLK_STS_DURATION_LIMIT] = { -ETIME, "duration limit exceeded" }, + [BLK_STS_INVAL] = { -EINVAL, "invalid" }, + /* everything else not covered above: */ [BLK_STS_IOERR] = { -EIO, "I/O" }, }; @@ -739,6 +741,18 @@ void submit_bio_noacct_nocheck(struct bio *bio) __submit_bio_noacct(bio); } +static blk_status_t blk_validate_atomic_write_op_size(struct request_queue *q, + struct bio *bio) +{ + if (bio->bi_iter.bi_size > queue_atomic_write_unit_max_bytes(q)) + return BLK_STS_INVAL; + + if (bio->bi_iter.bi_size % queue_atomic_write_unit_min_bytes(q)) + return BLK_STS_INVAL; + + return BLK_STS_OK; +} + /** * submit_bio_noacct - re-submit a bio to the block device layer for I/O * @bio: The bio describing the location in memory and on the device. @@ -797,6 +811,11 @@ void submit_bio_noacct(struct bio *bio) switch (bio_op(bio)) { case REQ_OP_READ: case REQ_OP_WRITE: + if (bio->bi_opf & REQ_ATOMIC) { + status = blk_validate_atomic_write_op_size(q, bio); + if (status != BLK_STS_OK) + goto end_io; + } break; case REQ_OP_FLUSH: /* diff --git a/block/blk-merge.c b/block/blk-merge.c index 8957e08e020c..ad07759ca147 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -18,6 +18,46 @@ #include "blk-rq-qos.h" #include "blk-throttle.h" +/* + * rq_straddles_atomic_write_boundary - check for boundary violation + * @rq: request to check + * @front: data size to be appended to front + * @back: data size to be appended to back + * + * Determine whether merging a request or bio into another request will result + * in a merged request which straddles an atomic write boundary. + * + * The value @front_adjust is the data which would be appended to the front of + * @rq, while the value @back_adjust is the data which would be appended to the + * back of @rq. Callers will typically only have either @front_adjust or + * @back_adjust as non-zero. + * + */ +static bool rq_straddles_atomic_write_boundary(struct request *rq, + unsigned int front_adjust, + unsigned int back_adjust) +{ + unsigned int boundary = queue_atomic_write_boundary_bytes(rq->q); + u64 mask, start_rq_pos, end_rq_pos; + + if (!boundary) + return false; + + start_rq_pos = blk_rq_pos(rq) << SECTOR_SHIFT; + end_rq_pos = start_rq_pos + blk_rq_bytes(rq) - 1; + + start_rq_pos -= front_adjust; + end_rq_pos += back_adjust; + + mask = ~(boundary - 1); + + /* Top bits are different, so crossed a boundary */ + if ((start_rq_pos & mask) != (end_rq_pos & mask)) + return true; + + return false; +} + static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv) { *bv = mp_bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); @@ -167,7 +207,16 @@ static inline unsigned get_max_io_size(struct bio *bio, { unsigned pbs = lim->physical_block_size >> SECTOR_SHIFT; unsigned lbs = lim->logical_block_size >> SECTOR_SHIFT; - unsigned max_sectors = lim->max_sectors, start, end; + unsigned max_sectors, start, end; + + /* + * We ignore lim->max_sectors for atomic writes simply because + * it may less than the bio size, which we cannot tolerate. + */ + if (bio->bi_opf & REQ_ATOMIC) + max_sectors = lim->atomic_write_max_sectors; + else + max_sectors = lim->max_sectors; if (lim->chunk_sectors) { max_sectors = min(max_sectors, @@ -305,6 +354,11 @@ struct bio *bio_split_rw(struct bio *bio, const struct queue_limits *lim, *segs = nsegs; return NULL; split: + if (bio->bi_opf & REQ_ATOMIC) { + bio->bi_status = BLK_STS_INVAL; + bio_endio(bio); + return ERR_PTR(-EINVAL); + } /* * We can't sanely support splitting for a REQ_NOWAIT bio. End it * with EAGAIN if splitting is required and return an error pointer. @@ -646,6 +700,13 @@ int ll_back_merge_fn(struct request *req, struct bio *bio, unsigned int nr_segs) return 0; } + if (req->cmd_flags & REQ_ATOMIC) { + if (rq_straddles_atomic_write_boundary(req, + 0, bio->bi_iter.bi_size)) { + return 0; + } + } + return ll_new_hw_segment(req, bio, nr_segs); } @@ -665,6 +726,13 @@ static int ll_front_merge_fn(struct request *req, struct bio *bio, return 0; } + if (req->cmd_flags & REQ_ATOMIC) { + if (rq_straddles_atomic_write_boundary(req, + bio->bi_iter.bi_size, 0)) { + return 0; + } + } + return ll_new_hw_segment(req, bio, nr_segs); } @@ -701,6 +769,13 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, blk_rq_get_max_sectors(req, blk_rq_pos(req))) return 0; + if (req->cmd_flags & REQ_ATOMIC) { + if (rq_straddles_atomic_write_boundary(req, + 0, blk_rq_bytes(next))) { + return 0; + } + } + total_phys_segments = req->nr_phys_segments + next->nr_phys_segments; if (total_phys_segments > blk_rq_get_max_segments(req)) return 0; @@ -798,6 +873,18 @@ static enum elv_merge blk_try_req_merge(struct request *req, return ELEVATOR_NO_MERGE; } +static bool blk_atomic_write_mergeable_rq_bio(struct request *rq, + struct bio *bio) +{ + return (rq->cmd_flags & REQ_ATOMIC) == (bio->bi_opf & REQ_ATOMIC); +} + +static bool blk_atomic_write_mergeable_rqs(struct request *rq, + struct request *next) +{ + return (rq->cmd_flags & REQ_ATOMIC) == (next->cmd_flags & REQ_ATOMIC); +} + /* * For non-mq, this has to be called with the request spinlock acquired. * For mq with scheduling, the appropriate queue wide lock should be held. @@ -821,6 +908,9 @@ static struct request *attempt_merge(struct request_queue *q, if (req->ioprio != next->ioprio) return NULL; + if (!blk_atomic_write_mergeable_rqs(req, next)) + return NULL; + /* * If we are allowed to merge, then append bio list * from next to rq and release next. merge_requests_fn @@ -952,6 +1042,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (rq->ioprio != bio_prio(bio)) return false; + if (blk_atomic_write_mergeable_rq_bio(rq, bio) == false) + return false; + return true; } diff --git a/block/blk-settings.c b/block/blk-settings.c index 996f247fc98e..25d3ca2e2f0d 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -97,6 +97,41 @@ static int blk_validate_zoned_limits(struct queue_limits *lim) return 0; } +/* + * Returns max guaranteed bytes which we can fit in a bio. + * + * We always assume that we can fit in at least PAGE_SIZE in a segment, apart + * from first and last segments. + */ +static +unsigned int blk_queue_max_guaranteed_bio(struct queue_limits *limits) +{ + unsigned int max_segments = min(BIO_MAX_VECS, limits->max_segments); + unsigned int length; + + length = min(max_segments, 2) * limits->logical_block_size; + if (max_segments > 2) + length += (max_segments - 2) * PAGE_SIZE; + + return length; +} + +static void blk_atomic_writes_update_limits(struct queue_limits *limits) +{ + unsigned int unit_limit = min(limits->max_hw_sectors << SECTOR_SHIFT, + blk_queue_max_guaranteed_bio(limits)); + + unit_limit = rounddown_pow_of_two(unit_limit); + + limits->atomic_write_max_sectors = + min(limits->atomic_write_hw_max >> SECTOR_SHIFT, + limits->max_hw_sectors); + limits->atomic_write_unit_min = + min(limits->atomic_write_hw_unit_min, unit_limit); + limits->atomic_write_unit_max = + min(limits->atomic_write_hw_unit_max, unit_limit); +} + /* * Check that the limits in lim are valid, initialize defaults for unset * values, and cap values based on others where needed. @@ -230,6 +265,23 @@ static int blk_validate_limits(struct queue_limits *lim) lim->misaligned = 0; } + /* + * The atomic write boundary size just needs to be a multiple of + * unit_max (and not necessarily a power-of-2), so this following check + * could be relaxed in future. + * Furthermore, if needed, unit_max could be reduced so that the + * boundary size was compliant (with a !power-of-2 boundary). + */ + if (lim->atomic_write_hw_boundary && + !is_power_of_2(lim->atomic_write_hw_boundary)) { + + lim->atomic_write_hw_max = 0; + lim->atomic_write_hw_boundary = 0; + lim->atomic_write_hw_unit_min = 0; + lim->atomic_write_hw_unit_max = 0; + } + blk_atomic_writes_update_limits(lim); + return blk_validate_zoned_limits(lim); } diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index f0f9314ab65c..42fbbaa52ccf 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -118,6 +118,30 @@ static ssize_t queue_max_discard_segments_show(struct request_queue *q, return queue_var_show(queue_max_discard_segments(q), page); } +static ssize_t queue_atomic_write_max_bytes_show(struct request_queue *q, + char *page) +{ + return queue_var_show(queue_atomic_write_max_bytes(q), page); +} + +static ssize_t queue_atomic_write_boundary_show(struct request_queue *q, + char *page) +{ + return queue_var_show(queue_atomic_write_boundary_bytes(q), page); +} + +static ssize_t queue_atomic_write_unit_min_show(struct request_queue *q, + char *page) +{ + return queue_var_show(queue_atomic_write_unit_min_bytes(q), page); +} + +static ssize_t queue_atomic_write_unit_max_show(struct request_queue *q, + char *page) +{ + return queue_var_show(queue_atomic_write_unit_max_bytes(q), page); +} + static ssize_t queue_max_integrity_segments_show(struct request_queue *q, char *page) { return queue_var_show(q->limits.max_integrity_segments, page); @@ -495,6 +519,11 @@ QUEUE_RO_ENTRY(queue_discard_max_hw, "discard_max_hw_bytes"); QUEUE_RW_ENTRY(queue_discard_max, "discard_max_bytes"); QUEUE_RO_ENTRY(queue_discard_zeroes_data, "discard_zeroes_data"); +QUEUE_RO_ENTRY(queue_atomic_write_max_bytes, "atomic_write_max_bytes"); +QUEUE_RO_ENTRY(queue_atomic_write_boundary, "atomic_write_boundary_bytes"); +QUEUE_RO_ENTRY(queue_atomic_write_unit_max, "atomic_write_unit_max_bytes"); +QUEUE_RO_ENTRY(queue_atomic_write_unit_min, "atomic_write_unit_min_bytes"); + QUEUE_RO_ENTRY(queue_write_same_max, "write_same_max_bytes"); QUEUE_RO_ENTRY(queue_write_zeroes_max, "write_zeroes_max_bytes"); QUEUE_RO_ENTRY(queue_zone_append_max, "zone_append_max_bytes"); @@ -618,6 +647,10 @@ static struct attribute *queue_attrs[] = { &queue_discard_max_entry.attr, &queue_discard_max_hw_entry.attr, &queue_discard_zeroes_data_entry.attr, + &queue_atomic_write_max_bytes_entry.attr, + &queue_atomic_write_boundary_entry.attr, + &queue_atomic_write_unit_min_entry.attr, + &queue_atomic_write_unit_max_entry.attr, &queue_write_same_max_entry.attr, &queue_write_zeroes_max_entry.attr, &queue_zone_append_max_entry.attr, diff --git a/block/blk.h b/block/blk.h index 75c1683fc320..b2fa42657f62 100644 --- a/block/blk.h +++ b/block/blk.h @@ -193,6 +193,9 @@ static inline unsigned int blk_queue_get_max_sectors(struct request *rq) if (unlikely(op == REQ_OP_WRITE_ZEROES)) return q->limits.max_write_zeroes_sectors; + if (rq->cmd_flags & REQ_ATOMIC) + return q->limits.atomic_write_max_sectors; + return q->limits.max_sectors; } diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 781c4500491b..632edd71f8c6 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -162,6 +162,11 @@ typedef u16 blk_short_t; */ #define BLK_STS_DURATION_LIMIT ((__force blk_status_t)17) +/* + * Invalid size or alignment. + */ +#define BLK_STS_INVAL ((__force blk_status_t)19) + /** * blk_path_error - returns true if error may be path related * @error: status the request was completed with @@ -370,7 +375,7 @@ enum req_flag_bits { __REQ_SWAP, /* swap I/O */ __REQ_DRV, /* for driver use */ __REQ_FS_PRIVATE, /* for file system (submitter) use */ - + __REQ_ATOMIC, /* for atomic write operations */ /* * Command specific flags, keep last: */ @@ -402,6 +407,7 @@ enum req_flag_bits { #define REQ_SWAP (__force blk_opf_t)(1ULL << __REQ_SWAP) #define REQ_DRV (__force blk_opf_t)(1ULL << __REQ_DRV) #define REQ_FS_PRIVATE (__force blk_opf_t)(1ULL << __REQ_FS_PRIVATE) +#define REQ_ATOMIC (__force blk_opf_t)(1ULL << __REQ_ATOMIC) #define REQ_NOUNMAP (__force blk_opf_t)(1ULL << __REQ_NOUNMAP) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index ac8e0cb2353a..565acbd3adcb 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -310,6 +310,15 @@ struct queue_limits { unsigned int discard_alignment; unsigned int zone_write_granularity; + /* atomic write limits */ + unsigned int atomic_write_hw_max; + unsigned int atomic_write_max_sectors; + unsigned int atomic_write_hw_boundary; + unsigned int atomic_write_hw_unit_min; + unsigned int atomic_write_unit_min; + unsigned int atomic_write_hw_unit_max; + unsigned int atomic_write_unit_max; + unsigned short max_segments; unsigned short max_integrity_segments; unsigned short max_discard_segments; @@ -1354,6 +1363,30 @@ static inline int queue_dma_alignment(const struct request_queue *q) return q ? q->limits.dma_alignment : 511; } +static inline unsigned int +queue_atomic_write_unit_max_bytes(const struct request_queue *q) +{ + return q->limits.atomic_write_unit_max; +} + +static inline unsigned int +queue_atomic_write_unit_min_bytes(const struct request_queue *q) +{ + return q->limits.atomic_write_unit_min; +} + +static inline unsigned int +queue_atomic_write_boundary_bytes(const struct request_queue *q) +{ + return q->limits.atomic_write_hw_boundary; +} + +static inline unsigned int +queue_atomic_write_max_bytes(const struct request_queue *q) +{ + return q->limits.atomic_write_max_sectors << SECTOR_SHIFT; +} + static inline unsigned int bdev_dma_alignment(struct block_device *bdev) { return queue_dma_alignment(bdev_get_queue(bdev)); @@ -1595,6 +1628,27 @@ struct io_comp_batch { void (*complete)(struct io_comp_batch *); }; +static inline bool bdev_can_atomic_write(struct block_device *bdev) +{ + struct request_queue *bd_queue = bdev->bd_queue; + struct queue_limits *limits = &bd_queue->limits; + + if (!limits->atomic_write_unit_min) + return false; + + if (bdev_is_partition(bdev)) { + sector_t bd_start_sect = bdev->bd_start_sect; + unsigned int alignment = + max(limits->atomic_write_unit_min, + limits->atomic_write_hw_boundary); + + if (!IS_ALIGNED(bd_start_sect, alignment >> SECTOR_SHIFT)) + return false; + } + + return true; +} + #define DEFINE_IO_COMP_BATCH(name) struct io_comp_batch name = { } #endif /* _LINUX_BLKDEV_H */ From patchwork Sun Jun 2 14:09:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 801215 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 01DC83FB83; Sun, 2 Jun 2024 14:13:13 +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=1717337595; cv=fail; b=bx+XlsmD9k0QW42Ul4M85o6Kt1JZWGSYPE7vl8gumLVMyZcN9FH+LGsa3HVNneuWWCAaUtnWEaAKEzRgUvDT9sShzW8JIAd0etWHaoeuwuoahXEkwZkr60Hxhm38dGKTibvkS93hgMUHZPTnQBc6P120IDgn1L8NjwU3b13s08E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337595; c=relaxed/simple; bh=pq9xftascDsyN4kFirLkMyvIYrxZf2Z/Ihozd1v+J8s=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=dqGmSPy/IKNKRdOtt42l/pMIuJfgFSsVHl+qix8VTWQtS4MvEX2ITkG5gmHLiHILmPHOP4Tx6734tSgC59HMyB9D8KY/qA0UPFkrI/9+yDLPATeOoFEGnn36XQ+Z7d3RV8HjRVTZtpGA+SDPOJSBe1/+z1GMIDY+J+AvzkR8foE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4525UKXq020741; Sun, 2 Jun 2024 14:09:52 GMT DKIM-Signature: =?utf-8?q?v=3D1=3B_a=3Drsa-sha256=3B_c=3Drelaxed/relaxed=3B_?= =?utf-8?q?d=3Doracle=2Ecom=3B_h=3Dcc=3Acontent-transfer-encoding=3Acontent-?= =?utf-8?q?type=3Adate=3Afrom=3Ain-reply-to=3Amessage-id=3Amime-version=3Are?= =?utf-8?q?ferences=3Asubject=3Ato=3B_s=3Dcorp-2023-11-20=3B_bh=3DTsryy5QZsK?= =?utf-8?q?mTfyx3TR+aS+FRRVdU7p5NS+M/p8NIQPo=3D=3B_b=3DXAbUlBrjcpvP/kl81TN50?= =?utf-8?q?EZXYgQ8qAuQvw4tTC25sCYWE2TGAhwq5UxElqdA7ndY7BoJ_cKjCzepAGzmXCo/eS?= =?utf-8?q?eXXAfpj1i0YUAcSZQyUCVcIlX4328uMeKvdEXxnLXl0MDyDOczB_8QveaPCyjoCek?= =?utf-8?q?9qgDADMptWj39a+cs0TyZ89djK5hrR07x1C/z+iFf30KiiRK0ZJOArC_P0mNifm65?= =?utf-8?q?jOMqQIzGxzmi06jh/5DTh+da3C8AJNRx33OcC8UPHXL085jqn+NNZ/VBJAm_DdkgI?= =?utf-8?q?l/rj0JSbhhNJwJ2jnRrxk5n4bgZcvy1B3x97Wef0kGqzPf60iWfxyGLgx958Fdw_A?= =?utf-8?q?g=3D=3D_?= Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yfuwm1cuu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:52 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 452CDYtX037809; Sun, 2 Jun 2024 14:09:51 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2101.outbound.protection.outlook.com [104.47.70.101]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3ygrja1h81-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:51 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=N/0yTVmdayT6MAV5JFdne9zgdyz5cugqunk+lpHYOPqbaNb4TuMR27A1Rq6/+tRKKs8/z6Dh+2RqjvzE9szhHy8qt627aJkTZnjjrKsiecl2oI8s/ZnQuqHzMNcSdLV3EqUqGSZMG2OgVU+3tQD+adzz/imbEEk+lFW7tkv8w+rQDEZkgsVGOreASxJvsMAeIio4TSlrndUpjpoDCuu+tJMwxzMn2RbCsWKC6ACm9X8u1Lt+A+cMd4VMLfRYNQPeASAjp3+YbIzRnmtxO/84MWsw8ms5Ey/GaVjH+0HTam2JgMEjukVHLMDch5OkXRkJp7PWNxaonh5BBCFuOG9voQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=Tsryy5QZsKmTfyx3TR+aS+FRRVdU7p5NS+M/p8NIQPo=; b=ldHyC74Ydvm09SpmTYQUk51eIcpbIp9LEf/2gwDz+NelCafbEOvHgNRitT/ed9YBca6Ufuv9qRAOzs/cB7OAQ6+IavS59uL0yEz2QxhPJBtPLDAcOgIaefyqykW2U3sPNv5ghzi8bbVUvbdLAV3YQpLuE7SQ9BiWst17CrYriDTwklxdaosuK+oFFsdkHyeBfEkgGLVxDhrYiAU0NxYkHGSNvOwoJ8DKyrsGiAVyWhXHkzMNYSqkzFKHJVIkw4JTzPVM9E0xwCVYRY8GbCrKVhgRArDVxn0arHdp3FlLEGO30UAQddNPkrqgMh1gHZysDti7E+0l0/MthAoY4RbV7Q== 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=Tsryy5QZsKmTfyx3TR+aS+FRRVdU7p5NS+M/p8NIQPo=; b=ZEa2JbhOjVn/Z8vi1wkDq0i5YyAgMFeKa83soMQmfySmyzv+Qqexy2/0PO7pSxsMY+rmDq7IMOEEJTz6opMhCeTn5ObojXPFEuOJ8DXrOBExs/I4Wzt+9oswpxvXqX2JEyoNY8zDcl1S+mkEUhoqMQFD8UuT9KJ9pNSTx1s2pqQ= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by DS0PR10MB8078.namprd10.prod.outlook.com (2603:10b6:8:1fd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.25; Sun, 2 Jun 2024 14:09:48 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%5]) with mapi id 15.20.7633.018; Sun, 2 Jun 2024 14:09:47 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, Prasad Singamsetty , John Garry Subject: [PATCH v7 5/9] block: Add atomic write support for statx Date: Sun, 2 Jun 2024 14:09:08 +0000 Message-Id: <20240602140912.970947-6-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240602140912.970947-1-john.g.garry@oracle.com> References: <20240602140912.970947-1-john.g.garry@oracle.com> X-ClientProxiedBy: MN2PR03CA0007.namprd03.prod.outlook.com (2603:10b6:208:23a::12) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|DS0PR10MB8078:EE_ X-MS-Office365-Filtering-Correlation-Id: 52f33fa8-f0e7-4655-3278-08dc830da92b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|366007|7416005|1800799015|376005|921011; X-Microsoft-Antispam-Message-Info: jRiv0cAiPi9SRlAWsZlMc2kHfpDVPXuza4C3LzIxpsdqlU02swXbZgu1JT1ZwNkr3Yby9b+olKh7YEYnVDF3Re4u8py7FoyNSQO7RuCIgjx1k9MEISS61UejiFx2TidfnMltvNPsUkg5Q+6kYUulI48kQixPBPd45rRqgxDtqjtAaTtVOwNtDXvofM6ESzpNdSiDnUZfT0BGKuuwLoGx1M/mDcZfvTaR525xLgxVeOwrf4sLQi9rNwsWl8jhy+ig45n/zpnrc8DDuI3tzUaE7Y5p3PbCQXZidc6S8MTBg8xrvfUEdWF7CJDfDcwi1URo/PsNuf/brt+0thNCvFxjN/mjY9U1fD9kgo3ibvzyW4FMG/mrUiLOzza6+AMGgVzttdcrCFRmMebb+F0SbDJ3hampYQNn+rDUJ75OFMM0HWKXCGR+ldgxHzDBinRtNgd7uYKTSxPm6h8K6Jrk/7dcfZRvMSPSkpPlkTFfB14nHTSpxlHzLn6pnL54xHaC9bEyr4GcVXeyUVgV6aLl8j2NYIjvzspsPWhwIg47CQbxAQALhoK803e8jXH80CC7AS5SwVb5pPW6SCv/gVejZmy4chNqI3+xlTr3j/6HX99FKcCaCa6liP6adAZAhBSJE/6hRNXywttvXd/8cI6nv4jmlGnz22ZhjcZKXS0Zh0cP3ishzsyBI2+eP9iWd6+JGbIvLC4bprGVbYMb+K/uLACJxZg5Ik0MrpKHblbw0EpgTzAefydVhPYtnKuW931nJjZ02J7Ha5O8mnLzQnnrMXt37s++zgbuTyWtDx8npCmVMu0A8HWaf3pdfV4omaus0m/GolJcKwica38XHrudritTHrQRLaEntuSir9bMy7VEjM28hc4EAF6lxJkhCp7M7QHY/0ol6NkSW8JKwf+kLjd1Km/G827uEGuZe4eAlJ1ajHhNAoVJvurMT+3oxGn4pa9R5e8LWQb+m4Y7+Bz+ojPhhhFtu1IlMC/AX3/QZg/cArokPMAQZbLiNwOOPVE9/0gz7tSvbBreOiS379rd9Zo7imrXcSTNlfwPzEsl5AoCgm+tbJGUn8b/V6k7uxZRcRf2lYzedIr7BLmBRQvLlgyoBrhaiFPR8hVqXusBW1YiE83RIEUMzAhMKMcJ9XtB4bt+q6gJIyepW6IfBD8Rz/wXSnEoXgrslDRezjexK+8ChH2PUEoCw2gB9aoSNPHRbd4s9KJzdn9qRJDVO2SDUWntvagfdccWSKvwIGuJczzjTGN53otcJ6b3kQ5ERtT25V0o7wMZDWQB/qBGCiDb8W3YBwKC6/Ya1e2EO0kEnGtgnZnxjWWMGarPJTbaX3xuLCuf X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR10MB4313.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366007)(7416005)(1800799015)(376005)(921011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: K36IDcbdFVZJKGYUol+bwEXXEqoReOrZFC3uJDtgvGrG8209a6J2LUnWH2/3An9DLGNgRQQ80sGp87tyKAyIMCLjy8UZg5UZTOCxZJHaqyr7c4NteKj1T7lfsU0Jo9PBc+Xq9nV7Uupn0pyDIr9vyC2u4y2ofdD9DEmKl4PWKyRgv2n31ufEra668yqAbRZQA4+6KB68bk0fS9c6Dfp5otQu5Z0jRvJJw6gjLOMNBO+X+mcPdHpa64suaAYSoAvJEKe/AgCOmMw9l6CA9B1BEUorRdiz+lhKweUm4D+pNuaBYXP7r/mOs30tQLTvf/X/iho6IOFhPqee/UxXx/TRcO10ewUCSt5YqlaSoQjWC7LiOlx8ydCpn5utTLTeqvk5m03Sy6nhsrHgvCTsVg2ljAXZ//qL5HOqLJAFgbaWWAineDnFy6oubL7nx9gBNUpD2yciGxT9Fi6WGUmIe7ycD1+5TowQ37xIed7F6iRZd09rKwaub/tD5VNg7qcFBzPHkJ9t6Xe+9cOIwXR00IkUdFI/5aQmgDCHOuZ/WGBDpLOP8V7FtHs+rpmqXBO4kp5udZyooihKhhWeCcOG2hDVgVK8gkj9pN3oSWbn5WJDTpiZJfRMV/gnjZcU7UZ4s1o5B1GvqQatxhcSEB456EfRa0P4Jy4cNhMJr7xEXxou3Se3Xo1JMpmNh0DnnsUSYDonqqGmbttEsEXTv69V7xR/d962Aluo/8DWB+G1vS8mSBB9YMtQZ0oveu/tZD2hxMQiGSfia3CvsLLfFnNsr3ZIiCNOnCPbsLPelC13t+Efpai+xf9bXcDxp31w755MOnEbF4g8+tbONAODkNrve/hGpKCsjLdb+43AFwIB9l6hPt5+noUH2LELnEXOW53JQth9BgXc+aiLrGn7EhdDGB/n77eqfTUGYmniH9W7HDSnmHNc1yfIV2LMYwg8bT5PFNB6PXRweuQ7KEwJl1yXJBw8Ox2QNVX7aZJEa1Z3Y0suvRACRFSEWl8WKBio29Cnv3DP0QwJZM/20mSe5oryjjt+ae9ZFGwmLS9CGlpfxAKU1hSj/Wxi92qkkWQrcSnV7fzWPWjFrdy9Ag1uOAYdvTgncYpMfpRKqtvkmHNZytqhfn+6i9B7t4NhNFQQT0iMjc3zmMU1WJ7YqdI2Ou7BgiWi6PPLWhcljVFWpGwIBajNCotu9n8FljK+/1P51DXZgaMnfmh6oD2LeQiitw2Ccj2SY/Dy/oePjDHfPxbHYYQiTz88UdwbewHpd7KyM4uVjQIZtDJM6TO7xar78T2EEXgzVnMEoEVZW5AtSnEipPjyQN8CYirOJLuGX/4OElzY+fBfD05lxrMPeigjxbPCqh6gkVK5N884JnsTCFeomSFe5kkUgClm3NuENsBIA0JFWD8sC4vrtUsiOoUOd4RZ5Da3muFJEnfudkW6Uj7PSSwJTAH1GU/BdKHoS8BFVs9KSgYjqVYZ+KXvdD75r2e7f8n06+bAmY1Uuv6h91Bgxo02MlECIpACANnf/MTNfpNwx36WOsAfceqxqBbqPwM7Lhqw05L7jjMPqacm3vrJmPVSd7KI7R6O+o+FQqZqaNXz4CuB9vXZHmOYcO5acw6NbJY+Kw== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 92uMZ5OgkCabSJ77/MVWOaHAxM/2RYwYKyhxh5v3kDhRZ9nGV5DTApKVFoozqf3NIZ2+ToHNvFEfbFJHd/3tPrq4hztOKF8NnzIEXQYsqkE+DdRQFu2uni0RbG75lugoR1nN9PRfB+fpN2ThilsHBSDMoU2hVIwFJObH4Vv6MTEMV7TtA+01k2xmemgjn9eRq2+O/6spf2QDgsbWG67yz7zbvFK4keRrTrOiSr1d/HBB4qWKmri9KVuGI8VKu+xSbFlN5O/BsbAjY2+Js7+HzW0CA4TVc7whKNi6Vy++85gFSTJy3aOb5WFF+bIcxj0hjCCcMtrj+VoLPlpG6mZVeDUSTe2SZcWbWsxnGYZZgdRlP+LdojHnDc7ua9A9MVy50fvW6wQ8vtSc+r6Ekq8HpxNbnUBdSOnTiDRDNyaRPiVIVeWEwJiJkj/F7LhCHINhQ4D7a9G38xJYuxnskibDzibmXKHPONW4eGgTdL6K14ijr8t66ChGKSsujCG0/iXXkSiWwRJRg0w2hOJnMHzbkikYJ/Dod+DP2ycWkZNROqUnVsCD6Hs2laqXDhJdA5almppS1rxfPU+oQYOEIy9ubxbhyTWN0tjHAKCOaOvjEN4= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 52f33fa8-f0e7-4655-3278-08dc830da92b X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2024 14:09:47.6948 (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: 6r9ixp+JxHSG6K1tNc7AysGSvfkSxTw7/x4rAFioYvGIVrDtjIHReDDn5iFZzTt7yUTI5K1a6uO7Ff83ByjNhQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB8078 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-02_08,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 phishscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406020122 X-Proofpoint-GUID: P3eHHu5zW_p_s4KuQNCiToVKYMlew-ME X-Proofpoint-ORIG-GUID: P3eHHu5zW_p_s4KuQNCiToVKYMlew-ME From: Prasad Singamsetty Extend statx system call to return additional info for atomic write support support if the specified file is a block device. Signed-off-by: Prasad Singamsetty Signed-off-by: John Garry --- block/bdev.c | 36 ++++++++++++++++++++++++++---------- fs/stat.c | 16 +++++++++------- include/linux/blkdev.h | 6 ++++-- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index 353677ac49b3..3976a652fcc7 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -1260,23 +1260,39 @@ void sync_bdevs(bool wait) } /* - * Handle STATX_DIOALIGN for block devices. - * - * Note that the inode passed to this is the inode of a block device node file, - * not the block device's internal inode. Therefore it is *not* valid to use - * I_BDEV() here; the block device has to be looked up by i_rdev instead. + * Handle STATX_{DIOALIGN, WRITE_ATOMIC} for block devices. */ -void bdev_statx_dioalign(struct inode *inode, struct kstat *stat) +void bdev_statx(struct inode *backing_inode, struct kstat *stat, + u32 request_mask) { struct block_device *bdev; - bdev = blkdev_get_no_open(inode->i_rdev); + if (!(request_mask & (STATX_DIOALIGN | STATX_WRITE_ATOMIC))) + return; + + /* + * Note that backing_inode is the inode of a block device node file, + * not the block device's internal inode. Therefore it is *not* valid + * to use I_BDEV() here; the block device has to be looked up by i_rdev + * instead. + */ + bdev = blkdev_get_no_open(backing_inode->i_rdev); if (!bdev) return; - stat->dio_mem_align = bdev_dma_alignment(bdev) + 1; - stat->dio_offset_align = bdev_logical_block_size(bdev); - stat->result_mask |= STATX_DIOALIGN; + if (request_mask & STATX_DIOALIGN) { + stat->dio_mem_align = bdev_dma_alignment(bdev) + 1; + stat->dio_offset_align = bdev_logical_block_size(bdev); + stat->result_mask |= STATX_DIOALIGN; + } + + if (request_mask & STATX_WRITE_ATOMIC && bdev_can_atomic_write(bdev)) { + struct request_queue *bd_queue = bdev->bd_queue; + + generic_fill_statx_atomic_writes(stat, + queue_atomic_write_unit_min_bytes(bd_queue), + queue_atomic_write_unit_max_bytes(bd_queue)); + } blkdev_put_no_open(bdev); } diff --git a/fs/stat.c b/fs/stat.c index 72d0e6357b91..bd0698dfd7b3 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -265,6 +265,7 @@ static int vfs_statx(int dfd, struct filename *filename, int flags, { struct path path; unsigned int lookup_flags = getname_statx_lookup_flags(flags); + struct inode *backing_inode; int error; if (flags & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT | AT_EMPTY_PATH | @@ -290,13 +291,14 @@ static int vfs_statx(int dfd, struct filename *filename, int flags, stat->attributes |= STATX_ATTR_MOUNT_ROOT; stat->attributes_mask |= STATX_ATTR_MOUNT_ROOT; - /* Handle STATX_DIOALIGN for block devices. */ - if (request_mask & STATX_DIOALIGN) { - struct inode *inode = d_backing_inode(path.dentry); - - if (S_ISBLK(inode->i_mode)) - bdev_statx_dioalign(inode, stat); - } + /* + * If this is a block device inode, override the filesystem + * attributes with the block device specific parameters that need to be + * obtained from the bdev backing inode. + */ + backing_inode = d_backing_inode(path.dentry); + if (S_ISBLK(backing_inode->i_mode)) + bdev_statx(backing_inode, stat, request_mask); path_put(&path); if (retry_estale(error, lookup_flags)) { diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 565acbd3adcb..af85bb122158 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1588,7 +1588,8 @@ int sync_blockdev(struct block_device *bdev); int sync_blockdev_range(struct block_device *bdev, loff_t lstart, loff_t lend); int sync_blockdev_nowait(struct block_device *bdev); void sync_bdevs(bool wait); -void bdev_statx_dioalign(struct inode *inode, struct kstat *stat); +void bdev_statx(struct inode *backing_inode, struct kstat *stat, + u32 request_mask); void printk_all_partitions(void); int __init early_lookup_bdev(const char *pathname, dev_t *dev); #else @@ -1606,7 +1607,8 @@ static inline int sync_blockdev_nowait(struct block_device *bdev) static inline void sync_bdevs(bool wait) { } -static inline void bdev_statx_dioalign(struct inode *inode, struct kstat *stat) +static inline void bdev_statx(struct inode *backing_inode, struct kstat *stat, + u32 request_mask) { } static inline void printk_all_partitions(void) From patchwork Sun Jun 2 14:09:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 801218 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 9D5E93D387; Sun, 2 Jun 2024 14:10:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337418; cv=fail; b=FXMiT1FN/En9ifUqJ8lkA04c4lfVtg1xsFvB8As+l/yQvhWAxiXeYyTI1iI9WMszsTSMOsApfzyRskVz1OOSP+w5H9A0TuvF/9mKOvegT44nkHAUszbuxYRqU8t4aeBUoCuHe2ZF/YC7a+Wtbk5oN7S/VIezfJPQugp2/3EaPZc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717337418; c=relaxed/simple; bh=sl1f16rLh6VuBRP96w1uGO1Jce7Sd7atKPgvxNCh4W0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=TgbkwbQRD/C0cb0S31DzQjpPkiXbl/aP2L1ZQGltfpqKQvOnEjNYAbBZ+FXPKY+WXIzLDVYrL3ZSk8Nf137Z187EH3lw/sKbr+wZGgSFmfy1Z8zXng33H6jxt5lVF/wBWSYI/Qnu0YXBGSC1Lw+kGzy1DaqoFHmZa9A1cn5WzzE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4526jm3S004327; Sun, 2 Jun 2024 14:09:53 GMT DKIM-Signature: =?utf-8?q?v=3D1=3B_a=3Drsa-sha256=3B_c=3Drelaxed/relaxed=3B_?= =?utf-8?q?d=3Doracle=2Ecom=3B_h=3Dcc=3Acontent-transfer-encoding=3Acontent-?= =?utf-8?q?type=3Adate=3Afrom=3Ain-reply-to=3Amessage-id=3Amime-version=3Are?= =?utf-8?q?ferences=3Asubject=3Ato=3B_s=3Dcorp-2023-11-20=3B_bh=3DhnwTjXg77N?= =?utf-8?q?ze6LQe2mD+iyMVp1YWIYX58p+5m2fahrk=3D=3B_b=3DDAFVvbN4lMb9k8nIQl0UN?= =?utf-8?q?Ib/9iBhzGaypRqFBHCi1K2H5w27twbbNvn2RTjCISYttx0B_jP1kxA882hzcUy8jQ?= =?utf-8?q?V4ZEewJFgAnd+31oFKwM0PxNKdbE5bNyW96LL2TD7MJ8LrffJlS_zB5OmaPKiU814?= =?utf-8?q?0sZ9GxMNPnILDJhq0ggKndTQcXwSRK//u3Zf4aXaiS3b3sIr5UWN7t8_biQYKxBih?= =?utf-8?q?SlAOEuhbvFppjEPqhO2dzsMvJR9lftQ/A0QTXL8nc27DBr71iuN8ScuAXPt_mRrQv?= =?utf-8?q?s6nLgL2MGuscZS6v0UTRKDepBqjtu1cauSYvhBb/b/VfJW5rbVQ2qmg0FBOIu30_A?= =?utf-8?q?Q=3D=3D_?= Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yfv6u1cnc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:52 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 452CDYtY037809; Sun, 2 Jun 2024 14:09:52 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2101.outbound.protection.outlook.com [104.47.70.101]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3ygrja1h81-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sun, 02 Jun 2024 14:09:51 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hgCyo+NXusTZsIgf6k3dSiRgzBpsLx9LGA+HUnv0QBHR8HTFtUUFwMw5LFKsvegUQKQrQOLTe0UnZs/C+PeoN40sUJAHoh2NgjIV5ZDECW9Ag61uRbhl3Vl6BylSTuq7/DUaK/++rTNsYFoUwkvO0qpjIxlU/JcYHOczdtB/7YEjM6UknbXXs+F+AdeT2tjC/GSsC6xGfW3TYCLFow8rD0shO/gj/EdD7Rw1h03ZBkb0UZ8WW/aBzPx0X3KB9hBya2phyuY648EsHpWIXosMVzWPJrDCPd2hWVVt23hPzqwHfqoz5ESzLq5fbZ0Qb75itUgO6J/bRh79AHAUGDRo5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=hnwTjXg77Nze6LQe2mD+iyMVp1YWIYX58p+5m2fahrk=; b=AoVSV+JdqC65ywKEG4AfB9Xd7zPWPh8s58O80LcvS4Hyqj7g5Tl8dp8/5K3G6jTC/tykYR1xhwVdjWg5bKddhjBxxdBmT2itmxnbU6B2FFgnk1+pd5SC+ciBLBYHhZlTFtV/M2/70xqVoF6v7rb1Ji3iOVoCh9pzSPKGrcwZLY/bKFjz0uEedWMimpVVCn/m6xNA4EGGl1WppXYAPgamxQlbOZ6sm5f78sNqJfxvGNRih13A0UyW1t3t+ZQGHbHBNipBmmlFUcYyPHvFxexlxd3/MDPHvCQDT3Z+SZfr7naGuaY9ayrIlgnUQfabf6WvVDg2x0bkVhZE4tuvIySUzg== 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=hnwTjXg77Nze6LQe2mD+iyMVp1YWIYX58p+5m2fahrk=; b=KCqSPMrE3UWVljJDRCXh9g2dHAlId7SPIg/OGW1Ahhu4GNtLRP3vekk13xnwGOwxg7ZYy90pcL7EhSgG0pex+C5GTIOTetyjtoW8p6LEFBYO7hES37J9d1eyaaEI989BLixwPBbpgsFZH71jKNKgF9OJXjwmtAOSXMdFar3TpQs= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by DS0PR10MB8078.namprd10.prod.outlook.com (2603:10b6:8:1fd::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7633.25; Sun, 2 Jun 2024 14:09:49 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%5]) with mapi id 15.20.7633.018; Sun, 2 Jun 2024 14:09:49 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, djwong@kernel.org, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, John Garry Subject: [PATCH v7 6/9] block: Add fops atomic write support Date: Sun, 2 Jun 2024 14:09:09 +0000 Message-Id: <20240602140912.970947-7-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240602140912.970947-1-john.g.garry@oracle.com> References: <20240602140912.970947-1-john.g.garry@oracle.com> X-ClientProxiedBy: MN2PR03CA0022.namprd03.prod.outlook.com (2603:10b6:208:23a::27) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|DS0PR10MB8078:EE_ X-MS-Office365-Filtering-Correlation-Id: 3b95f740-2669-4112-7567-08dc830da9ea X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|366007|7416005|1800799015|376005|921011; X-Microsoft-Antispam-Message-Info: zP+SIH+2k9RQY9rmNj/189mleTk25VBRC00geIQSQObgT1KawZagEDAYj6s7Jm0LZv4S0RjDzENuwvQTNTmHl+Adq5vXiTc3FN4E8Vq+l/XflHvS5dEO3V3HRCbQCuup4MIxfa6u+Ztd2tDuKZnsc+sd4g44hQlF8CJWkdWy9JC9tq4rpfWBMYGE/qGcXtB604uFI1BSZV3g4hf0ZP44VWf1z07gcOMBICr5Hj8e9J2Bd6NF6RcXGcJXmpAM/BuIUhidrBGvsfivjXT5EvpeT9eirYB4USdeRj/rtpvUvNHOuYhn/I+T74acFbfxAQU3UIntKWzU4Y5wfvYrP/zQsQibBa1KcQEIRI33wqXNyparXDTCcBpAHOLzH/bHf+IPhfn3unk2Q/yEe3IUnElI2erS3KzaImn7lwYjAa2IRxju0HGyYWsbL14cRmSplIw0IKl5rVUm/1LsNLujslGKOV2ZZH2sPKQ7tnytOO1oabp8h7+Twm7y/BgZaShNB3asCYCgRzDGl/nNM67MV/dfBdij60cn8uDxRYeI5RnA6VtlS02oBBsEDk/QH0yyJK8O5OVSHBoqwOr47IKZ10RBqhTx5wXIQnxDa8LZaRjAAvJjNnqGJT85B4/ddemtUWIJ9BsHRPTNyk7Dsjs2zI9d6LdKFCFb1IZXgeAX/jV/r8dVzMp8trrLfROfQ30QtRuTys+ELG8glK6A1e4LhMee4S5xnXrRS66ErlQaQsSd6YbPNJKQxluLAPI30K/pdwksrMo4knz+3cS1+EkX1JhcG9x3JdfXdlZPxVlV03Cq1eOdOUiqLcgbesfPN48F3muXKUFp4Qt3F9JkwdUbGuQJfcb1u0tWiS2ZKhKOgfQ7DRkqy9Fs2ia1CvxZSR7th6d8Zt0rivvZUv2OrVIZGPqoJhzVoQUlAqALu4D7WGqKFUtACSsAdCbEiPdoOjgcBqc4o+LwPxcH16yubo97Ezz0U2Lqcot+iyHJdARHOGFJ3AV+dwd6qRNbBQjQOOIH8pLyGjJfj28TLQTfyRSxR08lu8/As62tY9Dnnm71LeWEvx5PsnBQupujBnzUnHN7rQD8s5CpxSMqxvuD1KAcEtSHX3RqhaejHBnGmjop2xmLraW/4sWSfzLX5gV4IGQ+r5u0yIfHoSXcB7yUhQP0pzp099w3XapR+rd0XNOCmPjN/5S6c4j8cmNl9JGC3kmKD7cmKOGbwQFZw3kvjDIKBYPHEZ68M2Zp51SXniXHCK7euML/4ndtff3Fy16WrOP7XGG1JaHmw9UE6ceKSPrfycgOzIZJkSafkYEjOalJXon0Gwck1+DRHSbpX7jgNOaw/E9z X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR10MB4313.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366007)(7416005)(1800799015)(376005)(921011); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: vlgy8YcnDw3Jq4pi7aC36fec/xiEMpd+dBXkdoYpsbOrEHK/CigK1PgVE89PBUolUNYk5W+XOHhcWic84D5CfE8NRUgn8Tl0iVlsZr8raKAtf6Lt5DDHirL2tigEYiE/82vBF7Tyv04BOY4sdJBiudb3Ga44gSAEedOVEbSm9OQyRhjeJdjc4iOftOLDcLErpuRC4M7owfMHUhWOJTOUW+iS0PyCbNhqCclRrf3xLCmz3jgPRVdPoGY5ZR/8QVzzKWLnFv7DO0J5WiXuacxqNVeSgoaZmGYbwvbN9W9WvJrRHT34FZwr9jQEdojlfwN1ff4ni7Uk42Nwmc3Zddw83VB0E7uWvXkLSw/v3egEHinRR98MC7MqiaQl92rfUDQcMkluZfdj2VT0nR6t1sJEZpC1Mru1ljPzfx/QIKWuSPv65DofYnfEqJxdlywJWueLjdqaXOgzn6tSlAwJAmRRSScX/CQsynwIFkoZ5wFu7nF0z9O08qUyuRpVUT8eBvIuzEtyGJMhDjPZ0dTDcJBJaECR12xSDZWTdJR59u6s5eeBR1/2PEOoHVBCHk0w3lBVwcWScZHuMZKKe0dtlFZpJ8kywGmImHPjApDMLwlVNZi4+RipK8Nl+eMQ2FalSzAeKOpy5/LcWiUIwccLgZgeSUUnTRiQ9pHZ5XEygq0IttkFgd/980uXW4G+G6x1C9No+bRFKbQ8ZSV3zl5+sJswo9JQbgd3IffgmQguDQ5yToax2Lxu2NJ8LGYkG8U3EEnIP25nFJp6+wP6R/whcpuE9svGaYYDvo9HSgSBO2e+pEAW/wSDb40XeJv/AwZuH7RKs1wEneVlnrZEKyOzcPnVrhEtK3b1ho2ex+EqeMv8G+kYSUWwxlCW/yhB9e6PoIevzw02ZOVc6t2U8G1hP5PuIktmCJht0DRGy7oS+t0tcF157a/hZ+7Wi0f7ktVUMYQcaQYSXjHQXKPUAAXDVasq23cfLGiv5hnS+g815XH+c69eL3fAjIsoXFzyAgnO0W9tA6C/IDa12f9J/5FsBaI0UTvO33gXMCfd6GKUkeYtN1aXyx93u2oSOuCryYdLZV+5tbOdXzJkOqj4JpFuozPrU6fyy5A+SpJ/uj9qkXo+p68Snp8vfaVedv6ypEpQs9QzlgiCHLKS9KNph4QLJMpsFtc6V/EU2LxdIqMm0kRbhBE2MJHRSw/k52bAKWigLDeFvXi6d/CRdYfeyPKmEDxw4mNQDlgMz0VVQ9wVuOOUlVGGmtgGegdo0UnVfcXBoRphcOpR6AIGRkaeLMfJlNP50huhPs8wOJVtanN3+FPrpNKkQQIWTrxrjQz9cHw1P0QOEg6i6Qyl0QKwl8vbIEGpVh3xsl36DJMINotFlA7P2qTJEE2H0MlXkEzDQJsPp/RxACZOL2vjyggw0AEwoB+rqM0jsitePae7AtX9vGWP3da8HQj9DrfMwfrOXhjU4Kv+PEWqLSMzh5RWhgD8lEYqQtsq+r1iIts8/fbxgOKpkOmdj5NC6Zo560gLdSGtgEKLqFnXmJBAhOZAfryYCyu1h9uSkm5NoheagEbv0O47/lVTOhYd6xbZ3wfzfXGV1ICjWJKtFidY0qN0P6XpruUu2Q== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: d80DM8wcZCQy2p0m2bz8keAys0Kp0s5KDXgQ4GHyVJNzv72GvY6/eWyvZo+Ul00SuB+M/6UsgOQEHcRzPLlXOfo4cFgULgNc97SBrF0X3ICITqTtaLamI6coG3ZBgD8/AbY6B6Lr3loPR5alM1aV3SU0DgtshlUB2IkjuJ9CirBWfRkT8pPAkJexckN/05glZc5nLxaGxa7JIfHeAZ97enaBFoM5qL7lsXdOl9+qS/IWLXFB3khwn265AuXenfunkcqNeHbzTxOYTar8emRWmMIyNkBphFLGD1GZLuZCZdpfrRPvVlY+wOKQgyQf32G0vtx6dSuySTxT2Bpq+69BLEL4W/b8NeW/9QF+B0D+QMfYHk7Kik6N8xuaFb4OYsu8k1jbDWrNgn7NbRoiOuYM8WGC4//JNqHMebIWBk7eegWXuuV+OsNA3TyeHDbqGBEKQP3KgQrc9EbnkWXR/XhIwYZ0Zl/V8JUlKCnalYmjHlvCuO9F44mcaHIkrn21n/927ln6MTq1WJIUCu4Ml6XLPUjYhhx/TbvRwG0psSTGlyRSHgdm2wRsr45GlL6T/KARiwUaqKne7rD+0eNQhgsvx7mloDDCVonCVNARe3olgmo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3b95f740-2669-4112-7567-08dc830da9ea X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jun 2024 14:09:48.9724 (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: OPECkUiAbbBLmXcfyzF4/k1IpnHwGm/0CdQtYzW8m59nRAFaKJFluoDks8QFj8lfCNEWTHDHvYsR3F3aEXCDiw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR10MB8078 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-02_08,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 phishscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406020122 X-Proofpoint-ORIG-GUID: viF77xZHgbq0Tw0EE2hxol6m48gzbASn X-Proofpoint-GUID: viF77xZHgbq0Tw0EE2hxol6m48gzbASn Support atomic writes by submitting a single BIO with the REQ_ATOMIC set. It must be ensured that the atomic write adheres to its rules, like naturally aligned offset, so call blkdev_dio_invalid() -> blkdev_atomic_write_valid() [with renaming blkdev_dio_unaligned() to blkdev_dio_invalid()] for this purpose. The BIO submission path currently checks for atomic writes which are too large, so no need to check here. In blkdev_direct_IO(), if the nr_pages exceeds BIO_MAX_VECS, then we cannot produce a single BIO, so error in this case. Finally set FMODE_CAN_ATOMIC_WRITE when the bdev can support atomic writes and the associated file flag is for O_DIRECT. Signed-off-by: John Garry --- block/fops.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/block/fops.c b/block/fops.c index 376265935714..9d6d86ebefb9 100644 --- a/block/fops.c +++ b/block/fops.c @@ -34,9 +34,12 @@ static blk_opf_t dio_bio_write_op(struct kiocb *iocb) return opf; } -static bool blkdev_dio_unaligned(struct block_device *bdev, loff_t pos, - struct iov_iter *iter) +static bool blkdev_dio_invalid(struct block_device *bdev, loff_t pos, + struct iov_iter *iter, bool is_atomic) { + if (is_atomic && !generic_atomic_write_valid(pos, iter)) + return true; + return pos & (bdev_logical_block_size(bdev) - 1) || !bdev_iter_is_aligned(bdev, iter); } @@ -72,6 +75,8 @@ static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, bio.bi_iter.bi_sector = pos >> SECTOR_SHIFT; bio.bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; bio.bi_ioprio = iocb->ki_ioprio; + if (iocb->ki_flags & IOCB_ATOMIC) + bio.bi_opf |= REQ_ATOMIC; ret = bio_iov_iter_get_pages(&bio, iter); if (unlikely(ret)) @@ -343,6 +348,9 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb, task_io_account_write(bio->bi_iter.bi_size); } + if (iocb->ki_flags & IOCB_ATOMIC) + bio->bi_opf |= REQ_ATOMIC; + if (iocb->ki_flags & IOCB_NOWAIT) bio->bi_opf |= REQ_NOWAIT; @@ -359,12 +367,13 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb, static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) { struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host); + bool is_atomic = iocb->ki_flags & IOCB_ATOMIC; unsigned int nr_pages; if (!iov_iter_count(iter)) return 0; - if (blkdev_dio_unaligned(bdev, iocb->ki_pos, iter)) + if (blkdev_dio_invalid(bdev, iocb->ki_pos, iter, is_atomic)) return -EINVAL; nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1); @@ -373,6 +382,8 @@ static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter) return __blkdev_direct_IO_simple(iocb, iter, bdev, nr_pages); return __blkdev_direct_IO_async(iocb, iter, bdev, nr_pages); + } else if (is_atomic) { + return -EINVAL; } return __blkdev_direct_IO(iocb, iter, bdev, bio_max_segs(nr_pages)); } @@ -612,6 +623,9 @@ static int blkdev_open(struct inode *inode, struct file *filp) if (!bdev) return -ENXIO; + if (bdev_can_atomic_write(bdev) && filp->f_flags & O_DIRECT) + filp->f_mode |= FMODE_CAN_ATOMIC_WRITE; + ret = bdev_open(bdev, mode, filp->private_data, NULL, filp); if (ret) blkdev_put_no_open(bdev);