diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2024-05-09 01:07:01 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2025-11-16 01:35:03 -0500 |
| commit | 5a8993a15a79f03cd1a43ddc071d0e49a1247cd5 (patch) | |
| tree | fc1e80b5a0f2f5b374f29230c3776c7881371c20 /fs/fuse | |
| parent | ae1fde9038f333adab4be8283410ddc8570931c9 (diff) | |
| download | linux-next-5a8993a15a79f03cd1a43ddc071d0e49a1247cd5.tar.gz linux-next-5a8993a15a79f03cd1a43ddc071d0e49a1247cd5.zip | |
convert fuse_ctl
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>
Diffstat (limited to 'fs/fuse')
| -rw-r--r-- | fs/fuse/control.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/fuse/control.c b/fs/fuse/control.c index 3dca752127ff..140bd5730d99 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c @@ -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 = { |
