diff options
-rw-r--r-- | fs/autofs/autofs_i.h | 4 | ||||
-rw-r--r-- | fs/autofs/inode.c | 20 | ||||
-rw-r--r-- | fs/autofs/root.c | 6 |
3 files changed, 22 insertions, 8 deletions
diff --git a/fs/autofs/autofs_i.h b/fs/autofs/autofs_i.h index 4ef544434b51..8b4cca3c4705 100644 --- a/fs/autofs/autofs_i.h +++ b/fs/autofs/autofs_i.h | |||
@@ -101,7 +101,7 @@ struct autofs_symlink { | |||
101 | struct autofs_sb_info { | 101 | struct autofs_sb_info { |
102 | u32 magic; | 102 | u32 magic; |
103 | struct file *pipe; | 103 | struct file *pipe; |
104 | pid_t oz_pgrp; | 104 | struct pid *oz_pgrp; |
105 | int catatonic; | 105 | int catatonic; |
106 | struct super_block *sb; | 106 | struct super_block *sb; |
107 | unsigned long exp_timeout; | 107 | unsigned long exp_timeout; |
@@ -122,7 +122,7 @@ static inline struct autofs_sb_info *autofs_sbi(struct super_block *sb) | |||
122 | filesystem without "magic".) */ | 122 | filesystem without "magic".) */ |
123 | 123 | ||
124 | static inline int autofs_oz_mode(struct autofs_sb_info *sbi) { | 124 | static inline int autofs_oz_mode(struct autofs_sb_info *sbi) { |
125 | return sbi->catatonic || process_group(current) == sbi->oz_pgrp; | 125 | return sbi->catatonic || task_pgrp(current) == sbi->oz_pgrp; |
126 | } | 126 | } |
127 | 127 | ||
128 | /* Hash operations */ | 128 | /* Hash operations */ |
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; |
diff --git a/fs/autofs/root.c b/fs/autofs/root.c index 6fa04dd6d167..c1489533277a 100644 --- a/fs/autofs/root.c +++ b/fs/autofs/root.c | |||
@@ -213,8 +213,10 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr | |||
213 | sbi = autofs_sbi(dir->i_sb); | 213 | sbi = autofs_sbi(dir->i_sb); |
214 | 214 | ||
215 | oz_mode = autofs_oz_mode(sbi); | 215 | oz_mode = autofs_oz_mode(sbi); |
216 | DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d\n", | 216 | DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, " |
217 | current->pid, process_group(current), sbi->catatonic, oz_mode)); | 217 | "oz_mode = %d\n", pid_nr(task_pid(current)), |
218 | process_group(current), sbi->catatonic, | ||
219 | oz_mode)); | ||
218 | 220 | ||
219 | /* | 221 | /* |
220 | * Mark the dentry incomplete, but add it. This is needed so | 222 | * Mark the dentry incomplete, but add it. This is needed so |