From patchwork Wed Apr 9 14:25:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Guang Yuan Wu X-Patchwork-Id: 14044744 Received: from outbound-ip191a.ess.barracuda.com (outbound-ip191a.ess.barracuda.com [209.222.82.58]) (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 2854318CBE1 for ; Wed, 9 Apr 2025 14:25:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=209.222.82.58 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744208741; cv=fail; b=IoDr/bgGZo21FRrnoG8g0ni33e4vvi5Vy3jhSO059CKEA36ujo6AjTRBi5KRSo70uI386HZ8WkGrXNoW650n7RPGL17NkfoR/vqJ2QUY2zotgrky/FjKfE8kZhwMUi0eK5RErgkcxl7eYJvxLvi2EhIwe4fei8wyLiFGg1my8og= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744208741; c=relaxed/simple; bh=vZZHpnIh7QiPr5t08T3Brjy1p0cqtQEqeYKAK9DAPNw=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version; b=tY4AcU5XfNJn48Z/gwXn01OfWRCTNER0u24izHwpKs8VLyaaxhGm+oJIoLJB7Rp8k7E7yrM1PZ7Bb3gvBC2GnEq3pPjYEnKKfObZtgH1v3vAAHnineJSIVTBQBguOswMitdspyvn8sGysEKqNy1smHowe0d2rVmcTn1vr8wifbc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ddn.com; spf=pass smtp.mailfrom=ddn.com; dkim=pass (1024-bit key) header.d=ddn.com header.i=@ddn.com header.b=PA9SlHDO; arc=fail smtp.client-ip=209.222.82.58 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=ddn.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ddn.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ddn.com header.i=@ddn.com header.b="PA9SlHDO" Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11lp2174.outbound.protection.outlook.com [104.47.56.174]) by mx-outbound-ea8-37.us-east-2a.ess.aws.cudaops.com (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 09 Apr 2025 14:25:32 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zDxr2qDnOKNUYfY90qPDhROlUh2Gxgg5FMbHXjJVFpvL2vdJCRoQMZQd/5rsK9bIyXpZfbqGcntC8Mq4lDc532I3xVQw5I4XP9ss5aA/E62LnCGohBUY6Th7qLRA6DWwQu7hbVS3sglzqcwgwhtvwv1gH709ZUUvFbbgrNk09GpQabfvVhRx5Obd45+CVbqVotzovCmVWdyqnVxCLOaJekpNV6PgOG6uEkgE8eva13lHjWtZQzwZNe+CCCmFH0pdnwJGhu6EKyioik9ZeCpCgNvB+xIVo2BM3b5aGaLwTzYyFil8lemoL056onzRR/OJYZVJi0mCXVKL9aEHLVdB/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vZZHpnIh7QiPr5t08T3Brjy1p0cqtQEqeYKAK9DAPNw=; b=HSveP+g8Z16HNrnozH0QThY2XRaXPyqL+rsXHVygwiQ2CGjY93L0u3AjpcMn0MBPynIfdJZ89DrF9LhDWvyUS6o6OC0fcZnicqLk3WBX4fqPBs3WUIVuA7vsP7tkMzucN3AmWtWAnYEG3eSdPbjO+Tdvk1neUDj0fYu60YM/vTok0n9aduWw504eJC3xTPRw43fR50iCEXnVX/wR0Nf00rgtHfnZgmL9jsHtr4U9x2eu7X9k6yf4L+R+1UbCPKI4Y5xYlq8eXZVHcGBfh3tS2Zfzo2huEnsaxDIhmDPYjn1RIBwocQ4g2lrW7vj6sLcaoyzEEWrnpu7uUB96xLyKBg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ddn.com; dmarc=pass action=none header.from=ddn.com; dkim=pass header.d=ddn.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ddn.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vZZHpnIh7QiPr5t08T3Brjy1p0cqtQEqeYKAK9DAPNw=; b=PA9SlHDOOugZjNsc/s9nqaTrKmSQrWFkFa1iRXXkBWu1yPKmHLivIiMHGVmkj88wBkYHbB2U25eCMF82glLVGks0loACftmVMVwoTHPnDbjOWA8B3iGBu83NBmwg3syxmOk07tNMAyKNSH8koabvl7vKHp7lPvSK1P2pTJibcUQ= Received: from BN6PR19MB3187.namprd19.prod.outlook.com (2603:10b6:405:7d::33) by DS7PR19MB5686.namprd19.prod.outlook.com (2603:10b6:8:71::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.33; Wed, 9 Apr 2025 14:25:26 +0000 Received: from BN6PR19MB3187.namprd19.prod.outlook.com ([fe80::c650:f908:78e0:fb00]) by BN6PR19MB3187.namprd19.prod.outlook.com ([fe80::c650:f908:78e0:fb00%5]) with mapi id 15.20.8606.033; Wed, 9 Apr 2025 14:25:26 +0000 From: Guang Yuan Wu To: "linux-fsdevel@vger.kernel.org" CC: "mszeredi@redhat.com" , Bernd Schubert Subject: [PATCH] fs/fuse: fix race between concurrent setattr from multiple nodes Thread-Topic: [PATCH] fs/fuse: fix race between concurrent setattr from multiple nodes Thread-Index: AQHbqVp0M67N/vLLOUi6vmMAtVcZEw== Date: Wed, 9 Apr 2025 14:25:26 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=ddn.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BN6PR19MB3187:EE_|DS7PR19MB5686:EE_ x-ms-office365-filtering-correlation-id: c88b2553-f837-461e-7f31-08dd77725f7a x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|1800799024|376014|366016|38070700018; x-microsoft-antispam-message-info: =?iso-8859-1?q?nGGtDHQkAtlPwkdwxQCubGgeV1?= =?iso-8859-1?q?vBKKxu3I+HymHa3cRRKw0VcQ+dTGSX9xuo/ua/OqOhhLhPTSSfkIRXXj7brP?= =?iso-8859-1?q?95YD/EjH8yHLM3KDrAISaWhuT7Od6nJGtuLiOQKMeOjOeDbvejAnNPJ4Hlh3?= =?iso-8859-1?q?G96HbV7wxoB1rCsIO59oZx+eM7APBuEXU7/S3PDNCPOHkc+cKPcqQhQSVgpO?= =?iso-8859-1?q?ytR0sgVivJw2SYWeZfsK55u7gKaHO1z4Lsv53EKWC6eBdxzj/Zt9MkKoo5iZ?= =?iso-8859-1?q?wp4uYuVC0q7yqv7Wm+8/s1gCxCIXgMnal71h3QoneRhXHp1mEnJJX6LtRNWL?= =?iso-8859-1?q?seVH10dvL1w48gad+P4RaWo7XnQvUyzugseAZl7b9sUsKip3MaWJAVUNOwGG?= =?iso-8859-1?q?RyoI+iFkue0Oc9S7sag7CCVtfhsNLoJTu3SsbHekjCRlBewlK+CCNoRc2TzH?= =?iso-8859-1?q?tiRqvfRObi0uF0mXOCX7AjiASIMrCYGxsZoSlPwHrNenh2SyAzTb+iZaAmOT?= =?iso-8859-1?q?eq26PQZ+KgDrmSR3JRy7QXxCHtAI/+KeY0MTVJmv2m7wajJgzTlxl6yU3v3o?= =?iso-8859-1?q?Q7C77CI3jlOMaZLDToAT8/oL6Py4TRHpq7zPRTR1bgRQBLIWMbq3u0pCCTfI?= =?iso-8859-1?q?nxn7k70WrM3R53wzkPVz8xs4z7C7uRa3e8xwkK48RLEZL238voJE8as9lH5b?= =?iso-8859-1?q?ag+FN1hahf2ajlezhxPAAwjXN83U8Rl7hNO/XT7ck52/MTYi6vbe+GXLKHyv?= =?iso-8859-1?q?xpTBlsRjgVT3aO6XubrMSHVDa4Mu1G4+8yXW+uKlinqX9jjnYSy94qbwGSRN?= =?iso-8859-1?q?g0cg4vJbBBZAjlc2MyPaQlb810XAhRbp+9hHWEVZiHlqb8lMdgcjQFba3NRy?= =?iso-8859-1?q?TERbE6X6aR6xuPGXIHEz90fRE8zeKMqOjPv0H6vWI/eJGXmJ6o/cArL6YsZE?= =?iso-8859-1?q?+/02RPOSvSsOhSrXZ6x/vehA7WBSFnghoWqELCCNrPqiWrpeey4QfM9Ua7FG?= =?iso-8859-1?q?NRqArvq1kMTa38USd3o9O5J42uYLGjhhozSrXcmmQn35Y8nMekSNs4Pr+z2h?= =?iso-8859-1?q?uabzl50GJ6PJc781+je37x3aQhkNZTeU/ri2gT+5EJ/dRyO4nkV586a72N9s?= =?iso-8859-1?q?3+XmC03/TR5DyjV87PfG/QOvKhVtwAiIU7oiJzuabxi514icDMmxjeL49ezh?= =?iso-8859-1?q?WEKZoHJHKvK3Pb119RdY05+YI0RDzwizP8GpqKWSCCm7L7kvf+E3Mbwa/5F/?= =?iso-8859-1?q?K5YTrWi5OmKndfSNN+wEJrUFBeuACoZ8lQtUNspJkyOom0OoXOihPOSjmuPe?= =?iso-8859-1?q?gLXDyNL75e4o/Fsm+JomMPzDuR4aZvavUa7UOypatjroVt6mQEgiz1z+CubC?= =?iso-8859-1?q?4Tb018uj4dbS9ktWybWkHsrjn7YtUIDzgzx3SAW3gBGz/LI1nmEuOsHAmX2A?= =?iso-8859-1?q?5AY/ZlcpnPSxVtZ+bOxuyHHT6/0KKjBSfU52B1VKYtySfoPre6PlC8zQrZXh?= =?iso-8859-1?q?n3RL3fdt0Q7qXrxHIkasxaqWF6wLxRO7gjYV5l5I1eF7UXO6c=3D?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BN6PR19MB3187.namprd19.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(38070700018);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?1OglKFpep4TwcIMciW0P9JQ?= =?iso-8859-1?q?QJsCtJcr0Obemo3c3Q9ESCDWuXunmZuBtnZS9b71pbk+xxi7ly0gd8b9AZQ4?= =?iso-8859-1?q?UfXF9NMT9QmY8EQtSdTkxCFLTB0gYgakLf9gXE129C3kZ/tKi+9a8WqT0DF7?= =?iso-8859-1?q?/01cUkyC/pI13coE5Jxt5MvnZCnANLI/fR24XVzRbgIeixMivj3FJBhUu6bC?= =?iso-8859-1?q?G90+9aJQhSO0oFTJJNY4Q/A/BrjPEI1lIIsSXafSPAi/MpJXFNAZaFIMIG6K?= =?iso-8859-1?q?/bRUVYdNmf8aVvG0A+NaVRdVnuCJJm0A82+NX/MwESiKUWQaUKKn7soFcWNu?= =?iso-8859-1?q?s60SIj+2ROnQobqU0HUWsy6fAkamvr36QBAn2o/wZOC8IW2CDvq9BptnFwIZ?= =?iso-8859-1?q?FId9OwmkBjUNaeVc5K0oWJKkWZLkcSsyRL3KmsdEj5nZS5z96iEZGSa+qAVQ?= =?iso-8859-1?q?/gXVtY9MsQRDnIN9BOZXDztcPIMzPZlIHmQEfkmBdw/5ghKxRl1+amH5t3xH?= =?iso-8859-1?q?KiualkS5YPr5wdxXIaF5BNuTlX0l4ppRx8OmHrJIe8oRcDsTL/0tCDkzTbYX?= =?iso-8859-1?q?epnC0M+VZEUALOWyMFT4UOk8u/7BMfOhBKRGpMwx3596J21zEn0ayNinVr2w?= =?iso-8859-1?q?D1+/x1tp5a8vxLf16jLBbpI1PDTyE6v9GNcSDS++Iol7FLF7xopw7cnY7L0I?= =?iso-8859-1?q?TO3fZC7WS1HxAEsYCOoafdXIfGjnd1Kk45Pd3g2H4DVmv+K6Qt+UIHfAMT4o?= =?iso-8859-1?q?1U92jjMdk90qB9rTjqrVwwZwBAD2gR2UA/8sF4isiiTCTiFrxBfPnhqhRNmF?= =?iso-8859-1?q?ygh2soTwcdzY90uueZNFpGSrrNAL/ehFMxVKFfwRpdp3r1g0B6tAGyvS73J5?= =?iso-8859-1?q?oCcoCRlON3/DWi6dVQQzfjHHPSVeWlhmfWl1dhjIT3uelfcqiHG92RSn7bMf?= =?iso-8859-1?q?+UucluKWmH6qMAmYR3eiNnJ3DPSW68eqgei/19ktESJfxbeWhbFjZKuZzcQG?= =?iso-8859-1?q?diQMrfX1VdHrPpixMHxrCH12YXVHYSnLF/xJO3oK5rQ/CREvaqLYAu4AlZNw?= =?iso-8859-1?q?MWGCFxfrKtDZvp1fYjZ9MLOcP0tqROWVN1XERmAPelWmnMsHDvv50eLsrQAw?= =?iso-8859-1?q?ZMDs0Itfxm/AGmgj4rmeU03Sfh2XUfS/vYODAqS3AJuHnTA9qQ8RrKaTDPTw?= =?iso-8859-1?q?XRNHYIUkbqz8z3EEB3K+xvzOEz6l5cNsa//ZwJ3e6iB2ghbhl1YAvhjtexmY?= =?iso-8859-1?q?L0MHW8TIIMt/yVi42it1y2vztVsfOf33XqDdVYVcdP/ZcicuWPTQ9W0w3n3/?= =?iso-8859-1?q?LElWTnV5M0+MPn9NvQ6pFv3fiyQM6Qrfyg9B1KlYr1VqmMcJos83XgsKlKuo?= =?iso-8859-1?q?pvDswcIaQZYgPbIiph0ZAVSci/0mALB4USSDSDT38ZB9k4pb9pC2HMMOapEm?= =?iso-8859-1?q?GjoFje3ED0+HNAOmzTbyF/52FG9uer2Tb3VP7zYIRwRif+2A+dRfBSrAcp22?= =?iso-8859-1?q?Qtv0dCy1Yr8Y7zii5VvRQYyZeACRvNnoHS0YG/iWIOI3vRksYVAcTwdcKVyy?= =?iso-8859-1?q?M2OUWYLuItt3qrTZv+pV20Ijwki6Wl0qvjiufdypssduzECoU+5HMRi4=3D?= Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: gacutVEweVKjtuvL31HcFx72OGvnUajbs7qy7qV18k+5je0EkeCdOI7ULySEEb+VKG7O7FcjU+/GG4pQ4pkeQ7fQKCBsoUe7WNVD3Xc6HK3zqJFyuZktJCkzK1DtmVPk1ds16+aNXt2eX+t+e3KHjvMvefnqYwrK93P1b5LOYr73gib5HszUcb1pXBM9wgqjaTckNIHTUatF4QhG0eno+A43NhJ6VHPibLR2+BEeP64TxQzj5bOGVUhvb2YPWyXPVjimxhMd8UuioKLCwNGoIFpNVK7aLVL/NLUmt6DuWRE0g43JSuTFjp0ymKpoLLGH1kFM42N8BwecAsEqcKdvFgZY/E8/2sj5XiQOqR3C0eOMNut+Jx1VOFSb6vpYM/LcnfYCuIeFzodRwoSYI6U20l1nxmthNluyEqOiIbFZBOLu4ognYirmTBO6oDDcS/yNtX398TyO3h5I1mji3I+xM5SgL1w3DLsHLw++W76oX14H4kOI2biJi8tN7yWbUGZKeAH1KPoele5Qm6cDP/ImMqtkGgVB5YMwziY2EzRTELnLcDmhdgHAfBFsNi8d+5aajPARrE9dB1f/qgbt0fTNKKvzAIoiOfwnASqKovrg/RVOM/6KaW9pNpdeRMjCzdb3aNtsJkld0bini7Aouzw/IA== X-OriginatorOrg: ddn.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN6PR19MB3187.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c88b2553-f837-461e-7f31-08dd77725f7a X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Apr 2025 14:25:26.7832 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 753b6e26-6fd3-43e6-8248-3f1735d59bb4 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Hc0iR//KWI5qKc/MkJeE2UCupdTLBWCUbhFtAnEdsX4RFuXWJatgO2DnHNxGOo91 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR19MB5686 X-BESS-ID: 1744208732-102085-5643-8472-1 X-BESS-VER: 2019.3_20250402.1543 X-BESS-Apparent-Source-IP: 104.47.56.174 X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVsZGFuZAVgZQ0DQtLSnZyCLZyN w8OckYSKalGSdamqcmmhpbGKaZWCjVxgIAma3D20EAAAA= X-BESS-Outbound-Spam-Score: 0.00 X-BESS-Outbound-Spam-Report: Code version 3.2, rules version 3.2.2.263765 [from cloudscan12-84.us-east-2a.ess.aws.cudaops.com] Rule breakdown below pts rule name description ---- ---------------------- -------------------------------- 0.00 BSF_BESS_OUTBOUND META: BESS Outbound X-BESS-Outbound-Spam-Status: SCORE=0.00 using account:ESS124931 scores of KILL_LEVEL=7.0 tests=BSF_BESS_OUTBOUND X-BESS-BRTS-Status: 1 fuse: fix race between concurrent setattrs from multiple nodes     When mounting a user-space filesystem on multiple clients, after     concurrent ->setattr() calls from different node, stale inode attributes     may be cached in some node.     This is caused by fuse_setattr() racing with fuse_reverse_inval_inode().     When filesystem server receives setattr request, the client node with     valid iattr cached will be required to update the fuse_inode's attr_version     and invalidate the cache by fuse_reverse_inval_inode(), and at the next     call to ->getattr() they will be fetched from user-space.     The race scenario is:       1. client-1 sends setattr (iattr-1) request to server       2. client-1 receives the reply from server       3. before client-1 updates iattr-1 to the cached attributes by          fuse_change_attributes_common(), server receives another setattr          (iattr-2) request from client-2       4. server requests client-1 to update the inode attr_version and          invalidate the cached iattr, and iattr-1 becomes staled       5. client-2 receives the reply from server, and caches iattr-2       6. continue with step 2, client-1 invokes fuse_change_attributes_common(),          and caches iattr-1     The issue has been observed from concurrent of chmod, chown, or truncate,     which all invoke ->setattr() call.     The solution is to use fuse_inode's attr_version to check whether the     attributes have been modified during the setattr request's lifetime. If so,     mark the attributes as stale after fuse_change_attributes_common().     Signed-off-by: Guang Yuan Wu ---  fs/fuse/dir.c | 12 ++++++++++++  1 file changed, 12 insertions(+) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index d58f96d1e9a2..df3a6c995dc6 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1889,6 +1889,8 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,         int err;         bool trust_local_cmtime = is_wb;         bool fault_blocked = false; +       bool invalidate_attr = false; +       u64 attr_version;         if (!fc->default_permissions)                 attr->ia_valid |= ATTR_FORCE; @@ -1973,6 +1975,8 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,                 if (fc->handle_killpriv_v2 && !capable(CAP_FSETID))                         inarg.valid |= FATTR_KILL_SUIDGID;         } + +       attr_version = fuse_get_attr_version(fm->fc);         fuse_setattr_fill(fc, &args, inode, &inarg, &outarg);         err = fuse_simple_request(fm, &args);         if (err) { @@ -1998,9 +2002,17 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,                 /* FIXME: clear I_DIRTY_SYNC? */         } +       if ((attr_version != 0 && fi->attr_version > attr_version) || +               test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) +               invalidate_attr = true; +         fuse_change_attributes_common(inode, &outarg.attr, NULL,                                       ATTR_TIMEOUT(&outarg),                                       fuse_get_cache_mask(inode), 0); + +       if (invalidate_attr) +               fuse_invalidate_attr(inode); +         oldsize = inode->i_size;         /* see the comment in fuse_change_attributes() */         if (!is_wb || is_truncate)