• Steven Rostedt (Google)'s avatar
    tracefs: Clear EVENT_INODE flag in tracefs_drop_inode() · 0bcfd9aa
    Steven Rostedt (Google) authored
    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: baa23a8d ("tracefs: Reset permissions on remount if permissions are options")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    0bcfd9aa
inode.c 21.2 KB