]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
convert fuse_ctl
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 May 2024 05:07:01 +0000 (01:07 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 16 Nov 2025 06:35:03 +0000 (01:35 -0500)
objects are created in fuse_ctl_add_dentry() by d_alloc_name()+d_add(),
removed by simple_remove_by_name().

What we return is a borrowed reference - it is valid until the call of
fuse_ctl_remove_conn() and we depend upon the exclusion (on fuse_mutex)
for safety.  Return value is used only within the caller
(fuse_ctl_add_conn()).

Replace d_add() with d_make_persistent() + dput().  dput() is paired
with d_alloc_name() and return value is the result of d_make_persistent().

Acked-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/fuse/control.c

index 3dca752127ff8fd1f7a04883b774a71b73277b63..140bd5730d9984e8716391c33212d70d8677a103 100644 (file)
@@ -236,8 +236,14 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
                inc_nlink(inode);
        }
        inode->i_private = fc;
-       d_add(dentry, inode);
-
+       d_make_persistent(dentry, inode);
+       dput(dentry);
+
+       /*
+        * We are returning a borrowed reference here - it's only good while
+        * fuse_mutex is held.  Actually it's d_make_persistent() return
+        * value...
+        */
        return dentry;
 }
 
@@ -346,7 +352,7 @@ static void fuse_ctl_kill_sb(struct super_block *sb)
        fuse_control_sb = NULL;
        mutex_unlock(&fuse_mutex);
 
-       kill_litter_super(sb);
+       kill_anon_super(sb);
 }
 
 static struct file_system_type fuse_ctl_fs_type = {