diff -ruN Linux-2.2.14/arch/sparc64/solaris/timod.c linux/arch/sparc64/solaris/timod.c
--- Linux-2.2.14/arch/sparc64/solaris/timod.c	Tue Apr 14 20:44:21 1998
+++ linux/arch/sparc64/solaris/timod.c	Fri Mar 31 16:21:02 2000
@@ -154,7 +154,7 @@
 	sock = &current->files->fd[fd]->f_dentry->d_inode->u.socket_i;
 	wake_up_interruptible(&sock->wait);
 	if (sock->fasync_list && !(sock->flags & SO_WAITDATA))
-		kill_fasync(sock->fasync_list, SIGIO);
+		kill_fasync(sock->fasync_list, SIGIO, POLL_IN);
 	SOLD("done");
 }
 
diff -ruN Linux-2.2.14/drivers/char/adbmouse.c linux/drivers/char/adbmouse.c
--- Linux-2.2.14/drivers/char/adbmouse.c	Thu Apr 29 15:53:48 1999
+++ linux/drivers/char/adbmouse.c	Fri Mar 31 16:21:40 2000
@@ -134,7 +134,7 @@
     mouse.ready = 1;
     wake_up_interruptible(&mouse.wait);
     if (mouse.fasyncptr)
-	kill_fasync(mouse.fasyncptr, SIGIO);
+	kill_fasync(mouse.fasyncptr, SIGIO, POLL_IN);
 }
 
 static int fasync_mouse(int fd, struct file *filp, int on)
diff -ruN Linux-2.2.14/drivers/char/amigamouse.c linux/drivers/char/amigamouse.c
--- Linux-2.2.14/drivers/char/amigamouse.c	Mon Aug 24 16:02:43 1998
+++ linux/drivers/char/amigamouse.c	Fri Mar 31 16:21:54 2000
@@ -154,7 +154,7 @@
 	      mouse.dy =  2048;
 
 	  if (mouse.fasyncptr)
-	      kill_fasync(mouse.fasyncptr, SIGIO);
+	      kill_fasync(mouse.fasyncptr, SIGIO, POLL_IN);
 	}
 	AMI_MSE_INT_ON();
 }
diff -ruN Linux-2.2.14/drivers/char/atarimouse.c linux/drivers/char/atarimouse.c
--- Linux-2.2.14/drivers/char/atarimouse.c	Mon Aug 24 16:02:43 1998
+++ linux/drivers/char/atarimouse.c	Fri Mar 31 16:22:08 2000
@@ -49,7 +49,7 @@
     mouse.ready = 1;
     wake_up_interruptible(&mouse.wait);
     if (mouse.fasyncptr)
-	kill_fasync(mouse.fasyncptr, SIGIO);
+	kill_fasync(mouse.fasyncptr, SIGIO, POLL_IN);
 
 /*    ikbd_mouse_rel_pos(); */
 }
diff -ruN Linux-2.2.14/drivers/char/atixlmouse.c linux/drivers/char/atixlmouse.c
--- Linux-2.2.14/drivers/char/atixlmouse.c	Mon Aug 24 16:02:43 1998
+++ linux/drivers/char/atixlmouse.c	Fri Mar 31 16:21:17 2000
@@ -90,7 +90,7 @@
 		mouse.ready = 1;
 		wake_up_interruptible(&mouse.wait);
 		if (mouse.fasync)
-			kill_fasync(mouse.fasync, SIGIO);
+			kill_fasync(mouse.fasync, SIGIO, POLL_IN);
 	}
 	ATIXL_MSE_ENABLE_UPDATE();
 }
diff -ruN Linux-2.2.14/drivers/char/busmouse.c linux/drivers/char/busmouse.c
--- Linux-2.2.14/drivers/char/busmouse.c	Wed Jan  5 17:23:06 2000
+++ linux/drivers/char/busmouse.c	Fri Mar 31 16:17:26 2000
@@ -105,7 +105,7 @@
 	      mouse.dy =  2048;
 
 	  if (mouse.fasyncptr)
