diff options
Diffstat (limited to 'fs/autofs4/inode.c')
| -rw-r--r-- | fs/autofs4/inode.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 51fd8595bf85..ce7c0f1dd529 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
| @@ -99,6 +99,9 @@ static void autofs4_force_release(struct autofs_sb_info *sbi) | |||
| 99 | struct dentry *this_parent = sbi->sb->s_root; | 99 | struct dentry *this_parent = sbi->sb->s_root; |
| 100 | struct list_head *next; | 100 | struct list_head *next; |
| 101 | 101 | ||
| 102 | if (!sbi->sb->s_root) | ||
| 103 | return; | ||
| 104 | |||
| 102 | spin_lock(&dcache_lock); | 105 | spin_lock(&dcache_lock); |
| 103 | repeat: | 106 | repeat: |
| 104 | next = this_parent->d_subdirs.next; | 107 | next = this_parent->d_subdirs.next; |
| @@ -146,6 +149,14 @@ void autofs4_kill_sb(struct super_block *sb) | |||
| 146 | { | 149 | { |
| 147 | struct autofs_sb_info *sbi = autofs4_sbi(sb); | 150 | struct autofs_sb_info *sbi = autofs4_sbi(sb); |
| 148 | 151 | ||
| 152 | /* | ||
| 153 | * In the event of a failure in get_sb_nodev the superblock | ||
| 154 | * info is not present so nothing else has been setup, so | ||
| 155 | * just exit when we are called from deactivate_super. | ||
| 156 | */ | ||
| 157 | if (!sbi) | ||
| 158 | return; | ||
| 159 | |||
| 149 | sb->s_fs_info = NULL; | 160 | sb->s_fs_info = NULL; |
| 150 | 161 | ||
| 151 | if ( !sbi->catatonic ) | 162 | if ( !sbi->catatonic ) |
| @@ -310,7 +321,8 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
| 310 | s->s_fs_info = sbi; | 321 | s->s_fs_info = sbi; |
| 311 | sbi->magic = AUTOFS_SBI_MAGIC; | 322 | sbi->magic = AUTOFS_SBI_MAGIC; |
| 312 | sbi->pipefd = -1; | 323 | sbi->pipefd = -1; |
| 313 | sbi->catatonic = 0; | 324 | sbi->pipe = NULL; |
| 325 | sbi->catatonic = 1; | ||
| 314 | sbi->exp_timeout = 0; | 326 | sbi->exp_timeout = 0; |
| 315 | sbi->oz_pgrp = process_group(current); | 327 | sbi->oz_pgrp = process_group(current); |
| 316 | sbi->sb = s; | 328 | sbi->sb = s; |
| @@ -388,6 +400,7 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent) | |||
| 388 | goto fail_fput; | 400 | goto fail_fput; |
| 389 | sbi->pipe = pipe; | 401 | sbi->pipe = pipe; |
| 390 | sbi->pipefd = pipefd; | 402 | sbi->pipefd = pipefd; |
| 403 | sbi->catatonic = 0; | ||
| 391 | 404 | ||
| 392 | /* | 405 | /* |
| 393 | * Success! Install the root dentry now to indicate completion. | 406 | * Success! Install the root dentry now to indicate completion. |
| @@ -412,6 +425,8 @@ fail_ino: | |||
| 412 | kfree(ino); | 425 | kfree(ino); |
| 413 | fail_free: | 426 | fail_free: |
| 414 | kfree(sbi); | 427 | kfree(sbi); |
| 428 | s->s_fs_info = NULL; | ||
| 429 | kill_anon_super(s); | ||
| 415 | fail_unlock: | 430 | fail_unlock: |
| 416 | return -EINVAL; | 431 | return -EINVAL; |
| 417 | } | 432 | } |
