diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 45 | 
1 files changed, 10 insertions, 35 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 1b4d3355624a..abb3c9490c55 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -1003,11 +1003,12 @@ struct proto raw_prot = {  static struct sock *raw_get_first(struct seq_file *seq)  {  	struct sock *sk; +	struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));  	struct raw_iter_state *state = raw_seq_private(seq);  	for (state->bucket = 0; state->bucket < RAW_HTABLE_SIZE;  			++state->bucket) { -		sk_for_each(sk, &state->h->ht[state->bucket]) +		sk_for_each(sk, &h->ht[state->bucket])  			if (sock_net(sk) == seq_file_net(seq))  				goto found;  	} @@ -1018,6 +1019,7 @@ found:  static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk)  { +	struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file));  	struct raw_iter_state *state = raw_seq_private(seq);  	do { @@ -1027,7 +1029,7 @@ try_again:  	} while (sk && sock_net(sk) != seq_file_net(seq));  	if (!sk && ++state->bucket < RAW_HTABLE_SIZE) { -		sk = sk_head(&state->h->ht[state->bucket]); +		sk = sk_head(&h->ht[state->bucket]);  		goto try_again;  	}  	return sk; @@ -1045,9 +1047,9 @@ static struct sock *raw_get_idx(struct seq_file *seq, loff_t pos)  void *raw_seq_start(struct seq_file *seq, loff_t *pos)  { -	struct raw_iter_state *state = raw_seq_private(seq); +	struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file)); -	read_lock(&state->h->lock); +	read_lock(&h->lock);  	return *pos ? raw_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;  }  EXPORT_SYMBOL_GPL(raw_seq_start); @@ -1067,9 +1069,9 @@ EXPORT_SYMBOL_GPL(raw_seq_next);  void raw_seq_stop(struct seq_file *seq, void *v)  { -	struct raw_iter_state *state = raw_seq_private(seq); +	struct raw_hashinfo *h = PDE_DATA(file_inode(seq->file)); -	read_unlock(&state->h->lock); +	read_unlock(&h->lock);  }  EXPORT_SYMBOL_GPL(raw_seq_stop); @@ -1110,37 +1112,10 @@ static const struct seq_operations raw_seq_ops = {  	.show  = raw_seq_show,  }; -int raw_seq_open(struct inode *ino, struct file *file, -		 struct raw_hashinfo *h, const struct seq_operations *ops) -{ -	int err; -	struct raw_iter_state *i; - -	err = seq_open_net(ino, file, ops, sizeof(struct raw_iter_state)); -	if (err < 0) -		return err; - -	i = raw_seq_private((struct seq_file *)file->private_data); -	i->h = h; -	return 0; -} -EXPORT_SYMBOL_GPL(raw_seq_open); - -static int raw_v4_seq_open(struct inode *inode, struct file *file) -{ -	return raw_seq_open(inode, file, &raw_v4_hashinfo, &raw_seq_ops); -} - -static const struct file_operations raw_seq_fops = { -	.open	 = raw_v4_seq_open, -	.read	 = seq_read, -	.llseek	 = seq_lseek, -	.release = seq_release_net, -}; -  static __net_init int raw_init_net(struct net *net)  { -	if (!proc_create("raw", 0444, net->proc_net, &raw_seq_fops)) +	if (!proc_create_net_data("raw", 0444, net->proc_net, &raw_seq_ops, +			sizeof(struct raw_iter_state), &raw_v4_hashinfo))  		return -ENOMEM;  	return 0;  | 