-	      kill_fasync(mouse.fasyncptr, SIGIO);
+	      kill_fasync(mouse.fasyncptr, SIGIO, POLL_IN);
 	}
 	MSE_INT_ON();
 }
diff -ruN Linux-2.2.14/drivers/char/dn_keyb.c linux/drivers/char/dn_keyb.c
--- Linux-2.2.14/drivers/char/dn_keyb.c	Mon Apr 26 16:28:07 1999
+++ linux/drivers/char/dn_keyb.c	Fri Mar 31 16:17:53 2000
@@ -468,7 +468,7 @@
           		if (mouse_dy >  2048)
               		mouse_dy =  2048;
 				if (mouse_fasyncptr)
-              		kill_fasync(mouse_fasyncptr, SIGIO);
+              		kill_fasync(mouse_fasyncptr, SIGIO, POLL_IN);
 			}
 			mouse_byte_count=0;
 /*			printk("mouse: %d, %d, %x\n",mouse_x,mouse_y,buttons); */
diff -ruN Linux-2.2.14/drivers/char/msbusmouse.c linux/drivers/char/msbusmouse.c
--- Linux-2.2.14/drivers/char/msbusmouse.c	Wed Jan  5 17:23:07 2000
+++ linux/drivers/char/msbusmouse.c	Fri Mar 31 16:22:22 2000
@@ -89,7 +89,7 @@
 		mouse.ready = 1;
 		wake_up_interruptible(&mouse.wait);
 		if (mouse.fasyncptr)
-			kill_fasync(mouse.fasyncptr, SIGIO);
+			kill_fasync(mouse.fasyncptr, SIGIO, POLL_IN);
 	}
 }
 
diff -ruN Linux-2.2.14/drivers/char/n_hdlc.c linux/drivers/char/n_hdlc.c
--- Linux-2.2.14/drivers/char/n_hdlc.c	Wed Jan  5 17:22:50 2000
+++ linux/drivers/char/n_hdlc.c	Fri Mar 31 16:18:07 2000
@@ -660,7 +660,7 @@
 	/* wake up any blocked reads and perform async signalling */
 	wake_up_interruptible (&n_hdlc->read_wait);
 	if (n_hdlc->tty->fasync != NULL)
-		kill_fasync (n_hdlc->tty->fasync, SIGIO);
+		kill_fasync (n_hdlc->tty->fasync, SIGIO, POLL_IN);
 
 }	/* end of n_hdlc_tty_receive() */
 
diff -ruN Linux-2.2.14/drivers/char/n_tty.c linux/drivers/char/n_tty.c
--- Linux-2.2.14/drivers/char/n_tty.c	Wed Jan  5 17:22:50 2000
+++ linux/drivers/char/n_tty.c	Fri Mar 31 16:18:48 2000
@@ -604,7 +604,7 @@
 			tty->canon_head = tty->read_head;
 			tty->canon_data++;
 			if (tty->fasync)
-				kill_fasync(tty->fasync, SIGIO);
+				kill_fasync(tty->fasync, SIGIO, POLL_IN);
 			if (tty->read_wait)
 				wake_up_interruptible(&tty->read_wait);
 			return;
@@ -706,7 +706,7 @@
 
 	if (!tty->icanon && (tty->read_cnt >= tty->minimum_to_wake)) {
 		if (tty->fasync)
-			kill_fasync(tty->fasync, SIGIO);
+			kill_fasync(tty->fasync, SIGIO, POLL_IN);
 		if (tty->read_wait)
 			wake_up_interruptible(&tty->read_wait);
 	}
diff -ruN Linux-2.2.14/drivers/char/pc110pad.c linux/drivers/char/pc110pad.c
--- Linux-2.2.14/drivers/char/pc110pad.c	Wed Jan  5 17:22:22 2000
+++ linux/drivers/char/pc110pad.c	Fri Mar 31 16:22:49 2000
@@ -75,7 +75,7 @@
 {
 	wake_up_interruptible(&queue);
 	if(asyncptr)
-		kill_fasync(asyncptr, SIGIO);
+		kill_fasync(asyncptr, SIGIO, POLL_IN);
 }
 
 
