diff -u --recursive --new-file v1.2.2/linux/Makefile linux/Makefile
--- v1.2.2/linux/Makefile	Wed Mar 29 06:52:56 1995
+++ linux/Makefile	Wed Mar 29 06:55:12 1995
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 2
-SUBLEVEL = 2
+SUBLEVEL = 3
 
 ARCH = i386
 
diff -u --recursive --new-file v1.2.2/linux/drivers/block/ide.c linux/drivers/block/ide.c
--- v1.2.2/linux/drivers/block/ide.c	Sat Mar 18 12:45:45 1995
+++ linux/drivers/block/ide.c	Sun Apr  2 08:09:47 1995
@@ -125,11 +125,11 @@
 #include <linux/genhd.h>
 #include <linux/malloc.h>
 #include <linux/string.h>
-#include <linux/major.h>
 #include <linux/delay.h>
 #include <linux/major.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
+#include <linux/blkdev.h>
 #include <asm/bitops.h>
 #include <asm/irq.h>
 #include <asm/segment.h>
diff -u --recursive --new-file v1.2.2/linux/drivers/char/vc_screen.c linux/drivers/char/vc_screen.c
--- v1.2.2/linux/drivers/char/vc_screen.c	Wed Mar 29 06:52:57 1995
+++ linux/drivers/char/vc_screen.c	Sun Apr  2 10:21:20 1995
@@ -80,7 +80,6 @@
 	if (!vc_cons_allocated(cons))
 		return -ENXIO;
 
-	clear_selection();
 	size = vcs_size(inode);
 	if (count < 0 || p > size)
 		return -EINVAL;
@@ -139,7 +138,6 @@
 	if (!vc_cons_allocated(cons))
 		return -ENXIO;
 
-	clear_selection();
 	size = vcs_size(inode);
 	if (count < 0 || p > size)
 		return -EINVAL;
diff -u --recursive --new-file v1.2.2/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile
--- v1.2.2/linux/drivers/scsi/Makefile	Wed Mar 29 06:52:58 1995
+++ linux/drivers/scsi/Makefile	Sun Apr  2 10:14:40 1995
@@ -62,8 +62,6 @@
 ifdef CONFIG_SCSI_AHA152X
 SCSI_OBJS := $(SCSI_OBJS) aha152x.o
 SCSI_SRCS := $(SCSI_SRCS) aha152x.c
-else
-SCSI_MODULE_OBJS := $(SCSI_MODULE_OBJS) aha152x.o
 endif
 
 ifdef CONFIG_SCSI_AHA1542
diff -u --recursive --new-file v1.2.2/linux/drivers/scsi/aha152x.c linux/drivers/scsi/aha152x.c
--- v1.2.2/linux/drivers/scsi/aha152x.c	Wed Mar 29 06:52:58 1995
+++ linux/drivers/scsi/aha152x.c	Tue Mar 28 14:33:31 1995
@@ -223,7 +223,7 @@
 /* DEFINES */
 
 /* For PCMCIA cards, always use AUTOCONF */
-#ifdef PCMCIA
+#if defined(PCMCIA) || defined(MODULE)
 #define AUTOCONF
 #endif
 
diff -u --recursive --new-file v1.2.2/linux/drivers/scsi/st.c linux/drivers/scsi/st.c
--- v1.2.2/linux/drivers/scsi/st.c	Sun Feb 19 10:27:21 1995
+++ linux/drivers/scsi/st.c	Wed Mar 29 06:51:54 1995
@@ -251,6 +251,7 @@
   Scsi_Cmnd *SCpnt;
   Scsi_Tape *STp = &(scsi_tapes[dev]);
   unsigned char cmd[10];
+  unsigned int flags;
 
   cmd[0] = SPACE;
   cmd[1] = 0x01; /* Space FileMarks */
