diff options
| author | Pavel Emelyanov <xemul@parallels.com> | 2011-12-09 06:22:26 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-12-09 14:14:08 -0500 | 
| commit | efb3cb428dcde2356802b3f93e152efa7abc5a62 (patch) | |
| tree | db735c5f128fb22785944c71232521e4726cffab /net | |
| parent | 476f7dbff30a7c122899d753c9119d9233928380 (diff) | |
| download | olio-linux-3.10-efb3cb428dcde2356802b3f93e152efa7abc5a62.tar.xz olio-linux-3.10-efb3cb428dcde2356802b3f93e152efa7abc5a62.zip  | |
inet_diag: Split inet_diag_get_exact into parts
Similar to previous patch: the 1st part locks the inet handler
and will get generalized and the 2nd one dumps icsk-s and will
be used by TCP and DCCP handlers.
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
| -rw-r--r-- | net/ipv4/inet_diag.c | 28 | 
1 files changed, 16 insertions, 12 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 64abe476e2a..f50df2ed9af 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c @@ -709,19 +709,11 @@ out:  	return err;  } -static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, -		struct inet_diag_req *r, struct nlattr *bc) +static void inet_diag_dump_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *skb, +		struct netlink_callback *cb, struct inet_diag_req *r, struct nlattr *bc)  {  	int i, num;  	int s_i, s_num; -	const struct inet_diag_handler *handler; -	struct inet_hashinfo *hashinfo; - -	handler = inet_diag_lock_handler(r->sdiag_protocol); -	if (IS_ERR(handler)) -		goto unlock; - -	hashinfo = handler->idiag_hashinfo;  	s_i = cb->args[1];  	s_num = num = cb->args[2]; @@ -790,7 +782,7 @@ skip_listen_ht:  	}  	if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV))) -		goto unlock; +		goto out;  	for (i = s_i; i <= hashinfo->ehash_mask; i++) {  		struct inet_ehash_bucket *head = &hashinfo->ehash[i]; @@ -863,8 +855,20 @@ next_dying:  done:  	cb->args[1] = i;  	cb->args[2] = num; -unlock: +out: +	; +} + +static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, +		struct inet_diag_req *r, struct nlattr *bc) +{ +	const struct inet_diag_handler *handler; + +	handler = inet_diag_lock_handler(r->sdiag_protocol); +	if (!IS_ERR(handler)) +		inet_diag_dump_icsk(handler->idiag_hashinfo, skb, cb, r, bc);  	inet_diag_unlock_handler(handler); +  	return skb->len;  }  |