diff -ruN Linux-2.2.14/drivers/char/pc_keyb.c linux/drivers/char/pc_keyb.c
--- Linux-2.2.14/drivers/char/pc_keyb.c	Wed Jan  5 17:22:31 2000
+++ linux/drivers/char/pc_keyb.c	Fri Mar 31 16:19:05 2000
@@ -403,7 +403,7 @@
 		if (head != queue->tail) {
 			queue->head = head;
 			if (queue->fasync)
-				kill_fasync(queue->fasync, SIGIO);
+				kill_fasync(queue->fasync, SIGIO, POLL_IN);
 			wake_up_interruptible(&queue->proc_list);
 		}
 	}
diff -ruN Linux-2.2.14/drivers/char/qpmouse.c linux/drivers/char/qpmouse.c
--- Linux-2.2.14/drivers/char/qpmouse.c	Wed Jan  5 17:22:31 2000
+++ linux/drivers/char/qpmouse.c	Fri Mar 31 16:23:13 2000
@@ -134,7 +134,7 @@
 	}
 	queue->head = head;
 	if (queue->fasync)
-		kill_fasync(queue->fasync, SIGIO);
+		kill_fasync(queue->fasync, SIGIO, POLL_IN);
 	wake_up_interruptible(&queue->proc_list);
 }
 
diff -ruN Linux-2.2.14/drivers/net/ppp.c linux/drivers/net/ppp.c
--- Linux-2.2.14/drivers/net/ppp.c	Wed Jan  5 17:22:54 2000
+++ linux/drivers/net/ppp.c	Fri Mar 31 16:16:35 2000
@@ -2372,7 +2372,7 @@
 
 	wake_up_interruptible (&ppp->read_wait);
 	if (ppp->tty->fasync != NULL)
-		kill_fasync (ppp->tty->fasync, SIGIO);
+		kill_fasync (ppp->tty->fasync, SIGIO, POLL_IN);
 
 	return 1;
 }
diff -ruN Linux-2.2.14/drivers/net/sk_mca.h linux/drivers/net/sk_mca.h
--- Linux-2.2.14/drivers/net/sk_mca.h	Wed Jan  5 17:22:23 2000
+++ linux/drivers/net/sk_mca.h	Fri Mar 31 16:17:10 2000
@@ -168,7 +168,7 @@
 
 #endif /* _SK_MCA_DRIVER_ */
 
-extern int skmca_probe(struct device *);
+extern int skmca_probe(struct net_device *);
 
 
-#endif /* _SK_MCA_INCLUDE_ */
\ No newline at end of file
+#endif /* _SK_MCA_INCLUDE_ */
diff -ruN Linux-2.2.14/drivers/sbus/char/pcikbd.c linux/drivers/sbus/char/pcikbd.c
--- Linux-2.2.14/drivers/sbus/char/pcikbd.c	Wed Jan  5 17:23:09 2000
+++ linux/drivers/sbus/char/pcikbd.c	Fri Mar 31 16:19:31 2000
@@ -774,7 +774,7 @@
 	queue->head = head;
 	aux_ready = 1;
 	if (queue->fasync)
-		kill_fasync(queue->fasync, SIGIO);
+		kill_fasync(queue->fasync, SIGIO, POLL_IN);
 	wake_up_interruptible(&queue->proc_list);
 }
 
diff -ruN Linux-2.2.14/drivers/sbus/char/sunkbd.c linux/drivers/sbus/char/sunkbd.c
--- Linux-2.2.14/drivers/sbus/char/sunkbd.c	Thu Apr 22 22:24:51 1999
+++ linux/drivers/sbus/char/sunkbd.c	Fri Mar 31 16:19:47 2000
@@ -1278,7 +1278,7 @@
 		kbd_head = next;
 	}
 	if (kb_fasync)
-		kill_fasync (kb_fasync, SIGIO);
+		kill_fasync (kb_fasync, SIGIO, POLL_IN);
 	wake_up_interruptible (&kbd_wait);
 }
 
