diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/x_tables.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 89e322d3b361..12ed64c0bc9a 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c | |||
@@ -720,27 +720,33 @@ void *xt_unregister_table(struct xt_table *table) | |||
720 | EXPORT_SYMBOL_GPL(xt_unregister_table); | 720 | EXPORT_SYMBOL_GPL(xt_unregister_table); |
721 | 721 | ||
722 | #ifdef CONFIG_PROC_FS | 722 | #ifdef CONFIG_PROC_FS |
723 | struct xt_names_priv { | ||
724 | struct seq_net_private p; | ||
725 | int af; | ||
726 | }; | ||
723 | static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos) | 727 | static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos) |
724 | { | 728 | { |
725 | struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private; | 729 | struct xt_names_priv *priv = seq->private; |
726 | u_int16_t af = (unsigned long)pde->data; | 730 | struct net *net = priv->p.net; |
731 | int af = priv->af; | ||
727 | 732 | ||
728 | mutex_lock(&xt[af].mutex); | 733 | mutex_lock(&xt[af].mutex); |
729 | return seq_list_start(&init_net.xt.tables[af], *pos); | 734 | return seq_list_start(&net->xt.tables[af], *pos); |
730 | } | 735 | } |
731 | 736 | ||
732 | static void *xt_table_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 737 | static void *xt_table_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
733 | { | 738 | { |
734 | struct proc_dir_entry *pde = (struct proc_dir_entry *)seq->private; | 739 | struct xt_names_priv *priv = seq->private; |
735 | u_int16_t af = (unsigned long)pde->data; | 740 | struct net *net = priv->p.net; |
741 | int af = priv->af; | ||
736 | 742 | ||
737 | return seq_list_next(v, &init_net.xt.tables[af], pos); | 743 | return seq_list_next(v, &net->xt.tables[af], pos); |
738 | } | 744 | } |
739 | 745 | ||
740 | static void xt_table_seq_stop(struct seq_file *seq, void *v) | 746 | static void xt_table_seq_stop(struct seq_file *seq, void *v) |
741 | { | 747 | { |
742 | struct proc_dir_entry *pde = seq->private; | 748 | struct xt_names_priv *priv = seq->private; |
743 | u_int16_t af = (unsigned long)pde->data; | 749 | int af = priv->af; |
744 | 750 | ||
745 | mutex_unlock(&xt[af].mutex); | 751 | mutex_unlock(&xt[af].mutex); |
746 | } | 752 | } |
@@ -765,12 +771,13 @@ static const struct seq_operations xt_table_seq_ops = { | |||
765 | static int xt_table_open(struct inode *inode, struct file *file) | 771 | static int xt_table_open(struct inode *inode, struct file *file) |
766 | { | 772 | { |
767 | int ret; | 773 | int ret; |
774 | struct xt_names_priv *priv; | ||
768 | 775 | ||
769 | ret = seq_open(file, &xt_table_seq_ops); | 776 | ret = seq_open_net(inode, file, &xt_table_seq_ops, |
777 | sizeof(struct xt_names_priv)); | ||
770 | if (!ret) { | 778 | if (!ret) { |
771 | struct seq_file *seq = file->private_data; | 779 | priv = ((struct seq_file *)file->private_data)->private; |
772 | 780 | priv->af = (unsigned long)PDE(inode)->data; | |
773 | seq->private = PDE(inode); | ||
774 | } | 781 | } |
775 | return ret; | 782 | return ret; |
776 | } | 783 | } |