diff options
| author | David Howells <dhowells@redhat.com> | 2006-10-19 23:28:36 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-20 10:26:38 -0700 | 
| commit | 0e7d73824e6b0024100701da246fec769dd8f087 (patch) | |
| tree | 43fd5dd81dd39cb06253bd53aed2d91daaf13763 /fs/autofs | |
| parent | f2fbc6c2dad7bbcbf226c094749534f1e84d3be2 (diff) | |
[PATCH] autofs3: Make sure all dentries refs are released before calling kill_anon_super()
Make sure all dentries refs are released before calling kill_anon_super()
so that the assumption that generic_shutdown_super() can completely destroy
the dentry tree for there will be no external references holds true.
What was being done in the put_super() superblock op, is now done in the
kill_sb() filesystem op instead, prior to calling kill_anon_super().
The call to shrink_dcache_sb() is removed as it is redundant since
shrink_dcache_for_umount() will now be called after the cleanup routine.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Ian Kent <raven@themaw.net>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/autofs')
| -rw-r--r-- | fs/autofs/autofs_i.h | 1 | ||||
| -rw-r--r-- | fs/autofs/dirhash.c | 1 | ||||
| -rw-r--r-- | fs/autofs/init.c | 2 | ||||
| -rw-r--r-- | fs/autofs/inode.c | 4 | 
4 files changed, 4 insertions, 4 deletions
| diff --git a/fs/autofs/autofs_i.h b/fs/autofs/autofs_i.h index c7700d9b3f96..906ba5ce2261 100644 --- a/fs/autofs/autofs_i.h +++ b/fs/autofs/autofs_i.h @@ -149,6 +149,7 @@ extern const struct file_operations autofs_root_operations;  /* Initializing function */  int autofs_fill_super(struct super_block *, void *, int); +void autofs_kill_sb(struct super_block *sb);  /* Queue management functions */ diff --git a/fs/autofs/dirhash.c b/fs/autofs/dirhash.c index 3fded389d06b..bf8c8af98004 100644 --- a/fs/autofs/dirhash.c +++ b/fs/autofs/dirhash.c @@ -246,5 +246,4 @@ void autofs_hash_nuke(struct autofs_sb_info *sbi)  			kfree(ent);  		}  	} -	shrink_dcache_sb(sbi->sb);  } diff --git a/fs/autofs/init.c b/fs/autofs/init.c index aca123752406..cea5219b4f37 100644 --- a/fs/autofs/init.c +++ b/fs/autofs/init.c @@ -24,7 +24,7 @@ static struct file_system_type autofs_fs_type = {  	.owner		= THIS_MODULE,  	.name		= "autofs",  	.get_sb		= autofs_get_sb, -	.kill_sb	= kill_anon_super, +	.kill_sb	= autofs_kill_sb,  };  static int __init init_autofs_fs(void) diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index 2c9759baad61..54c518c89e4c 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c @@ -20,7 +20,7 @@  #include "autofs_i.h"  #include <linux/module.h> -static void autofs_put_super(struct super_block *sb) +void autofs_kill_sb(struct super_block *sb)  {  	struct autofs_sb_info *sbi = autofs_sbi(sb);  	unsigned int n; @@ -37,13 +37,13 @@ static void autofs_put_super(struct super_block *sb)  	kfree(sb->s_fs_info);  	DPRINTK(("autofs: shutting down\n")); +	kill_anon_super(sb);  }  static void autofs_read_inode(struct inode *inode);  static struct super_operations autofs_sops = {  	.read_inode	= autofs_read_inode, -	.put_super	= autofs_put_super,  	.statfs		= simple_statfs,  }; | 
