tracefs: Clear EVENT_INODE flag in tracefs_drop_inode()
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 23 May 2024 05:14:29 +0000 (01:14 -0400)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Thu, 23 May 2024 13:26:24 +0000 (09:26 -0400)
commit0bcfd9aa4dafa03b88d68bf66b694df2a3e76cf3
tree0b77943283264c2a3e7fa76816bf464c35b2fa45
parent340f0c7067a95281ad13734f8225f49c6cf52067
tracefs: Clear EVENT_INODE flag in tracefs_drop_inode()

When the inode is being dropped from the dentry, the TRACEFS_EVENT_INODE
flag needs to be cleared to prevent a remount from calling
eventfs_remount() on the tracefs_inode private data. There's a race
between the inode is dropped (and the dentry freed) to where the inode is
actually freed. If a remount happens between the two, the eventfs_inode
could be accessed after it is freed (only the dentry keeps a ref count on
it).

Currently the TRACEFS_EVENT_INODE flag is cleared from the dentry iput()
function. But this is incorrect, as it is possible that the inode has
another reference to it. The flag should only be cleared when the inode is
really being dropped and has no more references. That happens in the
drop_inode callback of the inode, as that gets called when the last
reference of the inode is released.

Remove the tracefs_d_iput() function and move its logic to the more
appropriate tracefs_drop_inode() callback function.

Link: https://lore.kernel.org/linux-trace-kernel/20240523051539.908205106@goodmis.org
Cc: stable@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Fixes: baa23a8d4360d ("tracefs: Reset permissions on remount if permissions are options")
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
fs/tracefs/inode.c