diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2007-12-01 08:33:17 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2007-12-01 08:33:17 -0500 |
commit | 2b1e300a9dfc3196ccddf6f1d74b91b7af55e416 (patch) | |
tree | 3181bf4f2c27d185c78b26642f35ed00cb280943 /include/linux/proc_fs.h | |
parent | e03ba84adb62fbc6049325a5bc00ef6932fa5e39 (diff) |
[NETNS]: Fix /proc/net breakage
Well I clearly goofed when I added the initial network namespace support
for /proc/net. Currently things work but there are odd details visible to
user space, even when we have a single network namespace.
Since we do not cache proc_dir_entry dentries at the moment we can just
modify ->lookup to return a different directory inode depending on the
network namespace of the process looking at /proc/net, replacing the
current technique of using a magic and fragile follow_link method.
To accomplish that this patch:
- introduces a shadow_proc method to allow different dentries to
be returned from proc_lookup.
- Removes the old /proc/net follow_link magic
- Fixes a weakness in our not caching of proc generic dentries.
As shadow_proc uses a task struct to decided which dentry to return we can
go back later and fix the proc generic caching without modifying any code
that uses the shadow_proc method.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'include/linux/proc_fs.h')
-rw-r--r-- | include/linux/proc_fs.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 1273c6ec535c..523528d237b0 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
@@ -48,6 +48,8 @@ typedef int (read_proc_t)(char *page, char **start, off_t off, | |||
48 | typedef int (write_proc_t)(struct file *file, const char __user *buffer, | 48 | typedef int (write_proc_t)(struct file *file, const char __user *buffer, |
49 | unsigned long count, void *data); | 49 | unsigned long count, void *data); |
50 | typedef int (get_info_t)(char *, char **, off_t, int); | 50 | typedef int (get_info_t)(char *, char **, off_t, int); |
51 | typedef struct proc_dir_entry *(shadow_proc_t)(struct task_struct *task, | ||
52 | struct proc_dir_entry *pde); | ||
51 | 53 | ||
52 | struct proc_dir_entry { | 54 | struct proc_dir_entry { |
53 | unsigned int low_ino; | 55 | unsigned int low_ino; |
@@ -79,6 +81,7 @@ struct proc_dir_entry { | |||
79 | int pde_users; /* number of callers into module in progress */ | 81 | int pde_users; /* number of callers into module in progress */ |
80 | spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ | 82 | spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ |
81 | struct completion *pde_unload_completion; | 83 | struct completion *pde_unload_completion; |
84 | shadow_proc_t *shadow_proc; | ||
82 | }; | 85 | }; |
83 | 86 | ||
84 | struct kcore_list { | 87 | struct kcore_list { |