Skip to content
This repository has been archived by the owner on Aug 27, 2022. It is now read-only.

Commit

Permalink
[PATCH] autofs4: panic after mount fail
Browse files Browse the repository at this point in the history
Resolve the panic on failed mount of an autofs filesystem originally
reported by Mao Bibo.

It addresses two issues that happen after the mount fail.  The first a NULL
pointer reference to a field (pipe) in the autofs superblock info structure
and second the lack of super block cleanup by the autofs and autofs4
modules.

Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
raven-au authored and Linus Torvalds committed Nov 14, 2006
1 parent 6a34b57 commit ba8df43
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
14 changes: 13 additions & 1 deletion fs/autofs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ void autofs_kill_sb(struct super_block *sb)
struct autofs_sb_info *sbi = autofs_sbi(sb);
unsigned int n;

/*
* In the event of a failure in get_sb_nodev the superblock
* info is not present so nothing else has been setup, so
* just exit when we are called from deactivate_super.
*/
if (!sbi)
return;

if ( !sbi->catatonic )
autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */

Expand Down Expand Up @@ -136,7 +144,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)

s->s_fs_info = sbi;
sbi->magic = AUTOFS_SBI_MAGIC;
sbi->catatonic = 0;
sbi->pipe = NULL;
sbi->catatonic = 1;
sbi->exp_timeout = 0;
sbi->oz_pgrp = process_group(current);
autofs_initialize_hash(&sbi->dirhash);
Expand Down Expand Up @@ -180,6 +189,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
if ( !pipe->f_op || !pipe->f_op->write )
goto fail_fput;
sbi->pipe = pipe;
sbi->catatonic = 0;

/*
* Success! Install the root dentry now to indicate completion.
Expand All @@ -198,6 +208,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
iput(root_inode);
fail_free:
kfree(sbi);
s->s_fs_info = NULL;
kill_anon_super(s);
fail_unlock:
return -EINVAL;
}
Expand Down
1 change: 1 addition & 0 deletions fs/autofs/waitq.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ void autofs_catatonic_mode(struct autofs_sb_info *sbi)
wq = nwq;
}
fput(sbi->pipe); /* Close the pipe */
sbi->pipe = NULL;
autofs_hash_dputall(&sbi->dirhash); /* Remove all dentry pointers */
}

Expand Down
17 changes: 16 additions & 1 deletion fs/autofs4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ 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;
Expand Down Expand Up @@ -146,6 +149,14 @@ void autofs4_kill_sb(struct super_block *sb)
{
struct autofs_sb_info *sbi = autofs4_sbi(sb);

/*
* In the event of a failure in get_sb_nodev the superblock
* info is not present so nothing else has been setup, so
* just exit when we are called from deactivate_super.
*/
if (!sbi)
return;

sb->s_fs_info = NULL;

if ( !sbi->catatonic )
Expand Down Expand Up @@ -310,7 +321,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
s->s_fs_info = sbi;
sbi->magic = AUTOFS_SBI_MAGIC;
sbi->pipefd = -1;
sbi->catatonic = 0;
sbi->pipe = NULL;
sbi->catatonic = 1;
sbi->exp_timeout = 0;
sbi->oz_pgrp = process_group(current);
sbi->sb = s;
Expand Down Expand Up @@ -388,6 +400,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
goto fail_fput;
sbi->pipe = pipe;
sbi->pipefd = pipefd;
sbi->catatonic = 0;

/*
* Success! Install the root dentry now to indicate completion.
Expand All @@ -412,6 +425,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
kfree(ino);
fail_free:
kfree(sbi);
s->s_fs_info = NULL;
kill_anon_super(s);
fail_unlock:
return -EINVAL;
}
Expand Down
6 changes: 2 additions & 4 deletions fs/autofs4/waitq.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,8 @@ void autofs4_catatonic_mode(struct autofs_sb_info *sbi)
wake_up_interruptible(&wq->queue);
wq = nwq;
}
if (sbi->pipe) {
fput(sbi->pipe); /* Close the pipe */
sbi->pipe = NULL;
}
fput(sbi->pipe); /* Close the pipe */
sbi->pipe = NULL;
}

static int autofs4_write(struct file *file, const void *addr, int bytes)
Expand Down

0 comments on commit ba8df43

Please sign in to comment.