decnet: Use SKB queue and list helpers instead of doing it by-hand.

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2009-05-28 16:43:52 -07:00
parent b6211ae7f2
commit bec571ec76
2 changed files with 7 additions and 20 deletions

View File

@ -1250,14 +1250,8 @@ static int dn_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
if (skb) { if (skb) {
amount = skb->len; amount = skb->len;
} else { } else {
skb = sk->sk_receive_queue.next; skb_queue_walk(&sk->sk_receive_queue, skb)
for (;;) {
if (skb ==
(struct sk_buff *)&sk->sk_receive_queue)
break;
amount += skb->len; amount += skb->len;
skb = skb->next;
}
} }
release_sock(sk); release_sock(sk);
err = put_user(amount, (int __user *)arg); err = put_user(amount, (int __user *)arg);
@ -1644,13 +1638,13 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target) static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int target)
{ {
struct sk_buff *skb = q->next; struct sk_buff *skb;
int len = 0; int len = 0;
if (flags & MSG_OOB) if (flags & MSG_OOB)
return !skb_queue_empty(q) ? 1 : 0; return !skb_queue_empty(q) ? 1 : 0;
while(skb != (struct sk_buff *)q) { skb_queue_walk(q, skb) {
struct dn_skb_cb *cb = DN_SKB_CB(skb); struct dn_skb_cb *cb = DN_SKB_CB(skb);
len += skb->len; len += skb->len;
@ -1666,8 +1660,6 @@ static int dn_data_ready(struct sock *sk, struct sk_buff_head *q, int flags, int
/* minimum data length for read exceeded */ /* minimum data length for read exceeded */
if (len >= target) if (len >= target)
return 1; return 1;
skb = skb->next;
} }
return 0; return 0;
@ -1683,7 +1675,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
size_t target = size > 1 ? 1 : 0; size_t target = size > 1 ? 1 : 0;
size_t copied = 0; size_t copied = 0;
int rv = 0; int rv = 0;
struct sk_buff *skb, *nskb; struct sk_buff *skb, *n;
struct dn_skb_cb *cb = NULL; struct dn_skb_cb *cb = NULL;
unsigned char eor = 0; unsigned char eor = 0;
long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); long timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
@ -1758,7 +1750,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
finish_wait(sk->sk_sleep, &wait); finish_wait(sk->sk_sleep, &wait);
} }
for(skb = queue->next; skb != (struct sk_buff *)queue; skb = nskb) { skb_queue_walk_safe(queue, skb, n) {
unsigned int chunk = skb->len; unsigned int chunk = skb->len;
cb = DN_SKB_CB(skb); cb = DN_SKB_CB(skb);
@ -1775,7 +1767,6 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
skb_pull(skb, chunk); skb_pull(skb, chunk);
eor = cb->nsp_flags & 0x40; eor = cb->nsp_flags & 0x40;
nskb = skb->next;
if (skb->len == 0) { if (skb->len == 0) {
skb_unlink(skb, queue); skb_unlink(skb, queue);

View File

@ -382,7 +382,7 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff
{ {
struct dn_skb_cb *cb = DN_SKB_CB(skb); struct dn_skb_cb *cb = DN_SKB_CB(skb);
struct dn_scp *scp = DN_SK(sk); struct dn_scp *scp = DN_SK(sk);
struct sk_buff *skb2, *list, *ack = NULL; struct sk_buff *skb2, *n, *ack = NULL;
int wakeup = 0; int wakeup = 0;
int try_retrans = 0; int try_retrans = 0;
unsigned long reftime = cb->stamp; unsigned long reftime = cb->stamp;
@ -390,9 +390,7 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff
unsigned short xmit_count; unsigned short xmit_count;
unsigned short segnum; unsigned short segnum;
skb2 = q->next; skb_queue_walk_safe(q, skb2, n) {
list = (struct sk_buff *)q;
while(list != skb2) {
struct dn_skb_cb *cb2 = DN_SKB_CB(skb2); struct dn_skb_cb *cb2 = DN_SKB_CB(skb2);
if (dn_before_or_equal(cb2->segnum, acknum)) if (dn_before_or_equal(cb2->segnum, acknum))
@ -400,8 +398,6 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff
/* printk(KERN_DEBUG "ack: %s %04x %04x\n", ack ? "ACK" : "SKIP", (int)cb2->segnum, (int)acknum); */ /* printk(KERN_DEBUG "ack: %s %04x %04x\n", ack ? "ACK" : "SKIP", (int)cb2->segnum, (int)acknum); */
skb2 = skb2->next;
if (ack == NULL) if (ack == NULL)
continue; continue;