[Linux-decnet-user] Latest DECnet bug fixes
Brought to you by:
chrissie_c,
ph3-der-loewe
|
From: Steve W. <st...@gw...> - 2000-06-19 14:46:56
|
Hi,
below is my latest bug fix patch for DECnet. I've spotted several other things
which need looking at again when I put this together. This patch includes:
o Patrick's SPARC DECnet endianess fixes
o One or two endianess things that I spotted
o Fixes where various things were referenced after they were free()d
Judging by the code in ipv4/route.c there are a number of features which
I should transfer into the DECnet code too at some point. There will be
another patch shortly with a few more fixes in it.
Dave: Please queue this for inclusion in the next kernel patch
Thanks,
Steve.
------------------------------------------------------------------------------
diff -r -u linux-2.4.0test1-ac21/net/decnet/af_decnet.c linux/net/decnet/af_decnet.c
--- linux-2.4.0test1-ac21/net/decnet/af_decnet.c Mon May 1 11:20:06 2000
+++ linux/net/decnet/af_decnet.c Mon Jun 19 10:20:31 2000
@@ -285,7 +285,7 @@
switch(*fmt) {
case 0:
- sdn->sdn_objnum = dn_htons(type);
+ sdn->sdn_objnum = type;
return 2;
case 1:
namel = 16;
@@ -307,7 +307,7 @@
if (len < 0)
return -1;
- sdn->sdn_objnamel = dn_htons(*data++);
+ sdn->sdn_objnamel = dn_htons((unsigned short)*data++);
len -= dn_ntohs(sdn->sdn_objnamel);
if ((len < 0) || (dn_ntohs(sdn->sdn_objnamel) > namel))
@@ -526,10 +526,6 @@
{
struct dn_scp *scp = &sk->protinfo.dn;
- if (sk->dead)
- return;
-
- sk->dead = 1;
scp->nsp_rxtshift = 0; /* reset back off */
if (sk->socket) {
@@ -661,11 +657,12 @@
struct sock *sk = sock->sk;
if (sk) {
+ sock_orphan(sk);
+ sock_hold(sk);
lock_sock(sk);
- sock->sk = NULL;
- sk->socket = NULL;
dn_destroy_sock(sk);
release_sock(sk);
+ sock_put(sk);
}
return 0;
@@ -749,14 +746,14 @@
if ((scp->accessdata.acc_accl != 0) &&
(scp->accessdata.acc_accl <= 12)) {
- scp->addr.sdn_objnamel = dn_htons(scp->accessdata.acc_accl);
+ scp->addr.sdn_objnamel = dn_htons((unsigned short)scp->accessdata.acc_accl);
memcpy(scp->addr.sdn_objname, scp->accessdata.acc_acc, dn_ntohs(scp->addr.sdn_objnamel));
scp->accessdata.acc_accl = 0;
memset(scp->accessdata.acc_acc, 0, 40);
}
- scp->addr.sdn_add.a_len = dn_htons(2);
+ scp->addr.sdn_add.a_len = dn_htons((unsigned short)2);
*(dn_address *)scp->addr.sdn_add.a_addr = decnet_address;
dn_hash_sock(sk);
diff -r -u linux-2.4.0test1-ac21/net/decnet/dn_neigh.c linux/net/decnet/dn_neigh.c
--- linux-2.4.0test1-ac21/net/decnet/dn_neigh.c Fri Mar 3 11:02:06 2000
+++ linux/net/decnet/dn_neigh.c Sun Jun 18 19:16:03 2000
@@ -441,7 +441,7 @@
struct dn_dev *dn_db;
dn_address src;
- src = dn_eth2dn(msg->id);
+ src = dn_htons(dn_eth2dn(msg->id));
neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1);
@@ -498,7 +498,7 @@
struct dn_neigh *dn;
dn_address src;
- src = dn_eth2dn(msg->id);
+ src = dn_htons(dn_eth2dn(msg->id));
neigh = __neigh_lookup(&dn_neigh_table, &src, skb->dev, 1);
diff -r -u linux-2.4.0test1-ac21/net/decnet/dn_route.c linux/net/decnet/dn_route.c
--- linux-2.4.0test1-ac21/net/decnet/dn_route.c Fri May 12 10:07:22 2000
+++ linux/net/decnet/dn_route.c Mon Jun 19 15:00:09 2000
@@ -131,7 +131,7 @@
return dn_rt_hash_mask & (unsigned)tmp;
}
-static void dn_dst_check_expire(unsigned long dummy)
+static void SMP_TIMER_NAME(dn_dst_check_expire)(unsigned long dummy)
{
int i;
struct dn_route *rt, **rtp;
@@ -142,10 +142,12 @@
rtp = &dn_rt_hash_table[i].chain;
write_lock(&dn_rt_hash_table[i].lock);
- for(;(rt=*rtp); rtp = &rt->u.rt_next) {
+ while((rt=*rtp) != NULL) {
if (atomic_read(&rt->u.dst.__refcnt) ||
- (now - rt->u.dst.lastuse) < expire)
+ (now - rt->u.dst.lastuse) < expire) {
+ rtp = &rt->u.rt_next;
continue;
+ }
*rtp = rt->u.rt_next;
rt->u.rt_next = NULL;
dst_free(&rt->u.dst);
@@ -156,10 +158,11 @@
break;
}
- dn_route_timer.expires = now + decnet_dst_gc_interval * HZ;
- add_timer(&dn_route_timer);
+ mod_timer(&dn_route_timer, now + decnet_dst_gc_interval * HZ);
}
+SMP_TIMER_DEFINE(dn_dst_check_expire, dn_dst_task);
+
static int dn_dst_gc(void)
{
struct dn_route *rt, **rtp;
@@ -229,7 +232,7 @@
write_unlock_bh(&dn_rt_hash_table[hash].lock);
}
-void dn_run_flush(unsigned long dummy)
+void SMP_TIMER_NAME(dn_run_flush)(unsigned long dummy)
{
int i;
struct dn_route *rt, *next;
@@ -250,6 +253,8 @@
write_unlock_bh(&dn_rt_hash_table[i].lock);
}
}
+
+SMP_TIMER_DEFINE(dn_run_flush, dn_flush_task);
static spinlock_t dn_rt_flush_lock = SPIN_LOCK_UNLOCKED;
|