diff -ruN Linux-2.2.14/drivers/sbus/char/sunmouse.c linux/drivers/sbus/char/sunmouse.c
--- Linux-2.2.14/drivers/sbus/char/sunmouse.c	Wed Jan  5 17:23:09 2000
+++ linux/drivers/sbus/char/sunmouse.c	Fri Mar 31 16:20:23 2000
@@ -137,7 +137,7 @@
 	}
 	sunmouse.ready = 1;
 	if (sunmouse.fasync)
-		kill_fasync (sunmouse.fasync, SIGIO);
+		kill_fasync (sunmouse.fasync, SIGIO, POLL_IN);
 	wake_up_interruptible (&sunmouse.proc_list);
 }
 
@@ -365,7 +365,7 @@
 		 */
 		sunmouse.ready = 1;
 		if (sunmouse.fasync)
-			kill_fasync (sunmouse.fasync, SIGIO);
+			kill_fasync (sunmouse.fasync, SIGIO, POLL_IN);
 		wake_up_interruptible(&sunmouse.proc_list);
 	}
 	return;
diff -ruN Linux-2.2.14/drivers/scsi/sg.c linux/drivers/scsi/sg.c
--- Linux-2.2.14/drivers/scsi/sg.c	Wed Jan  5 17:23:11 2000
+++ linux/drivers/scsi/sg.c	Fri Mar 31 16:23:59 2000
@@ -808,7 +808,7 @@
     if (sfp && srp) {
         wake_up_interruptible(&sfp->read_wait);
         if (sfp->async_qp)
-            kill_fasync(sfp->async_qp, SIGPOLL);
+            kill_fasync(sfp->async_qp, SIGIO, POLL_IN);
     }
 }
 
diff -ruN Linux-2.2.14/drivers/sgi/char/shmiq.c linux/drivers/sgi/char/shmiq.c
--- Linux-2.2.14/drivers/sgi/char/shmiq.c	Wed Jan  5 17:22:37 2000
+++ linux/drivers/sgi/char/shmiq.c	Fri Mar 31 16:24:15 2000
@@ -118,7 +118,7 @@
 	s->tail = tail_next;
 	shmiqs [device].tail = tail_next;
 	if (shmiqs [device].fasync)
-		kill_fasync (shmiqs [device].fasync, SIGIO);
+		kill_fasync (shmiqs [device].fasync, SIGIO, POLL_IN);
 	wake_up_interruptible (&shmiqs [device].proc_list);
 }
 
diff -ruN Linux-2.2.14/drivers/usb/mouse.c linux/drivers/usb/mouse.c
--- Linux-2.2.14/drivers/usb/mouse.c	Fri Apr 30 11:20:49 1999
+++ linux/drivers/usb/mouse.c	Fri Mar 31 16:20:43 2000
@@ -81,7 +81,7 @@
 
 	wake_up_interruptible(&mouse->wait);
 	if (mouse->fasync)
-		kill_fasync(mouse->fasync, SIGIO);
+		kill_fasync(mouse->fasync, SIGIO, POLL_IN);
 
 	return 1;
 }
diff -ruN Linux-2.2.14/fs/fcntl.c linux/fs/fcntl.c
--- Linux-2.2.14/fs/fcntl.c	Wed Jan  5 17:22:47 2000
+++ linux/fs/fcntl.c	Thu May  4 16:27:13 2000
@@ -8,6 +8,8 @@
 #include <linux/file.h>
 #include <linux/smp_lock.h>
 
+#include <asm/poll.h>
+#include <asm/siginfo.h>
 #include <asm/uaccess.h>
 
 extern int sock_fcntl (struct file *, unsigned int cmd, unsigned long arg);
@@ -223,7 +225,21 @@
 	return err;
 }
 
