Commit fa0334f19f0e1a1e570fc2a160dfe53536599ade

Authored by Sukadev Bhattiprolu
Committed by Linus Torvalds
1 parent d78e53c89a

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>

Showing 3 changed files with 22 additions and 8 deletions Side-by-side Diff

fs/autofs/autofs_i.h
... ... @@ -101,7 +101,7 @@
101 101 struct autofs_sb_info {
102 102 u32 magic;
103 103 struct file *pipe;
104   - pid_t oz_pgrp;
  104 + struct pid *oz_pgrp;
105 105 int catatonic;
106 106 struct super_block *sb;
107 107 unsigned long exp_timeout;
... ... @@ -122,7 +122,7 @@
122 122 filesystem without "magic".) */
123 123  
124 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 128 /* Hash operations */
... ... @@ -37,6 +37,8 @@
37 37 if (!sbi->catatonic)
38 38 autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */
39 39  
  40 + put_pid(sbi->oz_pgrp);
  41 +
40 42 autofs_hash_nuke(sbi);
41 43 for (n = 0; n < AUTOFS_MAX_SYMLINKS; n++) {
42 44 if (test_bit(n, sbi->symlink_bitmap))
... ... @@ -139,6 +141,7 @@
139 141 int pipefd;
140 142 struct autofs_sb_info *sbi;
141 143 int minproto, maxproto;
  144 + pid_t pgid;
142 145  
143 146 sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
144 147 if (!sbi)
... ... @@ -150,7 +153,6 @@
150 153 sbi->pipe = NULL;
151 154 sbi->catatonic = 1;
152 155 sbi->exp_timeout = 0;
153   - sbi->oz_pgrp = process_group(current);
154 156 autofs_initialize_hash(&sbi->dirhash);
155 157 sbi->queues = NULL;
156 158 memset(sbi->symlink_bitmap, 0, sizeof(long)*AUTOFS_SYMLINK_BITMAP_LEN);
... ... @@ -171,7 +173,7 @@
171 173  
172 174 /* Can this call block? - WTF cares? s is locked. */
173 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 177 &maxproto)) {
176 178 printk("autofs: called with bogus options\n");
177 179 goto fail_dput;
178 180  
179 181  
... ... @@ -184,13 +186,21 @@
184 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 197 pipe = fget(pipefd);
189 198  
190 199 if (!pipe) {
191 200 printk("autofs: could not open pipe file descriptor\n");
192   - goto fail_dput;
  201 + goto fail_put_pid;
193 202 }
  203 +
194 204 if (!pipe->f_op || !pipe->f_op->write)
195 205 goto fail_fput;
196 206 sbi->pipe = pipe;
... ... @@ -205,6 +215,8 @@
205 215 fail_fput:
206 216 printk("autofs: pipe file descriptor does not contain proper ops\n");
207 217 fput(pipe);
  218 +fail_put_pid:
  219 + put_pid(sbi->oz_pgrp);
208 220 fail_dput:
209 221 dput(root);
210 222 goto fail_free;
... ... @@ -213,8 +213,10 @@
213 213 sbi = autofs_sbi(dir->i_sb);
214 214  
215 215 oz_mode = autofs_oz_mode(sbi);
216   - DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d\n",
217   - current->pid, process_group(current), sbi->catatonic, oz_mode));
  216 + DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, "
  217 + "oz_mode = %d\n", pid_nr(task_pid(current)),
  218 + process_group(current), sbi->catatonic,
  219 + oz_mode));
218 220  
219 221 /*
220 222 * Mark the dentry incomplete, but add it. This is needed so