Commit 885ee74d authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

af_unix: Move CINQ/COUTQ code to helpers

Currently tcp diag reports rqlen and wqlen values similar to how
the CINQ/COUTQ iotcls do. To make unix diag report these values
in the same way move the respective code into helpers.
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 257b5298
...@@ -66,6 +66,9 @@ struct unix_sock { ...@@ -66,6 +66,9 @@ struct unix_sock {
#define peer_wait peer_wq.wait #define peer_wait peer_wq.wait
long unix_inq_len(struct sock *sk);
long unix_outq_len(struct sock *sk);
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
extern int unix_sysctl_register(struct net *net); extern int unix_sysctl_register(struct net *net);
extern void unix_sysctl_unregister(struct net *net); extern void unix_sysctl_unregister(struct net *net);
......
...@@ -2065,6 +2065,36 @@ static int unix_shutdown(struct socket *sock, int mode) ...@@ -2065,6 +2065,36 @@ static int unix_shutdown(struct socket *sock, int mode)
return 0; return 0;
} }
long unix_inq_len(struct sock *sk)
{
struct sk_buff *skb;
long amount = 0;
if (sk->sk_state == TCP_LISTEN)
return -EINVAL;
spin_lock(&sk->sk_receive_queue.lock);
if (sk->sk_type == SOCK_STREAM ||
sk->sk_type == SOCK_SEQPACKET) {
skb_queue_walk(&sk->sk_receive_queue, skb)
amount += skb->len;
} else {
skb = skb_peek(&sk->sk_receive_queue);
if (skb)
amount = skb->len;
}
spin_unlock(&sk->sk_receive_queue.lock);
return amount;
}
EXPORT_SYMBOL_GPL(unix_inq_len);
long unix_outq_len(struct sock *sk)
{
return sk_wmem_alloc_get(sk);
}
EXPORT_SYMBOL_GPL(unix_outq_len);
static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -2073,33 +2103,16 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ...@@ -2073,33 +2103,16 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
switch (cmd) { switch (cmd) {
case SIOCOUTQ: case SIOCOUTQ:
amount = sk_wmem_alloc_get(sk); amount = unix_outq_len(sk);
err = put_user(amount, (int __user *)arg); err = put_user(amount, (int __user *)arg);
break; break;
case SIOCINQ: case SIOCINQ:
{ amount = unix_inq_len(sk);
struct sk_buff *skb; if (amount < 0)
err = amount;
if (sk->sk_state == TCP_LISTEN) { else
err = -EINVAL;
break;
}
spin_lock(&sk->sk_receive_queue.lock);
if (sk->sk_type == SOCK_STREAM ||
sk->sk_type == SOCK_SEQPACKET) {
skb_queue_walk(&sk->sk_receive_queue, skb)
amount += skb->len;
} else {
skb = skb_peek(&sk->sk_receive_queue);
if (skb)
amount = skb->len;
}
spin_unlock(&sk->sk_receive_queue.lock);
err = put_user(amount, (int __user *)arg); err = put_user(amount, (int __user *)arg);
break; break;
}
default: default:
err = -ENOIOCTLCMD; err = -ENOIOCTLCMD;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment