From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 0C31430AAD6; Mon, 13 Oct 2025 14:48:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366900; cv=none; b=JrZFmNGfOsfU6gwmPQBEQIdyITR2GBcLwPm25mNVwyuUnQqus9OAsFimvBR8rUyng1+Hkm1sBtNg6lNsXyLmbn4YLa5kZ3mxQjat2J5kFLbV7KRu9gd0qPqQs6MfoVId4rnzcYqM7Dzwpu0hgRhLLzsg8RObirvmjd0Wx685snc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366900; c=relaxed/simple; bh=8uRrXI+jAp2WOh+hrCQ/nfUXhlceOD4BPQxB/TDmaSY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p4cmQdN6yo+5dR7W126OhZR+wUbggGvZ/yaYSnuuvuzsdO5iLiizkCZdhraQUXyDQs1ieTDPe2CVdMHKSz9PksOy6fLHFOP+1Z25zotk2vKRNitnqdkaPyKeQrdL5frexmY05hbsezhRo5cjYXunHA8uI8kF9S6R12yBg3H+iko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cNLk5C/j; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cNLk5C/j" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 64DDBC116D0; Mon, 13 Oct 2025 14:48:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366899; bh=8uRrXI+jAp2WOh+hrCQ/nfUXhlceOD4BPQxB/TDmaSY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cNLk5C/jKcPgG8lJYqdnbMfSauyIpT6pFOljy+VPSW/otrZrnuqylgK87eVQiRpv0 I29L/vEh6ZobwHebArqgpuMnCVdGOfiIlYZvFFSKnuFIqQibcOl+wrPUWFwdBN28X4 //QR5TNjEXhkc6OW2qkBgdXWYYFLFmflOa4Q3vbfxy0IaIoh/iNQVmzT5Nk3klWWdk 5H3rdmiRMSaiAOzx/2YYSSCBD3ocuC/yXd5kkqoGwMzt2foabFyGUczL9gYiHFHHpx e58f89K2iS+b7010jl/PUXActNZqkYcjaoauIbp9+JJHAin8z7cYCZbxvk6h8k//lF tzCcKSx84lzwQ== From: Jeff Layton Date: Mon, 13 Oct 2025 10:47:59 -0400 Subject: [PATCH 01/13] filelock: push the S_ISREG check down to ->setlease handlers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-1-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3148; i=jlayton@kernel.org; h=from:subject:message-id; bh=8uRrXI+jAp2WOh+hrCQ/nfUXhlceOD4BPQxB/TDmaSY=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REpusIvVkARYUoHp93zRS89i1Rksr6uyeczG +t7MEXFsB+JAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKQAKCRAADmhBGVaC FQ4cEADMRSRph7CppQp10aXJ9lg3lIQsFj3LcY1koZinnhvIKf7ZQSGqK/SqN0HGDe+CMWrxTta GJO7NyX4PNBG42TVhKRPv4lhYCkkae+ZjqWMibiOCQNrP8c8BfwskFjxeeMBHBQOj4TEu9j/bdk tEAbp4jXxLRD979LmGwDCrwxUxYk4/fL4jjBKSXr7oZvBqnnhJqe5IUfy9iuTaRao5GqRpO50Wq E6Zl7jm4l8LnJyKmSLT31wx+RvxkenuU+gZd8kAA/MOhct0cKufE/eDUC7XBVKQYaX0COoKIKqb lk/mqk9z5bBDzmvuGHqfsrSeSl1HPytENzaqMFxLKIoeKC3gmhJeyyvpP7HWj5mXOsO4BGApKA1 h1WQD1C7U8j2IZhHhY9Ci9dVHMd20HIl2qoPhvODGCrvVfNa3aF6bC4QUKwm+wSmbUabowYkxz6 rnLuMZ4eZq2RgCvHJh2oonB73Llmde3pJeVCnlq4Fyu3pgZW7OsEROEg1NZSO0O1o6+sF5hfnuT ER1S2qOD3Q4alUYCWTkIv5n+6aFZvtRm1W3sYtNK4p9/TDXeyIGl3WmvV/6xjg1xTJ4hqTOwByb rZD3eRjxWe+Ko/F+Lfb2wINatKLNnnUx0hlFtSPUI4kHHg8tTui2taJv3DdZyxBwJRdK/6TC6ib x0ICQEaFoT8p1Nw== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 When nfsd starts requesting directory delegations, setlease handlers may see requests for leases on directories. Push the !S_ISREG check down into the non-trivial setlease handlers, so we can selectively enable them where they're supported. FUSE is special: It's the only filesystem that supports atomic_open and allows kernel-internal leases. Ensure that we don't allow directory leases by default going forward by explicitly disabling them there. Signed-off-by: Jeff Layton --- fs/fuse/dir.c | 1 + fs/locks.c | 5 +++-- fs/nfs/nfs4file.c | 2 ++ fs/smb/client/cifsfs.c | 3 +++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index ecaec0fea3a132e7cbb88121e7db7fb504d57d3c..667774cc72a1d49796f531fcb34= 2d2e4878beb85 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -2230,6 +2230,7 @@ static const struct file_operations fuse_dir_operatio= ns =3D { .fsync =3D fuse_dir_fsync, .unlocked_ioctl =3D fuse_dir_ioctl, .compat_ioctl =3D fuse_dir_compat_ioctl, + .setlease =3D simple_nosetlease, }; =20 static const struct inode_operations fuse_common_inode_operations =3D { diff --git a/fs/locks.c b/fs/locks.c index 04a3f0e2072461b6e2d3d1cd12f2b089d69a7db3..0b16921fb52e602ea2e0c3de39d= 9d772af98ba7d 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1929,6 +1929,9 @@ static int generic_delete_lease(struct file *filp, vo= id *owner) int generic_setlease(struct file *filp, int arg, struct file_lease **flp, void **priv) { + if (!S_ISREG(file_inode(filp)->i_mode)) + return -EINVAL; + switch (arg) { case F_UNLCK: return generic_delete_lease(filp, *priv); @@ -2018,8 +2021,6 @@ vfs_setlease(struct file *filp, int arg, struct file_= lease **lease, void **priv) =20 if ((!vfsuid_eq_kuid(vfsuid, current_fsuid())) && !capable(CAP_LEASE)) return -EACCES; - if (!S_ISREG(inode->i_mode)) - return -EINVAL; error =3D security_file_lock(filp, arg); if (error) return error; diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 7f43e890d3564a000dab9365048a3e17dc96395c..7317f26892c5782a39660cae87e= c1afea24e36c0 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -431,6 +431,8 @@ void nfs42_ssc_unregister_ops(void) static int nfs4_setlease(struct file *file, int arg, struct file_lease **l= ease, void **priv) { + if (!S_ISREG(file_inode(file)->i_mode)) + return -EINVAL; return nfs4_proc_setlease(file, arg, lease, priv); } =20 diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 05b1fa76e8ccf1e86f0c174593cd6e1acb84608d..03c44c1d9bb631b87a8b67aa16e= 481d6bb3c7d14 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1149,6 +1149,9 @@ cifs_setlease(struct file *file, int arg, struct file= _lease **lease, void **priv struct inode *inode =3D file_inode(file); struct cifsFileInfo *cfile =3D file->private_data; =20 + if (!S_ISREG(inode->i_mode)) + return -EINVAL; + /* Check if file is oplocked if this is request for new lease */ if (arg =3D=3D F_UNLCK || ((arg =3D=3D F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) || --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 7EBB4277814; Mon, 13 Oct 2025 14:48:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366903; cv=none; b=aAOe9YJYbzPPrC88jKyCB++fqeCPpWSv2vu2NW+xwYziwl6mwFm0YnxBoN7X1w4DCELL4f3g/w0izPTi9G4//TVlHOAWoOZdClBGTJa/ttKNwe8grp6wI9HYUtKOwjtTtYsGZAB5d7cY55FhADozpmjvH1PsVtU0AOO5oRSA8LM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366903; c=relaxed/simple; bh=L1cRKq/J9sZ0cHXdekt5M9BmYyPxtAAJ9huQwBAlljg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TxlMwL5cpyYe2FkJkvRbKnP2GBWjXftsv3WoE84PSV8IDSoRTwb7IVwlbeKxwhifQZ+AbSbpZE9eiOqB3yqbjngshdAlXgz5hobW5+lw5tsUoQn4VqvJu1t6Gx8cARRb1bOY+uKYNNVHvbaL17z4kAvwKiAwBnVg7U8FFC4V8y0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aALhBCMl; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="aALhBCMl" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C7125C16AAE; Mon, 13 Oct 2025 14:48:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366903; bh=L1cRKq/J9sZ0cHXdekt5M9BmYyPxtAAJ9huQwBAlljg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aALhBCMlQeXPYHet4p+jeb95LLHKeZPo28uRVsfMa/EhyV/mGoP4xCDIx0IVe7YBq r9xDmlplt5ucXnF8yNdjyYA14uBBuJLDggsAU6EUe/FhzHQ/Qeoonb1BOnQ/rpkz+k oqWhLLEUWM3MDE6V96ldARilozhdZV3NB1k/y7EptDzoAouUn1DBQNf+GBdEaFU97B CkfyDIi57uKCXV6F1nd8El0EhZBinw6XeNwUrQx8TgAXpYSseDifogjaVNMJ3d4EzU GBZbk5J1AIpPmV8GO8hIBPInpJEV7BkJsq0qBFyaWHIJhR7di0zeam184S9cRFqp45 EysbA08YNArOA== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:00 -0400 Subject: [PATCH 02/13] filelock: add a lm_may_setlease lease_manager callback Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-2-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2064; i=jlayton@kernel.org; h=from:subject:message-id; bh=L1cRKq/J9sZ0cHXdekt5M9BmYyPxtAAJ9huQwBAlljg=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REqXJ08OU3We/ayZDYk00ILSS/LnyQxvwsph gh59BEZ3quJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKgAKCRAADmhBGVaC FZenEADMnVlzNqtp8ZFzEmImAHdpCTxML8l4s7ZVfvrqGrIXdyBDHvGcQrfTT/EVA7NWqyYrawY 6pZTm/N1JEGewWTHt8ZSvHo5yCQKAVUC5NQURhZEkP9xyRiRU/UQIXRtA/PqIOYUwEtuSt8PzgS L4ntpb5GLZbgNsN7UODui4vg8vBoOpNYAacYULYiL5V32vNiCtNhav32EQ1M0aImIUaADrh5S52 hoy6TPBDYzOYewZKh8OwNCPJEUs73oKOkLaEiZNraRm/4KXFE/vJwHs5OnAER4Jy94te7xcfuUG O29By832KUnDq40pzhwbexXFugjKykM9tCJiE6YK14GZ6UtUd1YGqzlKy/GDaPBKFvpt6Z4DLNV Aaw2HXKS2+A4ju85+Hz6jQeYFxKSLBwvWPG5zQnU1SlmEdCQ50aNiTY2lpGaz+jzAksHrwAL0XD IahcMWqxAeFdSGAo7D8HEWktdH/oWU8cB11SQ+LrBKQyDF04reU+9MrSjCy+Fa5C9ZEEJjBVCGQ pw2qGW6SR69ToXJnnj2/5l+euT0vR8nkeU3MGi9awn/Jb68UcDqGhprmPB5Aw+Qx2r+DP2EMRvF IFNEwZ6DzAOzKvwiU3VJ/tQpVmsOz/KcaJceMjEjPIMmur849Rde2ldsvdw7vxbAxcsl3By0lSi MfbBWmvJHSFYXuQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 The NFSv4.1 protocol adds support for directory delegations, but it specifies that if you already have a delegation and try to request a new one on the same filehandle, the server must reply that the delegation is unavailable. Add a new lease manager callback to allow the lease manager (nfsd in this case) to impose this extra check when performing a setlease. Signed-off-by: Jeff Layton --- fs/locks.c | 5 +++++ include/linux/filelock.h | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/fs/locks.c b/fs/locks.c index 0b16921fb52e602ea2e0c3de39d9d772af98ba7d..9e366b13674538dbf482ffdeee9= 2fc717733ee20 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1826,6 +1826,11 @@ generic_add_lease(struct file *filp, int arg, struct= file_lease **flp, void **pr continue; } =20 + /* Allow the lease manager to veto the setlease */ + if (lease->fl_lmops->lm_may_setlease && + !lease->fl_lmops->lm_may_setlease(lease, fl)) + goto out; + /* * No exclusive leases if someone else has a lease on * this file: diff --git a/include/linux/filelock.h b/include/linux/filelock.h index c2ce8ba05d068b451ecf8f513b7e532819a29944..70079beddf61aa32ef01f1114cf= 0cb3ffaf2131a 100644 --- a/include/linux/filelock.h +++ b/include/linux/filelock.h @@ -49,6 +49,20 @@ struct lease_manager_operations { int (*lm_change)(struct file_lease *, int, struct list_head *); void (*lm_setup)(struct file_lease *, void **); bool (*lm_breaker_owns_lease)(struct file_lease *); + + /** + * lm_may_setlease - extra conditions for setlease + * @new: new file_lease being set + * @old: old (extant) file_lease + * + * This allows the lease manager to add extra conditions when + * setting a lease, based on the presence of an existing lease. + * + * Return values: + * %false: @new and @old conflict + * %true: No conflict detected + */ + bool (*lm_may_setlease)(struct file_lease *new, struct file_lease *old); }; =20 struct lock_manager { --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 DEF3D30B53B; Mon, 13 Oct 2025 14:48:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366907; cv=none; b=WphCqTcpNww1muSKcR6nki0xyis08KhdWVLnZH3hOqhDs92CKnqpF7M3xRTCEba0MEaraf6zU1eGn/yp5ACp6ELEQiwMLqIBO+ZCISMbwWHHswThJFbi6xtGWHJ6V5Wm8GorprzHpwtNGtbCmdpuORc1zzyN2QFKKD9bxO1Z19U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366907; c=relaxed/simple; bh=DfXWfe3J6JP43Ux1a6sZKAEITJvGozUQi9wSKd1pfSk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=POQ5RiimYBiftqMGt+2W6tLxfeBGEdPK43lXyhYOg0pszPHgqv0GSS6MU0jMy9CZI0+TSw+k03AxwamgpX4c6Nou4vRB/RoTwNFPXzOsoHUiIZmLEcAsy3N0+9+okI5R83gj+lHLckAGxRif+Vbw3tukzPVZ6+5ntvxdokR+NWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=U41xBfkm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="U41xBfkm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37EE4C4CEE7; Mon, 13 Oct 2025 14:48:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366906; bh=DfXWfe3J6JP43Ux1a6sZKAEITJvGozUQi9wSKd1pfSk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=U41xBfkmh0PJspKJM8N4+TCJFm2sfKJdAtFt9kGnrF6zQAL/EIuZSzX1bzvZzXyAf vT5i3lMJGL5LQZGtusiQeLbnrD7oErMlik2p6Df8NQBrQhIPA0fm2WrMpPdw6rkgAD Irfo3qJNrAbj8iT9pvvEuBJWvtVIpQQqQ16ID/jahqiZBj42GB/FLdj7dhefh99oQ6 C9rLsQJ7VvqCEJ+H8FPmxclmVK3Ka/tyWFdHFrT2zk2HsSJQ48puKC776rBgZCXDmY XV6tBqdLCQYyKNwsDpD4vsz5rdpEYz85JqOU5bGLIglwL+bFIRjxvBUCSRJfb2ahDY GEyP5zLOCXAKw== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:01 -0400 Subject: [PATCH 03/13] vfs: add try_break_deleg calls for parents to vfs_{link,rename,unlink} Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-3-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1835; i=jlayton@kernel.org; h=from:subject:message-id; bh=DfXWfe3J6JP43Ux1a6sZKAEITJvGozUQi9wSKd1pfSk=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REqLBDtAp7T756QdxqxCHGT/naplNwnFPdaI RmmwSk2CpqJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKgAKCRAADmhBGVaC FRBzD/96GcXuNAIL+15ZatEftjZLlG96Tdk8dUoOd2ehdFY2nHjZ7RuX9TJze+i46RUopvmVHTh KoDNFEo0497SoqdNghJFJSWGcB+VPdUhU9rx6txNYijPqHfgpSYtYEy+G0C+j/KnraIwHmG+mYt EMq95CzHRPBqfg9+emtB8PmV46b/6bYqDN7Uk4B7M1F9F6sok++o00iRckeXMzaMBiAj6U4WZjP 6gm6AYPcCxxrntLCQFEkjsIcAz3Jm3Yja8fJ4oUXSFUgMmcpm3rgtJhkBbRvrJCh4R2W4xc+2d4 q9TrRtB8IFTUK4uE9boMuhZw8yRz+8VuAxBuGC8a5qqhapNvLXZe1YRDSQXA8Kc2Wbd21mjch6v YJ6zqisp3rr4hg4h+OY9I73KkqlCA9RoutXRLVQvrL3Eqt+pcP/MpRTxGz0R0QmlddK//NDCW1u VnxaTAaMp6wqo5C5XBhTWDlwyLN9y1O+aOIlOXwtV9CToD4CZoJo2mxpuPQbJpAH3ZDYvmOlOXx Tuh5FHXQEZDCz5jPliKCAv7pL7fD6ia3QEIlY1bDlIjLwEj8M2dS16nQogbbO0GW7EVsKgQEYzJ Le1MbQjKl1zUK3eV6lOkMWOJnKcApEhCSe5x5H94KhmXvQZfWFDoD12OZktLqBreVPYobqmHvII 4YVVs5EZl6vsfPA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. vfs_link, vfs_unlink, and vfs_rename all have existing delegation break handling for the children in the rename. Add the necessary calls for breaking delegations in the parent(s) as well. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- fs/namei.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/fs/namei.c b/fs/namei.c index 7377020a2cba02501483020e0fc93c279fb38d3e..6e61e0215b34134b1690f864e27= 19e3f82cf71a8 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4667,6 +4667,9 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode = *dir, else { error =3D security_inode_unlink(dir, dentry); if (!error) { + error =3D try_break_deleg(dir, delegated_inode); + if (error) + goto out; error =3D try_break_deleg(target, delegated_inode); if (error) goto out; @@ -4936,7 +4939,9 @@ int vfs_link(struct dentry *old_dentry, struct mnt_id= map *idmap, else if (max_links && inode->i_nlink >=3D max_links) error =3D -EMLINK; else { - error =3D try_break_deleg(inode, delegated_inode); + error =3D try_break_deleg(dir, delegated_inode); + if (!error) + error =3D try_break_deleg(inode, delegated_inode); if (!error) error =3D dir->i_op->link(old_dentry, dir, new_dentry); } @@ -5203,6 +5208,14 @@ int vfs_rename(struct renamedata *rd) old_dir->i_nlink >=3D max_links) goto out; } + error =3D try_break_deleg(old_dir, delegated_inode); + if (error) + goto out; + if (new_dir !=3D old_dir) { + error =3D try_break_deleg(new_dir, delegated_inode); + if (error) + goto out; + } if (!is_dir) { error =3D try_break_deleg(source, delegated_inode); if (error) --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 4134930BF6B; Mon, 13 Oct 2025 14:48:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366910; cv=none; b=GDBog+vLw2aaslFNMXquh/gB/uW+pV2gC+d7lxTvXffiLNYt6CkUeQraAb86exzYgweWu09c7oiL98fTwIQf6jOnzrhIz30/vvUoAlX78VRceJBHrtGUzzC8vSubE6xskK6fPclUuMfCJh6ROCAIQ5a6LVSjP2WA9mEgx4xvESk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366910; c=relaxed/simple; bh=ByTod7HDyAv21f/noRnpajC/qkzdPRejO/up8HqOJg4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gx043CE91zo7V/q5xTLZ8c+Vc9zSIY6LB2RBBXZogfCz2Cz8ljzeMlQMey7u8bxxXUeYOGAvo3QBtasGb4RZK/+579NKmRKnixE0QN5CtdWRSw1iCm1yS4Zsd33DB9VeTM8+L3qByaVywoiCyuztwDBqZGzyZiFwc1sjZVlAvbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=c9nqPy/v; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="c9nqPy/v" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A6E3C4CEFE; Mon, 13 Oct 2025 14:48:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366909; bh=ByTod7HDyAv21f/noRnpajC/qkzdPRejO/up8HqOJg4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=c9nqPy/v3dC/sVrk6Cof9IB6B/0W3C3sCfQwP9gNInwHNmYWBMeZAk5lqk7ypwB9R JszxjvshBDxjpXdhAdUEK+anGNFuN14gZ6PmK6Peupkpi8azO8qQin357eEzl+83Fy XlbsmqvaBLwlyQ2u0roOvADiNot2E9SaM9O5ZIehC8oLmQpaIUO0pfL1ZSC5/WTWJj ATyjXeBLWqpWb9lP7CHp7kmqg7/8XyPMgs8Gt+sD6duoIHkNw+XaURHkbkdgWPHb5/ tgr9hv4CWSVztKkmkIQopQK8ogVhr9vK1u14krgSwtWNc6ju6FjxOxLXrj7FaN478u 8HEhM0r10lz0w== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:02 -0400 Subject: [PATCH 04/13] vfs: allow mkdir to wait for delegation break on parent Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-4-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9126; i=jlayton@kernel.org; h=from:subject:message-id; bh=ByTod7HDyAv21f/noRnpajC/qkzdPRejO/up8HqOJg4=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REq23meF7zYx3XELQjHxkK6U10idPOyBfC9b nHv0SSuM3aJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKgAKCRAADmhBGVaC FR6KD/9eluwtUBjSoSAqI5/wmL8rpegTRiQgbo3hXoonqxl8peHGS1nsRrZCSh0EJ8fQ42/gxrH p1EnvaRm8jSjfib/QhxfPKpjTEo0/DyTCi8gTrXnyRkjkwItih990mUHNDqGDC2dDmGo/7vkhwE 7KL0RTsBY5me0ntz+C2utyQOFogK5UuUr2fLKUpBWxC4M8ARnEIZzHRzxbOMtngmgGIkDlB6j4f l6bfdUL3ZvaJBUjDQisVJ+o7l9zJ5SIwAxZupdNLDVoiS4WAPuwdSQMfafx8WjbNbF5k7st6CWH 5J0BnusskoLRHs9WVUu4xCr0yUr/Ux47KDihOTW3lFsCDxjJBIUy0sO15syVy/kqmTjMY6+S97Q ebCFOPWcKbAKnw835lkT9Q27+t71TtlNE9rJtjaSra+kKwyK0NhehXqHZkmsu8XU+uIkLIVwnB3 W0HHAfTc/qjKuzFGj3lQigZI7e5KVC5EnOkxmGfE1CPNzUtmIgL57EGQrTX9+m8tJtoBB/15Zlk iEk01kxh9UFohfjRYRaQKyVQUMAR1SB1vkju572ZI1JfBYyPnvn1VE4YaEKcyGrisSom2ELZZKY +iFX/rtG4jX8CJUVoI4X57gzStjcdil8XV4SF6SCWsa9fjbHS4H3G7Yei8uZ7mn0LNqfPz4X+tj kjnV7JexkxE3hfQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. Add a new delegated_inode parameter to vfs_mkdir. All of the existing callers set that to NULL for now, except for do_mkdirat which will properly block until the lease is gone. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- drivers/base/devtmpfs.c | 2 +- fs/cachefiles/namei.c | 2 +- fs/ecryptfs/inode.c | 2 +- fs/init.c | 2 +- fs/namei.c | 24 ++++++++++++++++++------ fs/nfsd/nfs4recover.c | 2 +- fs/nfsd/vfs.c | 2 +- fs/overlayfs/overlayfs.h | 2 +- fs/smb/server/vfs.c | 2 +- fs/xfs/scrub/orphanage.c | 2 +- include/linux/fs.h | 2 +- 11 files changed, 28 insertions(+), 16 deletions(-) diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 9d4e46ad8352257a6a65d85526ebdbf9bf2d4b19..0e79621cb0f79870003b867ca38= 4199171ded4e0 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -180,7 +180,7 @@ static int dev_mkdir(const char *name, umode_t mode) if (IS_ERR(dentry)) return PTR_ERR(dentry); =20 - dentry =3D vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode); + dentry =3D vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode, = NULL); if (!IS_ERR(dentry)) /* mark as kernel-created inode */ d_inode(dentry)->i_private =3D &thread; diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index d1edb2ac38376c4f9d2a18026450bb3c774f7824..50c0f9c76d1fd4c05db90d7d0d1= bad574523ead0 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c @@ -130,7 +130,7 @@ struct dentry *cachefiles_get_directory(struct cachefil= es_cache *cache, goto mkdir_error; ret =3D cachefiles_inject_write_error(); if (ret =3D=3D 0) - subdir =3D vfs_mkdir(&nop_mnt_idmap, d_inode(dir), subdir, 0700); + subdir =3D vfs_mkdir(&nop_mnt_idmap, d_inode(dir), subdir, 0700, NULL); else subdir =3D ERR_PTR(ret); if (IS_ERR(subdir)) { diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index ed1394da8d6bd7065f2a074378331f13fcda17f9..35830b3144f8f71374a78b3e746= 3b864f4fc216e 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -508,7 +508,7 @@ static struct dentry *ecryptfs_mkdir(struct mnt_idmap *= idmap, struct inode *dir, goto out; =20 lower_dentry =3D vfs_mkdir(&nop_mnt_idmap, lower_dir, - lower_dentry, mode); + lower_dentry, mode, NULL); rc =3D PTR_ERR(lower_dentry); if (IS_ERR(lower_dentry)) goto out; diff --git a/fs/init.c b/fs/init.c index 07f592ccdba868509d0f3aaf9936d8d890fdbec5..895f8a09a71acfd03e11164e3b4= 41a7d4e2de146 100644 --- a/fs/init.c +++ b/fs/init.c @@ -233,7 +233,7 @@ int __init init_mkdir(const char *pathname, umode_t mod= e) error =3D security_path_mkdir(&path, dentry, mode); if (!error) { dentry =3D vfs_mkdir(mnt_idmap(path.mnt), path.dentry->d_inode, - dentry, mode); + dentry, mode, NULL); if (IS_ERR(dentry)) error =3D PTR_ERR(dentry); } diff --git a/fs/namei.c b/fs/namei.c index 6e61e0215b34134b1690f864e2719e3f82cf71a8..86cf6eca1f485361c6732974e41= 03cf5ea721539 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4407,10 +4407,11 @@ SYSCALL_DEFINE3(mknod, const char __user *, filenam= e, umode_t, mode, unsigned, d =20 /** * vfs_mkdir - create directory returning correct dentry if possible - * @idmap: idmap of the mount the inode was found from - * @dir: inode of the parent directory - * @dentry: dentry of the child directory - * @mode: mode of the child directory + * @idmap: idmap of the mount the inode was found from + * @dir: inode of the parent directory + * @dentry: dentry of the child directory + * @mode: mode of the child directory + * @delegated_inode: returns parent inode, if the inode is delegated. * * Create a directory. * @@ -4427,7 +4428,8 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename,= umode_t, mode, unsigned, d * In case of an error the dentry is dput() and an ERR_PTR() is returned. */ struct dentry *vfs_mkdir(struct mnt_idmap *idmap, struct inode *dir, - struct dentry *dentry, umode_t mode) + struct dentry *dentry, umode_t mode, + struct inode **delegated_inode) { int error; unsigned max_links =3D dir->i_sb->s_max_links; @@ -4450,6 +4452,10 @@ struct dentry *vfs_mkdir(struct mnt_idmap *idmap, st= ruct inode *dir, if (max_links && dir->i_nlink >=3D max_links) goto err; =20 + error =3D try_break_deleg(dir, delegated_inode); + if (error) + goto err; + de =3D dir->i_op->mkdir(idmap, dir, dentry, mode); error =3D PTR_ERR(de); if (IS_ERR(de)) @@ -4473,6 +4479,7 @@ int do_mkdirat(int dfd, struct filename *name, umode_= t mode) struct path path; int error; unsigned int lookup_flags =3D LOOKUP_DIRECTORY; + struct inode *delegated_inode =3D NULL; =20 retry: dentry =3D filename_create(dfd, name, &path, lookup_flags); @@ -4484,11 +4491,16 @@ int do_mkdirat(int dfd, struct filename *name, umod= e_t mode) mode_strip_umask(path.dentry->d_inode, mode)); if (!error) { dentry =3D vfs_mkdir(mnt_idmap(path.mnt), path.dentry->d_inode, - dentry, mode); + dentry, mode, &delegated_inode); if (IS_ERR(dentry)) error =3D PTR_ERR(dentry); } end_creating_path(&path, dentry); + if (delegated_inode) { + error =3D break_deleg_wait(&delegated_inode); + if (!error) + goto retry; + } if (retry_estale(error, lookup_flags)) { lookup_flags |=3D LOOKUP_REVAL; goto retry; diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index c41bb85e06822a82c86e2a33bd9a91e978c75965..3dfbb85c9a1166b56e56eb9f1d6= bfd140584730b 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -162,7 +162,7 @@ nfsd4_create_clid_dir(struct nfs4_client *clp) * as well be forgiving and just succeed silently. */ goto out_put; - dentry =3D vfs_mkdir(&nop_mnt_idmap, d_inode(dir), dentry, S_IRWXU); + dentry =3D vfs_mkdir(&nop_mnt_idmap, d_inode(dir), dentry, 0700, NULL); if (IS_ERR(dentry)) status =3D PTR_ERR(dentry); out_put: diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index f537a7b4ee01f49cfb864df9a92a9660b743a51e..447f5ab8e0b92288c9f220060ab= 15f32f2a84de9 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1644,7 +1644,7 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc= _fh *fhp, nfsd_check_ignore_resizing(iap); break; case S_IFDIR: - dchild =3D vfs_mkdir(&nop_mnt_idmap, dirp, dchild, iap->ia_mode); + dchild =3D vfs_mkdir(&nop_mnt_idmap, dirp, dchild, iap->ia_mode, NULL); if (IS_ERR(dchild)) { host_err =3D PTR_ERR(dchild); } else if (d_is_negative(dchild)) { diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index c8fd5951fc5ece1ae6b3e2a0801ca15f9faf7d72..0f65f9a5d54d4786b39e4f4f30f= 416d5b9016e70 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -248,7 +248,7 @@ static inline struct dentry *ovl_do_mkdir(struct ovl_fs= *ofs, { struct dentry *ret; =20 - ret =3D vfs_mkdir(ovl_upper_mnt_idmap(ofs), dir, dentry, mode); + ret =3D vfs_mkdir(ovl_upper_mnt_idmap(ofs), dir, dentry, mode, NULL); pr_debug("mkdir(%pd2, 0%o) =3D %i\n", dentry, mode, PTR_ERR_OR_ZERO(ret)); return ret; } diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c index 891ed2dc2b7351a5cb14a2241d71095ffdd03f08..3d2190f26623b23ea79c6341090= 5a3c3ad684048 100644 --- a/fs/smb/server/vfs.c +++ b/fs/smb/server/vfs.c @@ -230,7 +230,7 @@ int ksmbd_vfs_mkdir(struct ksmbd_work *work, const char= *name, umode_t mode) idmap =3D mnt_idmap(path.mnt); mode |=3D S_IFDIR; d =3D dentry; - dentry =3D vfs_mkdir(idmap, d_inode(path.dentry), dentry, mode); + dentry =3D vfs_mkdir(idmap, d_inode(path.dentry), dentry, mode, NULL); if (IS_ERR(dentry)) err =3D PTR_ERR(dentry); else if (d_is_negative(dentry)) diff --git a/fs/xfs/scrub/orphanage.c b/fs/xfs/scrub/orphanage.c index 9c12cb8442311ca26b169e4d1567939ae44a5be0..91c9d07b97f306f57aebb9b69ba= 564b0c2cb8c17 100644 --- a/fs/xfs/scrub/orphanage.c +++ b/fs/xfs/scrub/orphanage.c @@ -167,7 +167,7 @@ xrep_orphanage_create( */ if (d_really_is_negative(orphanage_dentry)) { orphanage_dentry =3D vfs_mkdir(&nop_mnt_idmap, root_inode, - orphanage_dentry, 0750); + orphanage_dentry, 0750, NULL); error =3D PTR_ERR(orphanage_dentry); if (IS_ERR(orphanage_dentry)) goto out_unlock_root; diff --git a/include/linux/fs.h b/include/linux/fs.h index c895146c1444be36e0a779df55622cc38c9419ff..1040df3792794cd353b86558b41= 618294e25b8a6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2113,7 +2113,7 @@ bool inode_owner_or_capable(struct mnt_idmap *idmap, int vfs_create(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, bool); struct dentry *vfs_mkdir(struct mnt_idmap *, struct inode *, - struct dentry *, umode_t); + struct dentry *, umode_t, struct inode **); int vfs_mknod(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, dev_t); int vfs_symlink(struct mnt_idmap *, struct inode *, --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 7CA0B30C359; Mon, 13 Oct 2025 14:48:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366913; cv=none; b=K6aOc6CqGCLJqUGVmakbn8A9K/oxn+GRMJiJlq262Ya2dc+R7EmXZWc4sy/kWouUNiEhHpYfbxPutPCENSjBTBrrdIFtTvJ7zlp7gJogyHNmsbxa7v9nqLI9Rsal5RiinMF/H3yvEn/WbsUKswS81mRwv6BmT39RRRFtbqXwqvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366913; c=relaxed/simple; bh=DITGPrxEBGAinDQ3TL6Rppcs0FME3zPsDBnrTn3EUy4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P1+QB4dU2CChlSeUqFWH9/d2QlHZpTJv+aLjYZDjfql9A/Fmy6Cczvb0OgTpUCqiuXJXVm9e+gFjLRFkaRI81gIGCrrl41tL/Zdq/oZ4ZMsKQJ6zigbm88yuUPH0FtfQpvRS0Bx+TmAdDAe8a/HG0AJ2pQ9Nh0qzzsNCHi4htKc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IS/StRB3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IS/StRB3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 10340C116C6; Mon, 13 Oct 2025 14:48:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366913; bh=DITGPrxEBGAinDQ3TL6Rppcs0FME3zPsDBnrTn3EUy4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IS/StRB3uf3LkuWonVlYHleo/jFvFc40D9WU7clk7Pz0X1tTeuDbez9kXQ7E4TLRH z9MFABe2XcToTAOocY5Onl1Cr+fO2LRSBWChGe24TmZeOw1Sl25Zqvq36KfuqZUilQ quVH9QdcXyzKJxronabI7m6/GlOJhorcKF3wwyueMOD7zT9QgsyLMVK7sVKwKWs2td ZBvNkN6RKSm7wSd5QR8sf/OBDsLdtGvMqTYS/iwnKF6BdQ/+T7o8Kfl1/fCcGH/rP3 9mjKCcO2GcoIzgXRsHTofCIfNQ8PUrXW+pbQdd5EQPkhkAawO+06UnJofcBgQ8IXZI TFJkZ8Fbd+FLg== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:03 -0400 Subject: [PATCH 05/13] vfs: allow rmdir to wait for delegation break on parent Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-5-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7725; i=jlayton@kernel.org; h=from:subject:message-id; bh=DITGPrxEBGAinDQ3TL6Rppcs0FME3zPsDBnrTn3EUy4=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REq854sH4iRL/T5lLpLqiJcggYKnYHFoOnT7 QNLoC+73j2JAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKgAKCRAADmhBGVaC FWOzEACbENpKkY5gRUbZMoj8qqO/1fn2VosFr0GDO4v/4pupam4MegfP7drN0pky7+U7+LGXXhB Cu3xo/4FZ5cTUVHvrfbYRyl4DLtV7egx/gqYT9WtZp+wvtiXUAFCSd0BiGx4NRAqcIvqLp9+FT3 1o32KTBhSlLYJKqBb3zb1iR70CUyfR3FlXHwwZeENZECLHnNmFl7225V62pqTSXkYwf2Kdv+TAN ZeqN2abaRTZRNH36xr6UVSVppesWrmC/0Nbr3DNrpm/pA6tMULOG7TsNSF3iyUnAjuQgh+RcLCT 9IjOf8PmOVd0ZOSp9lCcp6UwGG/MT3iI11+8EP3WmxHi8oFrlUPoKUN69VvRUR3/Ket86Lq2hHY EWlTIGcoEddpuhsGaznzQbha+zShVTG6NOjHXjKTnXQTUCjuPPkpR5VRu/WWneDBMWKABsJZ8l+ +bUz/B2L7iP6pO8pIruEtBJAT0RB3zRvew18zZjkSmurnYQy+Oaiv0fTg1493xHDairrAJFeEni 4M8QkkIgglTcv9PqiyF0c4FGRi4MUTIZlrJkoyZtCJVGkt25YcnVlkiBhfXoiOr9IDeL5wV71xo ir7ixDycgH/aowbEP1J29AfGbsbmHIwiWsgTCWRqu+xoYORDSWNhGJmb9Su+h4bSeGYoNQaFG7O XMWRcXcV9DGCjUQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. Add a "delegated_inode" return pointer to vfs_rmdir() and populate that pointer with the parent inode if it's non-NULL. Most existing in-kernel callers pass in a NULL pointer. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- drivers/base/devtmpfs.c | 2 +- fs/ecryptfs/inode.c | 2 +- fs/namei.c | 22 +++++++++++++++++----- fs/nfsd/nfs4recover.c | 4 ++-- fs/nfsd/vfs.c | 2 +- fs/overlayfs/overlayfs.h | 2 +- fs/smb/server/vfs.c | 4 ++-- include/linux/fs.h | 3 ++- 8 files changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 0e79621cb0f79870003b867ca384199171ded4e0..104025104ef75381984fd94dfbd= 50feeaa8cdd22 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -261,7 +261,7 @@ static int dev_rmdir(const char *name) return PTR_ERR(dentry); if (d_inode(dentry)->i_private =3D=3D &thread) err =3D vfs_rmdir(&nop_mnt_idmap, d_inode(parent.dentry), - dentry); + dentry, NULL); else err =3D -EPERM; =20 diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 35830b3144f8f71374a78b3e7463b864f4fc216e..88631291b32535f623a3fbe4ea9= b6ed48a306ca0 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -540,7 +540,7 @@ static int ecryptfs_rmdir(struct inode *dir, struct den= try *dentry) if (d_unhashed(lower_dentry)) rc =3D -EINVAL; else - rc =3D vfs_rmdir(&nop_mnt_idmap, lower_dir, lower_dentry); + rc =3D vfs_rmdir(&nop_mnt_idmap, lower_dir, lower_dentry, NULL); } if (!rc) { clear_nlink(d_inode(dentry)); diff --git a/fs/namei.c b/fs/namei.c index 86cf6eca1f485361c6732974e4103cf5ea721539..4b5a99653c558397e592715d9d4= 663cd4a63ef86 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4522,9 +4522,10 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname= , umode_t, mode) =20 /** * vfs_rmdir - remove directory - * @idmap: idmap of the mount the inode was found from - * @dir: inode of the parent directory - * @dentry: dentry of the child directory + * @idmap: idmap of the mount the inode was found from + * @dir: inode of the parent directory + * @dentry: dentry of the child directory + * @delegated_inode: returns parent inode, if it's delegated. * * Remove a directory. * @@ -4535,7 +4536,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname,= umode_t, mode) * raw inode simply pass @nop_mnt_idmap. */ int vfs_rmdir(struct mnt_idmap *idmap, struct inode *dir, - struct dentry *dentry) + struct dentry *dentry, struct inode **delegated_inode) { int error =3D may_delete(idmap, dir, dentry, 1); =20 @@ -4557,6 +4558,10 @@ int vfs_rmdir(struct mnt_idmap *idmap, struct inode = *dir, if (error) goto out; =20 + error =3D try_break_deleg(dir, delegated_inode); + if (error) + goto out; + error =3D dir->i_op->rmdir(dir, dentry); if (error) goto out; @@ -4583,6 +4588,7 @@ int do_rmdir(int dfd, struct filename *name) struct qstr last; int type; unsigned int lookup_flags =3D 0; + struct inode *delegated_inode =3D NULL; retry: error =3D filename_parentat(dfd, name, lookup_flags, &path, &last, &type); if (error) @@ -4612,7 +4618,8 @@ int do_rmdir(int dfd, struct filename *name) error =3D security_path_rmdir(&path, dentry); if (error) goto exit4; - error =3D vfs_rmdir(mnt_idmap(path.mnt), path.dentry->d_inode, dentry); + error =3D vfs_rmdir(mnt_idmap(path.mnt), path.dentry->d_inode, + dentry, &delegated_inode); exit4: dput(dentry); exit3: @@ -4620,6 +4627,11 @@ int do_rmdir(int dfd, struct filename *name) mnt_drop_write(path.mnt); exit2: path_put(&path); + if (delegated_inode) { + error =3D break_deleg_wait(&delegated_inode); + if (!error) + goto retry; + } if (retry_estale(error, lookup_flags)) { lookup_flags |=3D LOOKUP_REVAL; goto retry; diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index 3dfbb85c9a1166b56e56eb9f1d6bfd140584730b..ad3acbb956d90cac88f74e5f598= 719af6f1f8328 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c @@ -275,7 +275,7 @@ nfsd4_unlink_clid_dir(char *name, struct nfsd_net *nn) status =3D -ENOENT; if (d_really_is_negative(dentry)) goto out; - status =3D vfs_rmdir(&nop_mnt_idmap, d_inode(dir), dentry); + status =3D vfs_rmdir(&nop_mnt_idmap, d_inode(dir), dentry, NULL); out: dput(dentry); out_unlock: @@ -367,7 +367,7 @@ purge_old(struct dentry *parent, char *cname, struct nf= sd_net *nn) inode_lock_nested(d_inode(parent), I_MUTEX_PARENT); child =3D lookup_one(&nop_mnt_idmap, &QSTR(cname), parent); if (!IS_ERR(child)) { - status =3D vfs_rmdir(&nop_mnt_idmap, d_inode(parent), child); + status =3D vfs_rmdir(&nop_mnt_idmap, d_inode(parent), child, NULL); if (status) printk("failed to remove client recovery directory %pd\n", child); diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 447f5ab8e0b92288c9f220060ab15f32f2a84de9..7d8cd2595f197be9741ee6320d4= 3ed6651896647 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -2194,7 +2194,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fh= p, int type, break; } } else { - host_err =3D vfs_rmdir(&nop_mnt_idmap, dirp, rdentry); + host_err =3D vfs_rmdir(&nop_mnt_idmap, dirp, rdentry, NULL); } fh_fill_post_attrs(fhp); =20 diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index 0f65f9a5d54d4786b39e4f4f30f416d5b9016e70..d215d7349489686b66bb66e939b= 27046f7d836f6 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -206,7 +206,7 @@ static inline int ovl_do_notify_change(struct ovl_fs *o= fs, static inline int ovl_do_rmdir(struct ovl_fs *ofs, struct inode *dir, struct dentry *dentry) { - int err =3D vfs_rmdir(ovl_upper_mnt_idmap(ofs), dir, dentry); + int err =3D vfs_rmdir(ovl_upper_mnt_idmap(ofs), dir, dentry, NULL); =20 pr_debug("rmdir(%pd2) =3D %i\n", dentry, err); return err; diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c index 3d2190f26623b23ea79c63410905a3c3ad684048..c5f0f3170d586cb2dc4d416b809= 48c642797fb82 100644 --- a/fs/smb/server/vfs.c +++ b/fs/smb/server/vfs.c @@ -609,7 +609,7 @@ int ksmbd_vfs_remove_file(struct ksmbd_work *work, cons= t struct path *path) =20 idmap =3D mnt_idmap(path->mnt); if (S_ISDIR(d_inode(path->dentry)->i_mode)) { - err =3D vfs_rmdir(idmap, d_inode(parent), path->dentry); + err =3D vfs_rmdir(idmap, d_inode(parent), path->dentry, NULL); if (err && err !=3D -ENOTEMPTY) ksmbd_debug(VFS, "rmdir failed, err %d\n", err); } else { @@ -1090,7 +1090,7 @@ int ksmbd_vfs_unlink(struct file *filp) dget(dentry); =20 if (S_ISDIR(d_inode(dentry)->i_mode)) - err =3D vfs_rmdir(idmap, d_inode(dir), dentry); + err =3D vfs_rmdir(idmap, d_inode(dir), dentry, NULL); else err =3D vfs_unlink(idmap, d_inode(dir), dentry, NULL); =20 diff --git a/include/linux/fs.h b/include/linux/fs.h index 1040df3792794cd353b86558b41618294e25b8a6..d8bdaf7c87502ff17775602f539= 1d375738b4ed8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2120,7 +2120,8 @@ int vfs_symlink(struct mnt_idmap *, struct inode *, struct dentry *, const char *); int vfs_link(struct dentry *, struct mnt_idmap *, struct inode *, struct dentry *, struct inode **); -int vfs_rmdir(struct mnt_idmap *, struct inode *, struct dentry *); +int vfs_rmdir(struct mnt_idmap *, struct inode *, struct dentry *, + struct inode **); int vfs_unlink(struct mnt_idmap *, struct inode *, struct dentry *, struct inode **); =20 --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 206021E9B0D; Mon, 13 Oct 2025 14:48:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366917; cv=none; b=IhWeF1L20a7sIYEp4XIyFlbY9LVv0bGFJmi/O9FYHAzLWG3tVK6TX8bUA1U2PDZlpExXbN0v56xfZaYcf7JZKECU/a3vVTrz6YsRnYk4bGs1Rv/K895WBOMUML4aBrJD2Uhn+KyMcwO8TgLpESoF/FhGzbSXb0II46zRPsBERL8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366917; c=relaxed/simple; bh=D4Q1z5eeaVUO9Z+ECTf/6Zqc/vYd4ncdAUbJ5tZDhnY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C7Qj7IUcCmKnQ13uwaRo0CSY88fGuMkp2S8wK6yBEIO412GdZpZ1PIBpQIZ1s/Si3yc7Sg3pvqDGZuSj+JJ6W+wFB/xiV9e9R/+hXek4r00+fdyjikTtmQN36N7qdP6ldggzfYqtCe7/+Mzd7us+BU0Wz33Th7+DE4ItAzvzeQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JfL9FY07; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JfL9FY07" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 79124C113D0; Mon, 13 Oct 2025 14:48:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366916; bh=D4Q1z5eeaVUO9Z+ECTf/6Zqc/vYd4ncdAUbJ5tZDhnY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JfL9FY07R2Mh4tOb+lcOkKBeKVADGuZNXDO7OXsCYqmmjkCgCjmHloBV7bgJsDPpf CEvNTdN6THsqg7azapM+eqp+l2kUnQbOcTS7T1EH7MqHtRyZA/z+/U8p0ekcnDg+2v iE8n5/TthVtHWVR8TrgmDd3vXpMxnKiDXRXnF/+vYCJQ7HdIR4BldUaEQSiol85gah 2S8AdC0KYn6XLnvpOlxfRo6powC733dFLmj/Kbc03Y4to7RjqbuQ+gNySExv2bW5/I z4PnjfNRNMFheMh7FBBbynukLwz0bhhWivHr1l8nTzGUkTkmhu2cJgL93MtTybX8/4 kNBuelTrEtx7A== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:04 -0400 Subject: [PATCH 06/13] vfs: break parent dir delegations in open(..., O_CREAT) codepath Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-6-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2938; i=jlayton@kernel.org; h=from:subject:message-id; bh=D4Q1z5eeaVUO9Z+ECTf/6Zqc/vYd4ncdAUbJ5tZDhnY=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7RErwqx3LlOE+U0VGrXGQHDV3voPg/0wc/+aj Jux5LApcN6JAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKwAKCRAADmhBGVaC FfidD/48/7/CVhQirrZb/jlRR0g9ThXDJbv6PoXlePNXWN/sCyolLMVStN+yxhBVwIkIgLhgvCw OYl2EmAe2KiauHQIkj86+IJvfsBa16kmnzK8gddwBmhh4+To62UaLL8fuJh/Hn9DdFG3uQD0JfO uOETKsvK9pz3P+FiZTsftXNOSsH5xezYTWLHzs2ll+Fg0AyfEfVfXBcZSLtzWzT5P4hVUw74n/6 GuP+N396MaOD1LIrh6WttjNJkdPfVh1WRAQSjk4S5R5trpfmz6Rmq/JsRxIBDczp2CMw2dvUK7t Y2rPjy23LkE7fIlK5AVmKrqNcgtbI2W1KiVUS31Ru8F4e24LHJf2MbcMLTuL25iU1xXj6q94O2C 5Yl+kmpbN16voAZFuPsaH+B1klOVVcXa/cnSdCV84FAlI+1dIo2T0o2Je05Qjy3dmOMLLPziEwG KqtYF1IGJ6kJmcKDnSrUeRAFR6CwdYJOQn/I5wrR0KNKWSC1iWkERpSg518rGo6ovNqNt6w85Cz aMHtwj6omHeGx7iN63vRU5ig3gFBJAerC6rtO1ZYmaFvJesbutE2VqqCqz7QWwDUopm6wcilznr 56bO+rYVEzcEepKersOhqa/i15BGcbpT/2Cg3LdzzP4elhN5BOSSzAN1gR8E7ZfDyONY5SVGKDs xwrmPl0WYjmx1eQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. Add a delegated_inode parameter to lookup_open and have it break the delegation. Then, open_last_lookups can wait for the delegation break and retry the call to lookup_open once it's done. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- fs/namei.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 4b5a99653c558397e592715d9d4663cd4a63ef86..786f42bd184b5dbf6d754fa1fb6= c94c0f75429f2 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3697,7 +3697,7 @@ static struct dentry *atomic_open(struct nameidata *n= d, struct dentry *dentry, */ static struct dentry *lookup_open(struct nameidata *nd, struct file *file, const struct open_flags *op, - bool got_write) + bool got_write, struct inode **delegated_inode) { struct mnt_idmap *idmap; struct dentry *dir =3D nd->path.dentry; @@ -3786,6 +3786,11 @@ static struct dentry *lookup_open(struct nameidata *= nd, struct file *file, =20 /* Negative dentry, just create the file */ if (!dentry->d_inode && (open_flag & O_CREAT)) { + /* but break the directory lease first! */ + error =3D try_break_deleg(dir_inode, delegated_inode); + if (error) + goto out_dput; + file->f_mode |=3D FMODE_CREATED; audit_inode_child(dir_inode, dentry, AUDIT_TYPE_CHILD_CREATE); if (!dir_inode->i_op->create) { @@ -3849,6 +3854,7 @@ static const char *open_last_lookups(struct nameidata= *nd, struct file *file, const struct open_flags *op) { struct dentry *dir =3D nd->path.dentry; + struct inode *delegated_inode =3D NULL; int open_flag =3D op->open_flag; bool got_write =3D false; struct dentry *dentry; @@ -3879,7 +3885,7 @@ static const char *open_last_lookups(struct nameidata= *nd, return ERR_PTR(-ECHILD); } } - +retry: if (open_flag & (O_CREAT | O_TRUNC | O_WRONLY | O_RDWR)) { got_write =3D !mnt_want_write(nd->path.mnt); /* @@ -3892,7 +3898,7 @@ static const char *open_last_lookups(struct nameidata= *nd, inode_lock(dir->d_inode); else inode_lock_shared(dir->d_inode); - dentry =3D lookup_open(nd, file, op, got_write); + dentry =3D lookup_open(nd, file, op, got_write, &delegated_inode); if (!IS_ERR(dentry)) { if (file->f_mode & FMODE_CREATED) fsnotify_create(dir->d_inode, dentry); @@ -3907,8 +3913,16 @@ static const char *open_last_lookups(struct nameidat= a *nd, if (got_write) mnt_drop_write(nd->path.mnt); =20 - if (IS_ERR(dentry)) + if (IS_ERR(dentry)) { + if (delegated_inode) { + int error =3D break_deleg_wait(&delegated_inode); + + if (!error) + goto retry; + return ERR_PTR(error); + } return ERR_CAST(dentry); + } =20 if (file->f_mode & (FMODE_OPENED | FMODE_CREATED)) { dput(nd->path.dentry); --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 806EE30CD93; Mon, 13 Oct 2025 14:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366920; cv=none; b=NKSnNkIi6u6XhKaIO7Gk6T0ql+/GlncQ/y+mDY+lqjlLtL3Ma3iTgPGEMZf9FUNmkdk0IC2adgh3awCqecANw+iJZCgO8QMxzixbYfcxfEV92wLx0+M02+UfF310owfz+KEYcTdUe0S5p0k05dfYYTAHp12jY3DfYYCTL5SCbOQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366920; c=relaxed/simple; bh=7C2fHBBRtUSq2lBVdEoW6vR3dOF799abQITSiYChU7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TC+Y8g+5MQadRCq30sn3N8GX8NgJr4QF/ynSoFyUJ+W0f3HQb/5NlvDyRn5ileNVodzYLwOVXbSGCSsdWpj8/ACdHxOhbBmUJ8Or62ujsGFrsFEDEAWVuNonyVMybOwfNePJGBl6uvQ9u8zFl0PlSwTify5htlsiqIMRE72VOH4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JT4W7NAT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JT4W7NAT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD07BC4CEFE; Mon, 13 Oct 2025 14:48:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366920; bh=7C2fHBBRtUSq2lBVdEoW6vR3dOF799abQITSiYChU7c=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JT4W7NATEE2gKo1hwpPS23uYqVqSG2EejlKCjHJJDjxi/TzS0JnvVbeEuEhKYPPQ9 Lsg4z+YN3ahcrQ9E/Jq/4C1cg2tolHKAjmmLYP0UBVMKboJb4RQJAU6E8mAXVYriVA teMKsJYqexz+bFfpk7Vij/ETbsyUZwbs6LdTyBNA2Smgra6omUSROs5Rq5ZHQN/CMn b38P55mNi98xBUr5ILPBTESPBMPorn/VrcoqK+cNy6hfOUHMKSTlqVUza7XNc1JoAE nCaB72XyVgcN+pINhHlGnb9fth949QTvmlOoB/YoShwIqrSI6fWZ2ycgz7GzkVsXwd CNV0fRx0JbBQA== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:05 -0400 Subject: [PATCH 07/13] vfs: make vfs_create break delegations on parent directory Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-7-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3533; i=jlayton@kernel.org; h=from:subject:message-id; bh=7C2fHBBRtUSq2lBVdEoW6vR3dOF799abQITSiYChU7c=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7RErZ0OXvA0nLRHai3beQ6E7JYIExl/CLVw50 BW6y7OkK6OJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKwAKCRAADmhBGVaC FTAnD/9l7NjZwG5Pedn+L3ocjTEP7z6atjtbFEPJVZemMgyoL0tVIAPC1/kf2lnod7ALItFgwrT 7mncOsFLgcjLCo8cWDzwDzB4JNnPzOwAXai2uTg+PuPTIJ9AKDL4eFBvSFYXz1gOZGmbOcgsBuU aeQ/kiFBThtg/ZQZ5sl3z+SnU4Nne8AY/j9iIUehVue57alCVwvql9x1TwAFWVA65VsuE4r3GFJ 3BHHHcFscJAzE+YI15IZlu7RlhmokCzd/xxFXmBFMUcBg8NqJGkOLcJgkcbs/Vy+OTPMyM3OTPa 3quEYiSMRkTA39xa3vNShbkOUVSUUYiIVaec2XacWTq9FtCXopp81f5sslXm79iEqkzQUnZZyZv D4oWIxiiJNOKhdZTBkGfydzeEDCm7yly1Egz/WUT3rq7WX3VW6Z4s25xSPSe4bvn+G3XODxkt8K 0FSJ/bqY/rEgBq7FWKjk7PgyjgzWJfY4b44okNcUSUZIKBbJd3lrx1ee2dsspB+KGJ5cXmGRbLE AL/G3aphtBepDN6qaEwC7GB5iQhvkE7jBM96TNbDVviNbsQUZx6tKqkkXlI14dr1/OrCBoHTW9f KxMVFRYrWosAPT/Cmr1y5SbAsUwarhpxvvqYBo8WhAZGFZJL0/M/q92IEZOWwsbt1MvMQs0ql3f 8tiRUytDv0pvibQ== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. Rename vfs_create as __vfs_create, make it static, and add a new delegated_inode parameter. Fix do_mknodat to call __vfs_create and wait for a delegation break if there is one. Add a new exported vfs_create wrapper that passes in NULL for delegated_inode. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- fs/namei.c | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 786f42bd184b5dbf6d754fa1fb6c94c0f75429f2..1427c53e13978e70adefdc572b7= 1247536985430 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3458,6 +3458,32 @@ static inline umode_t vfs_prepare_mode(struct mnt_id= map *idmap, return mode; } =20 +static int __vfs_create(struct mnt_idmap *idmap, struct inode *dir, + struct dentry *dentry, umode_t mode, bool want_excl, + struct inode **delegated_inode) +{ + int error; + + error =3D may_create(idmap, dir, dentry); + if (error) + return error; + + if (!dir->i_op->create) + return -EACCES; /* shouldn't it be ENOSYS? */ + + mode =3D vfs_prepare_mode(idmap, dir, mode, S_IALLUGO, S_IFREG); + error =3D security_inode_create(dir, dentry, mode); + if (error) + return error; + error =3D try_break_deleg(dir, delegated_inode); + if (error) + return error; + error =3D dir->i_op->create(idmap, dir, dentry, mode, want_excl); + if (!error) + fsnotify_create(dir, dentry); + return error; +} + /** * vfs_create - create new file * @idmap: idmap of the mount the inode was found from @@ -3477,23 +3503,7 @@ static inline umode_t vfs_prepare_mode(struct mnt_id= map *idmap, int vfs_create(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode, bool want_excl) { - int error; - - error =3D may_create(idmap, dir, dentry); - if (error) - return error; - - if (!dir->i_op->create) - return -EACCES; /* shouldn't it be ENOSYS? */ - - mode =3D vfs_prepare_mode(idmap, dir, mode, S_IALLUGO, S_IFREG); - error =3D security_inode_create(dir, dentry, mode); - if (error) - return error; - error =3D dir->i_op->create(idmap, dir, dentry, mode, want_excl); - if (!error) - fsnotify_create(dir, dentry); - return error; + return __vfs_create(idmap, dir, dentry, mode, want_excl, NULL); } EXPORT_SYMBOL(vfs_create); =20 @@ -4365,6 +4375,7 @@ static int do_mknodat(int dfd, struct filename *name,= umode_t mode, struct path path; int error; unsigned int lookup_flags =3D 0; + struct inode *delegated_inode =3D NULL; =20 error =3D may_mknod(mode); if (error) @@ -4383,8 +4394,9 @@ static int do_mknodat(int dfd, struct filename *name,= umode_t mode, idmap =3D mnt_idmap(path.mnt); switch (mode & S_IFMT) { case 0: case S_IFREG: - error =3D vfs_create(idmap, path.dentry->d_inode, - dentry, mode, true); + error =3D __vfs_create(idmap, path.dentry->d_inode, + dentry, mode, true, + &delegated_inode); if (!error) security_path_post_mknod(idmap, dentry); break; @@ -4399,6 +4411,11 @@ static int do_mknodat(int dfd, struct filename *name= , umode_t mode, } out2: end_creating_path(&path, dentry); + if (delegated_inode) { + error =3D break_deleg_wait(&delegated_inode); + if (!error) + goto retry; + } if (retry_estale(error, lookup_flags)) { lookup_flags |=3D LOOKUP_REVAL; goto retry; --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E1F2530DD16; Mon, 13 Oct 2025 14:48:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366924; cv=none; b=VuDodnsoz1WN2YZCftfy4ck1KYinbIkXCvSuJXMUHq69jYtcsWlHOm1T4RVaHeIEk8NPhmA3OnawG9nynACLn24AvOASEQPFPncTlr5RfedZEXTvYYovy/s8GmhIsyZmVGgbGIIrTbQyok9MyqWwbSfcizP6kZuw/Bk6XGICSns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366924; c=relaxed/simple; bh=yxbWy/3ErCMtZ3JMbvRBdh6rwPwLL6/FsViY5uHr484=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G8oiAh61CDsOzZ6RZ3TDYirKDisCbCPzP5EVvoX1OEd03MmwpoZb8V8K4c/DYpV7yjWbIwSbp47/dYSxlT051AbOCQ8oK9ay7QIqcDb/pDALDm41xI4O/xhdw3D4eW5AQmOiJsa2wR+ujw4i+A1CT8jpkSM3gyFaBWZggckQPeA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dJ52bAen; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dJ52bAen" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4D2A1C116C6; Mon, 13 Oct 2025 14:48:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366923; bh=yxbWy/3ErCMtZ3JMbvRBdh6rwPwLL6/FsViY5uHr484=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dJ52bAenhzuKH3haVrGPE7kz7ub5SttBtBRah8NgL2Nx9vsXpoK7o15bhF6HNQFR9 ou+u41VHK3qZzYgSUecHeMJoYBKendD0k9H+RlIqD3AeOwG0K1KqRbOKguDTp61dX1 KRacBAsuMxJ6QsVXCUjfMBCjXkmxUUFs4MslemW4lVfQaS2FYJS0wVIxp1U4b7e6mL TuYH51ce/DmKAztAH5UnOYx/qfbz82rGb8dt6fLXSEEWaEIFTNosJv9EJxy9dS2jQE 4cUvbf4CgNpFga/biOkFQ2o1hhPhNgxbFisRUjFZvVp5crzojbVgv1U8eiIBpMjeyV 5LLmRYrEWwtTQ== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:06 -0400 Subject: [PATCH 08/13] vfs: make vfs_mknod break delegations on parent directory Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-8-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7411; i=jlayton@kernel.org; h=from:subject:message-id; bh=yxbWy/3ErCMtZ3JMbvRBdh6rwPwLL6/FsViY5uHr484=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REr0vWGNO8rgb9mNU3Rko+uwg3QqAPSeO1am lA95loyT8mJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKwAKCRAADmhBGVaC FbLMEACzIS7AcPJOAqSvsp9n+MAN/iYjivUwr1veW7IIUve2dlFLYmsOYgtvuTxEiNSmCRm05Wn yxAypWfEsQfmFjZ2PBZWQ7U4ALGRwCee2OS/dCtVY12tK9x5qWdbTbAtwioWXpXjzXphp4XfE+p Qotys6gbnQG7hSDrbtezIV0epkJJPqWkwqWtlVpPWn2iupADZPvtjJPDgDXNG/sTy46VzSgvWII pT2QHS6tBSmuO9tl9S1TmjLnAWBowkeJ1I7vu+16cpeY3hZtV/BOfNVqB4L2rJPZZuW5GL6sjQM HMCo20TsdTgaxqQYW9oxcxiZ09cHdV2STnycDfchIDi7BZRHukj39izoDruV8a7sZ9WSMd01qrg rq+Y49uNcOvKP5RFGjT1JiO221CQITcdrRhgcUmz6qXggKgL+oben/hYYv9sDUpHYFkIWNVVHHW /wpLI3eyXc6oT3On6+aiSRRvaa5Z4NPAx2Yd8zweT1e7lLCRVyOGo45svmsJKHKreDv3B/tJkMa 2Q6BR/veV7E5S9Mkh9XVzXJoXeUl7KmLn975Eh/5qNBuBvsu2vFPABZu1bcrh+R3DW6elcfk/nE Csfn37WrE0MbgYRUGJOBw9kXWRP04kOrhhxQluA5JET3wj/g0AeHwuxAI4zmyPPSh2xTHk81881 254PI8qqTj4azLA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 In order to add directory delegation support, we need to break delegations on the parent whenever there is going to be a change in the directory. Add a new delegated_inode return pointer to vfs_mknod() and have the appropriate callers wait when there is an outstanding delegation. All other callers just set the pointer to NULL. Signed-off-by: Jeff Layton Reviewed-by: Jan Kara --- drivers/base/devtmpfs.c | 2 +- fs/ecryptfs/inode.c | 2 +- fs/init.c | 2 +- fs/namei.c | 25 +++++++++++++++++-------- fs/nfsd/vfs.c | 2 +- fs/overlayfs/overlayfs.h | 2 +- include/linux/fs.h | 4 ++-- net/unix/af_unix.c | 2 +- 8 files changed, 25 insertions(+), 16 deletions(-) diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 104025104ef75381984fd94dfbd50feeaa8cdd22..2f576ecf18324f767cd5ac6cbd2= 8adbf9f46b958 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -231,7 +231,7 @@ static int handle_create(const char *nodename, umode_t = mode, kuid_t uid, return PTR_ERR(dentry); =20 err =3D vfs_mknod(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode, - dev->devt); + dev->devt, NULL); if (!err) { struct iattr newattrs; =20 diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 88631291b32535f623a3fbe4ea9b6ed48a306ca0..acef6d921167268d4590c688894= d4522016db0dd 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -565,7 +565,7 @@ ecryptfs_mknod(struct mnt_idmap *idmap, struct inode *d= ir, rc =3D lock_parent(dentry, &lower_dentry, &lower_dir); if (!rc) rc =3D vfs_mknod(&nop_mnt_idmap, lower_dir, - lower_dentry, mode, dev); + lower_dentry, mode, dev, NULL); if (rc || d_really_is_negative(lower_dentry)) goto out; rc =3D ecryptfs_interpose(lower_dentry, dentry, dir->i_sb); diff --git a/fs/init.c b/fs/init.c index 895f8a09a71acfd03e11164e3b441a7d4e2de146..4f02260dd65b0dfcbfbf5812d2e= c6a33444a3b1f 100644 --- a/fs/init.c +++ b/fs/init.c @@ -157,7 +157,7 @@ int __init init_mknod(const char *filename, umode_t mod= e, unsigned int dev) error =3D security_path_mknod(&path, dentry, mode, dev); if (!error) error =3D vfs_mknod(mnt_idmap(path.mnt), path.dentry->d_inode, - dentry, mode, new_decode_dev(dev)); + dentry, mode, new_decode_dev(dev), NULL); end_creating_path(&path, dentry); return error; } diff --git a/fs/namei.c b/fs/namei.c index 1427c53e13978e70adefdc572b71247536985430..2e1e3f0068a28271e07aa0fa0c7= e0b04582400fe 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4302,13 +4302,15 @@ inline struct dentry *start_creating_user_path( } EXPORT_SYMBOL(start_creating_user_path); =20 + /** * vfs_mknod - create device node or file - * @idmap: idmap of the mount the inode was found from - * @dir: inode of the parent directory - * @dentry: dentry of the child device node - * @mode: mode of the child device node - * @dev: device number of device to create + * @idmap: idmap of the mount the inode was found from + * @dir: inode of the parent directory + * @dentry: dentry of the child device node + * @mode: mode of the child device node + * @dev: device number of device to create + * @delegated_inode: returns parent inode, if the inode is delegated. * * Create a device node or file. * @@ -4319,7 +4321,8 @@ EXPORT_SYMBOL(start_creating_user_path); * raw inode simply pass @nop_mnt_idmap. */ int vfs_mknod(struct mnt_idmap *idmap, struct inode *dir, - struct dentry *dentry, umode_t mode, dev_t dev) + struct dentry *dentry, umode_t mode, dev_t dev, + struct inode **delegated_inode) { bool is_whiteout =3D S_ISCHR(mode) && dev =3D=3D WHITEOUT_DEV; int error =3D may_create(idmap, dir, dentry); @@ -4343,6 +4346,10 @@ int vfs_mknod(struct mnt_idmap *idmap, struct inode = *dir, if (error) return error; =20 + error =3D try_break_deleg(dir, delegated_inode); + if (error) + return error; + error =3D dir->i_op->mknod(idmap, dir, dentry, mode, dev); if (!error) fsnotify_create(dir, dentry); @@ -4402,11 +4409,13 @@ static int do_mknodat(int dfd, struct filename *nam= e, umode_t mode, break; case S_IFCHR: case S_IFBLK: error =3D vfs_mknod(idmap, path.dentry->d_inode, - dentry, mode, new_decode_dev(dev)); + dentry, mode, new_decode_dev(dev), + &delegated_inode); break; case S_IFIFO: case S_IFSOCK: error =3D vfs_mknod(idmap, path.dentry->d_inode, - dentry, mode, 0); + dentry, mode, 0, + &delegated_inode); break; } out2: diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 7d8cd2595f197be9741ee6320d43ed6651896647..858485c76b6524e965b7cbc92f6= 7c1a4eb19e34e 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1660,7 +1660,7 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc= _fh *fhp, case S_IFIFO: case S_IFSOCK: host_err =3D vfs_mknod(&nop_mnt_idmap, dirp, dchild, - iap->ia_mode, rdev); + iap->ia_mode, rdev, NULL); break; default: printk(KERN_WARNING "nfsd: bad file type %o in nfsd_create\n", diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index d215d7349489686b66bb66e939b27046f7d836f6..8b8c99e9e1a518c365cfff952d3= 91887ec18d453 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -257,7 +257,7 @@ static inline int ovl_do_mknod(struct ovl_fs *ofs, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int err =3D vfs_mknod(ovl_upper_mnt_idmap(ofs), dir, dentry, mode, dev); + int err =3D vfs_mknod(ovl_upper_mnt_idmap(ofs), dir, dentry, mode, dev, N= ULL); =20 pr_debug("mknod(%pd2, 0%o, 0%o) =3D %i\n", dentry, mode, dev, err); return err; diff --git a/include/linux/fs.h b/include/linux/fs.h index d8bdaf7c87502ff17775602f5391d375738b4ed8..4ad49b39441b2c9088fd01a7e0e= 46a6511c26d2e 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2115,7 +2115,7 @@ int vfs_create(struct mnt_idmap *, struct inode *, struct dentry *vfs_mkdir(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, struct inode **); int vfs_mknod(struct mnt_idmap *, struct inode *, struct dentry *, - umode_t, dev_t); + umode_t, dev_t, struct inode **); int vfs_symlink(struct mnt_idmap *, struct inode *, struct dentry *, const char *); int vfs_link(struct dentry *, struct mnt_idmap *, struct inode *, @@ -2151,7 +2151,7 @@ static inline int vfs_whiteout(struct mnt_idmap *idma= p, struct inode *dir, struct dentry *dentry) { return vfs_mknod(idmap, dir, dentry, S_IFCHR | WHITEOUT_MODE, - WHITEOUT_DEV); + WHITEOUT_DEV, NULL); } =20 struct file *kernel_tmpfile_open(struct mnt_idmap *idmap, diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 768098dec2310008632558ae928703b37c3cc8ef..db1fd8d6a84c2c7c0d45b43d9c5= a936b3d491b7b 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1399,7 +1399,7 @@ static int unix_bind_bsd(struct sock *sk, struct sock= addr_un *sunaddr, idmap =3D mnt_idmap(parent.mnt); err =3D security_path_mknod(&parent, dentry, mode, 0); if (!err) - err =3D vfs_mknod(idmap, d_inode(parent.dentry), dentry, mode, 0); + err =3D vfs_mknod(idmap, d_inode(parent.dentry), dentry, mode, 0, NULL); if (err) goto out_path; err =3D mutex_lock_interruptible(&u->bindlock); --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6EC7930DD29; Mon, 13 Oct 2025 14:48:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366927; cv=none; b=g5aui/RqySl+dYkQPgCLmyooRzr3dujwzcHn0qyTOCPeDZYEsWVyJb0+lzSJ5yaO9sl7nVcdpOLnok23mW4o0cIjyhC5BAhuH5wM51DmFNyCPdrO1biyjN4eh2NtGmPPm5odJEJf3kN/HSyMhFRHewiTBZ3TKu7DwHu7um9vfSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366927; c=relaxed/simple; bh=slSG+3J1/tQx7TfRkB99FbBkUrMXPOZ1kKaL1V7X6Mk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AQ6pNNxSu8oQpy8y9BmpaU8n6kQNLIWC4w02W0z8PAEj4cZgdk7mnCFJD3K7A61VSQJlyM8Pdl0ZwAVUlGm33ojV+KMv2sfVeQxed8p1JNfrb/uW99QyZr22cYJLIuv8dk8Plwjao2nHodhP6L1YtfaD3Tgcx0jDSTRAPJbwijs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GKk6Obqp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GKk6Obqp" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B289AC4CEE7; Mon, 13 Oct 2025 14:48:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366926; bh=slSG+3J1/tQx7TfRkB99FbBkUrMXPOZ1kKaL1V7X6Mk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=GKk6ObqpbzcNxmEzsRQ7kYSiluVFk09440+eUiCayJQjl1mGEYmjCyF0ii5FeYCgU 2rXk2L5KNUkG01fCCv4Bix7iVRcBkJV2msjUtpbr9FGtf40sjki90SFX/Ntmn5HflA H/txLPbuMIfBoHE2xHPmWUgnc/b3b/5tvREXBAPaLcVzCEhN6FVZwqtCV92OhLPOhO aS9YUZBo3wWTU0ZiLxUEIjNKtnLfTzCrTpfT14LiN9br8wTe+aoNS9mI86GVdxVMH/ p9CD+1aVDZyHN+BLBzF125/Nh6zRoXUb+T98/2nb/PkIC+1ZO+MCz3cvVZSAAKa60w p1RaRbKCqpNvg== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:07 -0400 Subject: [PATCH 09/13] filelock: lift the ban on directory leases in generic_setlease Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-9-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1169; i=jlayton@kernel.org; h=from:subject:message-id; bh=slSG+3J1/tQx7TfRkB99FbBkUrMXPOZ1kKaL1V7X6Mk=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REr8r+3hUFfrFM/If3b8LOteej7cPUKY/vvn ABlFCIJmTyJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKwAKCRAADmhBGVaC FaHnEADN3vNO94QWfiHoQTjfFijRWK2Bb9ZX+Wlr9P2IbEodkZtgiV5J+YK3LFlv65DEbUEK4YQ 4/OVinW3Vj0zNrxy28wb6k6Q7GOjWrYbcnUyZHzQ+k9+2js7PVnCoP5at0wjA7EcL56AhB0SDyx B/IwobaRvZLYiaRPpC57Xr+5iZMw/I4JhBU/04rfjtTbT+C+j0XQhpF3cAX7wYimb9MI55ciMZk yhaqYh3CWTUEjpuIL28N3QW5XlhQ8gxZyoqpa3jdXOEunEt9dz+zUeFL0We+MAzicJrXyLnZ63L rPUHxox6ZE2RDAioExUICBv7s2nab7Kb3pqXtKbMWXZMVUTc5UVzdjh9SnaJpNRdC2pVJ6dImpB qFEfWU2ZFzGJVs4NqX8sgPhLo/PqwzBoSfPJQUdrlc5JScdcVpOUjkDC9LNQmOOKMDv17kvkfVb AxPJrKeznwAB3f4JwHkGJbdoz3OBQxDQU74fj+HMd5a8zFMHmzIwhzuhevgEJs6UW7Fm5Zi8ZzT Qjg3dnYDaUDXjfuURGWLCUTfb20UHHTCjhqkkTFgBd8L6FOTeBql8pL3sqj2VBkUmzVPjp0FCnt ZOs9hR2gi7El4kxgbu6MdtwUxUII+ikLnjRrhwgttbiyi3061/xTMVoPC0UinayYtKcsjlawgP5 ytOGR/V9ITlM0Eg== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 With the addition of the try_break_lease calls in directory changing operations, allow generic_setlease to hand them out. Note that this also makes directory leases available to userland via fcntl(). Signed-off-by: Jeff Layton --- fs/locks.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index 9e366b13674538dbf482ffdeee92fc717733ee20..ee85a38a7d42fb9545887a48797= 46c82779ace90 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1934,14 +1934,19 @@ static int generic_delete_lease(struct file *filp, = void *owner) int generic_setlease(struct file *filp, int arg, struct file_lease **flp, void **priv) { - if (!S_ISREG(file_inode(filp)->i_mode)) + struct inode *inode =3D file_inode(filp); + + if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) return -EINVAL; =20 switch (arg) { case F_UNLCK: return generic_delete_lease(filp, *priv); - case F_RDLCK: case F_WRLCK: + if (S_ISDIR(inode->i_mode)) + return -EINVAL; + fallthrough; + case F_RDLCK: if (!(*flp)->fl_lmops->lm_break) { WARN_ON_ONCE(1); return -ENOLCK; --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E30B430E0E2; Mon, 13 Oct 2025 14:48:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366931; cv=none; b=FOxkEtwVQdZO5bY2CCL1GdYfJX/rKurs5zfJvmL5+/g3Dj7CZzfPivS4nGzYwg7X7Vnyr8teS3gpv+hEeSBp/k9/WR11VZHO8M6r+A5Ob6O6aHuV1jZ+j4Ymq6Joat4woHcr8yZFHg0+/iTP2LT5CQCA2vsVkBFPltyW2WLvfy8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366931; c=relaxed/simple; bh=kQ3kwVXghyQcw4aroQIwAfURWIu333iEGSOIpiFKuOI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=csWovrDD6fj3AnQGZnOBL/XKUQNgsnZc8Y0VrcTbEA1GWLcQ+m651CFuqrOknrb6jWCCT8CkGUfUdjZYDt4tKStT6dBkWQ9lfzi8YFZxedX2wxZZzAZ+l6OWqrKE4iGDwsMiAW4yGGufR/rELWy6RbTfuIQY/ayQGTWqHKNAFBQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G9PYadLY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="G9PYadLY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 22357C4CEFE; Mon, 13 Oct 2025 14:48:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366930; bh=kQ3kwVXghyQcw4aroQIwAfURWIu333iEGSOIpiFKuOI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=G9PYadLYjucUApJfGHyrp9bsPygjU/VYs6TgIuisMy6gcBaV9Usd9DGViUjT+wOvl Kxp/gRwo0Og3OTX7w2qHRjLjr9jSruFJ8sE6JG4n+hEk91DycUUxBksUzKniPkp0w0 fe1sqnnqxnUMAn4dqGI3ovIkOzX/pioziRyqPxWixHCg785nysNA0tgMIUkl8g7SEG eEBdhd67RCoUtLjhNBbydjcvp3DWoCQb7BxHCbxstI0r1dRcgmpVrakImiGhrw74WJ chXdh+PUcDAd8EjWl4THhblyRqpsJF+spMsirnNXlzBvxhl+k3N8chtPTd6ReHdHaB /iw1B5DQ90W/w== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:08 -0400 Subject: [PATCH 10/13] nfsd: allow filecache to hold S_IFDIR files Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-10-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6750; i=jlayton@kernel.org; h=from:subject:message-id; bh=kQ3kwVXghyQcw4aroQIwAfURWIu333iEGSOIpiFKuOI=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7RErtdhkjg1yGfBHVs1pGPOHPYtO0JxXJ/Jcj ej6jGcMMLuJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RKwAKCRAADmhBGVaC FeYHD/9UEjXQAOETdxKwg2Kze+p9+gqVQbebyPRUxP6lwlXeA6toCaD7aMmGy17ukjntEeFCIb1 qZrItL0eqjEKBmmd1jgqLtf5UKcLmL9Qkeo2FTJCs02sD9VavVlpy8tqQFykbo3lpRk+AtVYKhf XgLgs0RD+eQj5HAOamRmO691Iu09AmHE04B34ChoVWBGIfSZcn2VY01ir367ydmcZ3ijGeKmTPB IA8hs1Hl93duddUk90bbaOiHSRp+SpuTU+4NhJv2kqHdwcRfnexcdgPPk+UXVhQ52G5jqRHchkU nJhI2gVH6e2DVT9y6SHtbhyt54/DtETsOx+kW8BK7rkka6rRJ3d3DgFs6qJja9elxs8zJKzm04Y W2nHrw/QdmaNVXJbJOCaFlnQV7rd6aU6Cl4u7WnJgZOTWHKjy2rb0mfGmZIgH+yVZMMT5MZ6j6z p/H+2fE6Ro5dcw4JaffWmf0jVRFgf4A9PxrRZYbnn3RU9M7wY8KaBXsUKwPRCmwI0SZH02z2w3T 7/S6lFb/T5iBWiGfquuXXlr9vjfcWl0GFe+cWjI55tGJ9vF76M+QgcinObWQ6SawIOAd7VY/3No eqJAVHnipXGog5guRQbYSy7neMdVrAoeAqvnAET2B80lZ3ucoSeX4IeZU+KFblFkGLuha0xHnGN HDBXDlt6C8yz7vw== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 The filecache infrastructure will only handle S_ISREG files at the moment. Plumb a "type" variable into nfsd_file_do_acquire and have all of the existing callers set it to S_ISREG. Add a new nfsd_file_acquire_dir() wrapper that we can then call to request a nfsd_file that holds a directory open. Signed-off-by: Jeff Layton --- fs/nfsd/filecache.c | 50 ++++++++++++++++++++++++++++++++++++++------------ fs/nfsd/filecache.h | 2 ++ fs/nfsd/vfs.c | 5 +++-- fs/nfsd/vfs.h | 2 +- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index a238b6725008a5c2988bd3da874d1f34ee778437..c2aa8357a1d9c136b55b2dbcb8d= e77d77f86b7c2 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -1086,7 +1086,7 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct n= et *net, struct auth_domain *client, struct svc_fh *fhp, unsigned int may_flags, struct file *file, - struct nfsd_file **pnf, bool want_gc) + umode_t type, bool want_gc, struct nfsd_file **pnf) { unsigned char need =3D may_flags & NFSD_FILE_MAY_MASK; struct nfsd_file *new, *nf; @@ -1097,13 +1097,13 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct= net *net, int ret; =20 retry: - if (rqstp) { - status =3D fh_verify(rqstp, fhp, S_IFREG, + if (rqstp) + status =3D fh_verify(rqstp, fhp, type, may_flags|NFSD_MAY_OWNER_OVERRIDE); - } else { - status =3D fh_verify_local(net, cred, client, fhp, S_IFREG, + else + status =3D fh_verify_local(net, cred, client, fhp, type, may_flags|NFSD_MAY_OWNER_OVERRIDE); - } + if (status !=3D nfs_ok) return status; inode =3D d_inode(fhp->fh_dentry); @@ -1184,7 +1184,7 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct n= et *net, status =3D nfs_ok; trace_nfsd_file_opened(nf, status); } else { - ret =3D nfsd_open_verified(fhp, may_flags, &nf->nf_file); + ret =3D nfsd_open_verified(fhp, type, may_flags, &nf->nf_file); if (ret =3D=3D -EOPENSTALE && stale_retry) { stale_retry =3D false; nfsd_file_unhash(nf); @@ -1246,7 +1246,7 @@ nfsd_file_acquire_gc(struct svc_rqst *rqstp, struct s= vc_fh *fhp, unsigned int may_flags, struct nfsd_file **pnf) { return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL, - fhp, may_flags, NULL, pnf, true); + fhp, may_flags, NULL, S_IFREG, true, pnf); } =20 /** @@ -1271,7 +1271,7 @@ nfsd_file_acquire(struct svc_rqst *rqstp, struct svc_= fh *fhp, unsigned int may_flags, struct nfsd_file **pnf) { return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL, - fhp, may_flags, NULL, pnf, false); + fhp, may_flags, NULL, S_IFREG, false, pnf); } =20 /** @@ -1314,8 +1314,8 @@ nfsd_file_acquire_local(struct net *net, struct svc_c= red *cred, const struct cred *save_cred =3D get_current_cred(); __be32 beres; =20 - beres =3D nfsd_file_do_acquire(NULL, net, cred, client, - fhp, may_flags, NULL, pnf, false); + beres =3D nfsd_file_do_acquire(NULL, net, cred, client, fhp, may_flags, + NULL, S_IFREG, false, pnf); put_cred(revert_creds(save_cred)); return beres; } @@ -1344,7 +1344,33 @@ nfsd_file_acquire_opened(struct svc_rqst *rqstp, str= uct svc_fh *fhp, struct nfsd_file **pnf) { return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL, - fhp, may_flags, file, pnf, false); + fhp, may_flags, file, S_IFREG, false, pnf); +} + +/** + * nfsd_file_acquire_dir - Get a struct nfsd_file with an open directory + * @rqstp: the RPC transaction being executed + * @fhp: the NFS filehandle of the file to be opened + * @pnf: OUT: new or found "struct nfsd_file" object + * + * The nfsd_file_object returned by this API is reference-counted + * but not garbage-collected. The object is unhashed after the + * final nfsd_file_put(). This opens directories only, and only + * in O_RDONLY mode. + * + * Return values: + * %nfs_ok - @pnf points to an nfsd_file with its reference + * count boosted. + * + * On error, an nfsstat value in network byte order is returned. + */ +__be32 +nfsd_file_acquire_dir(struct svc_rqst *rqstp, struct svc_fh *fhp, + struct nfsd_file **pnf) +{ + return nfsd_file_do_acquire(rqstp, SVC_NET(rqstp), NULL, NULL, fhp, + NFSD_MAY_READ|NFSD_MAY_64BIT_COOKIE, + NULL, S_IFDIR, false, pnf); } =20 /* diff --git a/fs/nfsd/filecache.h b/fs/nfsd/filecache.h index e3d6ca2b60308e5e91ba4bb32d935f54527d8bda..b383dbc5b9218d21a29b852572f= 80fab08de9fa9 100644 --- a/fs/nfsd/filecache.h +++ b/fs/nfsd/filecache.h @@ -82,5 +82,7 @@ __be32 nfsd_file_acquire_opened(struct svc_rqst *rqstp, s= truct svc_fh *fhp, __be32 nfsd_file_acquire_local(struct net *net, struct svc_cred *cred, struct auth_domain *client, struct svc_fh *fhp, unsigned int may_flags, struct nfsd_file **pnf); +__be32 nfsd_file_acquire_dir(struct svc_rqst *rqstp, struct svc_fh *fhp, + struct nfsd_file **pnf); int nfsd_file_cache_stats_show(struct seq_file *m, void *v); #endif /* _FS_NFSD_FILECACHE_H */ diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 858485c76b6524e965b7cbc92f67c1a4eb19e34e..abfa8f15fb5f8325885c7a6734e= 684728e725f93 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -959,15 +959,16 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp,= umode_t type, /** * nfsd_open_verified - Open a regular file for the filecache * @fhp: NFS filehandle of the file to open + * @type: S_IFMT inode type allowed (0 means any type is allowed) * @may_flags: internal permission flags * @filp: OUT: open "struct file *" * * Returns zero on success, or a negative errno value. */ int -nfsd_open_verified(struct svc_fh *fhp, int may_flags, struct file **filp) +nfsd_open_verified(struct svc_fh *fhp, umode_t type, int may_flags, struct= file **filp) { - return __nfsd_open(fhp, S_IFREG, may_flags, filp); + return __nfsd_open(fhp, type, may_flags, filp); } =20 /* diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index fa46f8b5f132079e3a2c45e71ecf9cc43181f6b0..ded2900d423f80d33fb6c8b809b= c5d9fc842ebfd 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -114,7 +114,7 @@ __be32 nfsd_setxattr(struct svc_rqst *rqstp, struct sv= c_fh *fhp, int nfsd_open_break_lease(struct inode *, int); __be32 nfsd_open(struct svc_rqst *, struct svc_fh *, umode_t, int, struct file **); -int nfsd_open_verified(struct svc_fh *fhp, int may_flags, +int nfsd_open_verified(struct svc_fh *fhp, umode_t type, int may_flags, struct file **filp); __be32 nfsd_splice_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file, loff_t offset, --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D4C1530E0EE; Mon, 13 Oct 2025 14:48:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366934; cv=none; b=QfHfGzbQUSLjL4T+x2FMRyZGF/861eV/oNLlU6EoDtNIOpLqOSiAFGfG0dyZI+L9FdLJmmSn8AYb4dsMcBOROFWgSa09jwndUMBPRc9birvMXPqNUvctbsGIcBRP/U3UqRfCvdgh5JUb5Ge4B9iUFIPpg9Ynd5Jsl9NHNkgPM4s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366934; c=relaxed/simple; bh=J5we6Oj9umwD8eK5iokfF/EbyCh2/ylz1MJttYCYqeQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=giJGmuJr56zoaseQCHOi1mR0n/sr9e6328RMQvsq48urX2mogquyTm/HocWZMr3oPXZwD8fGu68Ek23UMJide0YH3aGWI/qJlf8F+0rQU+K00+zfT7jcdJP3zJKH1PloeMeynrYONGmzhs4kc5vWfyGM2xzpHzVeIBb3lGwyqE0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZOkbwNpc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZOkbwNpc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 872F7C113D0; Mon, 13 Oct 2025 14:48:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366933; bh=J5we6Oj9umwD8eK5iokfF/EbyCh2/ylz1MJttYCYqeQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZOkbwNpcnQVZiwE/+1OP9mym6fOiHl24qMW9xYOYi3jifFxtYd0S5oqgUCVQGW5zT f12Ahu/yt8XfdGBrnnGxGSMd72XkRBrMRq9+5mPxr8cGPp2Te1RTNKAvHiJt6Eu1PP ZfRAz4P4VqNcQF5c9W6TW4RSsWHjgpyH8SNBLhERQ9eo28qLqXpeN82PZuOvIt1Fyj vWJHDMda9Z391xuPDziTvdm21CG9hMzZ5v2tHejb3G9a+LzmLl9k4M1/B/4N83rPrm VVLGu6HhJFP9ca3PU0WkbPaVlDJ7xhz0Om1t2JzIpO9Qapq6U9hJvPdcLyv42jJw+o EfLla4fxe9EAQ== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:09 -0400 Subject: [PATCH 11/13] nfsd: allow DELEGRETURN on directories Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-11-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1135; i=jlayton@kernel.org; h=from:subject:message-id; bh=J5we6Oj9umwD8eK5iokfF/EbyCh2/ylz1MJttYCYqeQ=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REsV/K5Cbac42DCmO0U6VglrS6hK2MFAgCKX UORwXDqyRmJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RLAAKCRAADmhBGVaC FXsND/9IwMUpKeKrXyaAVdscFyvOXADkgIXB6MhKk40rjoQr3GuolCGQvgHm4afZrUxX8wtSQFs DUS8ANvvaRlerYhiFAFWM2vQA16Urqhusp22d6aQR1bAWiBsPcRm6FDsjuqYCoz4Sx8Y5j/nw1G /Mk/8dC08BY0cII7i7XREdLlSmELt3uWaSM76bwhylscd4PdfOUyQS5l3zuhs+N7aQn3QsFV5C+ JbSsbKuTAQ7u67LPd9F0M0bRIpujddFYeTxnWHEuoq0j9eya4hN7zf85uCLHjXiJLy3p8Tlyrum qGjpOkpXBbaUsWZ8gSdWf6s+RBEbIFUWQtXuI7foCN6EeqxQMJACkWzyT5MSHrUaadRFZA4M+3e St05oeWyRQBHyBcZ297hZwC0Widpuz+SrsVATH1cy0aKbG46JHlA7vsbpy+W+fUntUHZWQbdBRh 2z/6qmqE121253Q+m+p1uD6BFoG+pjptTQjC2GuBamzTbLU/CYwrCU11IylVKtmmjK9L0jJ1i6F d340wgHHu0FgK23WtQPS/5mQIMiglbrGCtQVkbeLWPDeJXeZhZ0keEmCwIfbKtt/O2mGLIvrX6w B5oe8WPHdhInYeV8x4O5mfzPdDalpVH6Jv7QixlNuQcL1BKsDggjsi8urTghbWxRycLQVwfY4Q3 5i61rfj+1Tm/I9A== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 As Trond pointed out: "...provided that the presented stateid is actually valid, it is also sufficient to uniquely identify the file to which it is associated (see RFC8881 Section 8.2.4), so the filehandle should be considered mostly irrelevant for operations like DELEGRETURN." Don't ask fh_verify to filter on file type. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4state.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index c9053ef4d79f074f49ecaf0c7a3db78ec147136e..b06591f154aa372db710e071c69= 260f4639956d7 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -7824,7 +7824,8 @@ nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd= 4_compound_state *cstate, __be32 status; struct nfsd_net *nn =3D net_generic(SVC_NET(rqstp), nfsd_net_id); =20 - if ((status =3D fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0))) + status =3D fh_verify(rqstp, &cstate->current_fh, 0, 0); + if (status) return status; =20 status =3D nfsd4_lookup_stateid(cstate, stateid, SC_TYPE_DELEG, SC_STATUS= _REVOKED, &s, nn); --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 8D48E30EF64; Mon, 13 Oct 2025 14:48:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366937; cv=none; b=a3lLBuv4RHQVMLcYTtzuHSVH2S0aoqOASiW6O36aEUzIGsxcevoq56FnntVJCSC5HK6YAXX8Zga6Rf9a+jvCDhy3cgMTvI2njydroAB1fqnvk4TY0auF41SL+IiSg//LC4dkckJUmkHRrzG5wxJ++roZ/mxVepTfDs5CXz3D3FQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366937; c=relaxed/simple; bh=XdFZTvLBv8jG97H/465+ay12gK3EocumS5jEZExnjFE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lBf9gqZLzV5o6kvhMasR+g1ZouvWcacIi3eo+svvuV2VMOvZ0XNSscBO+Ft+x0ZfQ7cBA4wpn6wOL8+e2JyKhPEObUkhdh9iSePL528L8xkReDJYmhNNb1X4MfSV07kK7T8eMjchq4duTmOQypwtytSSaZuZdEavziYq/Uzya6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Nf2U+eFy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Nf2U+eFy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EC8B3C4CEFE; Mon, 13 Oct 2025 14:48:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366937; bh=XdFZTvLBv8jG97H/465+ay12gK3EocumS5jEZExnjFE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Nf2U+eFyWfPz1UjAB12UjZh1t8ZFKYnt9ac7SNRTYsGHGMEMBvCl+1s22x0HyMzs2 dt6jtb17kJMGMLJgF7RJ0+qCwkqiNxa7XqwypWm25PTRgU2vfCz83W8MbRXZnuuGF5 RxT0rKvFuZsArwQqD9zD/tBIouvRin7D338WqJsR4i/12x+bH3DmFPKhsH1FKW8DWG 4vX1BU2MQ80zDq7JnV8y2bSIKEDGqpba+hzibeHZMuosc7eTwWbxZkLwoEc63W9f8I r+Ip5PwJDi1zZyi6lcvee4nCqRFUtpf7RCNEHoKe54iXHzGzGzeF0wayucokOpMX0K F8CipGEplkS5A== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:10 -0400 Subject: [PATCH 12/13] nfsd: check for delegation conflicts vs. the same client Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-12-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2624; i=jlayton@kernel.org; h=from:subject:message-id; bh=XdFZTvLBv8jG97H/465+ay12gK3EocumS5jEZExnjFE=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REsyVLWKcjMsWV334tA/TwSVQZ4YXARM3QDA GmN7aMpV2eJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RLAAKCRAADmhBGVaC FWgXEACJ8AfPAskwnoPwDaw1BvIZoBTIbDQT4PTjnX+YbY5BdDm3nBWD+ki2u5QY5597noRlAbD +40FDIuz7ur2qLZXq6/lj9omlP31dytNLenL0KcqTUkAGuM2RWUIAHc90WcIpss8w5X5Gr0Eu0t i8H6ubBg9+kaTh+ALoGhR/MRvfVJzRoeHaYLgg5t2ZRkJ7H3GKG4Q0xXxMPd3uHMoDF+BARexze 4qx3q+czhixcAMRhJLExo1KN4u0Gf2Ef2b4s/NA9mYMnQsHIMB4uK8pUYpyNYpwWd1zo8WSWyMA R9sSFUcbgRYRjX2LwubTcxLWbp18xpr9RZ+OlP08I2bM5LCW6WtuTmfJ0EHId7HwZ8VN3Tg4xOt 3V2BmY3V0wiT4I7zyudHewJKhEWMXQQAKepsr9/PaJQeIsdu4HD+fF4YrW0oxS+1Gb76/c5QXr4 rpJPMglDc4k8lhnspxAFE9n1dmdCJHOpOSHZPxlNT7I8sN6U/+f0yS0RwYEnWw3vVtVid3lq2pZ RkOmgW9RQUowvl+zuMJoX6P9VbR8/INz+OF9TKtkYf+D2dSTATzqV1oZQnJ4miOvqbVFp8gcfca YjrX5ksYr46mQ4dy9XUelwHQqo6KiTAsyRqggZ6f0ZwNWwjHNZcEC5yBBk5c3uaAsU3zelkmnj7 eGxqiv4Kt9p2xyA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 RFC 8881 requires that the server reply with GDD_UNAVAIL when the client requests a directory delegation that it already holds. When setting a directory delegation, check that the client associated with the stateid doesn't match an existing delegation. If it does, reject the setlease attempt. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4state.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index b06591f154aa372db710e071c69260f4639956d7..011e336dfd996daa82b706c3536= 628971369fb10 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -88,6 +88,7 @@ void nfsd4_end_grace(struct nfsd_net *nn); static void _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpnt= f_state *cps); static void nfsd4_file_hash_remove(struct nfs4_file *fi); static void deleg_reaper(struct nfsd_net *nn); +static bool nfsd_dir_may_setlease(struct file_lease *new, struct file_leas= e *old); =20 /* Locking: */ =20 @@ -5550,6 +5551,31 @@ static const struct lease_manager_operations nfsd_le= ase_mng_ops =3D { .lm_change =3D nfsd_change_deleg_cb, }; =20 +static const struct lease_manager_operations nfsd_dir_lease_mng_ops =3D { + .lm_breaker_owns_lease =3D nfsd_breaker_owns_lease, + .lm_break =3D nfsd_break_deleg_cb, + .lm_change =3D nfsd_change_deleg_cb, + .lm_may_setlease =3D nfsd_dir_may_setlease, +}; + +static bool +nfsd_dir_may_setlease(struct file_lease *new, struct file_lease *old) +{ + struct nfs4_delegation *od, *nd; + + /* Only conflicts with other nfsd dir delegs */ + if (old->fl_lmops !=3D &nfsd_dir_lease_mng_ops) + return true; + + od =3D old->c.flc_owner; + nd =3D new->c.flc_owner; + + /* Are these for the same client? No bueno if so */ + if (od->dl_stid.sc_client =3D=3D nd->dl_stid.sc_client) + return false; + return true; +} + static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struc= t nfs4_stateowner *so, u32 seqid) { if (nfsd4_has_session(cstate)) @@ -5888,12 +5914,13 @@ static struct file_lease *nfs4_alloc_init_lease(str= uct nfs4_delegation *dp) fl =3D locks_alloc_lease(); if (!fl) return NULL; - fl->fl_lmops =3D &nfsd_lease_mng_ops; fl->c.flc_flags =3D FL_DELEG; fl->c.flc_type =3D deleg_is_read(dp->dl_type) ? F_RDLCK : F_WRLCK; fl->c.flc_owner =3D (fl_owner_t)dp; fl->c.flc_pid =3D current->tgid; fl->c.flc_file =3D dp->dl_stid.sc_file->fi_deleg_file->nf_file; + fl->fl_lmops =3D S_ISDIR(file_inode(fl->c.flc_file)->i_mode) ? + &nfsd_dir_lease_mng_ops : &nfsd_lease_mng_ops; return fl; } =20 --=20 2.51.0 From nobody Sun Feb 8 04:49:23 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 2A7BE30F52D; Mon, 13 Oct 2025 14:49:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366941; cv=none; b=uRRuPft2ifHXsGPyvecRwv+XhKELGV0EW3X5WbAyWoQ2n9LQKGNpTBIpLsUxvAQfc/iOs7TvFvRICr0F0O6xyJp9P9dpVh99EJEZ/zCS66ra1XaqJ4ifi4qEX5cnFO4gkDimnrtdrS/BqAIHKXGXeNF/ApW9mdw7JYpkzQvvyP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760366941; c=relaxed/simple; bh=aa2nwa5AUZDKL13xRk8VHTGhhxsB/IoN/NqofQpDKAc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WQnpyPu59FtCwUlJ0VHjBJfeeUD50/1CGnzVt57sppTJtdjki3tUk1BprlBNCp6IjRRjeS4VljCqufLMC/1tpB8dz8hql+qDXgzdMgY1+hH9ugbACkJ8EPUp07Vd0n6L3lu0+P5HloGkwlBDmIV+C5lZsvE05CYpQng9bycOh2g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ADlt6a8U; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ADlt6a8U" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5CC74C116D0; Mon, 13 Oct 2025 14:48:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760366940; bh=aa2nwa5AUZDKL13xRk8VHTGhhxsB/IoN/NqofQpDKAc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ADlt6a8UOqbXngXAy2sAICDjbTu8dQMBsS6xbt6qOQb2gm/owZ4yYhQ5aTYVHkS8K PJb9QzkLF+wFcUY87kwm5HUAA3uOoENEJYmOj/O1tmK3qB0t7l3fh861lgjqOFKzx3 lMFFpsTlgp0IwfaoLxJIaVr4Tt1iMgqfDbsbePdRnbvSuJDpWm9zvMZICvlLx599ve nRdTNQgViHLtKmVQ1xwRbpO2cvYPJ89QEE8ejkiSQ9Wwrb1rz3L8OArIUzq7nPxH1A 3RhzYr1BuPJ4xihBlbaYq4JV8WU38FvdnS8NZMhqZQdxPYT9dBKNPpdmXQEYauC3dW A7ehVmMPCAe0Q== From: Jeff Layton Date: Mon, 13 Oct 2025 10:48:11 -0400 Subject: [PATCH 13/13] nfsd: wire up GET_DIR_DELEGATION handling Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251013-dir-deleg-ro-v1-13-406780a70e5e@kernel.org> References: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> In-Reply-To: <20251013-dir-deleg-ro-v1-0-406780a70e5e@kernel.org> To: Miklos Szeredi , Alexander Viro , Christian Brauner , Jan Kara , Chuck Lever , Alexander Aring , Trond Myklebust , Anna Schumaker , Steve French , Paulo Alcantara , Ronnie Sahlberg , Shyam Prasad N , Tom Talpey , Bharath SM , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , David Howells , Tyler Hicks , NeilBrown , Olga Kornievskaia , Dai Ngo , Amir Goldstein , Namjae Jeon , Steve French , Sergey Senozhatsky , Carlos Maiolino , Kuniyuki Iwashima , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, netfs@lists.linux.dev, ecryptfs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, netdev@vger.kernel.org, Jeff Layton X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4963; i=jlayton@kernel.org; h=from:subject:message-id; bh=aa2nwa5AUZDKL13xRk8VHTGhhxsB/IoN/NqofQpDKAc=; b=owEBbQKS/ZANAwAKAQAOaEEZVoIVAcsmYgBo7REsqKBgKC2+m7edWhTDSNSDZurmHp2v1qS5S pJaGuMrNpCJAjMEAAEKAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCaO0RLAAKCRAADmhBGVaC FWPJD/4h1UbKOkyHMkLf6qmTTkk42pMF1Jty9w9cZJcboE+925ZuYTGJJ4kyKPq4k3F9k9ZM1Uz xEQi80nS/XkkYixKDgVT+vBsr79wWDdetT5WTVyyMMJwjA2WguRuo3rTMkEaj+DCHOd4Ooh+wkL e20JG9gzFWWXdOM7Ib94E6jPFUZOle2AF3BWPI+J8jhUmWUbRrZbMmlxUyopmSaTtvSr1wx2Lf0 SGlyWrvDqqLB90yE6M4LZrK0DIB1+TVB00odavoPm4bczI1AGUFoz1cCnW4/yoiT8kD0gYbdbsl c9p7eTZlL1YpQg6Bl1p8yuWsf/UPmIF/JW3sfZ1+R98HiutJkeglXhyRo061Nj+mcAlDKVZKaOT MCK9KBPVir+CPUvXZCf05Vkp4kpCm6Oz0KP3FSjStCBrR+L/moCPWsOmPj0kOyzaUFs+uMyQUmn ZcYjxu9rD6Fgap7z0XgMjtSzP+icwfkGJpWEyoIvf63htUP/68SesXIG1ShZIB2ayOukkFGX7nW oO4UJIp3m4oWMNXgjk2i3JC3Or6/KWn3cTkxWBsxZgvjr5Vk9WKxMAjg22AG3ODBmlJ2oTVe+s4 Vhgd4994ReIp18pdn31CddfPRERgE5HkIJP6hBsqZ20SAZhMjRzNlxkgZr0YZu0cGnizZfzgjOw GI4L9WSBZOGm9qw== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 Add a new routine for acquiring a read delegation on a directory. Since the same CB_RECALL/DELEGRETURN infrastrure is used for regular and directory delegations, we can just use a normal nfs4_delegation to represent it. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4proc.c | 21 +++++++++++++- fs/nfsd/nfs4state.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ fs/nfsd/state.h | 5 ++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 7f7e6bb23a90d9a1cafd154c0f09e236df75b083..527f8dc52159803770964700170= 473509ec328ed 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -2342,6 +2342,13 @@ nfsd4_get_dir_delegation(struct svc_rqst *rqstp, union nfsd4_op_u *u) { struct nfsd4_get_dir_delegation *gdd =3D &u->get_dir_delegation; + struct nfs4_delegation *dd; + struct nfsd_file *nf; + __be32 status; + + status =3D nfsd_file_acquire_dir(rqstp, &cstate->current_fh, &nf); + if (status !=3D nfs_ok) + return status; =20 /* * RFC 8881, section 18.39.3 says: @@ -2355,7 +2362,19 @@ nfsd4_get_dir_delegation(struct svc_rqst *rqstp, * return NFS4_OK with a non-fatal status of GDD4_UNAVAIL in this * situation. */ - gdd->gddrnf_status =3D GDD4_UNAVAIL; + dd =3D nfsd_get_dir_deleg(cstate, gdd, nf); + if (IS_ERR(dd)) { + int err =3D PTR_ERR(dd); + + if (err !=3D -EAGAIN) + return nfserrno(err); + gdd->gddrnf_status =3D GDD4_UNAVAIL; + return nfs_ok; + } + + gdd->gddrnf_status =3D GDD4_OK; + memcpy(&gdd->gddr_stateid, &dd->dl_stid.sc_stateid, sizeof(gdd->gddr_stat= eid)); + nfs4_put_stid(&dd->dl_stid); return nfs_ok; } =20 diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 011e336dfd996daa82b706c3536628971369fb10..770acbee9e8dc69b6f196356384= 08ae4f0498b5d 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -9386,3 +9386,85 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp,= struct dentry *dentry, nfs4_put_stid(&dp->dl_stid); return status; } + +/** + * nfsd_get_dir_deleg - attempt to get a directory delegation + * @cstate: compound state + * @gdd: GET_DIR_DELEGATION arg/resp structure + * @nf: nfsd_file opened on the directory + * + * Given a GET_DIR_DELEGATION request @gdd, attempt to acquire a delegation + * on the directory to which @nf refers. Note that this does not set up any + * sort of async notifications for the delegation. + */ +struct nfs4_delegation * +nfsd_get_dir_deleg(struct nfsd4_compound_state *cstate, + struct nfsd4_get_dir_delegation *gdd, + struct nfsd_file *nf) +{ + struct nfs4_client *clp =3D cstate->clp; + struct nfs4_delegation *dp; + struct file_lease *fl; + struct nfs4_file *fp; + int status =3D 0; + + fp =3D nfsd4_alloc_file(); + if (!fp) + return ERR_PTR(-ENOMEM); + + nfsd4_file_init(&cstate->current_fh, fp); + fp->fi_deleg_file =3D nf; + fp->fi_delegees =3D 1; + + /* if this client already has one, return that it's unavailable */ + spin_lock(&state_lock); + spin_lock(&fp->fi_lock); + if (nfs4_delegation_exists(clp, fp)) + status =3D -EAGAIN; + spin_unlock(&fp->fi_lock); + spin_unlock(&state_lock); + + if (status) + goto out_delegees; + + /* Try to set up the lease */ + status =3D -ENOMEM; + dp =3D alloc_init_deleg(clp, fp, NULL, NFS4_OPEN_DELEGATE_READ); + if (!dp) + goto out_delegees; + + fl =3D nfs4_alloc_init_lease(dp); + if (!fl) + goto out_put_stid; + + status =3D kernel_setlease(nf->nf_file, + fl->c.flc_type, &fl, NULL); + if (fl) + locks_free_lease(fl); + if (status) + goto out_put_stid; + + /* + * Now, try to hash it. This can fail if we race another nfsd task + * trying to set a delegation on the same file. If that happens, + * then just say UNAVAIL. + */ + spin_lock(&state_lock); + spin_lock(&clp->cl_lock); + spin_lock(&fp->fi_lock); + status =3D hash_delegation_locked(dp, fp); + spin_unlock(&fp->fi_lock); + spin_unlock(&clp->cl_lock); + spin_unlock(&state_lock); + + if (!status) + return dp; + + /* Something failed. Drop the lease and clean up the stid */ + kernel_setlease(fp->fi_deleg_file->nf_file, F_UNLCK, NULL, (void **)&dp); +out_put_stid: + nfs4_put_stid(&dp->dl_stid); +out_delegees: + put_deleg_file(fp); + return ERR_PTR(status); +} diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 1e736f4024263ffa9c93bcc9ec48f44566a8cc77..b052c1effdc5356487c610db972= 8df8ecfe851d4 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -867,4 +867,9 @@ static inline bool try_to_expire_client(struct nfs4_cli= ent *clp) =20 extern __be32 nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_delegation **pdp); + +struct nfsd4_get_dir_delegation; +struct nfs4_delegation *nfsd_get_dir_deleg(struct nfsd4_compound_state *cs= tate, + struct nfsd4_get_dir_delegation *gdd, + struct nfsd_file *nf); #endif /* NFSD4_STATE_H */ --=20 2.51.0