Linux-1.99.6: "double lock on device queue!"

Alan Cox (alan@lxorguk.ukuu.org.uk)
Sun, 19 May 96 22:14 BST


diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/Documentation/networking/README-REDHAT-USERS linux/Documentation/networking/README-REDHAT-USERS
--- linux.vanilla/Documentation/networking/README-REDHAT-USERS Thu Jan 1 01:00:00 1970
+++ linux/Documentation/networking/README-REDHAT-USERS Sat May 18 19:10:36 1996
@@ -0,0 +1,22 @@
+
+Redhat 2.1 and 3.0.3 incorrectly attempt to do the following
+
+ route add -net 127.0.0.1
+
+This breaks now that the kernel correctly spots that 127.0.0.1 has set bits in
+the host part of the address. You need to fix your system set up not bitch
+on the kernel list: For RedHat 3.0.3 your file
+"/etc/sysconfig/network-scripts/ifup-lo" should read
+
+#!/bin/sh
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+
+. $1
+
+if [ "foo$2" = "fooboot" -a ${ONBOOT} = "no" ]
+then
+ exit
+fi
+
+ifconfig ${DEVICE} ${IPADDR}
+route add -net 127.0.0.0
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/drivers/char/wd501p.h linux/drivers/char/wd501p.h
--- linux.vanilla/drivers/char/wd501p.h Fri May 17 22:28:06 1996
+++ linux/drivers/char/wd501p.h Sun May 19 21:18:59 1996
@@ -58,15 +58,13 @@
#define FEATUREMAP2 0
#endif

+#ifndef CONFIG_WDT_501
+#define CONFIG_WDT_500
+#endif

-#ifdef CONFIG_WDT500 /* Minimal board */
+#ifdef CONFIG_WDT_500 /* Minimal board */
#define FEATUREMAP1 (WDC_SR_TGOOD|WDC_SR_FANGOOD)
#define FEATUREMAP2 (WDC_SR_PSUOVER|WDC_SR_PSUUNDR)
-#endif
-
-#ifdef CONFIG_SOFT_WATCHDOG
-#define FEATUREMAP1 0
-#define FEATUREMAP2 0
#endif

#ifndef FEATUREMAP1
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/drivers/net/Config.in linux/drivers/net/Config.in
--- linux.vanilla/drivers/net/Config.in Fri May 17 22:27:53 1996
+++ linux/drivers/net/Config.in Sun May 19 23:09:23 1996
@@ -24,10 +24,10 @@
fi
bool 'Radio network interfaces' CONFIG_NET_RADIO
if [ "$CONFIG_NET_RADIO" != "n" ]; then
+ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+ tristate 'BAYCOM ser12 and par96 kiss emulation driver for AX.25' CONFIG_BAYCOM
+ fi
if [ "$CONFIG_AX25" = "y" ]; then
- if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
- tristate 'BAYCOM ser12 and par96 kiss emulation driver for AX.25' CONFIG_BAYCOM
- fi
bool 'Gracilis PackeTwin support' CONFIG_PT
bool 'Ottawa PI and PI/2 support' CONFIG_PI
fi
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/drivers/net/dummy.c linux/drivers/net/dummy.c
--- linux.vanilla/drivers/net/dummy.c Sun May 19 16:00:37 1996
+++ linux/drivers/net/dummy.c Sun May 19 16:11:10 1996
@@ -88,8 +88,8 @@
dev->get_stats = dummy_get_stats;
#endif

- dev->open = &dummy_open;
- dev->stop = &dummy_close;
+ dev->open = dummy_open;
+ dev->stop = dummy_close;

/* Fill in the fields of the device structure with ethernet-generic values. */
ether_setup(dev);
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/drivers/net/lance.c linux/drivers/net/lance.c
--- linux.vanilla/drivers/net/lance.c Fri May 17 22:27:48 1996
+++ linux/drivers/net/lance.c Sun May 19 16:05:44 1996
@@ -588,11 +588,11 @@
printk(version);

/* The LANCE-specific entries in the device structure. */
- dev->open = &lance_open;
- dev->hard_start_xmit = &lance_start_xmit;
- dev->stop = &lance_close;
- dev->get_stats = &lance_get_stats;
- dev->set_multicast_list = &set_multicast_list;
+ dev->open = lance_open;
+ dev->hard_start_xmit = lance_start_xmit;
+ dev->stop = lance_close;
+ dev->get_stats = lance_get_stats;
+ dev->set_multicast_list = set_multicast_list;

return;
}
--- linux.vanilla/net/core/dev.c Fri May 17 22:27:41 1996
+++ linux/net/core/dev.c Sun May 19 16:03:05 1996
@@ -45,9 +45,6 @@
* Alan Cox : Cleaned up the backlog initialise.
* Craig Metz : SIOCGIFCONF fix if space for under
* 1 device.
- * Thomas Bogendoerfer : Return ENODEV for dev_open, if there
- * is no device open function.
- *
*/

#include <asm/segment.h>
@@ -238,11 +235,12 @@

int dev_open(struct device *dev)
{
- int ret = -ENODEV;
+ int ret = 0;

/*
* Call device private open method
*/
+
if (dev->open)
ret = dev->open(dev);

diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/net/core/net_alias.c linux/net/core/net_alias.c
--- linux.vanilla/net/core/net_alias.c Sun May 19 16:00:43 1996
+++ linux/net/core/net_alias.c Sun May 19 16:04:29 1996
@@ -235,18 +235,6 @@
}


