Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1c340b2fd73880136c438e6e7978288fbec8273f
Commit:     1c340b2fd73880136c438e6e7978288fbec8273f
Parent:     6e04d01dfa6fe81d6bcae1e85de695285086cee2
Author:     Denis V. Lunev <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 10 03:27:17 2008 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 15:01:30 2008 -0800

    [NETNS]: Show routing information from correct namespace (fib_trie.c)
    
    This is the second part (for the CONFIG_IP_FIB_TRIE case) of the patch
    #4, where we have created proc files in namespaces.
    
    Now we can dump correct info in them.
    
    Acked-by: Benjamin Thery <[EMAIL PROTECTED]>
    Acked-by: Daniel Lezcano <[EMAIL PROTECTED]>
    Signed-off-by: Denis V. Lunev <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv4/fib_trie.c |   44 ++++++++++++++++++++++++++++++++------------
 1 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index fc0624e..aa9deb7 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -1995,6 +1995,7 @@ struct fib_table *fib_hash_init(u32 id)
 #ifdef CONFIG_PROC_FS
 /* Depth first Trie walk iterator */
 struct fib_trie_iter {
+       struct seq_net_private p;
        struct trie *trie_local, *trie_main;
        struct tnode *tnode;
        struct trie *trie;
@@ -2162,17 +2163,18 @@ static void trie_show_stats(struct seq_file *seq, 
struct trie_stat *stat)
 
 static int fib_triestat_seq_show(struct seq_file *seq, void *v)
 {
+       struct net *net = (struct net *)seq->private;
        struct trie *trie_local, *trie_main;
        struct trie_stat *stat;
        struct fib_table *tb;
 
        trie_local = NULL;
-       tb = fib_get_table(&init_net, RT_TABLE_LOCAL);
+       tb = fib_get_table(net, RT_TABLE_LOCAL);
        if (tb)
                trie_local = (struct trie *) tb->tb_data;
 
        trie_main = NULL;
-       tb = fib_get_table(&init_net, RT_TABLE_MAIN);
+       tb = fib_get_table(net, RT_TABLE_MAIN);
        if (tb)
                trie_main = (struct trie *) tb->tb_data;
 
@@ -2202,7 +2204,25 @@ static int fib_triestat_seq_show(struct seq_file *seq, 
void *v)
 
 static int fib_triestat_seq_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, fib_triestat_seq_show, NULL);
+       int err;
+       struct net *net;
+
+       net = get_proc_net(inode);
+       if (net == NULL)
+               return -ENXIO;
+       err = single_open(file, fib_triestat_seq_show, net);
+       if (err < 0) {
+               put_net(net);
+               return err;
+       }
+       return 0;
+}
+
+static int fib_triestat_seq_release(struct inode *ino, struct file *f)
+{
+       struct seq_file *seq = f->private_data;
+       put_net(seq->private);
+       return single_release(ino, f);
 }
 
 static const struct file_operations fib_triestat_fops = {
@@ -2210,7 +2230,7 @@ static const struct file_operations fib_triestat_fops = {
        .open   = fib_triestat_seq_open,
        .read   = seq_read,
        .llseek = seq_lseek,
-       .release = single_release,
+       .release = fib_triestat_seq_release,
 };
 
 static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
@@ -2239,12 +2259,12 @@ static void *fib_trie_seq_start(struct seq_file *seq, 
loff_t *pos)
        struct fib_table *tb;
 
        if (!iter->trie_local) {
-               tb = fib_get_table(&init_net, RT_TABLE_LOCAL);
+               tb = fib_get_table(iter->p.net, RT_TABLE_LOCAL);
                if (tb)
                        iter->trie_local = (struct trie *) tb->tb_data;
        }
        if (!iter->trie_main) {
-               tb = fib_get_table(&init_net, RT_TABLE_MAIN);
+               tb = fib_get_table(iter->p.net, RT_TABLE_MAIN);
                if (tb)
                        iter->trie_main = (struct trie *) tb->tb_data;
        }
@@ -2388,8 +2408,8 @@ static const struct seq_operations fib_trie_seq_ops = {
 
 static int fib_trie_seq_open(struct inode *inode, struct file *file)
 {
-       return seq_open_private(file, &fib_trie_seq_ops,
-                       sizeof(struct fib_trie_iter));
+       return seq_open_net(inode, file, &fib_trie_seq_ops,
+                           sizeof(struct fib_trie_iter));
 }
 
 static const struct file_operations fib_trie_fops = {
@@ -2397,7 +2417,7 @@ static const struct file_operations fib_trie_fops = {
        .open   = fib_trie_seq_open,
        .read   = seq_read,
        .llseek = seq_lseek,
-       .release = seq_release_private,
+       .release = seq_release_net,
 };
 
 static unsigned fib_flag_trans(int type, __be32 mask, const struct fib_info 
*fi)
@@ -2492,8 +2512,8 @@ static const struct seq_operations fib_route_seq_ops = {
 
 static int fib_route_seq_open(struct inode *inode, struct file *file)
 {
-       return seq_open_private(file, &fib_route_seq_ops,
-                       sizeof(struct fib_trie_iter));
+       return seq_open_net(inode, file, &fib_route_seq_ops,
+                           sizeof(struct fib_trie_iter));
 }
 
 static const struct file_operations fib_route_fops = {
@@ -2501,7 +2521,7 @@ static const struct file_operations fib_route_fops = {
        .open   = fib_route_seq_open,
        .read   = seq_read,
        .llseek = seq_lseek,
-       .release = seq_release_private,
+       .release = seq_release_net,
 };
 
 int __net_init fib_proc_init(struct net *net)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to