-static void send_sigio(struct fown_struct *fown, struct fasync_struct *fa)
+/*
+ * Table to convert sigio signal codes into poll band bitmaps
+ */
+static int band_table[NSIGPOLL+1] = {
+	~0,
+	POLLIN | POLLRDNORM,			/* POLL_IN */
+	POLLOUT | POLLWRNORM | POLLWRBAND,	/* POLL_OUT */
+	POLLIN | POLLRDNORM | POLLMSG,		/* POLL_MSG */
+	POLLERR,				/* POLL_ERR */
+	POLLPRI | POLLRDBAND,			/* POLL_PRI */
+	POLLHUP | POLLERR			/* POLL_HUP */
+};
+
+static void send_sigio(struct fown_struct *fown,
+	struct fasync_struct *fa, int reason)
 {
 	struct task_struct * p;
 	int   pid	= fown->pid;
@@ -252,9 +268,11 @@
 			   back to SIGIO in that case. --sct */
 			si.si_signo = fown->signum;
 			si.si_errno = 0;
-		        si.si_code  = SI_SIGIO;
-			si.si_pid   = pid;
-			si.si_uid   = uid;
+			si.si_code  = reason;
+			if (reason < 0 || reason > NSIGPOLL)
+				si.si_band  = ~0;
+			else
+				si.si_band = band_table[reason];
 			si.si_fd    = fa->fa_fd;
 			if (!send_sig_info(fown->signum, &si, p))
 				break;
@@ -266,7 +284,7 @@
 	read_unlock(&tasklist_lock);
 }
 
-void kill_fasync(struct fasync_struct *fa, int sig)
+void kill_fasync(struct fasync_struct *fa, int sig, int band)
 {
 	while (fa) {
 		struct fown_struct * fown;
@@ -276,8 +294,15 @@
 			return;
 		}
 		fown = &fa->fa_file->f_owner;
-		if (fown->pid)
-			send_sigio(fown, fa);
+
+		/*
+		 * Don't send SIGURG to processes which have not
+		 * set a queued signum: SIGURG has its own default
+		 * signalling mechanism.
+		 */
+		if (fown->pid && !(sig == SIGURG && fown->signum == 0))
+			send_sigio(fown, fa, band);
+
 		fa = fa->fa_next;
 	}
 }
diff -ruN Linux-2.2.14/include/linux/fs.h linux/include/linux/fs.h
--- Linux-2.2.14/include/linux/fs.h	Wed Jan  5 17:28:12 2000
+++ linux/include/linux/fs.h	Fri May  5 10:46:31 2000
@@ -707,7 +707,7 @@
 #define __getname()	((char *) __get_free_page(GFP_KERNEL))
 #define putname(name)	free_page((unsigned long)(name))
 
-extern void kill_fasync(struct fasync_struct *fa, int sig);
+extern void kill_fasync(struct fasync_struct *fa, int sig, int band);
 extern int register_blkdev(unsigned int, const char *, struct file_operations *);
 extern int unregister_blkdev(unsigned int major, const char * name);
 extern int blkdev_open(struct inode * inode, struct file * filp);
diff -ruN Linux-2.2.14/include/linux/net.h linux/include/linux/net.h
--- Linux-2.2.14/include/linux/net.h	Wed Jan  5 17:28:08 2000
+++ linux/include/linux/net.h	Fri Mar 31 16:24:35 2000
@@ -126,7 +126,7 @@
 };
 
 extern struct net_proto_family *net_families[];
-extern int	sock_wake_async(struct socket *sk, int how);
+extern int	sock_wake_async(struct socket *sk, int how, int band);
 extern int	sock_register(struct net_proto_family *fam);
 extern int	sock_unregister(int family);
 extern struct socket *sock_alloc(void);
diff -ruN Linux-2.2.14/kernel/signal.c linux/kernel/signal.c
--- Linux-2.2.14/kernel/signal.c	Wed Jan  5 17:23:17 2000
+++ linux/kernel/signal.c	Tue May 16 15:57:45 2000
@@ -329,9 +329,11 @@
 
 		struct signal_queue *q = 0;
 
