Index: oldkernel/linux/arch/sparc64/solaris/timod.c
diff -u linux/arch/sparc64/solaris/timod.c:1.1.1.1 linux/arch/sparc64/solaris/timod.c:1.2
--- linux/arch/sparc64/solaris/timod.c:1.1.1.1	Wed May 31 12:33:53 2000
+++ linux/arch/sparc64/solaris/timod.c	Thu Jun  1 15:08:24 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");
 }
 
Index: oldkernel/linux/drivers/char/adbmouse.c
diff -u linux/drivers/char/adbmouse.c:1.1.1.1 linux/drivers/char/adbmouse.c:1.2
--- linux/drivers/char/adbmouse.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/adbmouse.c	Thu Jun  1 15:08:24 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)
Index: oldkernel/linux/drivers/char/amigamouse.c
diff -u linux/drivers/char/amigamouse.c:1.1.1.1 linux/drivers/char/amigamouse.c:1.2
--- linux/drivers/char/amigamouse.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/amigamouse.c	Thu Jun  1 15:08:24 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();
 }
Index: oldkernel/linux/drivers/char/atarimouse.c
diff -u linux/drivers/char/atarimouse.c:1.1.1.1 linux/drivers/char/atarimouse.c:1.2
--- linux/drivers/char/atarimouse.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/atarimouse.c	Thu Jun  1 15:08:24 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(); */
 }
Index: oldkernel/linux/drivers/char/atixlmouse.c
diff -u linux/drivers/char/atixlmouse.c:1.1.1.1 linux/drivers/char/atixlmouse.c:1.2
--- linux/drivers/char/atixlmouse.c:1.1.1.1	Wed May 31 12:33:50 2000
+++ linux/drivers/char/atixlmouse.c	Thu Jun  1 15:08:24 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();
 }
Index: oldkernel/linux/drivers/char/busmouse.c
diff -u linux/drivers/char/busmouse.c:1.1.1.1 linux/drivers/char/busmouse.c:1.2
--- linux/drivers/char/busmouse.c:1.1.1.1	Wed May 31 12:33:50 2000
+++ linux/drivers/char/busmouse.c	Thu Jun  1 15:08:24 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();
 }
Index: oldkernel/linux/drivers/char/dn_keyb.c
diff -u linux/drivers/char/dn_keyb.c:1.1.1.1 linux/drivers/char/dn_keyb.c:1.2
--- linux/drivers/char/dn_keyb.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/dn_keyb.c	Thu Jun  1 15:08:24 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); */
Index: oldkernel/linux/drivers/char/msbusmouse.c
diff -u linux/drivers/char/msbusmouse.c:1.1.1.1 linux/drivers/char/msbusmouse.c:1.2
--- linux/drivers/char/msbusmouse.c:1.1.1.1	Wed May 31 12:33:50 2000
+++ linux/drivers/char/msbusmouse.c	Thu Jun  1 15:08:24 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);
 	}
 }
 
Index: oldkernel/linux/drivers/char/n_hdlc.c
diff -u linux/drivers/char/n_hdlc.c:1.1.1.1 linux/drivers/char/n_hdlc.c:1.2
--- linux/drivers/char/n_hdlc.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/n_hdlc.c	Thu Jun  1 15:08:24 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() */
 
Index: oldkernel/linux/drivers/char/n_tty.c
diff -u linux/drivers/char/n_tty.c:1.1.1.1 linux/drivers/char/n_tty.c:1.2
--- linux/drivers/char/n_tty.c:1.1.1.1	Wed May 31 12:33:50 2000
+++ linux/drivers/char/n_tty.c	Thu Jun  1 15:08:24 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);
 	}
Index: oldkernel/linux/drivers/char/pc110pad.c
diff -u linux/drivers/char/pc110pad.c:1.1.1.1 linux/drivers/char/pc110pad.c:1.2
--- linux/drivers/char/pc110pad.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/pc110pad.c	Thu Jun  1 15:08:24 2000
@@ -75,7 +75,7 @@
 {
 	wake_up_interruptible(&queue);
 	if(asyncptr)
-		kill_fasync(asyncptr, SIGIO);
+		kill_fasync(asyncptr, SIGIO, POLL_IN);
 }
 
 
Index: oldkernel/linux/drivers/char/pc_keyb.c
diff -u linux/drivers/char/pc_keyb.c:1.1.1.1 linux/drivers/char/pc_keyb.c:1.2
--- linux/drivers/char/pc_keyb.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/pc_keyb.c	Thu Jun  1 15:08:24 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);
 		}
 	}
Index: oldkernel/linux/drivers/char/qpmouse.c
diff -u linux/drivers/char/qpmouse.c:1.1.1.1 linux/drivers/char/qpmouse.c:1.2
--- linux/drivers/char/qpmouse.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/char/qpmouse.c	Thu Jun  1 15:08:24 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);
 }
 
