Commit fa0334f1 authored by Sukadev Bhattiprolu's avatar Sukadev Bhattiprolu Committed by Linus Torvalds

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: default avatarSukadev 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: default avatarEric W. Biederman <ebiederm@xmission.com>
Cc: Ian Kent <raven@themaw.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d78e53c8
...@@ -101,7 +101,7 @@ struct autofs_symlink { ...@@ -101,7 +101,7 @@ struct autofs_symlink {
struct autofs_sb_info { struct autofs_sb_info {
u32 magic; u32 magic;
struct file *pipe; struct file *pipe;
pid_t oz_pgrp; struct pid *oz_pgrp;
int catatonic; int catatonic;
struct super_block *sb; struct super_block *sb;
unsigned long exp_timeout; unsigned long exp_timeout;
...@@ -122,7 +122,7 @@ static inline struct autofs_sb_info *autofs_sbi(struct super_block *sb) ...@@ -122,7 +122,7 @@ static inline struct autofs_sb_info *autofs_sbi(struct super_block *sb)
filesystem without "magic".) */ filesystem without "magic".) */
static inline int autofs_oz_mode(struct autofs_sb_info *sbi) { static inline int autofs_oz_mode(struct autofs_sb_info *sbi) {
return sbi->catatonic || process_group(current) == sbi->oz_pgrp; return sbi->catatonic || task_pgrp(current) == sbi->oz_pgrp;
} }
/* Hash operations */ /* Hash operations */
......
...@@ -37,6 +37,8 @@ void autofs_kill_sb(struct super_block *sb) ...@@ -37,6 +37,8 @@ void autofs_kill_sb(struct super_block *sb)
if (!sbi->catatonic) if (!sbi->catatonic)
autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */ autofs_catatonic_mode(sbi); /* Free wait queues, close pipe */
put_pid(sbi->oz_pgrp);
autofs_hash_nuke(sbi); autofs_hash_nuke(sbi);
for (n = 0; n < AUTOFS_MAX_SYMLINKS; n++) { for (n = 0; n < AUTOFS_MAX_SYMLINKS; n++) {
if (test_bit(n, sbi->symlink_bitmap)) if (test_bit(n, sbi->symlink_bitmap))
...@@ -139,6 +141,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -139,6 +141,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
int pipefd; int pipefd;
struct autofs_sb_info *sbi; struct autofs_sb_info *sbi;
int minproto, maxproto; int minproto, maxproto;
pid_t pgid;
sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
if (!sbi) if (!sbi)
...@@ -150,7 +153,6 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -150,7 +153,6 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
sbi->pipe = NULL; sbi->pipe = NULL;
sbi->catatonic = 1; sbi->catatonic = 1;
sbi->exp_timeout = 0; sbi->exp_timeout = 0;
sbi->oz_pgrp = process_group(current);
autofs_initialize_hash(&sbi->dirhash); autofs_initialize_hash(&sbi->dirhash);
sbi->queues = NULL; sbi->queues = NULL;
memset(sbi->symlink_bitmap, 0, sizeof(long)*AUTOFS_SYMLINK_BITMAP_LEN); 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,7 +173,7 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
/* Can this call block? - WTF cares? s is locked. */ /* Can this call block? - WTF cares? s is locked. */
if (parse_options(data, &pipefd, &root_inode->i_uid, if (parse_options(data, &pipefd, &root_inode->i_uid,
&root_inode->i_gid, &sbi->oz_pgrp, &minproto, &root_inode->i_gid, &pgid, &minproto,
&maxproto)) { &maxproto)) {
printk("autofs: called with bogus options\n"); printk("autofs: called with bogus options\n");
goto fail_dput; goto fail_dput;
...@@ -184,13 +186,21 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -184,13 +186,21 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
goto fail_dput; goto fail_dput;
} }
DPRINTK(("autofs: pipe fd = %d, pgrp = %u\n", pipefd, sbi->oz_pgrp)); DPRINTK(("autofs: pipe fd = %d, pgrp = %u\n", pipefd, pgid));
sbi->oz_pgrp = find_get_pid(pgid);
if (!sbi->oz_pgrp) {
printk("autofs: could not find process group %d\n", pgid);
goto fail_dput;
}
pipe = fget(pipefd); pipe = fget(pipefd);
if (!pipe) { if (!pipe) {
printk("autofs: could not open pipe file descriptor\n"); printk("autofs: could not open pipe file descriptor\n");
goto fail_dput; goto fail_put_pid;
} }
if (!pipe->f_op || !pipe->f_op->write) if (!pipe->f_op || !pipe->f_op->write)
goto fail_fput; goto fail_fput;
sbi->pipe = pipe; sbi->pipe = pipe;
...@@ -205,6 +215,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -205,6 +215,8 @@ int autofs_fill_super(struct super_block *s, void *data, int silent)
fail_fput: fail_fput:
printk("autofs: pipe file descriptor does not contain proper ops\n"); printk("autofs: pipe file descriptor does not contain proper ops\n");
fput(pipe); fput(pipe);
fail_put_pid:
put_pid(sbi->oz_pgrp);
fail_dput: fail_dput:
dput(root); dput(root);
goto fail_free; goto fail_free;
......
...@@ -213,8 +213,10 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr ...@@ -213,8 +213,10 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr
sbi = autofs_sbi(dir->i_sb); sbi = autofs_sbi(dir->i_sb);
oz_mode = autofs_oz_mode(sbi); oz_mode = autofs_oz_mode(sbi);
DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d\n", DPRINTK(("autofs_lookup: pid = %u, pgrp = %u, catatonic = %d, "
current->pid, process_group(current), sbi->catatonic, oz_mode)); "oz_mode = %d\n", pid_nr(task_pid(current)),
process_group(current), sbi->catatonic,
oz_mode));
/* /*
* Mark the dentry incomplete, but add it. This is needed so * Mark the dentry incomplete, but add it. This is needed so
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment