--- net/atm/atmarp.c.broken Sat Dec 21 08:00:13 1996 +++ net/atm/atmarp.c Sat Dec 21 11:31:38 1996 @@ -141,7 +141,7 @@ } -static inline void time_out_entry(struct atmarp_entry **entry) +static inline int time_out_entry(struct atmarp_entry **entry) { struct atmarp_entry *next; @@ -149,18 +149,19 @@ if ((*entry)->vcc) { (*entry)->vcc->flags |= ATM_VF_RELEASED; (*entry)->vcc->flags &= ~ATM_VF_READY; + wake_up(&(*entry)->vcc->sleep); + return 0; } - else { - if ((*entry)->queued) { - dev_kfree_skb((*entry)->queued,FREE_WRITE); - DPRINTK("discarding queued skb\n"); - } - else printk(KERN_CRIT "atmarp: weird - incomplete entry, but " - "nothing queued\n"); - next = (*entry)->next; - kfree(*entry); - *entry = next; + if ((*entry)->queued) { + dev_kfree_skb((*entry)->queued,FREE_WRITE); + DPRINTK("discarding queued skb\n"); } + else printk(KERN_CRIT "atmarp: weird - incomplete entry, but " + "nothing queued\n"); + next = (*entry)->next; + kfree(*entry); + *entry = next; + return 1; } @@ -178,8 +179,7 @@ expire = (*entry)->last_use+(*entry)-> idle_timeout; if (expire < jiffies) { - time_out_entry(entry); - continue; + if (time_out_entry(entry)) continue; } else if (expire < idle_timer.expires) idle_timer.expires = expire; .