Index: oldkernel/linux/drivers/net/ppp.c
diff -u linux/drivers/net/ppp.c:1.1.1.1 linux/drivers/net/ppp.c:1.2
--- linux/drivers/net/ppp.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/drivers/net/ppp.c	Thu Jun  1 15:08:24 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;
 }
Index: oldkernel/linux/drivers/net/sk_mca.h
diff -u linux/drivers/net/sk_mca.h:1.1.1.1 linux/drivers/net/sk_mca.h:1.2
--- linux/drivers/net/sk_mca.h:1.1.1.1	Wed May 31 12:33:50 2000
+++ linux/drivers/net/sk_mca.h	Thu Jun  1 15:08:24 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_ */
Index: oldkernel/linux/drivers/sbus/char/pcikbd.c
diff -u linux/drivers/sbus/char/pcikbd.c:1.1.1.1 linux/drivers/sbus/char/pcikbd.c:1.2
--- linux/drivers/sbus/char/pcikbd.c:1.1.1.1	Wed May 31 12:33:52 2000
+++ linux/drivers/sbus/char/pcikbd.c	Thu Jun  1 15:08:24 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);
 }
 
Index: oldkernel/linux/drivers/sbus/char/sunkbd.c
diff -u linux/drivers/sbus/char/sunkbd.c:1.1.1.1 linux/drivers/sbus/char/sunkbd.c:1.2
--- linux/drivers/sbus/char/sunkbd.c:1.1.1.1	Wed May 31 12:33:52 2000
+++ linux/drivers/sbus/char/sunkbd.c	Thu Jun  1 15:08:24 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);
 }
 
Index: oldkernel/linux/drivers/sbus/char/sunmouse.c
diff -u linux/drivers/sbus/char/sunmouse.c:1.1.1.1 linux/drivers/sbus/char/sunmouse.c:1.2
--- linux/drivers/sbus/char/sunmouse.c:1.1.1.1	Wed May 31 12:33:52 2000
+++ linux/drivers/sbus/char/sunmouse.c	Thu Jun  1 15:08:24 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;
Index: oldkernel/linux/drivers/scsi/sg.c
diff -u linux/drivers/scsi/sg.c:1.1.1.1 linux/drivers/scsi/sg.c:1.2
--- linux/drivers/scsi/sg.c:1.1.1.1	Wed May 31 12:33:51 2000
+++ linux/drivers/scsi/sg.c	Thu Jun  1 15:08:24 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);
     }
 }
 
Index: oldkernel/linux/drivers/sgi/char/shmiq.c
diff -u linux/drivers/sgi/char/shmiq.c:1.1.1.1 linux/drivers/sgi/char/shmiq.c:1.2
--- linux/drivers/sgi/char/shmiq.c:1.1.1.1	Wed May 31 12:33:52 2000
+++ linux/drivers/sgi/char/shmiq.c	Thu Jun  1 15:08:24 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);
 }
 
Index: oldkernel/linux/drivers/telephony/ixj.c
diff -u linux/drivers/telephony/ixj.c:1.1.1.1 linux/drivers/telephony/ixj.c:1.2
--- linux/drivers/telephony/ixj.c:1.1.1.1	Wed May 31 12:33:53 2000
+++ linux/drivers/telephony/ixj.c	Thu Jun  1 15:08:24 2000
@@ -446,7 +446,7 @@
 						j->m_hook = 0;
 						j->ex.bits.hookstate = 1;
 						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+							kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of change
 					}
 					goto timer_end;
 				}
@@ -536,7 +536,7 @@
 					if (!j->m_hook) {
 						j->m_hook = j->ex.bits.hookstate = 1;
 						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+							kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of change
 					}
 				} else {
 					if ((j->dsp.low == 0x21 || j->dsp.low == 0x22) &&
@@ -552,7 +552,7 @@
 						j->m_hook = 0;
 						j->ex.bits.hookstate = 1;
 						if (j->async_queue)
-							kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+							kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of change
 					}
 				}
 			}
@@ -642,7 +642,7 @@
 			if (j->ex.bytes) {
 				wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
 				if (j->async_queue)
-					kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+					kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of change
 			}
 		} else {
 			break;
@@ -917,7 +917,7 @@
 		if (j->port != PORT_POTS) {
 			j->ex.bits.hookstate = 1;
 			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of change
+				kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of change
 
 		}
 	}
@@ -1473,7 +1473,7 @@
 			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
 
 			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of frame
+				kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of frame
 
 		}
 	}
@@ -1559,7 +1559,7 @@
 			wake_up_interruptible(&j->poll_q);	// Wake any blocked selects
 
 			if (j->async_queue)
-				kill_fasync(j->async_queue, SIGIO);	// Send apps notice of empty buffer
+				kill_fasync(j->async_queue, SIGIO, POLL_IN);	// Send apps notice of empty buffer
 #ifdef PERFMON_STATS
 			++j->frameswritten;
 #endif