+		ret = -ENOSPC;
 		if (atomic_read(&nr_queued_signals) < max_queued_signals) {
 			q = (struct signal_queue *)
 			    kmem_cache_alloc(signal_queue_cachep, GFP_ATOMIC);
+			ret = 0;
 		}
 		
 		if (q) {
diff -ruN Linux-2.2.14/net/core/sock.c linux/net/core/sock.c
--- Linux-2.2.14/net/core/sock.c	Mon May 10 12:55:25 1999
+++ linux/net/core/sock.c	Fri Mar 31 16:13:20 2000
@@ -982,7 +982,7 @@
 {
 	if (!sk->dead) {
 		wake_up_interruptible(sk->sleep);
-		sock_wake_async(sk->socket,0); 
+		sock_wake_async(sk->socket,0,POLL_ERR); 
 	}
 }
 
@@ -990,7 +990,7 @@
 {
 	if(!sk->dead) {
 		wake_up_interruptible(sk->sleep);
-		sock_wake_async(sk->socket,1);
+		sock_wake_async(sk->socket,1,POLL_IN);
 	}
 }
 
@@ -1005,7 +1005,7 @@
 
 		/* Should agree with poll, otherwise some programs break */
 		if (sock_writeable(sk))
-			sock_wake_async(sk->socket, 2);
+			sock_wake_async(sk->socket, 2, POLL_OUT);
 	}
 }
 
diff -ruN Linux-2.2.14/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- Linux-2.2.14/net/ipv4/tcp.c	Wed Jan  5 17:23:17 2000
+++ linux/net/ipv4/tcp.c	Fri Mar 31 16:13:55 2000
@@ -615,7 +615,7 @@
 	wake_up_interruptible(sk->sleep);
 	if (sock_wspace(sk) >=
 	    tcp_min_write_space(sk))
-		sock_wake_async(sk->socket, 2);
+		sock_wake_async(sk->socket, 2, POLL_OUT);
 }
 
 
diff -ruN Linux-2.2.14/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c
--- Linux-2.2.14/net/ipv4/tcp_input.c	Wed Jan  5 17:23:17 2000
+++ linux/net/ipv4/tcp_input.c	Fri Mar 31 16:14:57 2000
@@ -1131,7 +1131,7 @@
 
 	if (!sk->dead) {
 		sk->state_change(sk);
-		sock_wake_async(sk->socket, 1);
+		sock_wake_async(sk->socket, 1, POLL_HUP);
 	}
 
 	switch(sk->state) {
@@ -1669,6 +1669,7 @@
 			kill_proc(sk->proc, SIGURG, 1);
 		else
 			kill_pg(-sk->proc, SIGURG, 1);
+		sock_wake_async(sk->socket, 3, POLL_PRI);
 	}
 
 	/* We may be adding urgent data when the last byte read was
@@ -2213,7 +2214,7 @@
 
 			if(!sk->dead) {
 				sk->state_change(sk);
-				sock_wake_async(sk->socket, 0);
+				sock_wake_async(sk->socket, 0, POLL_OUT);
 			}
 		} else {
 			if(th->syn && !th->rst) {
diff -ruN Linux-2.2.14/net/socket.c linux/net/socket.c
--- Linux-2.2.14/net/socket.c	Thu Apr 22 22:45:20 1999
+++ linux/net/socket.c	Fri Mar 31 16:16:10 2000
@@ -544,7 +544,7 @@
 	return 0;
 }
 
-int sock_wake_async(struct socket *sock, int how)
+int sock_wake_async(struct socket *sock, int how, int band)
 {
 	if (!sock || !sock->fasync_list)
 		return -1;
@@ -561,8 +561,10 @@
 		/* fall through */
 	case 0:
 	call_kill:
-		kill_fasync(sock->fasync_list, SIGIO);
+		kill_fasync(sock->fasync_list, SIGIO, band);
 		break;
+	case 3:
+		kill_fasync(sock->fasync_list, SIGURG, band);
 	}
 	return 0;
 }
diff -ruN Linux-2.2.14/net/unix/af_unix.c linux/net/unix/af_unix.c
--- Linux-2.2.14/net/unix/af_unix.c	Wed Jan  5 17:22:42 2000
+++ linux/net/unix/af_unix.c	Fri Mar 31 16:12:46 2000
@@ -1515,7 +1515,7 @@
 		return;
 	wake_up_interruptible(sk->sleep);
 	if (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= MIN_WRITE_SPACE)
-		sock_wake_async(sk->socket, 2);
+		sock_wake_async(sk->socket, 2, POLL_OUT);
 }
 
 #ifdef CONFIG_PROC_FS
