[PATCH] autofs: fix "busy inodes after umount..."
authorAlexander Krizhanovsky <klx@yandex.ru>
Fri, 9 Sep 2005 20:01:59 +0000 (13:01 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 9 Sep 2005 20:57:31 +0000 (13:57 -0700)
This patch for old autofs (version 3) cleans dentries which are not putted
after killing the automount daemon (it's analogue of recent patch for
autofs4).

Signed-off-by: Alexander Krizhanovsky <klx@yandex.ru>
Cc: Ian Kent <raven@themaw.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/autofs/autofs_i.h
fs/autofs/dirhash.c
fs/autofs/inode.c

index 6171431272dc26a08b70b0dc18d9aaa1652e8377..990c28da5aecec59a81e7fab256a3bf0cbfc7f6c 100644 (file)
@@ -105,6 +105,7 @@ struct autofs_sb_info {
        struct file *pipe;
        pid_t oz_pgrp;
        int catatonic;
+       struct super_block *sb;
        unsigned long exp_timeout;
        ino_t next_dir_ino;
        struct autofs_wait_queue *queues; /* Wait queue pointer */
@@ -134,7 +135,7 @@ void autofs_hash_insert(struct autofs_dirhash *,struct autofs_dir_ent *);
 void autofs_hash_delete(struct autofs_dir_ent *);
 struct autofs_dir_ent *autofs_hash_enum(const struct autofs_dirhash *,off_t *,struct autofs_dir_ent *);
 void autofs_hash_dputall(struct autofs_dirhash *);
-void autofs_hash_nuke(struct autofs_dirhash *);
+void autofs_hash_nuke(struct autofs_sb_info *);
 
 /* Expiration-handling functions */
 
index 448143fd0796a36546dedb42d3ff8a38807bd5c6..5ccfcf26310d7ac6c000541300bedaae83dd267d 100644 (file)
@@ -232,13 +232,13 @@ void autofs_hash_dputall(struct autofs_dirhash *dh)
 
 /* Delete everything.  This is used on filesystem destruction, so we
    make no attempt to keep the pointers valid */
-void autofs_hash_nuke(struct autofs_dirhash *dh)
+void autofs_hash_nuke(struct autofs_sb_info *sbi)
 {
        int i;
        struct autofs_dir_ent *ent, *nent;
 
        for ( i = 0 ; i < AUTOFS_HASH_SIZE ; i++ ) {
-               for ( ent = dh->h[i] ; ent ; ent = nent ) {
+               for ( ent = sbi->dirhash.h[i] ; ent ; ent = nent ) {
                        nent = ent->next;
                        if ( ent->dentry )
                                dput(ent->dentry);
@@ -246,4 +246,5 @@ void autofs_hash_nuke(struct autofs_dirhash *dh)
                        kfree(ent);
                }
        }
+       shrink_dcache_sb(sbi->sb);
 }
index 4888c1fabbf714b32fad246d03ee7bb8db231e6a..65e5ed42190ed23f99b2aa760d0de46d56fe2b4a 100644 (file)
@@ -27,7 +27,7 @@ static void autofs_put_super(struct super_block *sb)
        if ( !sbi->catatonic )
                autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */
 
-       autofs_hash_nuke(&sbi->dirhash);
+       autofs_hash_nuke(sbi);
        for ( n = 0 ; n < AUTOFS_MAX_SYMLINKS ; n++ ) {
                if ( test_bit(n, sbi->symlink_bitmap) )
                        kfree(sbi->symlink[n].data);
@@ -148,6 +148,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
        s->s_magic = AUTOFS_SUPER_MAGIC;
        s->s_op = &autofs_sops;
        s->s_time_gran = 1;
+       sbi->sb = s;
 
        root_inode = iget(s, AUTOFS_ROOT_INO);
        root = d_alloc_root(root_inode);