diff options
Diffstat (limited to 'fs/autofs/inode.c')
-rw-r--r-- | fs/autofs/inode.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index d8315e61731e..e7204d71acc9 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c | |||
@@ -37,6 +37,8 @@ void autofs_kill_sb(struct super_block *sb) | |||
37 | if (!sbi->catatonic) | 37 | if (!sbi->catatonic) |
38 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ | 38 | autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ |
39 | 39 | ||
40 | put_pid(sbi->oz_pgrp); | ||
41 | |||
40 | autofs_hash_nuke(sbi); | 42 | autofs_hash_nuke(sbi); |
41 | for (n = 0; n < AUTOFS_MAX_SYMLINKS; n++) { | 43 | for (n = 0; n < AUTOFS_MAX_SYMLINKS; n++) { |
42 | if (test_bit(n, sbi->symlink_bitmap)) | 44 | if (test_bit(n, sbi->symlink_bitmap)) |
@@ -139,6 +141,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
139 | int pipefd; | 141 | int pipefd; |
140 | struct autofs_sb_info *sbi; | 142 | struct autofs_sb_info *sbi; |
141 | int minproto, maxproto; | 143 | int minproto, maxproto; |
144 | pid_t pgid; | ||
142 | 145 | ||
143 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 146 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
144 | if (!sbi) | 147 | if (!sbi) |
@@ -150,7 +153,6 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
150 | sbi->pipe = NULL; | 153 | sbi->pipe = NULL; |
151 | sbi->catatonic = 1; | 154 | sbi->catatonic = 1; |
152 | sbi->exp_timeout = 0; | 155 | sbi->exp_timeout = 0; |
153 | sbi->oz_pgrp = process_group(current); | ||
154 | autofs_initialize_hash(&sbi->dirhash); | 156 | autofs_initialize_hash(&sbi->dirhash); |
155 | sbi->queues = NULL; | 157 | sbi->queues = NULL; |
156 | memset(sbi->symlink_bitmap, 0, sizeof(long)*AUTOFS_SYMLINK_BITMAP_LEN); | 158 | memset(sbi->symlink_bitmap, 0, sizeof(long)*AUTOFS_SYMLINK_BITMAP_LEN); |
@@ -171,7 +173,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
171 | 173 | ||
172 | /* Can this call block? - WTF cares? s is locked. */ | 174 | /* Can this call block? - WTF cares? s is locked. */ |
173 | if (parse_options(data, &pipefd, &root_inode->i_uid, | 175 | if (parse_options(data, &pipefd, &root_inode->i_uid, |
174 | &root_inode->i_gid, &sbi->oz_pgrp, &minproto, | 176 | &root_inode->i_gid, &pgid, &minproto, |
175 | &maxproto)) { | 177 | &maxproto)) { |
176 | printk("autofs: called with bogus options\n"); | 178 | printk("autofs: called with bogus options\n"); |
177 | goto fail_dput; | 179 | goto fail_dput; |
@@ -184,13 +186,21 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
184 | goto fail_dput; | 186 | goto fail_dput; |
185 | } | 187 | } |
186 | 188 | ||
187 | DPRINTK(("autofs: pipe fd = %d, pgrp = %u\n", pipefd, sbi->oz_pgrp)); | 189 | DPRINTK(("autofs: pipe fd = %d, pgrp = %u\n", pipefd, pgid)); |
190 | sbi->oz_pgrp = find_get_pid(pgid); | ||
191 | |||
192 | if (!sbi->oz_pgrp) { | ||
193 | printk("autofs: could not find process group %d\n", pgid); | ||
194 | goto fail_dput; | ||
195 | } | ||
196 | |||
188 | pipe = fget(pipefd); | 197 | pipe = fget(pipefd); |
189 | 198 | ||
190 | if (!pipe) { | 199 | if (!pipe) { |
191 | printk("autofs: could not open pipe file descriptor\n"); | 200 | printk("autofs: could not open pipe file descriptor\n"); |
192 | goto fail_dput; | 201 | goto fail_put_pid; |
193 | } | 202 | } |
203 | |||
194 | if (!pipe->f_op || !pipe->f_op->write) | 204 | if (!pipe->f_op || !pipe->f_op->write) |
195 | goto fail_fput; | 205 | goto fail_fput; |
196 | sbi->pipe = pipe; | 206 | sbi->pipe = pipe; |
@@ -205,6 +215,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) | |||
205 | fail_fput: | 215 | fail_fput: |
206 | printk("autofs: pipe file descriptor does not contain proper ops\n"); | 216 | printk("autofs: pipe file descriptor does not contain proper ops\n"); |
207 | fput(pipe); | 217 | fput(pipe); |
218 | fail_put_pid: | ||
219 | put_pid(sbi->oz_pgrp); | ||
208 | fail_dput: | 220 | fail_dput: |
209 | dput(root); | 221 | dput(root); |
210 | goto fail_free; | 222 | goto fail_free; |