-static int
-net_alias_open(struct device * dev)
-{
- return 0;
-}
-
-static int
-net_alias_close(struct device * dev)
-{
- return 0;
-}
-
/*
* setups a new (alias) device
*/
@@ -276,8 +264,6 @@
dev->my_alias = alias; /* point to alias */
dev->name = alias->name;
dev->type = main_dev->type;
- dev->open = net_alias_open;
- dev->stop = net_alias_close;
dev->hard_header_len = main_dev->hard_header_len;
memcpy(dev->broadcast, main_dev->broadcast, MAX_ADDR_LEN);
memcpy(dev->dev_addr, main_dev->dev_addr, MAX_ADDR_LEN);
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/net/ipv4/af_inet.c linux/net/ipv4/af_inet.c
--- linux.vanilla/net/ipv4/af_inet.c Fri May 17 22:27:42 1996
+++ linux/net/ipv4/af_inet.c Sat May 18 19:12:24 1996
@@ -160,10 +160,10 @@
struct sock *sk;

if (base == 0)
- base = PROT_SOCK+1+(start % 1024);
+ base = PROT_SOCK+1+(start & 1023);
if (base <= PROT_SOCK)
{
- base += PROT_SOCK+(start % 1024);
+ base += PROT_SOCK+(start & 1023);
}

/*
@@ -181,7 +181,7 @@
}
if (j == 0)
{
- start =(i+1+start )%1024;
+ start =(i+1+start )&1023;
return(i+base+1);
}
if (j < size)
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/net/ipv4/icmp.c linux/net/ipv4/icmp.c
--- linux.vanilla/net/ipv4/icmp.c Fri May 17 22:27:42 1996
+++ linux/net/ipv4/icmp.c Fri May 17 22:44:13 1996
@@ -768,9 +768,9 @@
*/

#if defined(CONFIG_IP_FORWARD) && !defined(CONFIG_IP_DUMB_ROUTER)
- printk(KERN_INFO "icmp: ICMP redirect ignored. dest = %s, "
- "orig gw = %s, \"new\" gw = %s, device = %s.\n", in_ntoa(ip),
- in_ntoa(source), in_ntoa(icmph->un.gateway), dev->name);
+ NETDEBUG(printk(KERN_INFO "icmp: ICMP redirect ignored. dest = %X, "
+ "orig gw = %X, \"new\" gw = %X, device = %X.\n", in_ntoa(ip),
+ in_ntoa(source), in_ntoa(icmph->un.gateway), dev->name));
#else
switch(icmph->code & 7)
{
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/net/ipv4/ip_input.c linux/net/ipv4/ip_input.c
--- linux.vanilla/net/ipv4/ip_input.c Fri May 17 22:27:44 1996
+++ linux/net/ipv4/ip_input.c Fri May 17 22:35:42 1996
@@ -208,6 +208,7 @@
int brd=IS_MYADDR;
struct options * opt = NULL;
int is_frag=0;
+ int ret;
__u32 daddr;

#ifdef CONFIG_FIREWALL
@@ -422,19 +423,6 @@
}
#endif

-#ifdef CONFIG_IP_MASQUERADE
- /*
- * Do we need to de-masquerade this fragment?
- */
- if (ip_fw_demasquerade(&skb,dev))
- {
- struct iphdr *iph=skb->h.iph;
- if (ip_forward(skb, dev, is_frag|IPFWD_MASQUERADED, iph->daddr))
- kfree_skb(skb, FREE_WRITE);
- return(0);
- }
-#endif
-
/*
* Reassemble IP fragments.
*/
@@ -447,16 +435,27 @@
return 0;
skb->dev = dev;
iph=skb->h.iph;
+ }
+
#ifdef CONFIG_IP_MASQUERADE
- if (ip_fw_demasquerade(&skb,dev))
+ /*
+ * Do we need to de-masquerade this packet?
+ */
+ if ((ret = ip_fw_demasquerade(&skb,dev)) != 0) {
+ if (ret < 0)
+ {
+ kfree_skb(skb, FREE_WRITE);
+ return(0);
+ }
+ else
{
struct iphdr *iph=skb->h.iph;
if (ip_forward(skb, dev, IPFWD_MASQUERADED, iph->daddr))
kfree_skb(skb, FREE_WRITE);
- return 0;
+ return(0);
}
-#endif
}
+#endif

/*
* Point into the IP datagram, just past the header.
diff --unified --recursive --new-file --exclude-from exclude linux.vanilla/net/ipx/af_ipx.c linux/net/ipx/af_ipx.c
--- linux.vanilla/net/ipx/af_ipx.c Fri May 17 22:27:46 1996
+++ linux/net/ipx/af_ipx.c Sat May 18 19:22:24 1996
@@ -43,6 +43,7 @@
* protocol private area for ipx data.
* Revision 0.34: Module support. <Jim Freeman>
* Revision 0.35: Checksum support. <Neil Turton>, hooked in by <Alan Cox>
+ * Handles WIN95 discovery packets <Volker Lendecke>
*
* Protect the module by a MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT
* pair. Also, now usage count is managed this way
@@ -2068,7 +2069,9 @@
intrfc = ipxitf_find_using_phys(dev, pt->type);
if (intrfc == NULL)
{
- if (ipxcfg_auto_create_interfaces) {
+ if (ipxcfg_auto_create_interfaces &&
+ ntohl(ipx->ipx_dest.net)!=0L)
+ {
intrfc = ipxitf_auto_create(dev, pt->type);
}