On Fri, 27 Oct 2023 14:55:14 +0200
"Arnd Bergmann" <a...@arndb.de> wrote:


> This lock is part of the dentry passed to d_invalidate()
> 
> > [ 1402.609170] ? lock_release (kernel/locking/lockdep.c:5429
> > kernel/locking/lockdep.c:5773)
> > [ 1402.612923] ? create_dir_dentry.part.0 (fs/tracefs/event_inode.c:387)
> > [ 1402.617803] _raw_spin_lock (include/linux/spinlock_api_smp.h:134
> > kernel/locking/spinlock.c:154)
> > [ 1402.621467] ? d_invalidate (fs/dcache.c:1725 (discriminator 1))
> > [ 1402.625126] d_invalidate (fs/dcache.c:1725 (discriminator 1))
> > [ 1402.628619] create_dir_dentry.part.0 (fs/tracefs/event_inode.c:390)  
> 
> Which is called by create_dir_dentry(). I don't see a bug
> in that function, but maybe Steve has an idea.
> 
>

I see a bug ;-)

Can you test this patch?

Thanks!

-- Steve

diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c
index 4d2da7480e5f..ef003149e4d3 100644
--- a/fs/tracefs/event_inode.c
+++ b/fs/tracefs/event_inode.c
@@ -234,6 +234,10 @@ create_file_dentry(struct eventfs_inode *ei, struct dentry 
**e_dentry,
        bool invalidate = false;
 
        mutex_lock(&eventfs_mutex);
+       if (ei->is_freed) {
+               mutex_unlock(&eventfs_mutex);
+               return NULL;
+       }
        /* If the e_dentry already has a dentry, use it */
        if (*e_dentry) {
                /* lookup does not need to up the ref count */
@@ -333,6 +337,10 @@ create_dir_dentry(struct eventfs_inode *ei, struct dentry 
*parent, bool lookup)
        struct dentry *dentry = NULL;
 
        mutex_lock(&eventfs_mutex);
+       if (ei->is_freed) {
+               mutex_unlock(&eventfs_mutex);
+               return NULL;
+       }
        if (ei->dentry) {
                /* If the dentry already has a dentry, use it */
                dentry = ei->dentry;
-- 
2.42.0

Reply via email to