Commit fa0334f19f0e1a1e570fc2a160dfe53536599ade
Committed by
Linus Torvalds
1 parent
d78e53c89a
Exists in
master
and in
7 other branches
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 */ |
fs/autofs/inode.c
... | ... | @@ -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; |
fs/autofs/root.c
... | ... | @@ -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 |