]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
convert autofs
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 May 2024 16:44:53 +0000 (12:44 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 16 Nov 2025 06:35:05 +0000 (01:35 -0500)
creation/removal is via normal VFS paths; make ->mkdir() and ->symlink()
use d_make_persistent(); ->rmdir() and ->unlink() - d_make_discardable()
instead of dput() and that's it.

d_make_persistent() works for unhashed just fine...

Note that only persistent dentries are ever hashed there; unusual absense
of ->d_delete() in dentry_operations is due to that - anything that has
refcount reach 0 will be unhashed there, so it won't get to checking
->d_delete anyway.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/autofs/inode.c
fs/autofs/root.c

index f5c16ffba01340e95ea843fc15dcc957ef337d5f..eb86f893efbb80989e674a7965061666af777d3a 100644 (file)
@@ -55,7 +55,7 @@ void autofs_kill_sb(struct super_block *sb)
        }
 
        pr_debug("shutting down\n");
-       kill_litter_super(sb);
+       kill_anon_super(sb);
        if (sbi)
                kfree_rcu(sbi, rcu);
 }
index 39794633d484972653564aadca735b5c00a3320c..fb6c8215456c26466de500e649cc0af57f476f98 100644 (file)
@@ -594,9 +594,8 @@ static int autofs_dir_symlink(struct mnt_idmap *idmap,
        }
        inode->i_private = cp;
        inode->i_size = size;
-       d_add(dentry, inode);
 
-       dget(dentry);
+       d_make_persistent(dentry, inode);
        p_ino = autofs_dentry_ino(dentry->d_parent);
        p_ino->count++;
 
@@ -627,7 +626,7 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry)
 
        p_ino = autofs_dentry_ino(dentry->d_parent);
        p_ino->count--;
-       dput(dentry);
+       d_make_discardable(dentry);
 
        d_inode(dentry)->i_size = 0;
        clear_nlink(d_inode(dentry));
@@ -709,7 +708,7 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry)
 
        p_ino = autofs_dentry_ino(dentry->d_parent);
        p_ino->count--;
-       dput(dentry);
+       d_make_discardable(dentry);
        d_inode(dentry)->i_size = 0;
        clear_nlink(d_inode(dentry));
 
@@ -739,12 +738,11 @@ static struct dentry *autofs_dir_mkdir(struct mnt_idmap *idmap,
        inode = autofs_get_inode(dir->i_sb, S_IFDIR | mode);
        if (!inode)
                return ERR_PTR(-ENOMEM);
-       d_add(dentry, inode);
 
        if (sbi->version < 5)
                autofs_set_leaf_automount_flags(dentry);
 
-       dget(dentry);
+       d_make_persistent(dentry, inode);
        p_ino = autofs_dentry_ino(dentry->d_parent);
        p_ino->count++;
        inc_nlink(dir);