Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 71451
b: refs/heads/master
c: 07543f5
h: refs/heads/master
i:
  71449: 29d0ed0
  71447: ea78ba4
v: v3
  • Loading branch information
Pavel Emelyanov authored and Linus Torvalds committed Oct 19, 2007
1 parent 7df0302 commit f5585ec
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 425fb2b4bf5dde24be4a82e9a2c344bb49ac92e4
refs/heads/master: 07543f5c75cee744b791cf7716c69571486fe753
2 changes: 1 addition & 1 deletion trunk/fs/proc/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
return NULL;
}

int proc_fill_super(struct super_block *s, void *data, int silent)
int proc_fill_super(struct super_block *s)
{
struct inode * root_inode;

Expand Down
67 changes: 63 additions & 4 deletions trunk/fs/proc/root.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,90 @@
#include <linux/bitops.h>
#include <linux/smp_lock.h>
#include <linux/mount.h>
#include <linux/pid_namespace.h>

#include "internal.h"

struct proc_dir_entry *proc_bus, *proc_root_fs, *proc_root_driver;

static int proc_test_super(struct super_block *sb, void *data)
{
return sb->s_fs_info == data;
}

static int proc_set_super(struct super_block *sb, void *data)
{
struct pid_namespace *ns;

ns = (struct pid_namespace *)data;
sb->s_fs_info = get_pid_ns(ns);
return set_anon_super(sb, NULL);
}

static int proc_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
int err;
struct super_block *sb;
struct pid_namespace *ns;
struct proc_inode *ei;

if (proc_mnt) {
/* Seed the root directory with a pid so it doesn't need
* to be special in base.c. I would do this earlier but
* the only task alive when /proc is mounted the first time
* is the init_task and it doesn't have any pids.
*/
struct proc_inode *ei;
ei = PROC_I(proc_mnt->mnt_sb->s_root->d_inode);
if (!ei->pid)
ei->pid = find_get_pid(1);
}
return get_sb_single(fs_type, flags, data, proc_fill_super, mnt);

if (flags & MS_KERNMOUNT)
ns = (struct pid_namespace *)data;
else
ns = current->nsproxy->pid_ns;

sb = sget(fs_type, proc_test_super, proc_set_super, ns);
if (IS_ERR(sb))
return PTR_ERR(sb);

if (!sb->s_root) {
sb->s_flags = flags;
err = proc_fill_super(sb);
if (err) {
up_write(&sb->s_umount);
deactivate_super(sb);
return err;
}

ei = PROC_I(sb->s_root->d_inode);
if (!ei->pid) {
rcu_read_lock();
ei->pid = get_pid(find_pid_ns(1, ns));
rcu_read_unlock();
}

sb->s_flags |= MS_ACTIVE;
ns->proc_mnt = mnt;
}

return simple_set_mnt(mnt, sb);
}

static void proc_kill_sb(struct super_block *sb)
{
struct pid_namespace *ns;

ns = (struct pid_namespace *)sb->s_fs_info;
kill_anon_super(sb);
put_pid_ns(ns);
}

static struct file_system_type proc_fs_type = {
.name = "proc",
.get_sb = proc_get_sb,
.kill_sb = kill_anon_super,
.kill_sb = proc_kill_sb,
};

void __init proc_root_init(void)
Expand All @@ -54,12 +112,13 @@ void __init proc_root_init(void)
err = register_filesystem(&proc_fs_type);
if (err)
return;
proc_mnt = kern_mount(&proc_fs_type);
proc_mnt = kern_mount_data(&proc_fs_type, &init_pid_ns);
err = PTR_ERR(proc_mnt);
if (IS_ERR(proc_mnt)) {
unregister_filesystem(&proc_fs_type);
return;
}

proc_misc_init();

proc_net_init();
Expand Down
3 changes: 3 additions & 0 deletions trunk/include/linux/pid_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ struct pid_namespace {
struct kmem_cache *pid_cachep;
int level;
struct pid_namespace *parent;
#ifdef CONFIG_PROC_FS
struct vfsmount *proc_mnt;
#endif
};

extern struct pid_namespace init_pid_ns;
Expand Down
3 changes: 2 additions & 1 deletion trunk/include/linux/proc_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,8 @@ extern struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);

extern struct vfsmount *proc_mnt;
extern int proc_fill_super(struct super_block *,void *,int);
struct pid_namespace;
extern int proc_fill_super(struct super_block *);
extern struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);

/*
Expand Down

0 comments on commit f5585ec

Please sign in to comment.