ALPHA-1.0
diff --git a/Makefile b/Makefile
index c806bf0..a1abd43 100644
--- a/Makefile
+++ b/Makefile
@@ -149,7 +149,7 @@
 	$(CC) $(CFLAGS) $(PROFILING) -c -o $*.o $<
 
 tools/system:	boot/head.o init/main.o tools/version.o linuxsubdirs
-	$(LD) $(LDFLAGS) -T 1000 boot/head.o init/main.o tools/version.o \
+	$(LD) $(LDFLAGS) -Ttext 1000 boot/head.o init/main.o tools/version.o \
 		$(ARCHIVES) \
 		$(FILESYSTEMS) \
 		$(DRIVERS) \
@@ -194,7 +194,7 @@
 	if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
 
 tools/zSystem:	boot/head.o init/main.o tools/version.o linuxsubdirs
-	$(LD) $(LDFLAGS) -T 100000 boot/head.o init/main.o tools/version.o \
+	$(LD) $(LDFLAGS) -Ttext 100000 boot/head.o init/main.o tools/version.o \
 		$(ARCHIVES) \
 		$(FILESYSTEMS) \
 		$(DRIVERS) \
diff --git a/README b/README
index 4e73bed..7a0d435 100644
--- a/README
+++ b/README
@@ -1,18 +1,18 @@
 
-	Linux kernel release 0.99 patchlevel 15
+	Linux kernel release 1.0
 
-These are the release notes for linux version 0.99.15.  Read them
-carefully, as they tell you what's new, explain how to install the
-kernel, and what to do if something goes wrong. 
+These are the release notes for linux version 1.0.  Read them carefully,
+as they tell you what's new, explain how to install the kernel, and what
+to do if something goes wrong. 
 
 INSTALLING the kernel:
 
- - if you install by patching, you need a *clean* 0.99.14 source tree,
+ - if you install by patching, you need a *clean* 0.99.15 source tree,
    which presumably exists in /usr/src/linux.  If so, to get the kernel
    patched, just do a
 
 		cd /usr/src
-		patch -p0 < linux-0.99.patch15
+		patch -p0 < linux-1.0.patch
 
    and you should be ok.  You may want to remove the backup files (xxx~
    or xxx.orig), and make sure that there are no failed patches (xxx# or
@@ -21,7 +21,7 @@
  - If you install the full sources, do a
 
 		cd /usr/src
-		tar xvf linux-0.99.15.tar
+		tar xvf linux-1.0.tar
 
    to get it all put in place.
 
diff --git a/config.in b/config.in
index a844923..85e19af 100644
--- a/config.in
+++ b/config.in
@@ -106,7 +106,7 @@
 *
 #bool 'Keyboard meta-key sends ESC-prefix' CONFIG_KBD_META y
 #bool 'Keyboard Num Lock on by default' CONFIG_KBD_NUML y
-bool 'Parallel printer support' CONFIG_PRINTER y
+bool 'Parallel printer support' CONFIG_PRINTER n
 bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
 bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE y
 if [ "$CONFIG_PSMOUSE" = "y" ]
@@ -114,7 +114,7 @@
 fi
 bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n
 bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n
-bool 'Selection (cut and paste for virtual consoles)' CONFIG_SELECTION y
+bool 'Selection (cut and paste for virtual consoles)' CONFIG_SELECTION n
 bool 'QIC-02 tape support' CONFIG_TAPE_QIC02 n
 bool 'QIC-117 tape support' CONFIG_FTAPE n
 if [ "$CONFIG_FTAPE" = "y" ]
diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c
index f7077d5..e412764 100644
--- a/drivers/net/3c509.c
+++ b/drivers/net/3c509.c
@@ -13,7 +13,7 @@
 	C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
 */
 
-static char *version = "3c509.c:pl15i 2/23/94 becker@super.org\n";
+static char *version = "3c509.c:pl15k 3/5/94 becker@super.org\n";
 
 #include <linux/config.h>
 #include <linux/kernel.h>
@@ -190,7 +190,7 @@
 
 	{
 		char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
-		printk("%s: 3c509 at %#3.3x	 tag %d, %s port, address ",
+		printk("%s: 3c509 at %#3.3x tag %d, %s port, address ",
 			   dev->name, dev->base_addr, current_tag, if_names[dev->if_port]);
 	}
 
@@ -477,10 +477,12 @@
 		if (++i > 10) {
 			printk("%s: Infinite loop in interrupt, status %4.4x.\n",
 				   dev->name, status);
+			/* Clear all interrupts we have handled. */
+			outw(0x68FF, ioaddr + EL3_CMD);
 			break;
 		}
-		/* Clear the other interrupts we have handled. */
-		outw(0x6899, ioaddr + EL3_CMD); /* Ack IRQ */
+		/* Acknowledge the IRQ. */
+		outw(0x6891, ioaddr + EL3_CMD); /* Ack IRQ */
 	}
 
 	if (el3_debug > 4) {
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 4eecd8b..72a8e0c 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -127,10 +127,12 @@
 static struct blist blacklist[] = 
 {
    {"DENON","DRD-25X","V"},   /* A cdrom that locks up when probed at lun != 0 */
-   {"MAXTOR","XT-3280","PR02"},  /* Locks-up when LUN>0 polled. */
-   {"MAXTOR","XT-4380S","B3C"},  /* Locks-up when LUN>0 polled. */
+   {"IMS", "CDD521/10","2.06"},   /* Locks-up when LUN>0 polled. */
+   {"MAXTOR","XT-3280","PR02"},   /* Locks-up when LUN>0 polled. */
+   {"MAXTOR","XT-4380S","B3C"},   /* Locks-up when LUN>0 polled. */
    {"MAXTOR","MXT-1240S","I1.2"}, /* Locks up when LUN > 0 polled */
-   {"MAXTOR","XT-4170S","B5A"},  /* Locks-up sometimes when LUN>0 polled. */
+   {"MAXTOR","XT-4170S","B5A"},   /* Locks-up sometimes when LUN>0 polled. */
+   {"MAXTOR","XT-8760S","B7B"},   /* guess what? */
    {"NEC","CD-ROM DRIVE:841","1.0"},  /* Locks-up when LUN>0 polled. */
    {"RODIME","RO3000S","2.33"},  /* Locks up if polled for lun != 0 */
    {"SEAGATE", "ST157N", "\004|j"}, /* causes failed REQUEST SENSE on lun 1 for aha152x
diff --git a/fs/buffer.c b/fs/buffer.c
index 1f63919..923343f 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -748,16 +748,14 @@
 	bh = create_buffers(address, size);
 	if (!bh)
 		return 0;
+	/* do any of the buffers already exist? punt if so.. */
 	p = b;
 	for (offset = 0 ; offset < PAGE_SIZE ; offset += size) {
 		block = *(p++);
 		if (!block)
 			goto not_aligned;
-		tmp = get_hash_table(dev, block, size);
-		if (tmp) {
-			brelse(tmp);
+		if (find_buffer(dev, block, size))
 			goto not_aligned;
-		}
 	}
 	tmp = bh;
 	p = b;
diff --git a/fs/ext2/CHANGES b/fs/ext2/CHANGES
index 08b7b64..433655e 100644
--- a/fs/ext2/CHANGES
+++ b/fs/ext2/CHANGES
@@ -1,3 +1,14 @@
+Changes from version 0.4b to version 0.5
+========================================
+	- New superblock fields: s_lastcheck and s_checkinterval added
+	  by Uwe Ohse <uwe@tirka.gun.de> to implement timedependent checks
+	  of the file system
+	- Real random numbers for secure rm added by Pierre del Perugia
+	  <delperug@gla.ecoledoc.ibp.fr>
+	- The mount warnings related to the state of a fs are not printed
+	  if the fs is mounted read-only, idea by Nick Holloway
+	  <alfie@dcs.warwick.ac.uk>
+
 Changes from version 0.4a to version 0.4b
 =========================================
 	- Copyrights changed to include the name of my laboratory.
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 82a9a97..1ceaf34 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -267,21 +267,21 @@
 static void ext2_setup_super (struct super_block * sb,
 			      struct ext2_super_block * es)
 {
-	if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
-		printk ("EXT2-fs warning: mounting unchecked fs, "
-			"running e2fsck is recommended\n");
-	else if ((sb->u.ext2_sb.s_mount_state & EXT2_ERROR_FS))
-		printk ("EXT2-fs warning: mounting fs with errors, "
-			"running e2fsck is recommended\n");
-	else if (es->s_max_mnt_count >= 0 &&
-	         es->s_mnt_count >= (unsigned short) es->s_max_mnt_count)
-		printk ("EXT2-fs warning: maximal mount count reached, "
-			"running e2fsck is recommended\n");
-	else if (es->s_checkinterval &&
-		(es->s_lastcheck + es->s_checkinterval <= CURRENT_TIME))
-		printk ("EXT2-fs warning: checktime reached, "
-			"running e2fsck is recommended\n");
 	if (!(sb->s_flags & MS_RDONLY)) {
+		if (!(sb->u.ext2_sb.s_mount_state & EXT2_VALID_FS))
+			printk ("EXT2-fs warning: mounting unchecked fs, "
+				"running e2fsck is recommended\n");
+		else if ((sb->u.ext2_sb.s_mount_state & EXT2_ERROR_FS))
+			printk ("EXT2-fs warning: mounting fs with errors, "
+				"running e2fsck is recommended\n");
+		else if (es->s_max_mnt_count >= 0 &&
+		         es->s_mnt_count >= (unsigned short) es->s_max_mnt_count)
+			printk ("EXT2-fs warning: maximal mount count reached, "
+				"running e2fsck is recommended\n");
+		else if (es->s_checkinterval &&
+			(es->s_lastcheck + es->s_checkinterval <= CURRENT_TIME))
+			printk ("EXT2-fs warning: checktime reached, "
+				"running e2fsck is recommended\n");
 		es->s_state &= ~EXT2_VALID_FS;
 		if (!es->s_max_mnt_count)
 			es->s_max_mnt_count = EXT2_DFL_MAX_MNT_COUNT;
diff --git a/fs/proc/link.c b/fs/proc/link.c
index 2da00b0..a9a15d6 100644
--- a/fs/proc/link.c
+++ b/fs/proc/link.c
@@ -111,6 +111,10 @@
 	unsigned int dev,ino;
 	char buf[64];
 
+	if (!S_ISLNK(inode->i_mode)) {
+		iput(inode);
+		return -EINVAL;
+	}
 	i = proc_follow_link(NULL, inode, 0, 0, &inode);
 	if (i)
 		return i;
diff --git a/include/linux/ext2_fs.h b/include/linux/ext2_fs.h
index e6613e9..b73aa4f 100644
--- a/include/linux/ext2_fs.h
+++ b/include/linux/ext2_fs.h
@@ -52,8 +52,8 @@
 /*
  * The second extended file system version
  */
-#define EXT2FS_DATE		"94/01/08"
-#define EXT2FS_VERSION		"0.4b"
+#define EXT2FS_DATE		"94/03/10"
+#define EXT2FS_VERSION		"0.5"
 
 /*
  * Debug code
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index 03af7d5..2a7d91f 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -24,17 +24,17 @@
 
 extern inline void mark_bh(int nr)
 {
-	__asm__ __volatile__("btsl %1,%0":"=m" (bh_active):"ir" (nr));
+	__asm__ __volatile__("orl %1,%0":"=m" (bh_active):"ir" (1<<nr));
 }
 
 extern inline void disable_bh(int nr)
 {
-	__asm__ __volatile__("btcl %1,%0":"=m" (bh_mask):"ir" (nr));
+	__asm__ __volatile__("andl %1,%0":"=m" (bh_mask):"ir" (~(1<<nr)));
 }
 
 extern inline void enable_bh(int nr)
 {
-	__asm__ __volatile__("btsl %1,%0":"=m" (bh_mask):"ir" (nr));
+	__asm__ __volatile__("orl %1,%0":"=m" (bh_mask):"ir" (1<<nr));
 }
 
 #endif
diff --git a/kernel/traps.c b/kernel/traps.c
index 1303a25..707db91 100644
--- a/kernel/traps.c
+++ b/kernel/traps.c
@@ -101,12 +101,12 @@
 	printk("ds: %04x   es: %04x   fs: %04x   gs: %04x   ss: %04x\n",
 		regs->ds, regs->es, regs->fs, regs->gs, ss);
 	store_TR(i);
-	printk("Pid: %d, process nr: %d (%s)\nCode: ", current->pid, 0xffff & i, current->comm);
-	for(i=0;i<20;i++)
-		printk("%02x ",0xff & get_seg_byte(regs->cs,(i+(char *)regs->eip)));
-	printk("\nStack: ");
+	printk("Pid: %d, process nr: %d (%s)\nStack: ", current->pid, 0xffff & i, current->comm);
 	for(i=0;i<5;i++)
 		printk("%08lx ", get_seg_long(ss,(i+(unsigned long *)esp)));
+	printk("\nCode: ");
+	for(i=0;i<20;i++)
+		printk("%02x ",0xff & get_seg_byte(regs->cs,(i+(char *)regs->eip)));
 	printk("\n");
 	do_exit(SIGSEGV);
 }
diff --git a/mm/kmalloc.c b/mm/kmalloc.c
index e75fa20..e7a37b9 100644
--- a/mm/kmalloc.c
+++ b/mm/kmalloc.c
@@ -151,8 +151,14 @@
 	int order,tries,i,sz;
 	struct block_header *p;
 	struct page_descriptor *page;
+	extern unsigned long intr_count;
 
 /* Sanity check... */
+	if (intr_count && priority != GFP_ATOMIC) {
+		printk("kmalloc called nonatomically from interrupt %08lx\n",
+			((unsigned long *)&size)[-1]);
+		priority = GFP_ATOMIC;
+	}
 if (size > MAX_KMALLOC_K * 1024) 
      {
      printk ("kmalloc: I refuse to allocate %d bytes (for now max = %d).\n",
diff --git a/mm/swap.c b/mm/swap.c
index 885abf1..0a6dfb0 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -585,6 +585,7 @@
  */
 unsigned long __get_free_page(int priority)
 {
+	extern unsigned long intr_count;
 	unsigned long result, flag;
 	static unsigned long index = 0;
 
@@ -593,6 +594,11 @@
 	   sections of code have interrupts disabled. -RAB
 	   Is this code reentrant? */
 
+	if (intr_count && priority != GFP_ATOMIC) {
+		printk("gfp called nonatomically from interrupt %08lx\n",
+			((unsigned long *)&priority)[-1]);
+		priority = GFP_ATOMIC;
+	}
 	save_flags(flag);
 repeat:
 	REMOVE_FROM_MEM_QUEUE(free_page_list,nr_free_pages);
diff --git a/net/inet/ip.c b/net/inet/ip.c
index 944d1ed..f7f085d 100644
--- a/net/inet/ip.c
+++ b/net/inet/ip.c
@@ -1041,7 +1041,7 @@
  							len, len + hlen));
  
  		/* Allocate buffer. */
- 		if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len + hlen,GFP_KERNEL)) == NULL) 
+ 		if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len + hlen,GFP_ATOMIC)) == NULL) 
  		{
  			printk("IP: frag: no memory for new fragment!\n");
  			return;
diff --git a/net/inet/skbuff.c b/net/inet/skbuff.c
index 7de68d9..9409240 100644
--- a/net/inet/skbuff.c
+++ b/net/inet/skbuff.c
@@ -425,7 +425,15 @@
 
 struct sk_buff *alloc_skb(unsigned int size,int priority)
 {
-	struct sk_buff *skb=(struct sk_buff *)kmalloc(size,priority);
+	struct sk_buff *skb;
+	extern unsigned long intr_count;
+
+	if (intr_count && priority != GFP_ATOMIC) {
+		printk("alloc_skb called nonatomically from interrupt %08lx\n",
+			((unsigned long *)&size)[-1]);
+		priority = GFP_ATOMIC;
+	}
+	skb=(struct sk_buff *)kmalloc(size,priority);
 	if(skb==NULL)
 		return NULL;
 	skb->free= 2;	/* Invalid so we pick up forgetful users */
diff --git a/net/inet/sock.c b/net/inet/sock.c
index 356e607..d87d0c2 100644
--- a/net/inet/sock.c
+++ b/net/inet/sock.c
@@ -982,9 +982,13 @@
 	while(sk->state != TCP_CLOSE && current->timeout>0) {
 		interruptible_sleep_on(sk->sleep);
 		if (current->signal & ~current->blocked) {
+			break;
+#if 0
+			/* not working now - closes can't be restarted */
 			sti();
 			current->timeout=0;
 			return(-ERESTARTSYS);
+#endif
 		}
 	}
 	current->timeout=0;
@@ -1855,7 +1859,7 @@
   struct inet_protocol *p;
   int i;
 
-  printk("Swansea University Computer Society Net2Debugged [1.27]\n");
+  printk("Swansea University Computer Society Net2Debugged [1.30]\n");
   /* Set up our UNIX VFS major device. */
   if (register_chrdev(AF_INET_MAJOR, "af_inet", &inet_fops) < 0) {
 	printk("%s: cannot register major device %d!\n",
diff --git a/net/inet/tcp.c b/net/inet/tcp.c
index b29f444..fbd2e06 100644
--- a/net/inet/tcp.c
+++ b/net/inet/tcp.c
@@ -3602,99 +3602,25 @@
   sk->prot->queue_xmit(sk, dev, buff, 1);
 }
 
-/*
- * This routine probes a zero window.  It makes a copy of the first
- * packet in the write queue, but with just one byte of data.
- */
 void
 tcp_send_probe0(struct sock *sk)
 {
-  unsigned char *raw;
-  struct iphdr *iph;
-  struct sk_buff *skb2, *skb;
-  int len, hlen, data;
-  struct tcphdr *t1;
-  struct device *dev;
+	if (sk->zapped)
+		return;		/* Afer a valid reset we can send no more */
 
-  if (sk->zapped)
-	return;	/* Afer a valid reset we can send no more */
+	tcp_write_wakeup(sk);
 
-  if (sk -> state != TCP_ESTABLISHED && sk->state != TCP_CLOSE_WAIT &&
-      sk -> state != TCP_FIN_WAIT1 && sk->state != TCP_FIN_WAIT2)
-  	return;
-
-  skb = sk->wfront;
-  if (skb == NULL)
-        return;
-
-  dev = skb->dev;
-  /* I know this can't happen but as it does.. */
-  if(dev==NULL)
-    {
-      printk("tcp_send_probe0: NULL device bug!\n");
-      return;
-    }
-  IS_SKB(skb);
-
-  raw = skb->data;
-  iph = (struct iphdr *) (raw + dev->hard_header_len);
-
-  hlen = (iph->ihl * sizeof(unsigned long)) + dev->hard_header_len;
-  data = skb->len - hlen - sizeof(struct tcphdr);
-  len = hlen + sizeof(struct tcphdr) + (data ? 1 : 0);
- 	
-  /* Allocate buffer. */
-  if ((skb2 = alloc_skb(sizeof(struct sk_buff) + len, GFP_ATOMIC)) == NULL) {
-/*    printk("alloc failed raw %x th %x hlen %d data %d len %d\n",
-	   raw, skb->h.th, hlen, data, len); */
-    reset_timer (sk, TIME_PROBE0, 10);  /* try again real soon */
-    return;
-  }
-
-  skb2->arp = skb->arp;
-  skb2->len = len;
-  skb2->h.raw = (char *)(skb2->data);
- 
-  sk->wmem_alloc += skb2->mem_len;
- 
-  /* Copy the packet header into the new buffer. */
-  memcpy(skb2->h.raw, raw, len);
- 
-  skb2->h.raw += hlen;  /* it's now h.th -- pointer to the tcp header */
-  t1 = skb2->h.th;
- 
-/* source, dest, seq, from existing packet */
-  t1->ack_seq = ntohl(sk->acked_seq);
-  t1->res1 = 0;
-/* doff, fin, from existing packet.  Fin is safe because Linux always
- * sends fin in a separate packet
- * syn, rst, had better be zero in original */
-  t1->ack = 1;
-  t1->res2 = 0;
-  t1->window = ntohs(tcp_select_window(sk)/*sk->prot->rspace(sk)*/);
-  tcp_send_check(t1, sk->saddr, sk->daddr, len - hlen, sk);
-  /* Send it and free it.
-   * This will prevent the timer from automatically being restarted.
-   */
-  sk->prot->queue_xmit(sk, dev, skb2, 1);
-  sk->backoff++;
-  /*
-   * in the case of retransmissions, there's good reason to limit
-   * rto to 120 sec, as that's the maximum legal RTT on the Internet.
-   * For probes it could reasonably be longer.  However making it
-   * much longer could cause unacceptable delays in some situation,
-   * so we might as well use the same value
-   */
-  sk->rto = min(sk->rto << 1, 120*HZ);
-  reset_timer (sk, TIME_PROBE0, sk->rto);
-  sk->retransmits++;
-  sk->prot->retransmits ++;
+	sk->backoff++;
+	sk->rto = min(sk->rto << 1, 120*HZ);
+	reset_timer (sk, TIME_PROBE0, sk->rto);
+	sk->retransmits++;
+	sk->prot->retransmits ++;
 }
 
+
 /*
  *	Socket option code for TCP. 
- */
-  
+ */  
 int tcp_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen)
 {
 	int val,err;
diff --git a/zBoot/Makefile b/zBoot/Makefile
index ff34719..df21530 100644
--- a/zBoot/Makefile
+++ b/zBoot/Makefile
@@ -18,7 +18,7 @@
 all:	zSystem
 
 zSystem:	piggy.o $(zOBJECTS)
-		$(LD) $(LDFLAGS) -o zSystem -T 1000 $(zOBJECTS) piggy.o
+		$(LD) $(LDFLAGS) -o zSystem -Ttext 1000 $(zOBJECTS) piggy.o
 
 head.o:	head.s