Commit 5b7e934d authored by Al Viro's avatar Al Viro

Use kill_litter_super() in autofs4 ->kill_sb()

... and get rid of open-coding its guts (i.e. RIP autofs4_force_release())
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3899167d
...@@ -96,63 +96,6 @@ void autofs4_free_ino(struct autofs_info *ino) ...@@ -96,63 +96,6 @@ void autofs4_free_ino(struct autofs_info *ino)
kfree(ino); kfree(ino);
} }
/*
* Deal with the infamous "Busy inodes after umount ..." message.
*
* Clean up the dentry tree. This happens with autofs if the user
* space program goes away due to a SIGKILL, SIGSEGV etc.
*/
static void autofs4_force_release(struct autofs_sb_info *sbi)
{
struct dentry *this_parent = sbi->sb->s_root;
struct list_head *next;
if (!sbi->sb->s_root)
return;
spin_lock(&dcache_lock);
repeat:
next = this_parent->d_subdirs.next;
resume:
while (next != &this_parent->d_subdirs) {
struct dentry *dentry = list_entry(next, struct dentry, d_u.d_child);
/* Negative dentry - don`t care */
if (!simple_positive(dentry)) {
next = next->next;
continue;
}
if (!list_empty(&dentry->d_subdirs)) {
this_parent = dentry;
goto repeat;
}
next = next->next;
spin_unlock(&dcache_lock);
DPRINTK("dentry %p %.*s",
dentry, (int)dentry->d_name.len, dentry->d_name.name);
dput(dentry);
spin_lock(&dcache_lock);
}
if (this_parent != sbi->sb->s_root) {
struct dentry *dentry = this_parent;
next = this_parent->d_u.d_child.next;
this_parent = this_parent->d_parent;
spin_unlock(&dcache_lock);
DPRINTK("parent dentry %p %.*s",
dentry, (int)dentry->d_name.len, dentry->d_name.name);
dput(dentry);
spin_lock(&dcache_lock);
goto resume;
}
spin_unlock(&dcache_lock);
}
void autofs4_kill_sb(struct super_block *sb) void autofs4_kill_sb(struct super_block *sb)
{ {
struct autofs_sb_info *sbi = autofs4_sbi(sb); struct autofs_sb_info *sbi = autofs4_sbi(sb);
...@@ -169,15 +112,12 @@ void autofs4_kill_sb(struct super_block *sb) ...@@ -169,15 +112,12 @@ void autofs4_kill_sb(struct super_block *sb)
/* Free wait queues, close pipe */ /* Free wait queues, close pipe */
autofs4_catatonic_mode(sbi); autofs4_catatonic_mode(sbi);
/* Clean up and release dangling references */
autofs4_force_release(sbi);
sb->s_fs_info = NULL; sb->s_fs_info = NULL;
kfree(sbi); kfree(sbi);
out_kill_sb: out_kill_sb:
DPRINTK("shutting down"); DPRINTK("shutting down");
kill_anon_super(sb); kill_litter_super(sb);
} }
static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt) static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment