Re: [PATCH v6 12/15] Add start_renaming_two_dentries()
Paul Moore <[email protected]>
| Newsgroups | org.kernel.vger.ecryptfs,dev.linux.lists.netfs,org.kernel.vger.linux-cifs,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs,org.kernel.vger.linux-security-module,org.kernel.vger.linux-unionfs,org.kernel.vger.linux-xfs,org.kernel.vger.selinux |
|---|---|
| Message-ID | <CAHC9VhQERRrabQhMUd3DHRg+TqV6Ztoo0kqwK_tn5u--in-f4Q@mail.gmail.com> |
On Wed, Nov 12, 2025 at 7:42 PM NeilBrown <[email protected]> wrote: > > From: NeilBrown <[email protected]> > > A few callers want to lock for a rename and already have both dentries. > Also debugfs does want to perform a lookup but doesn't want permission > checking, so start_renaming_dentry() cannot be used. > > This patch introduces start_renaming_two_dentries() which is given both > dentries. debugfs performs one lookup itself. As it will only continue > with a negative dentry and as those cannot be renamed or unlinked, it is > safe to do the lookup before getting the rename locks. > > overlayfs uses start_renaming_two_dentries() in three places and selinux > uses it twice in sel_make_policy_nodes(). > > In sel_make_policy_nodes() we now lock for rename twice instead of just > once so the combined operation is no longer atomic w.r.t the parent > directory locks. As selinux_state.policy_mutex is held across the whole > operation this does not open up any interesting races. > > Reviewed-by: Amir Goldstein <[email protected]> > Reviewed-by: Jeff Layton <[email protected]> > Signed-off-by: NeilBrown <[email protected]> > > --- > changes since v5: > - sel_make_policy_nodes now uses "goto out" on error from start_renaming_two_dentries() > > changes since v3: > added missing assignment to rd.mnt_idmap in ovl_cleanup_and_whiteout > --- > fs/debugfs/inode.c | 48 ++++++++++++-------------- > fs/namei.c | 65 ++++++++++++++++++++++++++++++++++++ > fs/overlayfs/dir.c | 43 ++++++++++++++++-------- > include/linux/namei.h | 2 ++ > security/selinux/selinuxfs.c | 15 +++++++-- > 5 files changed, 131 insertions(+), 42 deletions(-) ... > diff --git a/fs/namei.c b/fs/namei.c > index 4b740048df97..7f0384ceb976 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -3877,6 +3877,71 @@ int start_renaming_dentry(struct renamedata *rd, int lookup_flags, > } > EXPORT_SYMBOL(start_renaming_dentry); > > +/** > + * start_renaming_two_dentries - Lock to dentries in given parents for rename I'm guessing you meant this to read "Lock *two* dentries ...". Otherwise the SELinux changes look fine to me. Acked-by: Paul Moore <[email protected]> (SELinux) > + * @rd: rename data containing parent > + * @old_dentry: dentry of name to move > + * @new_dentry: dentry to move to > + * > + * Ensure locks are in place for rename and check parentage is still correct. > + * > + * On success the two dentries are stored in @rd.old_dentry and > + * @rd.new_dentry and @rd.old_parent and @rd.new_parent are confirmed to > + * be the parents of the dentries. > + * > + * References and the lock can be dropped with end_renaming() > + * > + * Returns: zero or an error. > + */ -- paul-moore.com