]> git.neil.brown.name Git - history.git/commitdiff
Import 2.2.2 2.2.2
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:15 +0000 (15:18 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:15 +0000 (15:18 -0500)
26 files changed:
Documentation/Configure.help
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/proto.h
arch/alpha/kernel/smc37c669.c
arch/alpha/kernel/sys_dp264.c
arch/alpha/kernel/sys_miata.c
arch/alpha/kernel/sys_sx164.c
drivers/misc/parport_ieee1284.c
drivers/net/Space.c
drivers/net/hostess_sv11.c
drivers/net/ppp.c
drivers/net/syncppp.c
drivers/scsi/qlogicfas.c
fs/autofs/root.c
fs/autofs/waitq.c
fs/inode.c
fs/open.c
include/linux/videodev.h
kernel/sched.c
net/ipv4/af_inet.c
net/ipv4/icmp.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c
net/ipv4/timer.c
net/ipx/af_ipx.c

index 587315e6fd71840bed95556db99fe6504be5cfb5..1c625be2c8dc31dd5295a9a86bf6dcee9670c81d 100644 (file)
@@ -85,11 +85,11 @@ CONFIG_SMP
   a system with only one CPU, like most personal computers, say N. If
   you have a system with more than one CPU, say Y.
 
-  If you say Y here, the kernel will run on single and multiprocessor
+  If you say N here, the kernel will run on single and multiprocessor
   machines, but will use only one CPU of a multiprocessor machine. If
   you say Y here, the kernel will run on many, but not all,
   singleprocessor machines. On a singleprocessor machine, the kernel
-  will run faster if you say Y here.
+  will run faster if you say N here.
 
   Note that if you say Y here and choose architecture "586" or
   "Pentium" under "Processor family", the kernel will not work on 486
index 67c08778d2faa4177082fa6070d8776a7759f02c..8a8f153da8a0ca2a01f12d732759b134dddd1f28 100644 (file)
@@ -317,8 +317,8 @@ static int do_osf_statfs(struct dentry * dentry, struct osf_statfs *buffer, unsi
        struct super_block * sb = inode->i_sb;
        int error;
 
-       error = -ENOSYS;
-       if (sb->s_op->statfs) {
+       error = -ENODEV;
+       if (sb && sb->s_op && sb->s_op->statfs) {
                set_fs(KERNEL_DS);
                error = sb->s_op->statfs(sb, &linux_stat, sizeof(linux_stat));
                set_fs(USER_DS);
index 4fa0120179ed4eea90080e84c6d3801994b63892..8a0efe52d6af403152cab79fb9e105cb153408bb 100644 (file)
@@ -165,7 +165,7 @@ extern unsigned long est_cycle_freq;
 extern void SMC93x_Init(void);
 
 /* smc37c669.c */
-extern void SMC669_Init(void);
+extern void SMC669_Init(int);
 
 /* es1888.c */
 extern void es1888_init(void);
index 1202b7b90b0a3f7cae5b337c90581d01b241eab3..caab7accc292aec42e1d9220e4a3e607d33c264b 100644 (file)
@@ -862,7 +862,7 @@ typedef struct _SMC37c669_DRQ_TRANSLATION_ENTRY {
 */
 
 SMC37c669_CONFIG_REGS *SMC37c669_detect( 
-    void 
+    int
 );
 
 unsigned int SMC37c669_enable_device( 
@@ -1014,6 +1014,29 @@ __initdata =
        { -1, -1 } /* End of table */
     };
 
+/*
+** The following definition is for the MONET (XP1000) IRQ 
+** translation table.
+*/
+static SMC37c669_IRQ_TRANSLATION_ENTRY SMC37c669_monet_irq_table[]
+__initdata = 
+    { 
+       { SMC37c669_DEVICE_IRQ_A, -1 }, 
+       { SMC37c669_DEVICE_IRQ_B, -1 }, 
+       { SMC37c669_DEVICE_IRQ_C, 6 }, 
+       { SMC37c669_DEVICE_IRQ_D, 7 }, 
+       { SMC37c669_DEVICE_IRQ_E, 4 }, 
+       { SMC37c669_DEVICE_IRQ_F, 3 }, 
+       { SMC37c669_DEVICE_IRQ_H, -1 }, 
+       { -1, -1 } /* End of table */
+    };
+
+static SMC37c669_IRQ_TRANSLATION_ENTRY *SMC37c669_irq_tables[] __initdata =
+    {
+       SMC37c669_default_irq_table,
+       SMC37c669_monet_irq_table
+    }; 
+
 /*
 ** DRQ Translation Table
 **
@@ -1163,7 +1186,7 @@ struct DDB smc_ddb = {
 **
 **--
 */
-SMC37c669_CONFIG_REGS * __init SMC37c669_detect( void )
+SMC37c669_CONFIG_REGS * __init SMC37c669_detect( int index )
 {
     int i;
     SMC37c669_DEVICE_ID_REGISTER id;
@@ -1196,7 +1219,7 @@ SMC37c669_CONFIG_REGS * __init SMC37c669_detect( void )
 /*
 ** Initialize the IRQ and DRQ translation tables.
 */
-           SMC37c669_irq_table = SMC37c669_default_irq_table;
+           SMC37c669_irq_table = SMC37c669_irq_tables[ index ];
            SMC37c669_drq_table = SMC37c669_default_drq_table;
 /*
 ** erfix
@@ -2516,13 +2539,13 @@ SMC37c669_dump_registers(void)
  *      None
  *
  */
-void __init SMC669_Init ( void )
+void __init SMC669_Init ( int index )
 {
     SMC37c669_CONFIG_REGS *SMC_base;
     unsigned long flags;
 
     __save_and_cli(flags);
-    if ( ( SMC_base = SMC37c669_detect( ) ) != NULL ) {
+    if ( ( SMC_base = SMC37c669_detect( index ) ) != NULL ) {
 #if SMC_DEBUG
        SMC37c669_config_mode( TRUE );
        SMC37c669_dump_registers( );
index 656e5d8687459dcfadc26fa32f58fb231542e749..c464c37ec68cc85b1019d986b22ec5a2c66071bc 100644 (file)
@@ -316,7 +316,7 @@ dp264_pci_fixup(void)
 {
        layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
        common_pci_fixup(dp264_map_irq, common_swizzle);
-       SMC669_Init();
+       SMC669_Init(0);
 }
 
 static void __init
@@ -325,7 +325,7 @@ monet_pci_fixup(void)
        layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
        common_pci_fixup(monet_map_irq, monet_swizzle);
        /* es1888_init(); */ /* later? */
-       SMC669_Init();
+       SMC669_Init(1);
 }
 
 static void __init
@@ -333,7 +333,7 @@ webbrick_pci_fixup(void)
 {
        layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
        common_pci_fixup(webbrick_map_irq, common_swizzle);
-       SMC669_Init();
+       SMC669_Init(0);
 }
 
 
index c6f90861827798edfcb3ec1233bc09f709495e7c..f9c4b64c5b4e9ff929918f91afa7fcf6be7ab588 100644 (file)
@@ -267,7 +267,7 @@ miata_pci_fixup(void)
 {
        layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
        common_pci_fixup(miata_map_irq, miata_swizzle);
-       SMC669_Init(); /* it might be a GL (fails harmlessly if not) */
+       SMC669_Init(0); /* it might be a GL (fails harmlessly if not) */
        es1888_init();
 }
 
index a03f451d07da9b83dc8551561ec456c0a7789ed3..a35fdd219800d188cac5b290419568a3e876d669 100644 (file)
@@ -183,7 +183,7 @@ sx164_pci_fixup(void)
 {
        layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
        common_pci_fixup(sx164_map_irq, common_swizzle);
-       SMC669_Init();
+       SMC669_Init(0);
 }
 
 
index 76f4c4cb9565268bb12bf8a29ed1a5f225d5717f..302aa821180da7cd09b2d01ddff4fad6fb9e49ac 100644 (file)
@@ -52,7 +52,7 @@ int parport_ieee1284_nibble_mode_ok(struct parport *port, unsigned char mode)
                & ~1 ) & ~2);
        udelay(1);
        parport_write_data(port, mode);
-       udelay(1);
+       udelay(400);
        /* nSelectIn high, nAutoFd low */
        parport_write_control(port, (parport_read_control(port) & ~8) | 2);
        if (parport_wait_peripheral(port, 0x78, 0x38)) {
index 7e8e24848c3560ffb0409399e05673da7f6288bd..86d2039975b8754730473d27de556835f027f1c5 100644 (file)
@@ -518,7 +518,7 @@ __initfunc(static int fddiif_probe(struct device *dev))
        && dfx_probe(dev)
 #endif
 #ifdef CONFIG_APFDDI
-       && apfddi_init(dev);
+       && apfddi_init(dev)
 #endif
        && 1 ) {
            return 1;   /* -ENODEV or -EAGAIN would be more accurate. */
index 8317d37e046aa92a9e8e64347630caa35ad80fca..fe20840a48fb915915f78b1330da53257b5ade6f 100644 (file)
@@ -416,10 +416,8 @@ static struct sv11_device *sv11_unit;
 
 int init_module(void)
 {
-       printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.01.\n");
+       printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.02.\n");
        printk(KERN_INFO "(c) Copyright 1998, Building Number Three Ltd.\n");   
-       if(dma)
-               printk(KERN_WARNING "DMA mode probably wont work right now.\n");
        if((sv11_unit=sv11_init(io,irq))==NULL)
                return -ENODEV;
        return 0;
index b2c07b3faee11b73145feb701871446b252e6cbf..91e94c49b7c7d85d9846a7fd68da1266cb244ab9 100644 (file)
@@ -2062,7 +2062,11 @@ rcv_proto_vjc_comp(struct ppp *ppp, struct sk_buff *skb)
                               "ppp: error in VJ decompression\n");
                return 0;
        }
-       skb_put(skb, new_count + PPP_HDRLEN - skb->len);
+       new_count += PPP_HDRLEN;
+       if (new_count > skb->len)
+               skb_put(skb, new_count - skb->len);
+       else
+               skb_trim(skb, new_count);
        return rcv_proto_ip(ppp, skb);
 }
 
index d2daea0a3020959af6977dce0aae69641e67ccce..b405d3d2cb7fa5ae51c51c501277b472fb200a69 100644 (file)
@@ -51,7 +51,7 @@
 #include <asm/byteorder.h>
 #include "syncppp.h"
 
-#define MAXALIVECNT     3               /* max. alive packets */
+#define MAXALIVECNT     6               /* max. alive packets */
 
 #define PPP_ALLSTATIONS 0xff            /* All-Stations broadcast address */
 #define PPP_UI          0x03            /* Unnumbered Information */
index 4279ee6f380ca65a03f4e6ac0bc3febb423950b2..cbf6a375cf67a69102c3c95e5de4cbad014f3956 100644 (file)
@@ -5,8 +5,8 @@
    these silly disclaimers.
 
    Copyright 1994, Tom Zerucha.   
-   zerucha@shell.portal.com
-
+   tz@execpc.com
+   
    Additional Code, and much appreciated help by
    Michael A. Griffith
    grif@cs.ucr.edu
index 56190431855f26103ba0f4f5aee11eb29af39d10..6d9e9d80dbd22f767d58949f26671c1d9044f092 100644 (file)
@@ -209,7 +209,7 @@ static struct dentry_operations autofs_dentry_operations = {
        NULL,                   /* d_compare */
 };
 
-static int autofs_root_lookup(struct inode *dir, struct dentry * dentry)
+static int autofs_root_lookup(struct inode *dir, struct dentry *dentry)
 {
        struct autofs_sb_info *sbi;
        int oz_mode;
@@ -220,6 +220,9 @@ static int autofs_root_lookup(struct inode *dir, struct dentry * dentry)
        if (!S_ISDIR(dir->i_mode))
                return -ENOTDIR;
 
+       if (dentry->d_name.len > NAME_MAX)
+               return -ENOENT; /* File name too long to exist */
+
        sbi = autofs_sbi(dir->i_sb);
 
        oz_mode = autofs_oz_mode(sbi);
@@ -280,6 +283,9 @@ static int autofs_root_symlink(struct inode *dir, struct dentry *dentry, const c
        if ( !autofs_oz_mode(sbi) )
                return -EPERM;
 
+       if ( dentry->d_name.len > NAME_MAX )
+               return -ENAMETOOLONG;
+
        if ( autofs_hash_lookup(dh, &dentry->d_name) )
                return -EEXIST;
 
@@ -401,6 +407,9 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode)
        if ( !autofs_oz_mode(sbi) )
                return -EPERM;
 
+       if ( dentry->d_name.len > NAME_MAX )
+               return -ENAMETOOLONG;
+
        ent = autofs_hash_lookup(dh, &dentry->d_name);
        if ( ent )
                return -EEXIST;
index 81c68af463b309566376eac4273cdfd149a9b9b0..f9cccbd44074891d4f1f65515fd8091c8c3ddcc3 100644 (file)
@@ -99,7 +99,7 @@ static void autofs_notify_daemon(struct autofs_sb_info *sbi, struct autofs_wait_
                autofs_catatonic_mode(sbi);
 }
 
-int autofs_wait(struct autofs_sb_info *sbi, struct qstr * name)
+int autofs_wait(struct autofs_sb_info *sbi, struct qstr *name)
 {
        struct autofs_wait_queue *wq;
        int status;
@@ -107,6 +107,10 @@ int autofs_wait(struct autofs_sb_info *sbi, struct qstr * name)
        /* In catatonic mode, we don't wait for nobody */
        if ( sbi->catatonic )
                return -ENOENT;
+       
+       /* We shouldn't be able to get here, but just in case */
+       if ( name->len > NAME_MAX )
+               return -ENOENT;
 
        for ( wq = sbi->queues ; wq ; wq = wq->next ) {
                if ( wq->hash == name->hash &&
index 83554caa961207423625b948316a9cd4442af3b4..0ad4c7992bf4845a0cc9adc2edf68a0249f956b2 100644 (file)
@@ -385,6 +385,7 @@ static void try_to_free_inodes(int goal)
        goal -= inodes_stat.nr_free_inodes;
        if (goal > 0) {
                spin_unlock(&inode_lock);
+               select_dcache(goal, 0);
                prune_dcache(goal);
                spin_lock(&inode_lock);
                sync_all_inodes();
index 137eb4d5fe9ad7a273a8ea786ca4b165bf4e21cf..9850309ab2424f1d60434d3bc9212f65bdf6f818 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -22,10 +22,11 @@ asmlinkage int sys_statfs(const char * path, struct statfs * buf)
        error = PTR_ERR(dentry);
        if (!IS_ERR(dentry)) {
                struct inode * inode = dentry->d_inode;
+               struct super_block * sb = inode->i_sb;
 
-               error = -ENOSYS;
-               if (inode->i_sb->s_op->statfs)
-                       error = inode->i_sb->s_op->statfs(inode->i_sb, buf, sizeof(struct statfs));
+               error = -ENODEV;
+               if (sb && sb->s_op && sb->s_op->statfs)
+                       error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
 
                dput(dentry);
        }
@@ -52,10 +53,8 @@ asmlinkage int sys_fstatfs(unsigned int fd, struct statfs * buf)
        if (!(inode = dentry->d_inode))
                goto out_putf;
        error = -ENODEV;
-       if (!(sb = inode->i_sb))
-               goto out_putf;
-       error = -ENOSYS;
-       if (sb->s_op->statfs)
+       sb = inode->i_sb;
+       if (sb && sb->s_op && sb->s_op->statfs)
                error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
 out_putf:
        fput(file);
index ab04f1fee8ce68bcc1035a3a7a79a805899f6353..48605b233ee67688838ffc5ff5dd2ae36b0d6983 100644 (file)
@@ -273,6 +273,8 @@ struct video_unit
 #define VID_HARDWARE_PLANB     16      /* PowerMac motherboard video-in */
 #define VID_HARDWARE_BROADWAY  17      /* Broadway project */
 #define VID_HARDWARE_GEMTEK    18
+#define VID_HARDWARE_TYPHOON   19
+#define VID_HARDWARE_VINO      20      /* Reserved for SGI Indy Vino */
 
 /*
  *     Initialiser list
index 4510def86b5db2d3d05009ce4d9d407e3b7d24aa..40d5b072969294ef5156e403d70f29e12ddc6c00 100644 (file)
@@ -464,8 +464,17 @@ void add_timer(struct timer_list *timer)
        unsigned long flags;
 
        spin_lock_irqsave(&timerlist_lock, flags);
+       if (timer->prev)
+               goto bug;
        internal_add_timer(timer);
+out:
        spin_unlock_irqrestore(&timerlist_lock, flags);
+       return;
+
+bug:
+       printk("bug: kernel timer added twice at %p.\n",
+                       __builtin_return_address(0));
+       goto out;
 }
 
 static inline int detach_timer(struct timer_list *timer)
index 3520b0c52d7409ae502d068614e11a4994355180..71c547f58193f49bad38cf63d9f79ca49ff50132 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             PF_INET protocol family socket handler.
  *
- * Version:    $Id: af_inet.c,v 1.82 1999/01/04 20:36:44 davem Exp $
+ * Version:    $Id: af_inet.c,v 1.83 1999/02/22 13:54:18 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -828,6 +828,8 @@ int inet_shutdown(struct socket *sock, int how)
        sk->shutdown |= how;
        if (sk->prot->shutdown)
                sk->prot->shutdown(sk, how);
+       /* Wake up anyone sleeping in poll. */
+       sk->state_change(sk);
        return(0);
 }
 
index 5ac2d9a53cffe5b8ae4690fcde2e7306e893fcc9..544dd8937ce55cf9e3ed8fdd3d14e2b6838f4ab3 100644 (file)
@@ -402,6 +402,10 @@ static inline int icmpv4_xrlim_allow(struct rtable *rt, int type, int code)
        if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
                return 1;
 
+       /* No rate limit on loopback */
+       if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
+               return 1;
+
        return xrlim_allow(dst, *(icmp_pointers[type].timeout));
 }
 
index 67e482e862fe0069682a60c5d7da44db6ba53914..8378c2b03e90d05c03918823d271db869f16fbab 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp.c,v 1.134 1999/01/09 08:50:09 davem Exp $
+ * Version:    $Id: tcp.c,v 1.135 1999/02/22 13:54:21 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -1394,9 +1394,6 @@ void tcp_shutdown(struct sock *sk, int how)
            (TCPF_ESTABLISHED|TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE_WAIT)) {
                lock_sock(sk);
 
-               /* Flag that the sender has shutdown. */
-               sk->shutdown |= SEND_SHUTDOWN;
-
                /* Clear out any half completed packets.  FIN if needed. */
                if (tcp_close_state(sk,0))
                        tcp_send_fin(sk);
index e6ebfec82d73ad0b3f4bbc169ab7c97ccc9e645c..c93a874db5f5027ab13eada41d801e611a331f2e 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp_input.c,v 1.155 1999/01/26 05:33:50 davem Exp $
+ * Version:    $Id: tcp_input.c,v 1.156 1999/02/22 13:54:13 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -130,11 +130,15 @@ static __inline__ void tcp_remember_ack(struct tcp_opt *tp, struct tcphdr *th,
 {
        tp->delayed_acks++; 
 
-       /* Tiny-grams with PSH set make us ACK quickly.
-        * Note: This also clears the "quick ack mode" bit.
+       /* Tiny-grams with PSH set artifically deflate our
+        * ato measurement, but with a lower bound.
         */
-       if(th->psh && (skb->len < (tp->mss_cache >> 1)))
-               tp->ato = HZ/50;
+       if(th->psh && (skb->len < (tp->mss_cache >> 1))) {
+               /* Preserve the quickack state. */
+               if((tp->ato & 0x7fffffff) > HZ/50)
+                       tp->ato = ((tp->ato & 0x80000000) |
+                                  (HZ/50));
+       }
 } 
 
 /* Called to compute a smoothed rtt estimate. The data fed to this
index eb21856896378cbc4a257c5d2bcdfa5a8d3eb54b..03c96e99c8707d5834cca9be6285fc82023cce13 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp_output.c,v 1.101 1999/01/20 07:20:14 davem Exp $
+ * Version:    $Id: tcp_output.c,v 1.102 1999/02/22 13:54:26 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
index f6e86d92ddc5807d93036bdbd4fd814074c4e980..3821a7c4cf2186f3c03c5fa36a0baf1a6934d8dc 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             TIMER - implementation of software timers for IP.
  *
- * Version:    $Id: timer.c,v 1.14 1998/11/07 11:55:43 davem Exp $
+ * Version:    $Id: timer.c,v 1.15 1999/02/22 13:54:29 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
index 8ff0fe317db16ee28a619ee5a6d111e6706ff432..929278b68fa4d5adb7842502995691a40715bb08 100644 (file)
@@ -766,11 +766,10 @@ static int ipxitf_rcv(ipx_interface *intrfc, struct sk_buff *skb)
 
                i = 0;
 
-               /* Dump packet if too many hops or already seen this net */
-               if(ipx->ipx_tctrl < 8)
-                       for( ; i < ipx->ipx_tctrl; i++)
-                               if(*l++ == intrfc->if_netnum)
-                                       break;
+               /* Dump packet if already seen this net */
+               for( ; i < ipx->ipx_tctrl; i++)
+                       if(*l++ == intrfc->if_netnum)
+                               break;
 
                if(i == ipx->ipx_tctrl) 
                { 
@@ -779,6 +778,10 @@ static int ipxitf_rcv(ipx_interface *intrfc, struct sk_buff *skb)
                        /* xmit on all other interfaces... */
                        for(ifcs = ipx_interfaces; ifcs != NULL; ifcs = ifcs->if_next) 
                        {
+                               /* Except unconfigured interfaces */
+                               if(ifcs->if_netnum == 0)
+                                       continue;
+                                       
                                /* That aren't in the list */
                                l = (__u32 *) c;
                                for(i = 0; i <= ipx->ipx_tctrl; i++)
@@ -2074,18 +2077,16 @@ int ipx_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
        
        /* Too small? */
        if(ntohs(ipx->ipx_pktsize) < sizeof(struct ipxhdr))
-       {
-               kfree_skb(skb);
-               return (0);
-       }
-       
+               goto drop;
+               
+       /* Not ours */  
+        if (skb->pkt_type == PACKET_OTHERHOST)
+               goto drop;
+                        
        if(ipx->ipx_checksum != IPX_NO_CHECKSUM) 
        {
                if(ipx_set_checksum(ipx, ntohs(ipx->ipx_pktsize)) != ipx->ipx_checksum)
-               {
-                       kfree_skb(skb);
-                       return (0);
-               }
+                       goto drop;
        }
 
        /* Determine what local ipx endpoint this is */
@@ -2099,13 +2100,14 @@ int ipx_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
                }
 
                if(intrfc == NULL)      /* Not one of ours */
-               {
-                       kfree_skb(skb);
-                       return (0);
-               }
+                       goto drop;
        }
 
        return (ipxitf_rcv(intrfc, skb));
+       
+drop:
+       kfree_skb(skb);
+       return (0);
 }
 
 static int ipx_sendmsg(struct socket *sock, struct msghdr *msg, int len,
@@ -2133,8 +2135,11 @@ static int ipx_sendmsg(struct socket *sock, struct msghdr *msg, int len,
                        uaddr.sipx_port = 0;
                        uaddr.sipx_network = 0L;
 #ifdef CONFIG_IPX_INTERN
-                       memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
-                               ->if_node, IPX_NODE_LEN);
+                       if(sk->protinfo.af_ipx.intrfc)
+                               memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
+                                               ->if_node,IPX_NODE_LEN);
+                       else
+                               return -ENETDOWN;               /* Someone zonked the iface */
 #endif
                        ret = ipx_bind(sock, (struct sockaddr *)&uaddr,
                                        sizeof(struct sockaddr_ipx));