@@ -264,7 +265,12 @@
 	      (void *) cmd, (void *) (STp->buffer)->b_data, 0,
 	      st_sleep_done, ST_TIMEOUT, MAX_RETRIES);
 
+  /* need to do the check with interrupts off. -RAB */
+  save_flags(flags);
+  cli();
   if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+  restore_flags(flags);
+  
   SCpnt->request.dev = -1;
   if ((STp->buffer)->last_result != 0) {
     printk("st%d: Backing over filemark failed.\n", dev);
@@ -283,6 +289,7 @@
 {
   int offset, transfer, blks;
   int result;
+  unsigned int flags;
   unsigned char cmd[10];
   Scsi_Cmnd *SCpnt;
   Scsi_Tape *STp = &(scsi_tapes[dev]);
@@ -327,8 +334,12 @@
 		 (void *) cmd, (STp->buffer)->b_data, transfer,
 		 st_sleep_done, ST_TIMEOUT, MAX_WRITE_RETRIES);
 
+    /* this must be done with interrupts off */
+    save_flags (flags);
+    cli();
     if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
-
+    restore_flags(flags);
+ 
     if ((STp->buffer)->last_result_fatal != 0) {
       printk("st%d: Error on flush.\n", dev);
       if ((SCpnt->sense_buffer[0] & 0x70) == 0x70 &&
@@ -406,6 +417,7 @@
 {
     int dev;
     unsigned short flags;
+    unsigned int processor_flags;
     int i;
     unsigned char cmd[10];
     Scsi_Cmnd * SCpnt;
@@ -459,7 +471,12 @@
                 0, st_sleep_done, ST_LONG_TIMEOUT,
 		MAX_READY_RETRIES);
 
+
+    /* this must be done with interrupts off */
+    save_flags (processor_flags);
+    cli();
     if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+    restore_flags(processor_flags);
 
     if ((SCpnt->sense_buffer[0] & 0x70) == 0x70 &&
 	(SCpnt->sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */
@@ -473,7 +490,13 @@
 		  0, st_sleep_done, ST_LONG_TIMEOUT,
 		  MAX_READY_RETRIES);
 
-      if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+
+    /* this must be done with interrupts off */
+    save_flags (processor_flags);
+    cli();
+    if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+    restore_flags(processor_flags);
+
       (STp->mt_status)->mt_fileno = STp->drv_block = 0;
       STp->eof = ST_NOEOF;
     }
@@ -509,7 +532,12 @@
                 (void *) cmd, (void *) (STp->buffer)->b_data,
 		6, st_sleep_done, ST_TIMEOUT, MAX_READY_RETRIES);
 
+
+    /* this must be done with interrupts off */
+    save_flags (processor_flags);
+    cli();
     if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+    restore_flags(processor_flags);
 
     if (!SCpnt->result && !SCpnt->sense_buffer[0]) {
       STp->max_block = ((STp->buffer)->b_data[1] << 16) |
@@ -539,7 +567,12 @@
                 (void *) cmd, (void *) (STp->buffer)->b_data,
                 12, st_sleep_done, ST_TIMEOUT, MAX_READY_RETRIES);
 
+
+    /* this must be done with interrupts off */
+    save_flags (processor_flags);
+    cli();
     if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+    restore_flags(flags);
 
     if ((STp->buffer)->last_result_fatal != 0) {
 #ifdef DEBUG
@@ -626,6 +659,7 @@
     static unsigned char cmd[10];
     Scsi_Cmnd * SCpnt;
     Scsi_Tape * STp;
+    unsigned int flags;
    
     dev = MINOR(inode->i_rdev);
     rewind = (dev & 0x80) == 0;
@@ -653,7 +687,13 @@
 		    (void *) cmd, (void *) (STp->buffer)->b_data,
 		    0, st_sleep_done, ST_TIMEOUT, MAX_WRITE_RETRIES);
 
+
+	/* this must be done with interrupts off */
+	save_flags (flags);
+	cli();
 	if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+	restore_flags(flags);
+
 
 	if ((STp->buffer)->last_result_fatal != 0) {
 	  SCpnt->request.dev = -1;  /* Mark as not busy */
@@ -710,6 +750,7 @@
     char *b_point;
     Scsi_Cmnd * SCpnt;
     Scsi_Tape * STp;
+    unsigned int flags;
 
     dev = MINOR(inode->i_rdev) & 127;
     STp = &(scsi_tapes[dev]);
@@ -813,7 +854,12 @@
 		   (void *) cmd, (STp->buffer)->b_data, transfer,
 		   st_sleep_done, ST_TIMEOUT, MAX_WRITE_RETRIES);
 
-      if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+
+	/* this must be done with interrupts off */
+	save_flags (flags);
+	cli();
+	if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+	restore_flags(flags);
 
       if ((STp->buffer)->last_result_fatal != 0) {
 #ifdef DEBUG
@@ -944,6 +990,7 @@
     static unsigned char cmd[10];
     Scsi_Cmnd * SCpnt;
     Scsi_Tape * STp;
+    unsigned int flags;
 
     dev = MINOR(inode->i_rdev) & 127;
     STp = &(scsi_tapes[dev]);
@@ -1019,7 +1066,12 @@
 		     (STp->buffer)->buffer_size,
 		     st_sleep_done, ST_TIMEOUT, MAX_RETRIES);
 
+
+	/* this must be done with interrupts off */
+	save_flags (flags);
+	cli();
 	if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+	restore_flags(flags);
 
 	(STp->buffer)->read_pointer = 0;
 	STp->eof_hit = 0;
@@ -1232,6 +1284,7 @@
    Scsi_Cmnd * SCpnt;
    Scsi_Tape * STp;
    int fileno, blkno, at_sm, undone, datalen;
+   unsigned int flags;
 
    dev = dev & 127;
    STp = &(scsi_tapes[dev]);
@@ -1551,7 +1604,13 @@
 	       (void *) cmd, (void *) (STp->buffer)->b_data, datalen,
 	       st_sleep_done, timeout, MAX_RETRIES);
 
-   if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+
+	/* this must be done with interrupts off */
+	save_flags (flags);
+	cli();
+	if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+	restore_flags(flags);
+
 
    ioctl_result = (STp->buffer)->last_result_fatal;
 
@@ -1676,6 +1735,7 @@
    unsigned char scmd[10];
    Scsi_Cmnd *SCpnt;
    Scsi_Tape *STp;
+   unsigned int flags;
 
    dev = dev & 127;
    STp = &(scsi_tapes[dev]);
@@ -1803,7 +1863,13 @@
 		 (void *) scmd, (void *) (STp->buffer)->b_data,
 		 20, st_sleep_done, ST_TIMEOUT, MAX_READY_RETRIES);
 
-     if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+
+	/* this must be done with interrupts off */
+	save_flags (flags);
+	cli();
+	if (SCpnt->request.dev == dev) sleep_on( &(STp->waiting) );
+	restore_flags(flags);
+
      
      if ((STp->buffer)->last_result_fatal != 0) {
        mt_pos.mt_blkno = (-1);
diff -u --recursive --new-file v1.2.2/linux/kernel/exit.c linux/kernel/exit.c
--- v1.2.2/linux/kernel/exit.c	Thu Mar  9 20:37:36 1995
+++ linux/kernel/exit.c	Thu Mar 30 15:54:00 1995
@@ -47,7 +47,7 @@
 	if (!p || sig > 32)
 		return -EINVAL;
 	if (!priv && ((sig != SIGCONT) || (current->session != p->session)) &&
-	    (current->euid != p->euid) && (current->uid != p->uid) && !suser())
+	    (current->euid != p->euid) && (current->euid != p->uid) && !suser())
 		return -EPERM;
 	if (!sig)
 		return 0;
