This is a note to let you know that I've just added the patch titled Subject:[PATCH v2 15/23] tracefs: Avoid using the ei->dentry pointer unnecessarily to the 6.7-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: tracefs-avoid-using-the-ei-dentry-pointer-unnecessarily.patch and it can be found in the queue-6.7 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From SRS0=eEWY=JP=rostedt.homelinux.com=rostedt@xxxxxxxxxx Tue Feb 6 12:35:32 2024 From: Steven Rostedt <rostedt@xxxxxxxxxxx> Date: Tue, 06 Feb 2024 06:32:13 -0500 Subject:[PATCH v2 15/23] tracefs: Avoid using the ei->dentry pointer unnecessarily To: linux-kernel@xxxxxxxxxxxxxxx, stable@xxxxxxxxxxxxxxx Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>, Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>, Sasha Levin <sashal@xxxxxxxxxx>, Masami Hiramatsu <mhiramat@xxxxxxxxxx>, Mark Rutland <mark.rutland@xxxxxxx>, Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx>, Christian Brauner <brauner@xxxxxxxxxx>, Al Viro <viro@xxxxxxxxxxxxxxxxxx>, Ajay Kaher <ajay.kaher@xxxxxxxxxxxx> Message-ID: <20240206113400.525587454@xxxxxxxxxxxxxxxxxxxxx> From: Steven Rostedt <rostedt@xxxxxxxxxxx> From: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> The eventfs_find_events() code tries to walk up the tree to find the event directory that a dentry belongs to, in order to then find the eventfs inode that is associated with that event directory. However, it uses an odd combination of walking the dentry parent, looking up the eventfs inode associated with that, and then looking up the dentry from there. Repeat. But the code shouldn't have back-pointers to dentries in the first place, and it should just walk the dentry parenthood chain directly. Similarly, 'set_top_events_ownership()' looks up the dentry from the eventfs inode, but the only reason it wants a dentry is to look up the superblock in order to look up the root dentry. But it already has the real filesystem inode, which has that same superblock pointer. So just pass in the superblock pointer using the information that's already there, instead of looking up extraneous data that is irrelevant. Link: https://lore.kernel.org/linux-trace-kernel/202401291043.e62e89dc-oliver.sang@xxxxxxxxx/ Link: https://lore.kernel.org/linux-trace-kernel/20240131185512.638645365@xxxxxxxxxxx Cc: stable@xxxxxxxxxxxxxxx Cc: Masami Hiramatsu <mhiramat@xxxxxxxxxx> Cc: Mark Rutland <mark.rutland@xxxxxxx> Cc: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> Cc: Christian Brauner <brauner@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Ajay Kaher <ajay.kaher@xxxxxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Fixes: c1504e510238 ("eventfs: Implement eventfs dir creation functions") Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx> (cherry picked from commit 99c001cb617df409dac275a059d6c3f187a2da7a) Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/tracefs/event_inode.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) --- a/fs/tracefs/event_inode.c +++ b/fs/tracefs/event_inode.c @@ -156,33 +156,30 @@ static int eventfs_set_attr(struct mnt_i return ret; } -static void update_top_events_attr(struct eventfs_inode *ei, struct dentry *dentry) +static void update_top_events_attr(struct eventfs_inode *ei, struct super_block *sb) { - struct inode *inode; + struct inode *root; /* Only update if the "events" was on the top level */ if (!ei || !(ei->attr.mode & EVENTFS_TOPLEVEL)) return; /* Get the tracefs root inode. */ - inode = d_inode(dentry->d_sb->s_root); - ei->attr.uid = inode->i_uid; - ei->attr.gid = inode->i_gid; + root = d_inode(sb->s_root); + ei->attr.uid = root->i_uid; + ei->attr.gid = root->i_gid; } static void set_top_events_ownership(struct inode *inode) { struct tracefs_inode *ti = get_tracefs(inode); struct eventfs_inode *ei = ti->private; - struct dentry *dentry; /* The top events directory doesn't get automatically updated */ if (!ei || !ei->is_events || !(ei->attr.mode & EVENTFS_TOPLEVEL)) return; - dentry = ei->dentry; - - update_top_events_attr(ei, dentry); + update_top_events_attr(ei, inode->i_sb); if (!(ei->attr.mode & EVENTFS_SAVE_UID)) inode->i_uid = ei->attr.uid; @@ -235,8 +232,10 @@ static struct eventfs_inode *eventfs_fin mutex_lock(&eventfs_mutex); do { - /* The parent always has an ei, except for events itself */ - ei = dentry->d_parent->d_fsdata; + // The parent is stable because we do not do renames + dentry = dentry->d_parent; + // ... and directories always have d_fsdata + ei = dentry->d_fsdata; /* * If the ei is being freed, the ownership of the children @@ -246,12 +245,11 @@ static struct eventfs_inode *eventfs_fin ei = NULL; break; } - - dentry = ei->dentry; + // Walk upwards until you find the events inode } while (!ei->is_events); mutex_unlock(&eventfs_mutex); - update_top_events_attr(ei, dentry); + update_top_events_attr(ei, dentry->d_sb); return ei; } Patches currently in stable-queue which might be from rostedt@xxxxxxxxxx are queue-6.7/eventfs-keep-all-directory-links-at-1.patch queue-6.7/eventfs-save-directory-inodes-in-the-eventfs_inode-structure.patch queue-6.7/tracefs-zero-out-the-tracefs_inode-when-allocating-it.patch queue-6.7/eventfs-read-ei-entries-before-ei-children-in-eventfs_iterate.patch queue-6.7/eventfs-remove-lookup-parameter-from-create_dir-file_dentry.patch queue-6.7/eventfs-remove-fsnotify-functions-from-lookup.patch queue-6.7/eventfs-stop-using-dcache_readdir-for-getdents.patch queue-6.7/tracefs-avoid-using-the-ei-dentry-pointer-unnecessarily.patch queue-6.7/eventfs-initialize-the-tracefs-inode-properly.patch queue-6.7/eventfs-do-ctx-pos-update-for-all-iterations-in-eventfs_iterate.patch queue-6.7/tracefs-dentry-lookup-crapectomy.patch queue-6.7/eventfs-have-the-inodes-all-for-files-and-directories-all-be-the-same.patch queue-6.7/eventfs-use-kcalloc-instead-of-kzalloc.patch queue-6.7/eventfs-shortcut-eventfs_iterate-by-skipping-entries-already-read.patch queue-6.7/eventfs-do-not-create-dentries-nor-inodes-in-iterate_shared.patch queue-6.7/eventfs-have-eventfs_iterate-stop-immediately-if-ei-is_freed-is-set.patch queue-6.7/eventfs-restructure-eventfs_inode-structure-to-be-more-condensed.patch queue-6.7/eventfs-warn-if-an-eventfs_inode-is-freed-without-is_freed-being-set.patch queue-6.7/eventfs-get-rid-of-dentry-pointers-without-refcounts.patch queue-6.7/eventfs-remove-unused-d_parent-pointer-field.patch queue-6.7/eventfs-clean-up-dentry-ops-and-add-revalidate-function.patch