aboutsummaryrefslogtreecommitdiffstats
path: root/fs/autofs/inode.c
diff options
context:
space:
mode:
authorSukadev Bhattiprolu <sukadev@us.ibm.com>2007-05-11 01:23:08 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-11 11:29:36 -0400
commitfa0334f19f0e1a1e570fc2a160dfe53536599ade (patch)
treed223dcb53af7b5dd80958a1710c335ca942e1bcc /fs/autofs/inode.c
parentd78e53c89a820471837e0cb91fe36b7be1a7c9de (diff)
Replace pid_t in autofs with struct pid reference
Make autofs container-friendly by caching struct pid reference rather than pid_t and using pid_nr() to retreive a task's pid_t. ChangeLog: - Fix Eric Biederman's comments - Use find_get_pid() to hold a reference to oz_pgrp and release while unmounting; separate out changes to autofs and autofs4. - Fix Cedric's comments: retain old prototype of parse_options() and move necessary change to its caller. Signed-off-by: Sukadev Bhattiprolu <sukadev@us.ibm.com> Cc: Cedric Le Goater <clg@fr.ibm.com> Cc: Dave Hansen <haveblue@us.ibm.com> Cc: Serge Hallyn <serue@us.ibm.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: containers@lists.osdl.org Acked-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Ian Kent <raven@themaw.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/autofs/inode.c')
-rw-r--r--fs/autofs/inode.c20
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)
205fail_fput: 215fail_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);
218fail_put_pid:
219 put_pid(sbi->oz_pgrp);
208fail_dput: 220fail_dput:
209 dput(root); 221 dput(root);
210 goto fail_free; 222 goto fail_free;