kernfs: dont call d_splice_alias() under kernfs node lock
authorIan Kent <raven@themaw.net>
Fri, 16 Jul 2021 09:28:40 +0000 (17:28 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Jul 2021 07:29:15 +0000 (09:29 +0200)
The call to d_splice_alias() in kernfs_iop_lookup() doesn't depend on
any kernfs node so there's no reason to hold the kernfs node lock when
calling it.

Reviewed-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Ian Kent <raven@themaw.net>
Link: https://lore.kernel.org/r/162642772000.63632.10672683419693513226.stgit@web.messagingengine.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/kernfs/dir.c

index 4994723..ba58142 100644 (file)
@@ -1100,7 +1100,6 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
                                        struct dentry *dentry,
                                        unsigned int flags)
 {
-       struct dentry *ret;
        struct kernfs_node *parent = dir->i_private;
        struct kernfs_node *kn;
        struct inode *inode = NULL;
@@ -1120,11 +1119,10 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
        /* Needed only for negative dentry validation */
        if (!inode)
                kernfs_set_rev(parent, dentry);
-       /* instantiate and hash (possibly negative) dentry */
-       ret = d_splice_alias(inode, dentry);
        up_read(&kernfs_rwsem);
 
-       return ret;
+       /* instantiate and hash (possibly negative) dentry */
+       return d_splice_alias(inode, dentry);
 }
 
 static int kernfs_iop_mkdir(struct user_namespace *mnt_userns,