Index: oldkernel/linux/drivers/usb/mouse.c
diff -u linux/drivers/usb/mouse.c:1.1.1.1 linux/drivers/usb/mouse.c:1.2
--- linux/drivers/usb/mouse.c:1.1.1.1	Wed May 31 12:33:53 2000
+++ linux/drivers/usb/mouse.c	Thu Jun  1 15:08:24 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;
 }
Index: oldkernel/linux/fs/fcntl.c
diff -u linux/fs/fcntl.c:1.2 linux/fs/fcntl.c:1.3
--- linux/fs/fcntl.c:1.2	Thu Jun  1 15:03:08 2000
+++ linux/fs/fcntl.c	Thu Jun  1 15:08:25 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);
@@ -236,7 +238,20 @@
 	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;
@@ -265,9 +280,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;
@@ -279,7 +296,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;
@@ -289,8 +306,11 @@
 			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;
 	}
 }
Index: oldkernel/linux/ibcs/iBCSemul/timod.c
diff -u linux/ibcs/iBCSemul/timod.c:1.1.1.1 linux/ibcs/iBCSemul/timod.c:1.2
--- linux/ibcs/iBCSemul/timod.c:1.1.1.1	Wed May 31 12:41:32 2000
+++ linux/ibcs/iBCSemul/timod.c	Thu Jun  1 15:08:25 2000
@@ -46,7 +46,7 @@
 #define esp u_regs[UREG_FP]
 #endif
 
-extern void kill_fasync(struct fasync_struct *fa, int sig);
+extern void kill_fasync(struct fasync_struct *fa, int sig, int band);
 
 #ifdef IBCS_TRACE
 static char *
@@ -82,7 +82,7 @@
 
 	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);
 }
 
 
Index: oldkernel/linux/include/asm-sparc/poll.h
diff -u linux/include/asm-sparc/poll.h:1.1.1.1 linux/include/asm-sparc/poll.h:1.2
--- linux/include/asm-sparc/poll.h:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/include/asm-sparc/poll.h	Thu Jun  1 15:08:25 2000
@@ -11,6 +11,7 @@
 #define POLLWRNORM	POLLOUT
 #define POLLRDBAND	128
 #define POLLWRBAND	256
+#define POLLMSG		512
 
 struct pollfd {
 	int fd;
Index: oldkernel/linux/include/asm-sparc64/poll.h
diff -u linux/include/asm-sparc64/poll.h:1.1.1.1 linux/include/asm-sparc64/poll.h:1.2
--- linux/include/asm-sparc64/poll.h:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/include/asm-sparc64/poll.h	Thu Jun  1 15:08:25 2000
@@ -11,6 +11,7 @@
 #define POLLWRNORM	POLLOUT
 #define POLLRDBAND	128
 #define POLLWRBAND	256
+#define POLLMSG		512
 
 struct pollfd {
 	int fd;
Index: oldkernel/linux/include/linux/fs.h
diff -u linux/include/linux/fs.h:1.3 linux/include/linux/fs.h:1.4
--- linux/include/linux/fs.h:1.3	Thu Jun  1 15:03:09 2000
+++ linux/include/linux/fs.h	Thu Jun  1 15:08:25 2000
@@ -730,7 +730,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);
Index: oldkernel/linux/include/linux/net.h
diff -u linux/include/linux/net.h:1.1.1.1 linux/include/linux/net.h:1.2
--- linux/include/linux/net.h:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/include/linux/net.h	Thu Jun  1 15:08:25 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);
Index: oldkernel/linux/net/socket.c
diff -u linux/net/socket.c:1.1.1.1 linux/net/socket.c:1.2
--- linux/net/socket.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/net/socket.c	Thu Jun  1 15:08:25 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;
 }
Index: oldkernel/linux/net/core/sock.c
diff -u linux/net/core/sock.c:1.1.1.1 linux/net/core/sock.c:1.2
--- linux/net/core/sock.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/net/core/sock.c	Thu Jun  1 15:08:25 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);
 	}
 }
 
Index: oldkernel/linux/net/ipv4/tcp.c
diff -u linux/net/ipv4/tcp.c:1.1.1.1 linux/net/ipv4/tcp.c:1.2
--- linux/net/ipv4/tcp.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/net/ipv4/tcp.c	Thu Jun  1 15:08:25 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);
 }
 
 
Index: oldkernel/linux/net/ipv4/tcp_input.c
diff -u linux/net/ipv4/tcp_input.c:1.1.1.1 linux/net/ipv4/tcp_input.c:1.2
--- linux/net/ipv4/tcp_input.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/net/ipv4/tcp_input.c	Thu Jun  1 15:08:25 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) {
Index: oldkernel/linux/net/unix/af_unix.c
diff -u linux/net/unix/af_unix.c:1.1.1.1 linux/net/unix/af_unix.c:1.2
--- linux/net/unix/af_unix.c:1.1.1.1	Wed May 31 12:33:49 2000
+++ linux/net/unix/af_unix.c	Thu Jun  1 15:08:25 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
