## Automatically generated incremental diff
## From:   linux-2.5.69-bk19
## To:     linux-2.5.70
## Robot:  $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $

diff -urN linux-2.5.69-bk19/CREDITS linux-2.5.70/CREDITS
--- linux-2.5.69-bk19/CREDITS	2003-05-26 19:02:15.000000000 -0700
+++ linux-2.5.70/CREDITS	2003-05-26 19:02:20.000000000 -0700
@@ -1963,7 +1963,8 @@
 E: pavel@ucw.cz
 E: pavel@suse.cz
 D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
-D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB
+D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
+D: work on suspend-to-ram/disk, killing duplicates from ioctl32
 S: Volkova 1131
 S: 198 00 Praha 9
 S: Czech Republic
diff -urN linux-2.5.69-bk19/Documentation/DMA-API.txt linux-2.5.70/Documentation/DMA-API.txt
--- linux-2.5.69-bk19/Documentation/DMA-API.txt	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/Documentation/DMA-API.txt	2003-05-26 19:02:20.000000000 -0700
@@ -79,7 +79,7 @@
 int
 dma_set_mask(struct device *dev, u64 mask)
 int
-pci_dma_set_mask(struct pci_device *dev, u64 mask)
+pci_set_dma_mask(struct pci_device *dev, u64 mask)
 
 Checks to see if the mask is possible and updates the device
 parameters if it is.
diff -urN linux-2.5.69-bk19/Documentation/ide.txt linux-2.5.70/Documentation/ide.txt
--- linux-2.5.69-bk19/Documentation/ide.txt	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/Documentation/ide.txt	2003-05-26 19:02:20.000000000 -0700
@@ -230,6 +230,10 @@
  "hdx=cdrom"		: drive is present, and is a cdrom drive
  
  "hdx=cyl,head,sect"	: disk drive is present, with specified geometry
+
+ "hdx=remap"		: remap access of sector 0 to sector 1 (for EZD)
+
+ "hdx=remap63"		: remap the drive: shift all by 63 sectors (for DM)
  
  "hdx=autotune"		: driver will attempt to tune interface speed
 			  to the fastest PIO mode supported,
diff -urN linux-2.5.69-bk19/Documentation/ioctl-number.txt linux-2.5.70/Documentation/ioctl-number.txt
--- linux-2.5.69-bk19/Documentation/ioctl-number.txt	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/Documentation/ioctl-number.txt	2003-05-26 19:02:20.000000000 -0700
@@ -174,7 +174,7 @@
 0xA0	all	linux/sdp/sdp.h		Industrial Device Project
 					<mailto:kenji@bitgate.com>
 0xA2    00-0F   DVD decoder driver      in development:
-                                        <http://linuxtv.org/dvd/api/>
+                                        <http://linuxtv.org/developer/dvdapi.html>
 0xA3	00-1F	Philips SAA7146 dirver	in development:
 					<mailto:Andreas.Beckmann@hamburg.sc.philips.com>
 0xA3	80-8F	Port ACL		in development:
diff -urN linux-2.5.69-bk19/Documentation/kernel-parameters.txt linux-2.5.70/Documentation/kernel-parameters.txt
--- linux-2.5.69-bk19/Documentation/kernel-parameters.txt	2003-05-26 19:02:15.000000000 -0700
+++ linux-2.5.70/Documentation/kernel-parameters.txt	2003-05-26 19:02:20.000000000 -0700
@@ -361,9 +361,10 @@
 
 	noirqbalance	[IA-32,SMP,KNL] Disable kernel irq balancing
 
-	i8042_direct	[HW] Non-translated mode
-	i8042_dumbkbd
-	i8042_noaux
+	i8042_direct	[HW] Keyboard has been put into non-translated mode 
+			by BIOS
+	i8042_dumbkbd	[HW] Don't attempt to blink the leds
+	i8042_noaux	[HW] Don't check for auxiliary (== mouse) port
 	i8042_nomux
 	i8042_reset	[HW] Reset the controller during init and cleanup
 	i8042_unlock	[HW] Unlock (ignore) the keylock
diff -urN linux-2.5.69-bk19/Documentation/networking/NAPI_HOWTO.txt linux-2.5.70/Documentation/networking/NAPI_HOWTO.txt
--- linux-2.5.69-bk19/Documentation/networking/NAPI_HOWTO.txt	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/Documentation/networking/NAPI_HOWTO.txt	2003-05-26 19:02:20.000000000 -0700
@@ -218,7 +218,7 @@
 interrupt processor:
 
 ------------------
-static void
+static irqreturn_t
 netdevice_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 
@@ -228,9 +228,9 @@
 	int work_count = my_work_count;
         status = read_interrupt_status_reg();
         if (status == 0)
-                return;         /* Shared IRQ: not us */
+                return IRQ_NONE; /* Shared IRQ: not us */
         if (status == 0xffff)
-                return;         /* Hot unplug */
+                return IRQ_HANDLED;      /* Hot unplug */
         if (status & error)
 		do_some_error_handling()
         
@@ -262,7 +262,7 @@
 		status = read_interrupt_status_reg();
 
 	} while (!(status & error) || more_work_to_be_done);
-
+	return IRQ_HANDLED;
 }
 
 ----------------------------------------------------------------------
@@ -270,7 +270,7 @@
 We now change this to what is shown below to NAPI-enable it:
 
 ----------------------------------------------------------------------
-static void
+static irqreturn_t
 netdevice_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct net_device *dev = (struct net_device *)dev_instance;
@@ -278,9 +278,9 @@
 
         status = read_interrupt_status_reg();
         if (status == 0)
-                return;         /* Shared IRQ: not us */
+                return IRQ_NONE;         /* Shared IRQ: not us */
         if (status == 0xffff)
-                return;         /* Hot unplug */
+                return IRQ_HANDLED;         /* Hot unplug */
         if (status & error)
 		do_some_error_handling();
         
@@ -325,7 +325,7 @@
 /************************ start note *********************************/		
 	} while (!(status & error) || more_work_to_be_done(status));
 /************************ end note note *********************************/		
-
+	return IRQ_HANDLED;
 }
 
 ---------------------------------------------------------------------
@@ -430,7 +430,7 @@
 -------------------------------------------------------------------
 
 /* this is called by the network core */
-static void my_poll (struct net_device *dev, int *budget)
+static int my_poll (struct net_device *dev, int *budget)
 {
 
 	struct my_private *tp = (struct my_private *)dev->priv;
@@ -461,7 +461,7 @@
                 if ((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
                     (!(rx_status & RxStatusOK))) {
                         netdrv_rx_err (rx_status, dev, tp, ioaddr);
-                        return;
+                        return 1;
                 }
 
 /************************ note note *********************************/		
diff -urN linux-2.5.69-bk19/MAINTAINERS linux-2.5.70/MAINTAINERS
--- linux-2.5.69-bk19/MAINTAINERS	2003-05-26 19:02:15.000000000 -0700
+++ linux-2.5.70/MAINTAINERS	2003-05-26 19:02:20.000000000 -0700
@@ -838,6 +838,13 @@
 W:	http://www.linuxia64.org/
 S:	Maintained
 
+SN-IA64 (Itanium) SUB-PLATFORM
+P:	John Hesterberg
+M:	jh@sgi.com
+L:	linux-ia64@linuxia64.org
+W:	http://www.sgi.com/altix
+S:	Maintained
+
 IBM MCA SCSI SUBSYSTEM DRIVER
 P:	Michael Lang
 M:	langa2@kph.uni-mainz.de
diff -urN linux-2.5.69-bk19/Makefile linux-2.5.70/Makefile
--- linux-2.5.69-bk19/Makefile	2003-05-26 19:02:15.000000000 -0700
+++ linux-2.5.70/Makefile	2003-05-26 19:02:20.000000000 -0700
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 5
-SUBLEVEL = 69
-EXTRAVERSION = -bk19
+SUBLEVEL = 70
+EXTRAVERSION =
 
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
diff -urN linux-2.5.69-bk19/arch/i386/boot/setup.S linux-2.5.70/arch/i386/boot/setup.S
--- linux-2.5.69-bk19/arch/i386/boot/setup.S	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/arch/i386/boot/setup.S	2003-05-26 19:02:20.000000000 -0700
@@ -893,6 +893,9 @@
 	movw	%cs, %si
 	subw	$DELTA_INITSEG, %si
 	shll	$4, %esi			# Convert to 32-bit pointer
+
+# jump to startup_32 in arch/i386/kernel/head.S
+#	
 # NOTE: For high loaded big kernels we need a
 #	jmpi    0x100000,__BOOT_CS
 #
diff -urN linux-2.5.69-bk19/arch/i386/kernel/apic.c linux-2.5.70/arch/i386/kernel/apic.c
--- linux-2.5.69-bk19/arch/i386/kernel/apic.c	2003-05-26 19:02:15.000000000 -0700
+++ linux-2.5.70/arch/i386/kernel/apic.c	2003-05-26 19:02:20.000000000 -0700
@@ -38,6 +38,8 @@
 
 #include "io_ports.h"
 
+static void apic_pm_activate(void);
+
 void __init apic_intr_init(void)
 {
 #ifdef CONFIG_SMP
@@ -453,6 +455,7 @@
 
 	if (nmi_watchdog == NMI_LOCAL_APIC)
 		setup_apic_nmi_watchdog();
+	apic_pm_activate();
 }
 
 #ifdef CONFIG_PM
@@ -589,7 +592,7 @@
 
 #else	/* CONFIG_PM */
 
-static inline void apic_pm_activate(void) { }
+static void apic_pm_activate(void) { }
 
 #endif	/* CONFIG_PM */
 
diff -urN linux-2.5.69-bk19/arch/i386/kernel/trampoline.S linux-2.5.70/arch/i386/kernel/trampoline.S
--- linux-2.5.69-bk19/arch/i386/kernel/trampoline.S	2003-05-04 16:53:13.000000000 -0700
+++ linux-2.5.70/arch/i386/kernel/trampoline.S	2003-05-26 19:02:20.000000000 -0700
@@ -4,6 +4,8 @@
  *
  *	4 Jan 1997 Michael Chastain: changed to gnu as.
  *
+ *	This is only used for booting secondary CPUs in SMP machine
+ *
  *	Entry: CS:IP point to the start of our code, we are 
  *	in real mode with no stack, but the rest of the 
  *	trampoline page to make our stack and everything else
diff -urN linux-2.5.69-bk19/arch/m68knommu/Kconfig linux-2.5.70/arch/m68knommu/Kconfig
--- linux-2.5.69-bk19/arch/m68knommu/Kconfig	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/Kconfig	2003-05-26 19:02:21.000000000 -0700
@@ -695,6 +695,14 @@
 	help
 	  Use a fast secondary clock to produce profiling information.
 
+config BOOTPARAM
+	bool 'Compiled-in Kernel Boot Parameter'
+
+config BOOTPARAM_STRING 
+	string 'Kernel Boot Parameter'
+	default 'console=ttyS0,19200'
+	depends on BOOTPARAM
+
 config DUMPTOFLASH
 	bool "Panic/Dump to FLASH"
 	depends on COLDFIRE
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68328/ints.c linux-2.5.70/arch/m68knommu/platform/68328/ints.c
--- linux-2.5.69-bk19/arch/m68knommu/platform/68328/ints.c	2003-05-04 16:53:09.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68328/ints.c	2003-05-26 19:02:21.000000000 -0700
@@ -30,8 +30,6 @@
 #include <asm/MC68VZ328.h>
 #endif
 
-#define INTERNAL_IRQS (32)
-
 /* assembler routines */
 asmlinkage void system_call(void);
 asmlinkage void buserr(void);
@@ -64,7 +62,7 @@
 asmlinkage void trap45(void);
 asmlinkage void trap46(void);
 asmlinkage void trap47(void);
-asmlinkage void bad_interrupt(void);
+asmlinkage void bad_interrupt(int, void *, struct pt_regs *);
 asmlinkage void inthandler(void);
 asmlinkage void inthandler1(void);
 asmlinkage void inthandler2(void);
@@ -76,50 +74,49 @@
 
 extern e_vector *_ramvec;
 
+/* The number of spurious interrupts */
+volatile unsigned int num_spurious;
+unsigned int local_irq_count[NR_CPUS];
+
 /* irq node variables for the 32 (potential) on chip sources */
-static irq_node_t *int_irq_list[INTERNAL_IRQS];
+static irq_node_t int_irq_list[NR_IRQS];
 
-static int int_irq_count[INTERNAL_IRQS];
-static short int_irq_ablecount[INTERNAL_IRQS];
+asm ("
+	.global _start, __ramend
+	.section .romvec
+ 
+e_vectors:
+	.long __ramend-4, _start, buserr, trap, trap, trap, trap, trap
+	.long trap, trap, trap, trap, trap, trap, trap, trap
+	.long trap, trap, trap, trap, trap, trap, trap, trap
+	.long trap, trap, trap, trap
+	.long trap, trap, trap, trap
+	/*.long inthandler, inthandler, inthandler, inthandler
+	.long inthandler4, inthandler, inthandler, inthandler   */
+	/* TRAP #0-15 */
+	.long system_call, trap, trap, trap, trap, trap, trap, trap
+	.long trap, trap, trap, trap, trap, trap, trap, trap
+	.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+	.text
 
-static void int_badint(int irq, void *dev_id, struct pt_regs *fp)
-{
-	num_spurious += 1;
-}
+ignore: rte
+
+");
 
 /*
  * This function should be called during kernel startup to initialize
- * the amiga IRQ handling routines.
+ * the IRQ handling routines.
  */
-void M68328_init_IRQ(void)
+void init_IRQ(void)
 {
 	int i;
 
 	/* set up the vectors */
-
-#ifdef CONFIG_DRAGON2
-	for (i=2; i < 32; ++i)
-                _ramvec[i] = bad_interrupt;
-
-	_ramvec[2] = buserr;
-	_ramvec[3] = trap3;
-	_ramvec[4] = trap4;
-	_ramvec[5] = trap5;
-	_ramvec[6] = trap6;
-	_ramvec[7] = trap7;
-	_ramvec[8] = trap8;
-	_ramvec[9] = trap9;
-	_ramvec[10] = trap10;
-	_ramvec[11] = trap11;
-	_ramvec[12] = trap12;
-	_ramvec[13] = trap13;
-	_ramvec[14] = trap14;
-	_ramvec[15] = trap15;
-#endif
+	for (i = 72; i < 256; ++i)
+		_ramvec[i] = (e_vector)bad_interrupt;
 
 	_ramvec[32] = system_call;
 
-	_ramvec[64] = bad_interrupt;
 	_ramvec[65] = inthandler1;
 	_ramvec[66] = inthandler2;
 	_ramvec[67] = inthandler3;
@@ -131,148 +128,85 @@
 	IVR = 0x40; /* Set DragonBall IVR (interrupt base) to 64 */
 
 	/* initialize handlers */
-	for (i = 0; i < INTERNAL_IRQS; i++) {
-		int_irq_list[i] = NULL;
-
-		int_irq_ablecount[i] = 0;
-		int_irq_count[i] = 0;
+	for (i = 0; i < NR_IRQS; i++) {
+		int_irq_list[i].handler = bad_interrupt;
+		int_irq_list[i].flags   = IRQ_FLG_STD;
+		int_irq_list[i].dev_id  = NULL;
+		int_irq_list[i].devname = NULL;
 	}
 
 	/* turn off all interrupts */
 	IMR = ~0;
 }
 
-void M68328_insert_irq(irq_node_t **list, irq_node_t *node)
-{
-	unsigned long flags;
-	irq_node_t *cur;
-
-	if (!node->dev_id)
-		printk("%s: Warning: dev_id of %s is zero\n",
-		       __FUNCTION__, node->devname);
-
-	local_irq_save(flags);
-
-	cur = *list;
-	while (cur) {
-		list = &cur->next;
-		cur = cur->next;
-	}
-
-	node->next = cur;
-	*list = node;
-
-	local_irq_restore(flags);
-}
-
-void M68328_delete_irq(irq_node_t **list, void *dev_id)
-{
-	unsigned long flags;
-	irq_node_t *node;
-
-	local_irq_save(flags);
-
-	for (node = *list; node; list = &node->next, node = *list) {
-		if (node->dev_id == dev_id) {
-			*list = node->next;
-			/* Mark it as free. */
-			node->handler = NULL;
-			local_irq_restore(flags);
-			return;
-		}
-	}
-	local_irq_restore(flags);
-	printk("%s: tried to remove invalid irq\n", __FUNCTION__);
-}
-
-int M68328_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
+int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
                          unsigned long flags, const char *devname, void *dev_id)
 {
-	if (irq >= INTERNAL_IRQS) {
+	if (irq >= NR_IRQS) {
 		printk ("%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
 		return -ENXIO;
 	}
 
-	if (!int_irq_list[irq]) {
-		int_irq_list[irq] = new_irq_node();
-		int_irq_list[irq]->flags   = IRQ_FLG_STD;
-	}
-
-	if (!(int_irq_list[irq]->flags & IRQ_FLG_STD)) {
-		if (int_irq_list[irq]->flags & IRQ_FLG_LOCK) {
+	if (!(int_irq_list[irq].flags & IRQ_FLG_STD)) {
+		if (int_irq_list[irq].flags & IRQ_FLG_LOCK) {
 			printk("%s: IRQ %d from %s is not replaceable\n",
-			       __FUNCTION__, irq, int_irq_list[irq]->devname);
+			       __FUNCTION__, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
 		if (flags & IRQ_FLG_REPLACE) {
 			printk("%s: %s can't replace IRQ %d from %s\n",
-			       __FUNCTION__, devname, irq, int_irq_list[irq]->devname);
+			       __FUNCTION__, devname, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
 	}
-	int_irq_list[irq]->handler = handler;
-	int_irq_list[irq]->flags   = flags;
-	int_irq_list[irq]->dev_id  = dev_id;
-	int_irq_list[irq]->devname = devname;
-
-	/* enable in the IMR */
-	if (!int_irq_ablecount[irq])
-		IMR &= ~(1<<irq);
+
+	int_irq_list[irq].handler = handler;
+	int_irq_list[irq].flags   = flags;
+	int_irq_list[irq].dev_id  = dev_id;
+	int_irq_list[irq].devname = devname;
+
+	IMR &= ~(1<<irq);
 
 	return 0;
 }
 
-void M68328_free_irq(unsigned int irq, void *dev_id)
+void free_irq(unsigned int irq, void *dev_id)
 {
-	if (irq >= INTERNAL_IRQS) {
+	if (irq >= NR_IRQS) {
 		printk ("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
-	if (int_irq_list[irq]->dev_id != dev_id)
+	if (int_irq_list[irq].dev_id != dev_id)
 		printk("%s: removing probably wrong IRQ %d from %s\n",
-		       __FUNCTION__, irq, int_irq_list[irq]->devname);
-	int_irq_list[irq]->handler = int_badint;
-	int_irq_list[irq]->flags   = IRQ_FLG_STD;
-	int_irq_list[irq]->dev_id  = NULL;
-	int_irq_list[irq]->devname = NULL;
+		       __FUNCTION__, irq, int_irq_list[irq].devname);
+
+	int_irq_list[irq].handler = bad_interrupt;
+	int_irq_list[irq].flags   = IRQ_FLG_STD;
+	int_irq_list[irq].dev_id  = NULL;
+	int_irq_list[irq].devname = NULL;
 
 	IMR |= 1<<irq;
 }
 
-/*
- * Enable/disable a particular machine specific interrupt source.
- * Note that this may affect other interrupts in case of a shared interrupt.
- * This function should only be called for a _very_ short time to change some
- * internal data, that may not be changed by the interrupt at the same time.
- * int_(enable|disable)_irq calls may also be nested.
- */
-void M68328_enable_irq(unsigned int irq)
+int show_interrupts(struct seq_file *p, void *v)
 {
-	if (irq >= INTERNAL_IRQS) {
-		printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
-		return;
-	}
-
-	if (--int_irq_ablecount[irq])
-		return;
-
-	/* enable the interrupt */
-	IMR &= ~(1<<irq);
-}
+	int i;
 
-void M68328_disable_irq(unsigned int irq)
-{
-	if (irq >= INTERNAL_IRQS) {
-		printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
-		return;
+	for (i = 0; i < NR_IRQS; i++) {
+		if (int_irq_list[i].flags & IRQ_FLG_STD)
+			continue;
+
+		seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
+		if (int_irq_list[i].flags & IRQ_FLG_LOCK)
+			seq_printf(p, "L ");
+		else
+			seq_printf(p, "  ");
+		seq_printf(p, "%s\n", int_irq_list[i].devname);
 	}
+	seq_printf(p, "   : %10u   spurious", num_spurious);
 
-	if (int_irq_ablecount[irq]++)
-		return;
-
-	/* disable the interrupt */
-	IMR |= 1<<irq;
+	return 0;
 }
 
 /* The 68k family did not have a good way to determine the source
@@ -281,7 +215,7 @@
  * into one vector and look in the blasted mask register...
  * This code is designed to be fast, almost constant time, not clean!
  */
-void M68328_do_irq(int vec, struct pt_regs *fp)
+void process_int(int vec, struct pt_regs *fp)
 {
 	int irq;
 	int mask;
@@ -332,9 +266,10 @@
 			irq++;
 		}
 
-		if (int_irq_list[irq] && int_irq_list[irq]->handler) {
-			int_irq_list[irq]->handler(irq, int_irq_list[irq]->dev_id, fp);
-			int_irq_count[irq]++;
+		kstat_cpu(0).irqs[irq]++;
+
+		if (int_irq_list[irq].handler) {
+			int_irq_list[irq].handler(irq, int_irq_list[irq].dev_id, fp);
 		} else {
 			printk("unregistered interrupt %d!\nTurning it off in the IMR...\n", irq);
 			IMR |= mask;
@@ -342,14 +277,3 @@
 		pend &= ~mask;
 	}
 }
-
-void config_M68328_irq(void)
-{
-	mach_default_handler = NULL;
-	mach_init_IRQ        = M68328_init_IRQ;
-	mach_request_irq     = M68328_request_irq;
-	mach_free_irq        = M68328_free_irq;
-	mach_enable_irq      = M68328_enable_irq;
-	mach_disable_irq     = M68328_disable_irq;
-	mach_process_int     = M68328_do_irq;
-}
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68EZ328/config.c linux-2.5.70/arch/m68knommu/platform/68EZ328/config.c
--- linux-2.5.69-bk19/arch/m68knommu/platform/68EZ328/config.c	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68EZ328/config.c	2003-05-26 19:02:21.000000000 -0700
@@ -126,6 +126,4 @@
   mach_hwclk           = NULL;
   mach_set_clock_mmss  = NULL;
   mach_reset           = BSP_reset;
-
-  config_M68328_irq();
 }
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/config.c linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/config.c
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/config.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/config.c	2003-05-26 19:02:21.000000000 -0700
@@ -10,7 +10,6 @@
  * for more details.
  */
 
-#include <stdarg.h>
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
@@ -27,20 +26,29 @@
 #include <asm/machdep.h>
 #include <asm/MC68VZ328.h>
 
-#define CLOCK_COMPARE (32768/HZ)
+#ifdef CONFIG_INIT_LCD
+#include "screen.h"
+#endif
+
+/* with a 33.16 MHz clock, this will give usec resolution to the time functions */
+#define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK
+#define CLOCK_PRE 7
+#define TICKS_PER_JIFFY 41450
 
-static void dragen2_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
+static void
+dragen2_sched_init(void (*timer_routine) (int, void *, struct pt_regs *))
 {
 	/* disable timer 1 */
 	TCTL = 0;
 
 	/* set ISR */
-	request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL);
+	if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL)) 
+		panic("Unable to attach timer interrupt\n");
 
-	/* Restart mode, Enable int, 32KHz */
-	TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ;
-	TPRER = 0;
-	TCMP = CLOCK_COMPARE-1; 
+	/* Restart mode, Enable int, Set clock source */
+	TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE;
+	TPRER = CLOCK_PRE;
+	TCMP = TICKS_PER_JIFFY;
 
 	/* Enable timer 1 */
 	TCTL |= TCTL_TEN;
@@ -48,104 +56,143 @@
 
 static void dragen2_tick(void)
 {
-  	/* Reset Timer1 */
+	/* Reset Timer1 */
 	TSTAT &= 0;
 }
 
 static unsigned long dragen2_gettimeoffset(void)
 {
-	unsigned long ticks, offset = 0;
+	unsigned long ticks = TCN, offset = 0;
 
-	ticks = TCN;
-
-	if (ticks > (CLOCK_COMPARE>>1)) {
-		/* check for pending interrupt */
-		if (ISR & (1<<TMR_IRQ_NUM))
-			offset = 1000000/HZ;
-	}
+	/* check for pending interrupt */
+	if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM)))
+		offset = 1000000 / HZ;
 
-	ticks = CLOCK_COMPARE - ticks;
-	ticks = (1000000/HZ * ticks) / CLOCK_COMPARE;
+	ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY;
 
 	return ticks + offset;
 }
 
-static void dragen2_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec)
+static void dragen2_gettod(int *year, int *mon, int *day, int *hour,
+						   int *min, int *sec)
 {
 	long now = RTCTIME;
 
 	*year = *mon = *day = 1;
-	*hour = (now>>24)%24;
-	*min = (now>>16)%60;
-	*sec = now%60;
+	*hour = (now >> 24) % 24;
+	*min = (now >> 16) % 60;
+	*sec = now % 60;
 }
 
 static void dragen2_reset(void)
 {
 	local_irq_disable();
-	asm volatile ("
-		movel #-1, 0xFFFFF304;
-		moveb #0, 0xFFFFF300;
-		moveal #0x04000000, %a0;
-		moveal 0(%a0), %sp;
-		moveal 4(%a0), %a0;
-		jmp (%a0);
-	");
+
+#ifdef CONFIG_INIT_LCD
+	PBDATA |= 0x20;				/* disable CCFL light */
+	PKDATA |= 0x4;				/* disable LCD controller */
+	LCKCON = 0;
+#endif
+
+	__asm__ __volatile__(
+		"reset\n\t"
+		"moveal #0x04000000, %a0\n\t"
+		"moveal 0(%a0), %sp\n\t"
+		"moveal 4(%a0), %a0\n\t"
+		"jmp (%a0)"
+	);
 }
 
 int dragen2_cs8900_setup(struct net_device *dev)
 {
-	/* Set the ETH hardware address from its flash monitor location */
-	memcpy(dev->dev_addr, (void *)0x400fffa, 6);
-        dev->irq = INT1_IRQ_NUM;
-	return dev->base_addr = 0x08000041;
+	static int nbdev = 0;
+
+	if (++nbdev == 1) {
+		/* Set the ETH hardware address from its flash monitor location */
+		memcpy(dev->dev_addr, (void *) 0x400fffa, 6);
+		dev->irq = INT1_IRQ_NUM;
+		return dev->base_addr = 0x08000041;
+	}
+	return 1;					/* no more interface */
 }
 
 static void init_hardware(void)
 {
+#if CONFIG_DIRECT_IO_ACCESS
+	SCR = 0x10;					/* allow user access to internal registers */
+#endif
+
 	/* CSGB Init */
 	CSGBB = 0x4000;
 	CSB = 0x1a1;
 
 	/* CS8900 init */
 	/* PK3: hardware sleep function pin, active low */
-	PKSEL |= PK(3);	/* select pin as I/O */
-	PKDIR |= PK(3);	/* select pin as output */
-	PKDATA |= PK(3);	/* set pin high */
+	PKSEL |= PK(3);				/* select pin as I/O */
+	PKDIR |= PK(3);				/* select pin as output */
+	PKDATA |= PK(3);			/* set pin high */
 
 	/* PF5: hardware reset function pin, active high */
-	PFSEL |= PF(5);	/* select pin as I/O */
-	PFDIR |= PF(5);	/* select pin as output */
-	PFDATA &= ~PF(5);	/* set pin low */
+	PFSEL |= PF(5);				/* select pin as I/O */
+	PFDIR |= PF(5);				/* select pin as output */
+	PFDATA &= ~PF(5);			/* set pin low */
 
 	/* cs8900 hardware reset */
 	PFDATA |= PF(5);
-	{ volatile int i; for (i = 0; i < 32000; ++i); }
+	{ int i; for (i = 0; i < 32000; ++i); }
 	PFDATA &= ~PF(5);
 
 	/* INT1 enable (cs8900 IRQ) */
-	PDPOL &= ~PD(1);	/* active high signal */
+	PDPOL &= ~PD(1);			/* active high signal */
 	PDIQEG &= ~PD(1);
-	PDIRQEN |= PD(1);	/* IRQ enabled */
+	PDIRQEN |= PD(1);			/* IRQ enabled */
 
 #ifdef CONFIG_68328_SERIAL_UART2
 	/* Enable RXD TXD port bits to enable UART2 */
-	PJSEL &= ~(PJ(5)|PJ(4));
+	PJSEL &= ~(PJ(5) | PJ(4));
+#endif
+
+#ifdef CONFIG_INIT_LCD
+	/* initialize LCD controller */
+	LSSA = (long) screen_bits;
+	LVPW = 0x14;
+	LXMAX = 0x140;
+	LYMAX = 0xef;
+	LRRA = 0;
+	LPXCD = 3;
+	LPICF = 0x08;
+	LPOLCF = 0;
+	LCKCON = 0x80;
+	PCPDEN = 0xff;
+	PCSEL = 0;
+
+	/* Enable LCD controller */
+	PKDIR |= 0x4;
+	PKSEL |= 0x4;
+	PKDATA &= ~0x4;
+
+	/* Enable CCFL backlighting circuit */
+	PBDIR |= 0x20;
+	PBSEL |= 0x20;
+	PBDATA &= ~0x20;
+
+	/* contrast control register */
+	PFDIR |= 0x1;
+	PFSEL &= ~0x1;
+	PWMR = 0x037F;
 #endif
 }
 
 void config_BSP(char *command, int len)
 {
 	printk("68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
-        command[0] = '\0'; /* no specific boot option */
+	command[0] = '\0';			/* no specific boot option */
 
 	init_hardware();
 
-	mach_sched_init      = dragen2_sched_init;
-	mach_tick            = dragen2_tick;
-	mach_gettimeoffset   = dragen2_gettimeoffset;
-	mach_reset           = dragen2_reset;
-	mach_gettod          = dragen2_gettod;
-
-	config_M68328_irq();
+	mach_sched_init = dragen2_sched_init;
+	mach_tick = dragen2_tick;
+	mach_gettimeoffset = dragen2_gettimeoffset;
+	mach_reset = dragen2_reset;
+	mach_gettod = dragen2_gettod;
 }
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_fixed.S linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_fixed.S
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_fixed.S	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_fixed.S	1969-12-31 16:00:00.000000000 -0800
@@ -1,159 +0,0 @@
-#include <linux/config.h>
-	
-	.global _start
-	.global _stext
-
-	.global _rambase
-	.global _ramvec
-	.global _ramstart
-	.global _ramend
-
-#ifdef CONFIG_INIT_LCD
-	.global splash_bits
-#endif
-
-	.data
-
-/*
- *      Set up the usable of RAM stuff. Size of RAM is determined then
- *      an initial stack set up at the end.
- */
-.align 4
-_ramvec:
-.long   0
-_rambase:
-.long   0
-_ramstart:
-.long   0
-_ramend:
-.long   0
-
-#ifdef CONFIG_INIT_LCD
-splash_bits:
-#include "bootlogo.rh"
-#endif
-	
-	.text
-_start:
-_stext:
-	movew	#0x2700,%sr
-	moveal  #__ramend-CONFIG_MEMORY_RESERVE*0x100000 - 0x10, %sp
-	movel	#0xffffffff, 0xfffff304	/* disable all interrupts */
-
-#ifdef CONFIG_RAMKERNEL
-	/* Copy me from ROM to RAM */
-	moveal	#__rom_start, %a0
-	moveal	#__ram_start, %a1
-	moveal	#__data_end, %a2
-
-	/* Copy %a0 to %a1 until %a1 == %a2 */
-2:	cmpal	%a1, %a2
-	beq	1f
-	movel	%a0@+, %a1@+
-	bra	2b
-1:
-        /* jump into the RAM copy */
-        jmp     ram_jump
-ram_jump:
-#endif
-
-#ifdef CONFIG_INIT_LCD
-	movel	#splash_bits, 0xfffffA00 /* LSSA */
-	moveb	#0x28,   0xfffffA05	/* LVPW */
-	movew	#0x280,  0xFFFFFa08	/* LXMAX */
-	movew	#0x1df,  0xFFFFFa0a	/* LYMAX */
-	moveb	#0,      0xfffffa29	/* LBAR */
-	moveb	#0,      0xfffffa25	/* LPXCD */
-	moveb	#0x08,   0xFFFFFa20	/* LPICF */
-	moveb	#0x01,   0xFFFFFA21	/* -ve pol */
-	moveb	#0x81,   0xfffffA27	/* LCKCON */
-	movew	#0xff00, 0xfffff412	/* LCD pins */
-#endif
-
-	moveq   #13, %d7                /* '\r' */
-	jsr putc
-	moveq   #10, %d7                /* '\n' */
-	jsr putc
-	moveq   #65, %d7                /* 'A' */
-	jsr putc
-
-	movew	#32767, %d0  /* PLL settle wait loop */
-1:	subq	#1, %d0
-	bne	1b
-
-	moveq   #66, %d7                /* 'B' */
-	jsr putc
-
-#ifndef CONFIG_RAMKERNEL
-	/* Copy data segment from ROM to RAM */
-	moveal	#_etext, %a0
-	moveal	#_sdata, %a1
-	moveal	#_edata, %a2
-
-	/* Copy %a0 to %a1 until %a1 == %a2 */
-2:	cmpal	%a1, %a2
-	beq	1f
-	movel	%a0@+, %a1@+
-	bra	2b
-1:
-#endif
-	moveq   #67, %d7                /* 'C' */
-	jsr putc
-
-	/* Initialize BSS segment to 0 */
-	moveal	#_sbss, %a0
-	moveal	#_ebss, %a1
-
-	/* Copy 0 to %a0 until %a0 == %a1 */
-2:	cmpal	%a0, %a1
-	beq	1f
-	clrl	%a0@+
-	bra	2b
-1:
-	moveq   #68, %d7                /* 'D' */
-	jsr putc
-
-        movel   #_sdata, %d0    
-        movel   %d0,    _rambase        
-        movel   #_ebss,  %d0
-        movel   %d0,    _ramstart
-	movel	#__ramend-CONFIG_MEMORY_RESERVE*0x100000, %d0
-	movel	%d0,	_ramend
-	movel	#__ramvec,	%d0
-	movel	%d0,	_ramvec
-	
-	moveq   #69, %d7                /* 'E' */
-	jsr putc
-
-/*
- * load the current task pointer and stack
- */
-	lea	init_thread_union, %a0
-	lea	0x2000(%a0), %sp
-
-	moveq   #70, %d7                /* 'F' */
-	jsr putc
-	moveq   #13, %d7                /* '\r' */
-	jsr putc
-	moveq   #10, %d7                /* '\n' */
-	jsr putc
-
-1:	jsr	start_kernel
-	bra	1b
-
-_exit:
-	bra	_exit
-
-putc:
-	moveb	%d7,0xfffff907
-1:
-	movew	0xfffff906, %d7
-	andw	#0x2000, %d7
-	beq	1b
-	rts
-
-	.data
-env:
-	.long	0
-	.text
-
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_himem.S linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_himem.S
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_himem.S	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_himem.S	1969-12-31 16:00:00.000000000 -0800
@@ -1 +0,0 @@
-#include "crt0_fixed.S"
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S	2003-05-26 19:02:21.000000000 -0700
@@ -1 +1,129 @@
-#include "crt0_fixed.S"
+#include <linux/config.h>
+
+#if defined(CONFIG_RAM32MB)
+#define	MEM_END	0x02000000	/* Memory size 32Mb */
+#elif defined(CONFIG_RAM16MB)
+#define	MEM_END	0x01000000	/* Memory size 16Mb */
+#else
+#define	MEM_END	0x00800000	/* Memory size 8Mb */
+#endif
+
+	.global	_start
+	.global _rambase
+	.global _ramvec
+	.global	_ramstart
+	.global	_ramend
+	
+.macro	PUTC CHAR
+	moveq	#\CHAR, %d7
+	jsr	putc
+.endm
+
+	.data
+
+/*
+ *	Set up the usable of RAM stuff
+ */
+_rambase:
+	.long	0
+_ramvec:
+	.long	0
+_ramstart:
+	.long	0
+_ramend:
+	.long	0
+
+	.text
+
+_start:
+
+/*
+ * Setup initial stack
+ */
+	/* disable all interrupts */
+	movew	#0x2700, %sr
+	movel	#-1, 0xfffff304
+	movel	#MEM_END-4, %sp
+
+	PUTC	'\r'
+	PUTC	'\n'
+	PUTC	'A'
+	PUTC	'B'
+
+/*
+ *	Determine end of RAM
+ */
+
+	movel	#MEM_END, %a0
+	movel	%a0, _ramend
+
+	PUTC	'C'
+
+/*
+ *	Move ROM filesystem above bss :-)
+ */
+
+	moveal	#_sbss, %a0			/* romfs at the start of bss */
+	moveal	#_ebss, %a1			/* Set up destination  */
+	movel	%a0, %a2			/* Copy of bss start */
+
+	movel	8(%a0), %d1			/* Get size of ROMFS */
+	addql	#8, %d1				/* Allow for rounding */
+	andl	#0xfffffffc, %d1	/* Whole words */
+
+	addl	%d1, %a0			/* Copy from end */
+	addl	%d1, %a1			/* Copy from end */
+	movel	%a1, _ramstart		/* Set start of ram */
+
+1:
+	movel	-(%a0), %d0			/* Copy dword */
+	movel	%d0, -(%a1)
+	cmpl	%a0, %a2			/* Check if at end */
+	bne	1b
+
+	PUTC	'D'
+
+/*
+ * Initialize BSS segment to 0
+ */
+
+	lea	_sbss, %a0
+	lea	_ebss, %a1
+
+	/* Copy 0 to %a0 until %a0 == %a1 */
+2:	cmpal	%a0, %a1
+	beq	1f
+	clrl	(%a0)+
+	bra	2b
+1:
+
+	PUTC	'E'
+
+/*
+ * Load the current task pointer and stack
+ */
+
+	lea	init_thread_union, %a0
+	lea	0x2000(%a0), %sp
+
+	PUTC	'F'
+	PUTC	'\r'
+	PUTC	'\n'
+
+/*
+ * Go
+ */
+
+	jmp	start_kernel
+
+/*
+ * Local functions
+ */
+ 
+putc:
+	moveb	%d7, 0xfffff907
+1:
+	movew	0xfffff906, %d7
+	andw	#0x2000, %d7
+	beq	1b
+	rts
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_rom.S linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_rom.S
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/de2/crt0_rom.S	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/de2/crt0_rom.S	1969-12-31 16:00:00.000000000 -0800
@@ -1 +0,0 @@
-#include "crt0_fixed.S"
diff -urN linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/ucdimm/config.c linux-2.5.70/arch/m68knommu/platform/68VZ328/ucdimm/config.c
--- linux-2.5.69-bk19/arch/m68knommu/platform/68VZ328/ucdimm/config.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/arch/m68knommu/platform/68VZ328/ucdimm/config.c	2003-05-26 19:02:21.000000000 -0700
@@ -114,6 +114,4 @@
 	mach_gettimeoffset   = BSP_gettimeoffset;
 	mach_gettod          = BSP_gettod;
 	mach_reset           = BSP_reset;
-
-	config_M68328_irq();
 }
diff -urN linux-2.5.69-bk19/arch/mips/baget/vacserial.c linux-2.5.70/arch/mips/baget/vacserial.c
--- linux-2.5.69-bk19/arch/mips/baget/vacserial.c	2003-05-04 16:53:33.000000000 -0700
+++ linux-2.5.70/arch/mips/baget/vacserial.c	2003-05-26 19:02:21.000000000 -0700
@@ -124,7 +124,7 @@
  * UART
  */
 static struct serial_uart_config uart_config[] = {
-        { "unknown",  1, 0 },  /* Must go first  --  used as unasigned */
+        { "unknown",  1, 0 },  /* Must go first  --  used as unassigned */
         { "VAC UART", 1, 0 }
 }; 
 #define VAC_UART_TYPE 1   /* Just index in above array */
diff -urN linux-2.5.69-bk19/arch/parisc/kernel/ioctl32.c linux-2.5.70/arch/parisc/kernel/ioctl32.c
--- linux-2.5.69-bk19/arch/parisc/kernel/ioctl32.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/parisc/kernel/ioctl32.c	2003-05-26 19:02:21.000000000 -0700
@@ -1785,443 +1785,6 @@
         return -EINVAL;
 }
 
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-/* Ugh, LVM. Pitty it was not cleaned up before accepted :((. */
-typedef struct {
-	uint8_t vg_name[NAME_LEN];
-	uint32_t vg_number;
-	uint32_t vg_access;
-	uint32_t vg_status;
-	uint32_t lv_max;
-	uint32_t lv_cur;
-	uint32_t lv_open;
-	uint32_t pv_max;
-	uint32_t pv_cur;
-	uint32_t pv_act;
-	uint32_t dummy;
-	uint32_t vgda;
-	uint32_t pe_size;
-	uint32_t pe_total;
-	uint32_t pe_allocated;
-	uint32_t pvg_total;
-	u32 proc;
-	u32 pv[ABS_MAX_PV + 1];
-	u32 lv[ABS_MAX_LV + 1];
-    	uint8_t vg_uuid[UUID_LEN+1];	/* volume group UUID */
-	uint8_t dummy1[200];
-} vg32_t;
-
-typedef struct {
-	uint8_t id[2];
-	uint16_t version;
-	lvm_disk_data_t pv_on_disk;
-	lvm_disk_data_t vg_on_disk;
-	lvm_disk_data_t pv_namelist_on_disk;
-	lvm_disk_data_t lv_on_disk;
-	lvm_disk_data_t pe_on_disk;
-	uint8_t pv_name[NAME_LEN];
-	uint8_t vg_name[NAME_LEN];
-	uint8_t system_id[NAME_LEN];
-	kdev_t pv_dev;
-	uint32_t pv_number;
-	uint32_t pv_status;
-	uint32_t pv_allocatable;
-	uint32_t pv_size;
-	uint32_t lv_cur;
-	uint32_t pe_size;
-	uint32_t pe_total;
-	uint32_t pe_allocated;
-	uint32_t pe_stale;
-	u32 pe;
-	u32 inode;
-	uint8_t pv_uuid[UUID_LEN+1];
-} pv32_t;
-
-typedef struct {
-	char lv_name[NAME_LEN];
-	u32 lv;
-} lv_req32_t;
-
-typedef struct {
-	u32 lv_index;
-	u32 lv;
-	/* Transfer size because user space and kernel space differ */
-	uint16_t size;
-} lv_status_byindex_req32_t;
-
-typedef struct {
-	compat_dev_t	dev;
-	u32		lv;
-} lv_status_bydev_req32_t;
-
-typedef struct {
-	uint8_t lv_name[NAME_LEN];
-	kdev_t old_dev;
-	kdev_t new_dev;
-	u32 old_pe;
-	u32 new_pe;
-} le_remap_req32_t;
-
-typedef struct {
-	char pv_name[NAME_LEN];
-	u32 pv;
-} pv_status_req32_t;
-
-typedef struct {
-	uint8_t lv_name[NAME_LEN];
-	uint8_t vg_name[NAME_LEN];
-	uint32_t lv_access;
-	uint32_t lv_status;
-	uint32_t lv_open;
-	kdev_t lv_dev;
-	uint32_t lv_number;
-	uint32_t lv_mirror_copies;
-	uint32_t lv_recovery;
-	uint32_t lv_schedule;
-	uint32_t lv_size;
-	u32 lv_current_pe;
-	uint32_t lv_current_le;
-	uint32_t lv_allocated_le;
-	uint32_t lv_stripes;
-	uint32_t lv_stripesize;
-	uint32_t lv_badblock;
-	uint32_t lv_allocation;
-	uint32_t lv_io_timeout;
-	uint32_t lv_read_ahead;
-	/* delta to version 1 starts here */
-	u32 lv_snapshot_org;
-	u32 lv_snapshot_prev;
-	u32 lv_snapshot_next;
-	u32 lv_block_exception;
-	uint32_t lv_remap_ptr;
-	uint32_t lv_remap_end;
-	uint32_t lv_chunk_size;
-	uint32_t lv_snapshot_minor;
-	char dummy[200];
-} lv32_t;
-
-typedef struct {
-	u32 hash[2];
-	u32 rsector_org;
-	kdev_t rdev_org;
-	u32 rsector_new;
-	kdev_t rdev_new;
-} lv_block_exception32_t;
-
-static void put_lv_t(lv_t *l)
-{
-	if (l->lv_current_pe) vfree(l->lv_current_pe);
-	if (l->lv_block_exception) vfree(l->lv_block_exception);
-	kfree(l);
-}
-
-static lv_t *get_lv_t(u32 p, int *errp)
-{
-	int err, i;
-	u32 ptr1, ptr2;
-	size_t size;
-	lv_block_exception32_t *lbe32;
-	lv_block_exception_t *lbe;
-	lv32_t *ul = (lv32_t *)A(p);
-	lv_t *l = (lv_t *) kmalloc(sizeof(lv_t), GFP_KERNEL);
-
-	if (!l) {
-		*errp = -ENOMEM;
-		return NULL;
-	}
-	memset(l, 0, sizeof(lv_t));
-	err = copy_from_user(l, ul, (long)&((lv32_t *)0)->lv_current_pe);
-	err |= __copy_from_user(&l->lv_current_le, &ul->lv_current_le,
-				((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
-	err |= __copy_from_user(&l->lv_remap_ptr, &ul->lv_remap_ptr,
-				((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
-	err |= __get_user(ptr1, &ul->lv_current_pe);
-	err |= __get_user(ptr2, &ul->lv_block_exception);
-	if (err) {
-		kfree(l);
-		*errp = -EFAULT;
-		return NULL;
-	}
-	if (ptr1) {
-		size = l->lv_allocated_le * sizeof(pe_t);
-		l->lv_current_pe = vmalloc(size);
-		if (l->lv_current_pe)
-			err = copy_from_user(l->lv_current_pe, (void *)A(ptr1), size);
-	}
-	if (!err && ptr2) {
-		size = l->lv_remap_end * sizeof(lv_block_exception_t);
-		l->lv_block_exception = lbe = vmalloc(size);
-		if (l->lv_block_exception) {
-			lbe32 = (lv_block_exception32_t *)A(ptr2);
-			memset(lbe, 0, size);
-			for (i = 0; i < l->lv_remap_end; i++, lbe++, lbe32++) {
-				err |= get_user(lbe->rsector_org, &lbe32->rsector_org);
-				err |= __get_user(lbe->rdev_org, &lbe32->rdev_org);
-				err |= __get_user(lbe->rsector_new, &lbe32->rsector_new);
-				err |= __get_user(lbe->rdev_new, &lbe32->rdev_new);
-			}
-		}
-	}
-	if (err || (ptr1 && !l->lv_current_pe) || (ptr2 && !l->lv_block_exception)) {
-		if (!err)
-			*errp = -ENOMEM;
-		else
-			*errp = -EFAULT;
-		put_lv_t(l);
-		return NULL;
-	}
-	return l;
-}
-
-static int copy_lv_t(u32 ptr, lv_t *l)
-{
-	int err;
-	lv32_t *ul = (lv32_t *)A(ptr);
-	u32 ptr1;
-	size_t size;
-
-	err = get_user(ptr1, &ul->lv_current_pe);
-	if (err)
-		return -EFAULT;
-	err = copy_to_user(ul, l, (long)&((lv32_t *)0)->lv_current_pe);
-	err |= __copy_to_user(&ul->lv_current_le, &l->lv_current_le,
-				((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
-	err |= __copy_to_user(&ul->lv_remap_ptr, &l->lv_remap_ptr,
-				((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
-	size = l->lv_allocated_le * sizeof(pe_t);
-	if (ptr1)
-		err |= __copy_to_user((void *)A(ptr1), l->lv_current_pe, size);
-	return err ? -EFAULT : 0;
-}
-
-static int do_lvm_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	vg_t *v = NULL;
-	union {
-		lv_req_t lv_req;
-		le_remap_req_t le_remap;
-		lv_status_byindex_req_t lv_byindex;
-	        lv_status_bydev_req_t lv_bydev;
-		pv_status_req_t pv_status;
-	} u;
-	pv_t p;
-	int err;
-	u32 ptr = 0;
-	int i;
-	mm_segment_t old_fs;
-	void *karg = &u;
-
-	switch (cmd) {
-	case VG_STATUS:
-		v = kmalloc(sizeof(vg_t), GFP_KERNEL);
-		if (!v)
-			return -ENOMEM;
-		karg = v;
-		break;
-
-	case VG_CREATE_OLD:
-	case VG_CREATE:
-		v = kmalloc(sizeof(vg_t), GFP_KERNEL);
-		if (!v)
-			return -ENOMEM;
-		if (copy_from_user(v, (void *)arg, (long)&((vg32_t *)0)->proc)) {
-			kfree(v);
-			return -EFAULT;
-		}
-		/* 'proc' field is unused, just NULL it out. */
-		v->proc = NULL;
-		if (copy_from_user(v->vg_uuid, ((vg32_t *)arg)->vg_uuid, UUID_LEN+1)) {
-			kfree(v);
-			return -EFAULT;
-		}
-		    
-		karg = v;
-		memset(v->pv, 0, sizeof(v->pv) + sizeof(v->lv));
-		if (v->pv_max > ABS_MAX_PV || v->lv_max > ABS_MAX_LV)
-			return -EPERM;
-		for (i = 0; i < v->pv_max; i++) {
-			err = __get_user(ptr, &((vg32_t *)arg)->pv[i]);
-			if (err)
-				break;
-			if (ptr) {
-				v->pv[i] = kmalloc(sizeof(pv_t), GFP_KERNEL);
-				if (!v->pv[i]) {
-					err = -ENOMEM;
-					break;
-				}
-				err = copy_from_user(v->pv[i], (void *)A(ptr),
-						     sizeof(pv32_t) - 8 - UUID_LEN+1);
-				if (err) {
-					err = -EFAULT;
-					break;
-				}
-				err = copy_from_user(v->pv[i]->pv_uuid,
-						     ((pv32_t *)A(ptr))->pv_uuid,
-						     UUID_LEN+1);
-				if (err) {
-				        err = -EFAULT;
-					break;
-				}
-
-				v->pv[i]->pe = NULL;
-				v->pv[i]->bd = NULL;
-			}
-		}
-		if (!err) {
-			for (i = 0; i < v->lv_max; i++) {
-				err = __get_user(ptr, &((vg32_t *)arg)->lv[i]);
-				if (err)
-					break;
-				if (ptr) {
-					v->lv[i] = get_lv_t(ptr, &err);
-					if (err)
-						break;
-				}
-			}
-		}
-		break;
-
-	case LV_CREATE:
-	case LV_EXTEND:
-	case LV_REDUCE:
-	case LV_REMOVE:
-	case LV_RENAME:
-	case LV_STATUS_BYNAME:
-	        err = copy_from_user(&u.pv_status, arg, sizeof(u.pv_status.pv_name));
-		if (err)
-			return -EFAULT;
-		if (cmd != LV_REMOVE) {
-			err = __get_user(ptr, &((lv_req32_t *)arg)->lv);
-			if (err)
-				return err;
-			u.lv_req.lv = get_lv_t(ptr, &err);
-		} else
-			u.lv_req.lv = NULL;
-		break;
-
-	case LV_STATUS_BYINDEX:
-		err = get_user(u.lv_byindex.lv_index,
-			       &((lv_status_byindex_req32_t *)arg)->lv_index);
-		err |= __get_user(ptr, &((lv_status_byindex_req32_t *)arg)->lv);
-		if (err)
-			return err;
-		u.lv_byindex.lv = get_lv_t(ptr, &err);
-		break;
-
-	case LV_STATUS_BYDEV:
-	        err = get_user(u.lv_bydev.dev, &((lv_status_bydev_req32_t *)arg)->dev);
-		err |= __get_user(ptr, &((lv_status_bydev_req32_t *)arg)->lv);
-		if (err)
-			return err;
-		u.lv_bydev.lv = get_lv_t(ptr, &err);
-		break;
-
-	case VG_EXTEND:
-		err = copy_from_user(&p, (void *)arg, sizeof(pv32_t) - 8 - UUID_LEN+1);
-		if (err)
-			return -EFAULT;
-		err = copy_from_user(p.pv_uuid, ((pv32_t *)arg)->pv_uuid, UUID_LEN+1);
-		if (err)
-			return -EFAULT;
-		p.pe = NULL;
-		p.bd = NULL;
-		karg = &p;
-		break;
-
-	case PV_CHANGE:
-	case PV_STATUS:
-		err = copy_from_user(&u.pv_status, arg, sizeof(u.lv_req.lv_name));
-		if (err)
-			return -EFAULT;
-		err = __get_user(ptr, &((pv_status_req32_t *)arg)->pv);
-		if (err)
-			return err;
-		u.pv_status.pv = &p;
-		if (cmd == PV_CHANGE) {
-			err = copy_from_user(&p, (void *)A(ptr),
-					     sizeof(pv32_t) - 8 - UUID_LEN+1);
-			if (err)
-				return -EFAULT;
-			p.pe = NULL;
-			p.bd = NULL;
-		}
-		break;
-	};
-
-        old_fs = get_fs(); set_fs (KERNEL_DS);
-        err = sys_ioctl (fd, cmd, (unsigned long)karg);
-        set_fs (old_fs);
-
-	switch (cmd) {
-	case VG_STATUS:
-		if (!err) {
-			if (copy_to_user((void *)arg, v, (long)&((vg32_t *)0)->proc) ||
-			    clear_user(&((vg32_t *)arg)->proc, sizeof(vg32_t) - (long)&((vg32_t *)0)->proc))
-				err = -EFAULT;
-		}
-		if (copy_to_user(((vg32_t *)arg)->vg_uuid, v->vg_uuid, UUID_LEN+1)) {
-		        err = -EFAULT;
-		}
-		kfree(v);
-		break;
-
-	case VG_CREATE_OLD:
-	case VG_CREATE:
-		for (i = 0; i < v->pv_max; i++) {
-			if (v->pv[i])
-				kfree(v->pv[i]);
-		}
-		for (i = 0; i < v->lv_max; i++) {
-			if (v->lv[i])
-				put_lv_t(v->lv[i]);
-		}
-		kfree(v);
-		break;
-
-	case LV_STATUS_BYNAME:
-		if (!err && u.lv_req.lv)
-			err = copy_lv_t(ptr, u.lv_req.lv);
-		/* Fall through */
-
-        case LV_CREATE:
-	case LV_EXTEND:
-	case LV_REDUCE:
-		if (u.lv_req.lv)
-			put_lv_t(u.lv_req.lv);
-		break;
-
-	case LV_STATUS_BYINDEX:
-		if (u.lv_byindex.lv) {
-			if (!err)
-				err = copy_lv_t(ptr, u.lv_byindex.lv);
-			put_lv_t(u.lv_byindex.lv);
-		}
-		break;
-
-	case LV_STATUS_BYDEV:
-	        if (u.lv_bydev.lv) {
-			if (!err)
-				err = copy_lv_t(ptr, u.lv_bydev.lv);
-			put_lv_t(u.lv_byindex.lv);
-	        }
-	        break;
-
-	case PV_STATUS:
-		if (!err) {
-			err = copy_to_user((void *)A(ptr), &p, sizeof(pv32_t) - 8 - UUID_LEN+1);
-			if (err)
-				return -EFAULT;
-			err = copy_to_user(((pv_t *)A(ptr))->pv_uuid, p.pv_uuid, UUID_LEN + 1);
-			if (err)
-				return -EFAULT;
-		}
-		break;
-	};
-
-	return err;
-}
-#endif
-
 #ifdef CONFIG_GENRTC
 #endif
 
@@ -3040,22 +2603,6 @@
 HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-HANDLE_IOCTL(VG_STATUS, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE_OLD, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(VG_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REMOVE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REDUCE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_RENAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYNAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYINDEX, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYDEV, do_lvm_ioctl)
-HANDLE_IOCTL(PV_CHANGE, do_lvm_ioctl)
-HANDLE_IOCTL(PV_STATUS, do_lvm_ioctl)
-#endif /* LVM */
 #if defined(CONFIG_GEN_RTC)
 COMPATIBLE_IOCTL(RTC_AIE_ON)
 COMPATIBLE_IOCTL(RTC_AIE_OFF)
diff -urN linux-2.5.69-bk19/arch/s390/defconfig linux-2.5.70/arch/s390/defconfig
--- linux-2.5.69-bk19/arch/s390/defconfig	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/arch/s390/defconfig	2003-05-26 19:02:21.000000000 -0700
@@ -19,6 +19,9 @@
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_EMBEDDED is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
 
 #
 # Loadable module support
@@ -162,6 +165,7 @@
 # CONFIG_IPV6_PRIVACY is not set
 # CONFIG_INET6_AH is not set
 # CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
 # CONFIG_XFRM_USER is not set
 
 #
@@ -228,6 +232,10 @@
 #
 # Ethernet (1000 Mbit)
 #
+
+#
+# Ethernet (10000 Mbit)
+#
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 
@@ -262,6 +270,7 @@
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 # CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
 CONFIG_JBD=y
 # CONFIG_JBD_DEBUG is not set
 CONFIG_FS_MBCACHE=y
@@ -292,6 +301,7 @@
 CONFIG_PROC_FS=y
 # CONFIG_DEVFS_FS is not set
 CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
 # CONFIG_TMPFS is not set
 CONFIG_RAMFS=y
 
diff -urN linux-2.5.69-bk19/arch/s390/kernel/compat_ioctl.c linux-2.5.70/arch/s390/kernel/compat_ioctl.c
--- linux-2.5.69-bk19/arch/s390/kernel/compat_ioctl.c	2003-05-04 16:53:34.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/compat_ioctl.c	2003-05-26 19:02:21.000000000 -0700
@@ -11,32 +11,57 @@
  *
  */
 
-#include <linux/types.h>
 #include <linux/compat.h>
+#include <linux/init.h>
+#include <linux/ioctl32.h>
 #include <linux/kernel.h>
-#include <linux/fs.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
-#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+
+#include <asm/ioctls.h>
+#include <asm/types.h>
+#include <asm/uaccess.h>
+
+#include <linux/blk.h>
+#include <linux/blkpg.h>
+#include <linux/cdrom.h>
+#include <linux/dm-ioctl.h>
+#include <linux/elevator.h>
 #include <linux/file.h>
-#include <linux/vt.h>
+#include <linux/fs.h>
+#include <linux/hdreg.h>
 #include <linux/kd.h>
+#include <linux/loop.h>
+#include <linux/lp.h>
+#include <linux/mtio.h>
 #include <linux/netdevice.h>
+#include <linux/nbd.h>
+#include <linux/ppp_defs.h>
+#include <linux/raid/md_u.h>
+#include <linux/random.h>
+#include <linux/raw.h>
 #include <linux/route.h>
+#include <linux/vt.h>
+#include <linux/watchdog.h>
+
+#include <linux/auto_fs.h>
+#include <linux/devfs_fs.h>
 #include <linux/ext2_fs.h>
-#include <linux/hdreg.h>
+#include <linux/smb_fs.h>
+
 #include <linux/if_bonding.h>
-#include <linux/blkpg.h>
-#include <linux/blk.h>
-#include <linux/dm-ioctl.h>
-#include <linux/loop.h>
-#include <linux/elevator.h>
-#include <asm/types.h>
-#include <asm/uaccess.h>
+#include <linux/if_ppp.h>
+#include <linux/if_pppox.h>
+#include <linux/if_tun.h>
+
+#include <scsi/scsi.h>
+#include <scsi/scsi_ioctl.h>
+#include <scsi/sg.h>
+
 #include <asm/dasd.h>
-#include <asm/tape390.h>
 #include <asm/sockios.h>
-#include <asm/ioctls.h>
+#include <asm/tape390.h>
 
 #include "compat_linux.h"
 
@@ -49,7 +74,8 @@
 	__u32		start;
 };  
 
-static inline int hd_geometry_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static inline int hd_geometry_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
+				    struct file *f)
 {
 	struct hd_geometry32 *hg32 = (struct hd_geometry32 *) A(arg);
 	struct hd_geometry hg;
@@ -112,7 +138,8 @@
         __u32	ifcbuf;
 };
 
-static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int dev_ifname32(unsigned int fd, unsigned int cmd,
+			unsigned long arg, struct file *f)
 {
 	struct ireq32 *uir32 = (struct ireq32 *) A(arg);
 	struct net_device *dev;
@@ -137,8 +164,8 @@
 	return 0;
 }
 
-static inline int dev_ifconf(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
+static int dev_ifconf(unsigned int fd, unsigned int cmd,
+		      unsigned long arg, struct file *f)
 {
 	struct ioconf32 *uifc32 = (struct ioconf32 *) A(arg);
 	struct ifconf32 ifc32;
@@ -202,7 +229,8 @@
 	return err;
 }
 
-static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg)
+static int bond_ioctl(unsigned int fd, unsigned int cmd,
+		      unsigned long arg, struct file *f)
 {
 	struct ifreq ifr;
 	mm_segment_t old_fs;
@@ -254,8 +282,8 @@
 	return err;
 }
 
-static inline int dev_ifsioc(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
+static int dev_ifsioc(unsigned int fd, unsigned int cmd,
+			     unsigned long arg, struct file *f)
 {
 	struct ifreq32 *uifr = (struct ifreq32 *) A(arg);
 	struct ifreq ifr;
@@ -335,7 +363,8 @@
 	unsigned short	rt_irtt;	/* Initial RTT			*/
 };
 
-static inline int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int routing_ioctl(unsigned int fd, unsigned int cmd,
+			 unsigned long arg, struct file *f)
 {
 	struct rtentry32 *ur = (struct rtentry32 *) A(arg);
 	struct rtentry r;
@@ -364,7 +393,8 @@
 	return ret;
 }
 
-static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int do_ext2_ioctl(unsigned int fd, unsigned int cmd,
+			 unsigned long arg, struct file *f)
 {
 	/* These are just misnamed, they actually get/put from/to user an int */
 	switch (cmd) {
@@ -392,7 +422,8 @@
 	char			reserved[4];
 };
 
-static int loop_status(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int loop_status(unsigned int fd, unsigned int cmd,
+		       unsigned long arg, struct file *f)
 {
 	mm_segment_t old_fs = get_fs();
 	struct loop_info l;
@@ -448,10 +479,12 @@
 	u32 data;
 };
                                 
-static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, struct blkpg_ioctl_arg32 *arg)
+static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd,
+			     unsigned long uarg, struct file *f)
 {
 	struct blkpg_ioctl_arg a;
 	struct blkpg_partition p;
+	struct blkpg_ioctl_arg32 *arg = (void*)A(uarg);
 	int err;
 	mm_segment_t old_fs = get_fs();
 	
@@ -541,7 +574,7 @@
 #define ICAZ90HARDRESET _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x12, 0)
 #define ICAZ90HARDERROR _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x13, 0)
 
-static int do_rsa_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int do_rsa_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg, struct file *f)
 {
 	mm_segment_t old_fs = get_fs();
 	int err = 0;
@@ -622,7 +655,8 @@
 	return err;
 }
 
-static int do_rsa_crt_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int do_rsa_crt_ioctl(unsigned int fd, unsigned int cmd,
+			    unsigned long arg, struct file *f)
 {
 	mm_segment_t old_fs = get_fs();
 	int err = 0;
@@ -745,7 +779,8 @@
 	return err;
 }
 
-static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg)
+static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg,
+		  struct file *f)
 {
 	mm_segment_t old_fs = get_fs();
 	int err;
@@ -759,216 +794,106 @@
 	return err;
 }
 
-struct ioctl32_handler {
-	unsigned int cmd;
-	int (*function)(unsigned int, unsigned int, unsigned long);
-};
-
-struct ioctl32_list {
-	struct ioctl32_handler handler;
-	struct ioctl32_list *next;
-};
-
-#define IOCTL32_DEFAULT(cmd)		{ { cmd, (void *) sys_ioctl }, 0 }
-#define IOCTL32_HANDLER(cmd, handler)	{ { cmd, (void *) handler }, 0 }
-
-static struct ioctl32_list ioctl32_handler_table[] = {
-	IOCTL32_DEFAULT(FIBMAP),
-	IOCTL32_DEFAULT(FIGETBSZ),
-
-	IOCTL32_DEFAULT(DASDAPIVER),
-	IOCTL32_DEFAULT(BIODASDDISABLE),
-	IOCTL32_DEFAULT(BIODASDENABLE),
-	IOCTL32_DEFAULT(BIODASDRSRV),
-	IOCTL32_DEFAULT(BIODASDRLSE),
-	IOCTL32_DEFAULT(BIODASDSLCK),
-	IOCTL32_DEFAULT(BIODASDINFO),
-	IOCTL32_DEFAULT(BIODASDFMT),
-
-	IOCTL32_DEFAULT(TAPE390_DISPLAY),
-
-	IOCTL32_DEFAULT(BLKROSET),
-	IOCTL32_DEFAULT(BLKROGET),
-	IOCTL32_DEFAULT(BLKRRPART),
-	IOCTL32_DEFAULT(BLKFLSBUF),
-	IOCTL32_DEFAULT(BLKRASET),
-	IOCTL32_DEFAULT(BLKFRASET),
-	IOCTL32_DEFAULT(BLKSECTSET),
-	IOCTL32_DEFAULT(BLKSSZGET),
-	IOCTL32_DEFAULT(BLKBSZGET),
-	IOCTL32_DEFAULT(BLKGETSIZE64),
-
-	IOCTL32_HANDLER(HDIO_GETGEO, hd_geometry_ioctl),
-
-	IOCTL32_DEFAULT(TCGETA),
-	IOCTL32_DEFAULT(TCSETA),
-	IOCTL32_DEFAULT(TCSETAW),
-	IOCTL32_DEFAULT(TCSETAF),
-	IOCTL32_DEFAULT(TCSBRK),
-	IOCTL32_DEFAULT(TCSBRKP),
-	IOCTL32_DEFAULT(TCXONC),
-	IOCTL32_DEFAULT(TCFLSH),
-	IOCTL32_DEFAULT(TCGETS),
-	IOCTL32_DEFAULT(TCSETS),
-	IOCTL32_DEFAULT(TCSETSW),
-	IOCTL32_DEFAULT(TCSETSF),
-	IOCTL32_DEFAULT(TIOCLINUX),
-
-	IOCTL32_DEFAULT(TIOCGETD),
-	IOCTL32_DEFAULT(TIOCSETD),
-	IOCTL32_DEFAULT(TIOCEXCL),
-	IOCTL32_DEFAULT(TIOCNXCL),
-	IOCTL32_DEFAULT(TIOCCONS),
-	IOCTL32_DEFAULT(TIOCGSOFTCAR),
-	IOCTL32_DEFAULT(TIOCSSOFTCAR),
-	IOCTL32_DEFAULT(TIOCSWINSZ),
-	IOCTL32_DEFAULT(TIOCGWINSZ),
-	IOCTL32_DEFAULT(TIOCMGET),
-	IOCTL32_DEFAULT(TIOCMBIC),
-	IOCTL32_DEFAULT(TIOCMBIS),
-	IOCTL32_DEFAULT(TIOCMSET),
-	IOCTL32_DEFAULT(TIOCPKT),
-	IOCTL32_DEFAULT(TIOCNOTTY),
-	IOCTL32_DEFAULT(TIOCSTI),
-	IOCTL32_DEFAULT(TIOCOUTQ),
-	IOCTL32_DEFAULT(TIOCSPGRP),
-	IOCTL32_DEFAULT(TIOCGPGRP),
-	IOCTL32_DEFAULT(TIOCSCTTY),
-	IOCTL32_DEFAULT(TIOCGPTN),
-	IOCTL32_DEFAULT(TIOCSPTLCK),
-	IOCTL32_DEFAULT(TIOCGSERIAL),
-	IOCTL32_DEFAULT(TIOCSSERIAL),
-	IOCTL32_DEFAULT(TIOCSERGETLSR),
-
-	IOCTL32_DEFAULT(FIOCLEX),
-	IOCTL32_DEFAULT(FIONCLEX),
-	IOCTL32_DEFAULT(FIOASYNC),
-	IOCTL32_DEFAULT(FIONBIO),
-	IOCTL32_DEFAULT(FIONREAD),
-
-	IOCTL32_DEFAULT(PIO_FONT),
-	IOCTL32_DEFAULT(GIO_FONT),
-	IOCTL32_DEFAULT(KDSIGACCEPT),
-	IOCTL32_DEFAULT(KDGETKEYCODE),
-	IOCTL32_DEFAULT(KDSETKEYCODE),
-	IOCTL32_DEFAULT(KIOCSOUND),
-	IOCTL32_DEFAULT(KDMKTONE),
-	IOCTL32_DEFAULT(KDGKBTYPE),
-	IOCTL32_DEFAULT(KDSETMODE),
-	IOCTL32_DEFAULT(KDGETMODE),
-	IOCTL32_DEFAULT(KDSKBMODE),
-	IOCTL32_DEFAULT(KDGKBMODE),
-	IOCTL32_DEFAULT(KDSKBMETA),
-	IOCTL32_DEFAULT(KDGKBMETA),
-	IOCTL32_DEFAULT(KDGKBENT),
-	IOCTL32_DEFAULT(KDSKBENT),
-	IOCTL32_DEFAULT(KDGKBSENT),
-	IOCTL32_DEFAULT(KDSKBSENT),
-	IOCTL32_DEFAULT(KDGKBDIACR),
-	IOCTL32_DEFAULT(KDSKBDIACR),
-	IOCTL32_DEFAULT(KDGKBLED),
-	IOCTL32_DEFAULT(KDSKBLED),
-	IOCTL32_DEFAULT(KDGETLED),
-	IOCTL32_DEFAULT(KDSETLED),
-	IOCTL32_DEFAULT(GIO_SCRNMAP),
-	IOCTL32_DEFAULT(PIO_SCRNMAP),
-	IOCTL32_DEFAULT(GIO_UNISCRNMAP),
-	IOCTL32_DEFAULT(PIO_UNISCRNMAP),
-	IOCTL32_DEFAULT(PIO_FONTRESET),
-	IOCTL32_DEFAULT(PIO_UNIMAPCLR),
-
-	IOCTL32_DEFAULT(VT_SETMODE),
-	IOCTL32_DEFAULT(VT_GETMODE),
-	IOCTL32_DEFAULT(VT_GETSTATE),
-	IOCTL32_DEFAULT(VT_OPENQRY),
-	IOCTL32_DEFAULT(VT_ACTIVATE),
-	IOCTL32_DEFAULT(VT_WAITACTIVE),
-	IOCTL32_DEFAULT(VT_RELDISP),
-	IOCTL32_DEFAULT(VT_DISALLOCATE),
-	IOCTL32_DEFAULT(VT_RESIZE),
-	IOCTL32_DEFAULT(VT_RESIZEX),
-	IOCTL32_DEFAULT(VT_LOCKSWITCH),
-	IOCTL32_DEFAULT(VT_UNLOCKSWITCH),
-
-	IOCTL32_DEFAULT(SIOCGSTAMP),
-
-	IOCTL32_DEFAULT(DM_VERSION),
-	IOCTL32_DEFAULT(DM_REMOVE_ALL),
-	IOCTL32_DEFAULT(DM_DEV_CREATE),
-	IOCTL32_DEFAULT(DM_DEV_REMOVE),
-	IOCTL32_DEFAULT(DM_DEV_RELOAD),
-	IOCTL32_DEFAULT(DM_DEV_SUSPEND),
-	IOCTL32_DEFAULT(DM_DEV_RENAME),
-	IOCTL32_DEFAULT(DM_DEV_DEPS),
-	IOCTL32_DEFAULT(DM_DEV_STATUS),
-	IOCTL32_DEFAULT(DM_TARGET_STATUS),
-	IOCTL32_DEFAULT(DM_TARGET_WAIT),
-
-	IOCTL32_DEFAULT(LOOP_SET_FD),
-	IOCTL32_DEFAULT(LOOP_CLR_FD),
-
-	IOCTL32_HANDLER(SIOCGIFNAME, dev_ifname32),
-	IOCTL32_HANDLER(SIOCGIFCONF, dev_ifconf),
-	IOCTL32_HANDLER(SIOCGIFFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMETRIC, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMETRIC, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMTU, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMTU, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMEM, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMEM, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFHWADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFHWADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCADDMULTI, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCDELMULTI, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFINDEX, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMAP, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMAP, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFBRDADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFBRDADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFDSTADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFDSTADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFNETMASK, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFNETMASK, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFPFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFPFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFTXQLEN, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFTXQLEN, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCADDRT, routing_ioctl),
-	IOCTL32_HANDLER(SIOCDELRT, routing_ioctl),
-
-	IOCTL32_HANDLER(SIOCBONDENSLAVE, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDRELEASE, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDSETHWADDR, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDSLAVEINFOQUERY, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDINFOQUERY, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDCHANGEACTIVE, bond_ioctl),
-
-	IOCTL32_HANDLER(EXT2_IOC32_GETFLAGS, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_SETFLAGS, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_GETVERSION, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_SETVERSION, do_ext2_ioctl),
-
-	IOCTL32_HANDLER(LOOP_SET_STATUS, loop_status),
-	IOCTL32_HANDLER(LOOP_GET_STATUS, loop_status),
-
-	IOCTL32_HANDLER(ICARSAMODEXPO, do_rsa_ioctl),
-	IOCTL32_HANDLER(ICARSACRT, do_rsa_crt_ioctl),
-	IOCTL32_HANDLER(ICARSAMODMULT, do_rsa_ioctl),
-	IOCTL32_DEFAULT(ICAZ90STATUS),
-	IOCTL32_DEFAULT(ICAZ90QUIESCE),
-	IOCTL32_DEFAULT(ICAZ90HARDRESET),
-	IOCTL32_DEFAULT(ICAZ90HARDERROR),
-
-	IOCTL32_HANDLER(BLKRAGET, w_long),
-	IOCTL32_HANDLER(BLKGETSIZE, w_long),
-	IOCTL32_HANDLER(BLKFRAGET, w_long),
-	IOCTL32_HANDLER(BLKSECTGET, w_long),
-	IOCTL32_HANDLER(BLKPG, blkpg_ioctl_trans)
+int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd,
+			 unsigned long arg, struct file *f)
+{
+	/* siocdevprivate cannot be emulated properly */
+	return -EINVAL;
+}
 
-};
+#define COMPATIBLE_IOCTL(cmd)		HANDLE_IOCTL((cmd), NULL)
+#define HANDLE_IOCTL(cmd,handler)	{ (cmd), (handler), NULL },
+#define IOCTL_TABLE_START \
+	struct ioctl_trans ioctl_start[] = {
+#define IOCTL_TABLE_END \
+	}; struct ioctl_trans ioctl_end[0];
+
+IOCTL_TABLE_START
+#include <linux/compat_ioctl.h>
+
+COMPATIBLE_IOCTL(DASDAPIVER)
+COMPATIBLE_IOCTL(BIODASDDISABLE)
+COMPATIBLE_IOCTL(BIODASDENABLE)
+COMPATIBLE_IOCTL(BIODASDRSRV)
+COMPATIBLE_IOCTL(BIODASDRLSE)
+COMPATIBLE_IOCTL(BIODASDSLCK)
+COMPATIBLE_IOCTL(BIODASDINFO)
+COMPATIBLE_IOCTL(BIODASDFMT)
+
+COMPATIBLE_IOCTL(TAPE390_DISPLAY)
+COMPATIBLE_IOCTL(BLKRASET)
+COMPATIBLE_IOCTL(BLKFRASET)
+COMPATIBLE_IOCTL(BLKBSZGET)
+COMPATIBLE_IOCTL(BLKGETSIZE64)
+
+HANDLE_IOCTL(HDIO_GETGEO, hd_geometry_ioctl)
+
+COMPATIBLE_IOCTL(TCSBRKP)
+
+COMPATIBLE_IOCTL(TIOCGSERIAL)
+COMPATIBLE_IOCTL(TIOCSSERIAL)
+
+COMPATIBLE_IOCTL(SIOCGSTAMP)
+
+HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
+HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
+HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFMETRIC, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFMETRIC, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFMTU, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFMTU, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFMEM, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFMEM, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFHWADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFHWADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCADDMULTI, dev_ifsioc)
+HANDLE_IOCTL(SIOCDELMULTI, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFINDEX, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFMAP, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFMAP, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFBRDADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFBRDADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFDSTADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFDSTADDR, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFNETMASK, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFNETMASK, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
+HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
+HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
+HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
+HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
+HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDSETHWADDR, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDSLAVEINFOQUERY, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDINFOQUERY, bond_ioctl)
+HANDLE_IOCTL(SIOCBONDCHANGEACTIVE, bond_ioctl)
+
+HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
+HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
+HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
+HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
+
+HANDLE_IOCTL(LOOP_SET_STATUS, loop_status)
+HANDLE_IOCTL(LOOP_GET_STATUS, loop_status)
+
+HANDLE_IOCTL(ICARSAMODEXPO, do_rsa_ioctl)
+HANDLE_IOCTL(ICARSACRT, do_rsa_crt_ioctl)
+HANDLE_IOCTL(ICARSAMODMULT, do_rsa_ioctl)
+
+COMPATIBLE_IOCTL(ICAZ90STATUS)
+COMPATIBLE_IOCTL(ICAZ90QUIESCE)
+COMPATIBLE_IOCTL(ICAZ90HARDRESET)
+COMPATIBLE_IOCTL(ICAZ90HARDERROR)
+
+HANDLE_IOCTL(BLKRAGET, w_long)
+HANDLE_IOCTL(BLKGETSIZE, w_long)
+HANDLE_IOCTL(BLKFRAGET, w_long)
+HANDLE_IOCTL(BLKSECTGET, w_long)
+HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
 
-#define NR_IOCTL32_HANDLERS	(sizeof(ioctl32_handler_table) /	\
-				 sizeof(ioctl32_handler_table[0]))
+IOCTL_TABLE_END
diff -urN linux-2.5.69-bk19/arch/s390/kernel/compat_wrapper.S linux-2.5.70/arch/s390/kernel/compat_wrapper.S
--- linux-2.5.69-bk19/arch/s390/kernel/compat_wrapper.S	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/compat_wrapper.S	2003-05-26 19:02:21.000000000 -0700
@@ -220,12 +220,12 @@
 	lgfr	%r3,%r3			# int
 	jg	sys_umount		# branch to system call
 
-	.globl  sys32_ioctl_wrapper 
-sys32_ioctl_wrapper:
+	.globl  compat_sys_ioctl_wrapper
+compat_sys_ioctl_wrapper:
 	llgfr	%r2,%r2			# unsigned int
 	llgfr	%r3,%r3			# unsigned int
 	llgfr	%r4,%r4			# unsigned int
-	jg	sys32_ioctl		# branch to system call
+	jg	compat_sys_ioctl	# branch to system call
 
 	.globl  compat_sys_fcntl_wrapper 
 compat_sys_fcntl_wrapper:
@@ -1209,3 +1209,24 @@
 sys32_set_tid_address_wrapper:
 	llgtr	%r2,%r2			# int *
 	jg	sys_set_tid_address	# branch to system call
+
+	.globl  sys_epoll_create_wrapper
+sys_epoll_create_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_epoll_create	# branch to system call
+
+	.globl  sys_epoll_ctl_wrapper
+sys_epoll_ctl_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	lgfr	%r4,%r4			# int
+	llgtr	%r5,%r5			# struct epoll_event *
+	jg	sys_epoll_ctl		# branch to system call
+
+	.globl  sys_epoll_wait_wrapper
+sys_epoll_wait_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# struct epoll_event *
+	lgfr	%r4,%r4			# int
+	lgfr	%r5,%r5			# int
+	jg	sys_epoll_wait		# branch to system call
diff -urN linux-2.5.69-bk19/arch/s390/kernel/debug.c linux-2.5.70/arch/s390/kernel/debug.c
--- linux-2.5.69-bk19/arch/s390/kernel/debug.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/debug.c	2003-05-26 19:02:21.000000000 -0700
@@ -585,7 +585,6 @@
 {
 	debug_info_t *rc = NULL;
 
-	MOD_INC_USE_COUNT;
 	if (!initialized)
 		BUG();
 	down(&debug_lock);
@@ -605,7 +604,6 @@
       out:
         if (rc == NULL){
 		printk(KERN_ERR "debug: debug_register failed for %s\n",name);
-		MOD_DEC_USE_COUNT;
         }
 	up(&debug_lock);
 	return rc;
@@ -627,7 +625,6 @@
 	debug_info_put(id);
 	up(&debug_lock);
 
-	MOD_DEC_USE_COUNT;
       out:
 	return;
 }
@@ -851,9 +848,17 @@
 	int i;
 	unsigned long flags;
 	mode_t mode = S_IFREG;
+	struct proc_dir_entry *pde;
 
 	if (!id)
 		goto out;
+	pde = create_proc_entry(view->name, mode, id->proc_root_entry);
+	if (!pde){
+		printk(KERN_WARNING "debug: create_proc_entry() failed! Cannot register view %s/%s\n", id->name,view->name);
+		rc = -1;
+		goto out;
+	}
+
 	spin_lock_irqsave(&id->lock, flags);
 	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
 		if (id->views[i] == NULL)
@@ -864,6 +869,7 @@
 			id->name,view->name);
 		printk(KERN_WARNING 
 			"debug: maximum number of views reached (%i)!\n", i);
+		remove_proc_entry(pde->name, id->proc_root_entry);
 		rc = -1;
 	}
 	else {
@@ -872,11 +878,8 @@
 			mode |= S_IRUSR;
 		if (view->input_proc)
 			mode |= S_IWUSR;
-		id->proc_entries[i] = create_proc_entry(view->name, mode,
-							id->proc_root_entry);
-		if (id->proc_entries[i] != NULL)
-			id->proc_entries[i]->proc_fops = &debug_file_ops;
-		rc = 0;
+		pde->proc_fops = &debug_file_ops;
+		id->proc_entries[i] = pde;
 	}
 	spin_unlock_irqrestore(&id->lock, flags);
       out:
diff -urN linux-2.5.69-bk19/arch/s390/kernel/entry64.S linux-2.5.70/arch/s390/kernel/entry64.S
--- linux-2.5.69-bk19/arch/s390/kernel/entry64.S	2003-05-04 16:53:03.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/entry64.S	2003-05-26 19:02:21.000000000 -0700
@@ -249,14 +249,14 @@
 # special linkage: %r12 contains the return address for trace_svc
 #
 sysc_tracesys:
-	srl	%r7,3
+	srl	%r7,2
 	stg     %r7,SP_R2(%r15)
         brasl   %r14,syscall_trace
 	larl	%r1,.Lnr_syscalls
 	clc	SP_R2(8,%r15),0(%r1)
 	jl	sysc_tracego
 	lg	%r7,SP_R2(%r15)   # strace might have changed the
-	sll     %r7,3             #  system call
+	sll     %r7,2             #  system call
 	lgf	%r8,0(%r7,%r10)
 sysc_tracego:
 	lmg     %r3,%r6,SP_R3(%r15)
diff -urN linux-2.5.69-bk19/arch/s390/kernel/head.S linux-2.5.70/arch/s390/kernel/head.S
--- linux-2.5.69-bk19/arch/s390/kernel/head.S	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/head.S	2003-05-26 19:02:21.000000000 -0700
@@ -573,7 +573,7 @@
         .long  .Lduct                   # cr2: dispatchable unit control table
         .long  0                        # cr3: instruction authorization
         .long  0                        # cr4: instruction authorization
-        .long  0                        # cr5:  various things
+        .long  0xffffffff               # cr5: primary-aste origin
         .long  0                        # cr6:  I/O interrupts
         .long  0                        # cr7:  secondary space segment table
         .long  0                        # cr8:  access registers translation
diff -urN linux-2.5.69-bk19/arch/s390/kernel/head64.S linux-2.5.70/arch/s390/kernel/head64.S
--- linux-2.5.69-bk19/arch/s390/kernel/head64.S	2003-05-04 16:53:09.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/head64.S	2003-05-26 19:02:21.000000000 -0700
@@ -586,7 +586,7 @@
         .quad  .Lduct                   # cr2: dispatchable unit control table
         .quad  0                        # cr3: instruction authorization
         .quad  0                        # cr4: instruction authorization
-        .quad  0                        # cr5:  various things
+        .quad  0xffffffffffffffff       # cr5: primary-aste origin
         .quad  0                        # cr6:  I/O interrupts
         .quad  0                        # cr7:  secondary space segment table
         .quad  0                        # cr8:  access registers translation
diff -urN linux-2.5.69-bk19/arch/s390/kernel/process.c linux-2.5.70/arch/s390/kernel/process.c
--- linux-2.5.69-bk19/arch/s390/kernel/process.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/process.c	2003-05-26 19:02:21.000000000 -0700
@@ -166,7 +166,6 @@
 
 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
-	struct task_struct *p;
 	struct pt_regs regs;
 
 	memset(&regs, 0, sizeof(regs));
@@ -180,8 +179,8 @@
 	regs.orig_gpr2 = -1;
 
 	/* Ok, create the new process.. */
-	p = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+	return do_fork(flags | CLONE_VM | CLONE_UNTRACED,
+		       0, &regs, 0, NULL, NULL);
 }
 
 /*
@@ -272,16 +271,13 @@
 
 asmlinkage int sys_fork(struct pt_regs regs)
 {
-	struct task_struct *p;
-        p = do_fork(SIGCHLD, regs.gprs[15], &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+	return do_fork(SIGCHLD, regs.gprs[15], &regs, 0, NULL, NULL);
 }
 
 asmlinkage int sys_clone(struct pt_regs regs)
 {
         unsigned long clone_flags;
         unsigned long newsp;
-	struct task_struct *p;
 	int *parent_tidptr, *child_tidptr;
 
         clone_flags = regs.gprs[3];
@@ -290,9 +286,8 @@
 	child_tidptr = (int *) regs.gprs[5];
         if (!newsp)
                 newsp = regs.gprs[15];
-        p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, &regs, 0,
-		    parent_tidptr, child_tidptr);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+        return do_fork(clone_flags & ~CLONE_IDLETASK, newsp, &regs, 0,
+		       parent_tidptr, child_tidptr);
 }
 
 /*
@@ -307,10 +302,8 @@
  */
 asmlinkage int sys_vfork(struct pt_regs regs)
 {
-	struct task_struct *p;
-	p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
-		    regs.gprs[15], &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+	return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
+		       regs.gprs[15], &regs, 0, NULL, NULL);
 }
 
 /*
diff -urN linux-2.5.69-bk19/arch/s390/kernel/s390_ksyms.c linux-2.5.70/arch/s390/kernel/s390_ksyms.c
--- linux-2.5.69-bk19/arch/s390/kernel/s390_ksyms.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/s390_ksyms.c	2003-05-26 19:02:21.000000000 -0700
@@ -59,20 +59,7 @@
 EXPORT_SYMBOL(dump_fpu);
 EXPORT_SYMBOL(overflowuid);
 EXPORT_SYMBOL(overflowgid);
-
-#ifdef CONFIG_S390_SUPPORT
-/*
- * Dynamically add/remove 31 bit ioctl conversion functions.
- */
-extern int register_ioctl32_conversion(unsigned int cmd,
-				       int (*handler)(unsigned int, 
-						      unsigned int,
-						      unsigned long,
-						      struct file *));
-int unregister_ioctl32_conversion(unsigned int cmd);
-EXPORT_SYMBOL(register_ioctl32_conversion);
-EXPORT_SYMBOL(unregister_ioctl32_conversion);
-#endif
+EXPORT_SYMBOL(empty_zero_page);
 
 /*
  * misc.
diff -urN linux-2.5.69-bk19/arch/s390/kernel/smp.c linux-2.5.70/arch/s390/kernel/smp.c
--- linux-2.5.69-bk19/arch/s390/kernel/smp.c	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/smp.c	2003-05-26 19:02:21.000000000 -0700
@@ -469,7 +469,7 @@
        /* don't care about the psw and regs settings since we'll never
           reschedule the forked task. */
        memset(&regs,0,sizeof(struct pt_regs));
-       return do_fork(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL);
+       return copy_process(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL);
 }
 
 int __cpu_up(unsigned int cpu)
@@ -498,6 +498,7 @@
                 printk("failed fork for CPU %d", cpu);
 		return -EIO;
 	}
+	wake_up_forked_process(idle);
 
         /*
          * We remove it from the pidhash and the runqueue
@@ -512,10 +513,9 @@
 	cpu_lowcore->kernel_stack = (unsigned long)
 		idle->thread_info + (THREAD_SIZE);
 	__ctl_store(cpu_lowcore->cregs_save_area[0], 0, 15);
-	__asm__ __volatile__("la    1,%0\n\t"
-			     "stam  0,15,0(1)"
-			     : "=m" (cpu_lowcore->access_regs_save_area[0])
-			     : : "1", "memory");
+	__asm__ __volatile__("stam  0,15,0(%0)"
+			     : : "a" (&cpu_lowcore->access_regs_save_area)
+			     : "memory");
         eieio();
         signal_processor(cpu,sigp_restart);
 
diff -urN linux-2.5.69-bk19/arch/s390/kernel/syscalls.S linux-2.5.70/arch/s390/kernel/syscalls.S
--- linux-2.5.69-bk19/arch/s390/kernel/syscalls.S	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/syscalls.S	2003-05-26 19:02:21.000000000 -0700
@@ -62,7 +62,7 @@
 SYSCALL(sys_acct,sys_acct,sys32_acct_wrapper)
 SYSCALL(sys_umount,sys_umount,sys32_umount_wrapper)
 NI_SYSCALL							/* old lock syscall */
-SYSCALL(sys_ioctl,sys_ioctl,sys32_ioctl_wrapper)
+SYSCALL(sys_ioctl,sys_ioctl,compat_sys_ioctl_wrapper)
 SYSCALL(sys_fcntl,sys_fcntl,compat_sys_fcntl_wrapper)		/* 55 */
 NI_SYSCALL							/* intel mpx syscall */
 SYSCALL(sys_setpgid,sys_setpgid,sys32_setpgid_wrapper)
@@ -83,9 +83,9 @@
 SYSCALL(sys_sigsuspend_glue,sys_sigsuspend_glue,sys32_sigsuspend_glue)
 SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)
 SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)
-SYSCALL(sys_setrlimit,sys_setrlimit,sys32_setrlimit_wrapper)	/* 75 */
-SYSCALL(sys_old_getrlimit,sys_getrlimit,sys32_old_getrlimit_wrapper)
-SYSCALL(sys_getrusage,sys_getrusage,sys32_getrusage_wrapper)
+SYSCALL(sys_setrlimit,sys_setrlimit,compat_sys_setrlimit_wrapper)	/* 75 */
+SYSCALL(sys_old_getrlimit,sys_getrlimit,compat_sys_old_getrlimit_wrapper)
+SYSCALL(sys_getrusage,sys_getrusage,compat_sys_getrusage_wrapper)
 SYSCALL(sys_gettimeofday,sys_gettimeofday,sys32_gettimeofday_wrapper)
 SYSCALL(sys_settimeofday,sys_settimeofday,sys32_settimeofday_wrapper)
 SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper)	/* 80 old getgroups16 syscall */
@@ -122,7 +122,7 @@
 SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
 NI_SYSCALL							/* old "idle" system call */
 NI_SYSCALL							/* vm86old for i386 */
-SYSCALL(sys_wait4,sys_wait4,sys32_wait4_wrapper)
+SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4_wrapper)
 SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)		/* 115 */
 SYSCALL(sys_sysinfo,sys_sysinfo,sys32_sysinfo_wrapper)
 SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper)
@@ -199,7 +199,7 @@
 NI_SYSCALL							/* streams1 */
 NI_SYSCALL							/* streams2 */
 SYSCALL(sys_vfork_glue,sys_vfork_glue,sys_vfork_glue)		/* 190 */
-SYSCALL(sys_getrlimit,sys_getrlimit,sys32_getrlimit_wrapper)
+SYSCALL(sys_getrlimit,sys_getrlimit,compat_sys_getrlimit_wrapper)
 SYSCALL(sys_mmap2,sys_mmap2,sys32_mmap2_wrapper)
 SYSCALL(sys_truncate64,sys_ni_syscall,sys32_truncate64_wrapper)
 SYSCALL(sys_ftruncate64,sys_ni_syscall,sys32_ftruncate64_wrapper)
@@ -257,9 +257,9 @@
 SYSCALL(sys_io_submit,sys_io_submit,sys_ni_syscall)
 SYSCALL(sys_io_cancel,sys_io_cancel,sys_ni_syscall)
 SYSCALL(sys_exit_group,sys_exit_group,sys32_exit_group_wrapper)
-SYSCALL(sys_epoll_create,sys_epoll_create,sys_ni_syscall)
-SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_ni_syscall)		/* 250 */
-SYSCALL(sys_epoll_wait,sys_epoll_wait,sys_ni_syscall)
+SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
+SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper)	/* 250 */
+SYSCALL(sys_epoll_wait,sys_epoll_wait,sys_epoll_wait_wrapper)
 SYSCALL(sys_set_tid_address,sys_set_tid_address,sys32_set_tid_address_wrapper)
 SYSCALL(sys_fadvise64,sys_fadvise64,sys_ni_syscall)
 SYSCALL(sys_timer_create,sys_timer_create,sys_ni_syscall)
diff -urN linux-2.5.69-bk19/arch/s390/kernel/traps.c linux-2.5.70/arch/s390/kernel/traps.c
--- linux-2.5.69-bk19/arch/s390/kernel/traps.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/s390/kernel/traps.c	2003-05-26 19:02:21.000000000 -0700
@@ -282,7 +282,7 @@
                 const struct exception_table_entry *fixup;
                 fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN);
                 if (fixup)
-                        regs->psw.addr = fixup->fixup | ~PSW_ADDR_INSN;
+                        regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE;
                 else
                         die(str, regs, interruption_code);
         }
@@ -293,27 +293,14 @@
 	return (void *)((regs->psw.addr-S390_lowcore.pgm_ilc) & PSW_ADDR_INSN);
 }
 
-int do_debugger_trap(struct pt_regs *regs,int signal)
+static int do_debugger_trap(struct pt_regs *regs)
 {
-	if(regs->psw.mask&PSW_MASK_PSTATE)
-	{
-		if(current->ptrace & PT_PTRACED)
-			force_sig(signal,current);
-		else
-			return 1;
-	}
-	else
-	{
-#ifdef CONFIG_REMOTE_DEBUG
-		if(gdb_stub_initialised)
-		{
-			gdb_stub_handle_exception(regs, signal);
-			return 0;
-		}
-#endif
-		return 1;
+	if ((regs->psw.mask & PSW_MASK_PSTATE) &&
+	    (current->ptrace & PT_PTRACED)) {
+		force_sig(SIGTRAP,current);
+		return 0;
 	}
-	return 0;
+	return 1;
 }
 
 #define DO_ERROR(signr, str, name) \
@@ -400,7 +387,7 @@
 		*((__u16 *)opcode)=*((__u16 *)location);
 	if (*((__u16 *)opcode)==S390_BREAKPOINT_U16)
         {
-		if(do_debugger_trap(regs,SIGTRAP))
+		if(do_debugger_trap(regs))
 			signal = SIGILL;
 	}
 #ifdef CONFIG_MATHEMU
@@ -659,7 +646,7 @@
 		per_info->lowcore.words.address=S390_lowcore.per_address;
 		per_info->lowcore.words.access_id=S390_lowcore.per_access_id;
 	}
-	if (do_debugger_trap(regs,SIGTRAP)) {
+	if (do_debugger_trap(regs)) {
 		/* I've seen this possibly a task structure being reused ? */
 		printk("Spurious per exception detected\n");
 		printk("switching off per tracing for this task.\n");
diff -urN linux-2.5.69-bk19/arch/s390/vmlinux.lds.S linux-2.5.70/arch/s390/vmlinux.lds.S
--- linux-2.5.69-bk19/arch/s390/vmlinux.lds.S	2003-05-04 16:53:12.000000000 -0700
+++ linux-2.5.70/arch/s390/vmlinux.lds.S	2003-05-26 19:02:21.000000000 -0700
@@ -12,7 +12,7 @@
 jiffies = jiffies_64 + 4;
 #else
 OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
-OUTPUT_ARCH(s390)
+OUTPUT_ARCH(s390:64-bit)
 ENTRY(_start)
 jiffies = jiffies_64;
 #endif
diff -urN linux-2.5.69-bk19/arch/x86_64/ia32/ia32_ioctl.c linux-2.5.70/arch/x86_64/ia32/ia32_ioctl.c
--- linux-2.5.69-bk19/arch/x86_64/ia32/ia32_ioctl.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/arch/x86_64/ia32/ia32_ioctl.c	2003-05-26 19:02:21.000000000 -0700
@@ -3196,22 +3196,6 @@
 HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-HANDLE_IOCTL(VG_STATUS, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(VG_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REMOVE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REDUCE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_RENAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYNAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYINDEX, do_lvm_ioctl)
-HANDLE_IOCTL(PV_CHANGE, do_lvm_ioctl)
-HANDLE_IOCTL(PV_STATUS, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE_OLD, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYDEV, do_lvm_ioctl)
-#endif /* LVM */
 /* VFAT */
 HANDLE_IOCTL(VFAT_IOCTL_READDIR_BOTH32, vfat_ioctl32)
 HANDLE_IOCTL(VFAT_IOCTL_READDIR_SHORT32, vfat_ioctl32)
diff -urN linux-2.5.69-bk19/drivers/acpi/scan.c linux-2.5.70/drivers/acpi/scan.c
--- linux-2.5.69-bk19/drivers/acpi/scan.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/acpi/scan.c	2003-05-26 19:02:21.000000000 -0700
@@ -66,7 +66,7 @@
 	spin_unlock(&acpi_device_lock);
 
 	kobject_init(&device->kobj);
-	strncpy(device->kobj.name,device->pnp.bus_id,KOBJ_NAME_LEN);
+	strlcpy(device->kobj.name,device->pnp.bus_id,KOBJ_NAME_LEN);
 	if (parent)
 		device->kobj.parent = &parent->kobj;
 	device->kobj.ktype = &ktype_acpi_ns;
diff -urN linux-2.5.69-bk19/drivers/acpi/toshiba_acpi.c linux-2.5.70/drivers/acpi/toshiba_acpi.c
--- linux-2.5.69-bk19/drivers/acpi/toshiba_acpi.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/acpi/toshiba_acpi.c	2003-05-26 19:02:21.000000000 -0700
@@ -108,8 +108,7 @@
 	int result;
 	char* str2 = kmalloc(n + 1, GFP_KERNEL);
 	if (str2 == 0) return 0;
-	strncpy(str2, str, n);
-	str2[n] = 0;
+	strlcpy(str2, str, n);
 	va_start(args, format);
 	result = vsscanf(str2, format, args);
 	va_end(args);
diff -urN linux-2.5.69-bk19/drivers/block/genhd.c linux-2.5.70/drivers/block/genhd.c
--- linux-2.5.69-bk19/drivers/block/genhd.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/block/genhd.c	2003-05-26 19:02:21.000000000 -0700
@@ -89,8 +89,7 @@
 	}
 
 	p->major = major;
-	strncpy(p->name, name, sizeof(p->name)-1);
-	p->name[sizeof(p->name)-1] = 0;
+	strlcpy(p->name, name, sizeof(p->name));
 	p->next = 0;
 	index = major_to_index(major);
 
diff -urN linux-2.5.69-bk19/drivers/block/loop.c linux-2.5.70/drivers/block/loop.c
--- linux-2.5.69-bk19/drivers/block/loop.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/block/loop.c	2003-05-26 19:02:21.000000000 -0700
@@ -867,7 +867,7 @@
 	if (err)
 		return err;	
 
-	strncpy(lo->lo_name, info->lo_name, LO_NAME_SIZE);
+	strlcpy(lo->lo_name, info->lo_name, LO_NAME_SIZE);
 
 	lo->transfer = xfer_funcs[type]->transfer;
 	lo->ioctl = xfer_funcs[type]->ioctl;
@@ -902,7 +902,7 @@
 	info->lo_rdevice = lo->lo_device ? stat.rdev : stat.dev;
 	info->lo_offset = lo->lo_offset;
 	info->lo_flags = lo->lo_flags;
-	strncpy(info->lo_name, lo->lo_name, LO_NAME_SIZE);
+	strlcpy(info->lo_name, lo->lo_name, LO_NAME_SIZE);
 	info->lo_encrypt_type = lo->lo_encrypt_type;
 	if (lo->lo_encrypt_key_size && capable(CAP_SYS_ADMIN)) {
 		info->lo_encrypt_key_size = lo->lo_encrypt_key_size;
diff -urN linux-2.5.69-bk19/drivers/block/paride/bpck6.c linux-2.5.70/drivers/block/paride/bpck6.c
--- linux-2.5.69-bk19/drivers/block/paride/bpck6.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/block/paride/bpck6.c	2003-05-26 19:02:21.000000000 -0700
@@ -193,11 +193,11 @@
   	if(out)
  	{
 		ppc6_close(PPCSTRUCT(pi));
-		return(1);	
 		if(verbose)
 		{
 			printk(KERN_DEBUG "leaving probe\n");
 		}
+               return(1);
 	}
   	else
   	{
diff -urN linux-2.5.69-bk19/drivers/cdrom/cm206.c linux-2.5.70/drivers/cdrom/cm206.c
--- linux-2.5.69-bk19/drivers/cdrom/cm206.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/cdrom/cm206.c	2003-05-26 19:02:21.000000000 -0700
@@ -1447,7 +1447,7 @@
 	request_region(cm206_base, 16, "cm206");
 	cd = (struct cm206_struct *) kmalloc(size, GFP_KERNEL);
 	if (!cd)
-		return -EIO;
+               goto out_base;
 	/* Now we have found the adaptor card, try to reset it. As we have
 	 * found out earlier, this process generates an interrupt as well,
 	 * so we might just exploit that fact for irq probing! */
@@ -1456,7 +1456,6 @@
 	if (cm206_irq <= 0) {
 		printk("can't find IRQ!\n");
 		goto out_probe;
-		return -EIO;
 	} else
 		printk(" IRQ %d found\n", cm206_irq);
 #else
@@ -1530,6 +1529,7 @@
 	free_irq(cm206_irq, NULL);
 out_probe:
 	kfree(cd);
+out_base:
 	release_region(cm206_base, 16);
 	return -EIO;
 }
diff -urN linux-2.5.69-bk19/drivers/char/drm/drm_memory.h linux-2.5.70/drivers/char/drm/drm_memory.h
--- linux-2.5.69-bk19/drivers/char/drm/drm_memory.h	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/char/drm/drm_memory.h	2003-05-26 19:02:21.000000000 -0700
@@ -30,6 +30,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/highmem.h>
 #include "drmP.h"
 
 /* Cut down version of drm_memory_debug.h, which used to be called
diff -urN linux-2.5.69-bk19/drivers/char/ftape/zftape/zftape-vtbl.h linux-2.5.70/drivers/char/ftape/zftape/zftape-vtbl.h
--- linux-2.5.69-bk19/drivers/char/ftape/zftape/zftape-vtbl.h	2003-05-04 16:53:13.000000000 -0700
+++ linux-2.5.70/drivers/char/ftape/zftape/zftape-vtbl.h	2003-05-26 19:02:21.000000000 -0700
@@ -129,8 +129,7 @@
 #define DUMP_VOLINFO(level, desc, info)					\
 {									\
 	char tmp[21];							\
-	strncpy(tmp, desc, 20);						\
-	tmp[20] = '\0';							\
+	strlcpy(tmp, desc, sizeof(tmp));				\
 	TRACE(level, "Volume %d:\n"					\
 	      KERN_INFO "description  : %s\n"				\
 	      KERN_INFO "first segment: %d\n"				\
diff -urN linux-2.5.69-bk19/drivers/char/i8k.c linux-2.5.70/drivers/char/i8k.c
--- linux-2.5.69-bk19/drivers/char/i8k.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/char/i8k.c	2003-05-26 19:02:21.000000000 -0700
@@ -167,7 +167,7 @@
  */
 static int i8k_get_serial_number(unsigned char *buff)
 {
-    strncpy(buff, serial_number, 16);
+    strlcpy(buff, serial_number, sizeof(serial_number));
     return 0;
 }
 
@@ -551,24 +551,24 @@
     case  0:	/* BIOS Information */
 	p = dmi_string(dmi,data[5]);
 	if (*p) {
-	    strncpy(bios_version, p, sizeof(bios_version));
+	    strlcpy(bios_version, p, sizeof(bios_version));
 	    string_trim(bios_version, sizeof(bios_version));
 	}
 	break;	
     case 1:	/* System Information */
 	p = dmi_string(dmi,data[4]);
 	if (*p) {
-	    strncpy(system_vendor, p, sizeof(system_vendor));
+	    strlcpy(system_vendor, p, sizeof(system_vendor));
 	    string_trim(system_vendor, sizeof(system_vendor));
 	}
 	p = dmi_string(dmi,data[5]);
 	if (*p) {
-	    strncpy(product_name, p, sizeof(product_name));
+	    strlcpy(product_name, p, sizeof(product_name));
 	    string_trim(product_name, sizeof(product_name));
 	}
 	p = dmi_string(dmi,data[7]);
 	if (*p) {
-	    strncpy(serial_number, p, sizeof(serial_number));
+	    strlcpy(serial_number, p, sizeof(serial_number));
 	    string_trim(serial_number, sizeof(serial_number));
 	}
 	break;
diff -urN linux-2.5.69-bk19/drivers/char/mem.c linux-2.5.70/drivers/char/mem.c
--- linux-2.5.69-bk19/drivers/char/mem.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/char/mem.c	2003-05-26 19:02:21.000000000 -0700
@@ -707,9 +707,6 @@
 #ifdef CONFIG_FTAPE
 	ftape_init();
 #endif
-#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
-	tapechar_init();
-#endif
 	return 0;
 }
 
diff -urN linux-2.5.69-bk19/drivers/char/rio/rioinit.c linux-2.5.70/drivers/char/rio/rioinit.c
--- linux-2.5.69-bk19/drivers/char/rio/rioinit.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/drivers/char/rio/rioinit.c	2003-05-26 19:02:21.000000000 -0700
@@ -1541,8 +1541,10 @@
 struct rioVersion *
 RIOVersid(void)
 {
-    strncpy(stVersion.version, "RIO driver for linux V1.0", 255);
-    strncpy(stVersion.buildDate, __DATE__, 255);
+    strlcpy(stVersion.version, "RIO driver for linux V1.0",
+	    sizeof(stVersion.version));
+    strlcpy(stVersion.buildDate, __DATE__,
+	    sizeof(stVersion.buildDate));
 
     return &stVersion;
 }
diff -urN linux-2.5.69-bk19/drivers/char/sx.c linux-2.5.70/drivers/char/sx.c
--- linux-2.5.69-bk19/drivers/char/sx.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/char/sx.c	2003-05-26 19:02:21.000000000 -0700
@@ -305,7 +305,6 @@
 static int  sx_get_CD (void * ptr); 
 static void sx_shutdown_port (void * ptr);
 static int  sx_set_real_termios (void  *ptr);
-static void sx_hungup (void  *ptr);
 static void sx_close (void  *ptr);
 static int sx_chars_in_buffer (void * ptr);
 static int sx_init_board (struct sx_board *board);
@@ -386,7 +385,6 @@
 	sx_set_real_termios, 
 	sx_chars_in_buffer,
 	sx_close,
-	sx_hungup,
 };
 
 
@@ -1453,8 +1451,6 @@
 
 	tty->driver_data = port;
 	port->gs.tty = tty;
-	if (!port->gs.count)
-		MOD_INC_USE_COUNT;
 	port->gs.count++;
 
 	sx_dprintk (SX_DEBUG_OPEN, "starting port\n");
@@ -1466,7 +1462,6 @@
 	sx_dprintk (SX_DEBUG_OPEN, "done gs_init\n");
 	if (retval) {
 		port->gs.count--;
-		if (port->gs.count) MOD_DEC_USE_COUNT;
 		return retval;
 	}
 
@@ -1485,7 +1480,6 @@
 	if (sx_send_command (port, HS_LOPEN, -1, HS_IDLE_OPEN) != 1) {
 		printk (KERN_ERR "sx: Card didn't respond to LOPEN command.\n");
 		port->gs.count--;
-		if (!port->gs.count) MOD_DEC_USE_COUNT;
 		return -EIO;
 	}
 
@@ -1520,40 +1514,6 @@
 }
 
 
-/* I haven't the foggiest why the decrement use count has to happen
-   here. The whole linux serial drivers stuff needs to be redesigned.
-   My guess is that this is a hack to minimize the impact of a bug
-   elsewhere. Thinking about it some more. (try it sometime) Try
-   running minicom on a serial port that is driven by a modularized
-   driver. Have the modem hangup. Then remove the driver module. Then
-   exit minicom.  I expect an "oops".  -- REW */
-static void sx_hungup (void *ptr)
-{
-  /*
-	struct sx_port *port = ptr; 
-  */
-	func_enter ();
-
-	/* Don't force the SX card to close. mgetty doesn't like it !!!!!! -- pvdl */
-	/* For some reson we added this code. Don't know why anymore ;-( -- pvdl */
-	/*
-	sx_setsignals (port, 0, 0);
-	sx_reconfigure_port(port);	
-	sx_send_command (port, HS_CLOSE, 0, 0);
-
-	if (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED) {
-		if (sx_send_command (port, HS_FORCE_CLOSED, -1, HS_IDLE_CLOSED) != 1) {
-			printk (KERN_ERR 
-			        "sx: sent the force_close command, but card didn't react\n");
-		} else
-			sx_dprintk (SX_DEBUG_CLOSE, "sent the force_close command.\n");
-	}
-	*/
-	MOD_DEC_USE_COUNT;
-	func_exit ();
-}
-
-
 static void sx_close (void *ptr)
 {
 	struct sx_port *port = ptr; 
@@ -1589,7 +1549,6 @@
 		port->gs.count = 0;
 	}
 
-	MOD_DEC_USE_COUNT;
 	func_exit ();
 }
 
@@ -2285,6 +2244,7 @@
 
 	memset(&sx_driver, 0, sizeof(sx_driver));
 	sx_driver.magic = TTY_DRIVER_MAGIC;
+	sx_driver.owner = THIS_MODULE;
 	sx_driver.driver_name = "specialix_sx";
 	sx_driver.name = "ttyX";
 	sx_driver.major = SX_NORMAL_MAJOR;
diff -urN linux-2.5.69-bk19/drivers/char/tty_io.c linux-2.5.70/drivers/char/tty_io.c
--- linux-2.5.69-bk19/drivers/char/tty_io.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/char/tty_io.c	2003-05-26 19:02:21.000000000 -0700
@@ -145,8 +145,6 @@
 extern int vme_scc_init (void);
 extern int serial167_init(void);
 extern int rs_8xx_init(void);
-extern void sclp_tty_init(void);
-extern void tty3215_init(void);
 extern void tub3270_init(void);
 extern void rs_360_init(void);
 extern void tx3912_rs_init(void);
@@ -2480,9 +2478,6 @@
 #ifdef CONFIG_TN3270
 	tub3270_init();
 #endif
-#ifdef CONFIG_SCLP_TTY
-	sclp_tty_init();
-#endif
 #ifdef CONFIG_A2232
 	a2232board_init();
 #endif
diff -urN linux-2.5.69-bk19/drivers/eisa/eisa-bus.c linux-2.5.70/drivers/eisa/eisa-bus.c
--- linux-2.5.69-bk19/drivers/eisa/eisa-bus.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/drivers/eisa/eisa-bus.c	2003-05-26 19:02:21.000000000 -0700
@@ -38,9 +38,9 @@
 
 	for (i = 0; i < EISA_INFOS; i++) {
 		if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) {
-			strncpy (edev->dev.name,
+			strlcpy (edev->dev.name,
 				 eisa_table[i].name,
-				 DEVICE_NAME_SIZE - 1);
+				 DEVICE_NAME_SIZE);
 			return;
 		}
 	}
diff -urN linux-2.5.69-bk19/drivers/hotplug/pci_hotplug_core.c linux-2.5.70/drivers/hotplug/pci_hotplug_core.c
--- linux-2.5.69-bk19/drivers/hotplug/pci_hotplug_core.c	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/drivers/hotplug/pci_hotplug_core.c	2003-05-26 19:02:21.000000000 -0700
@@ -529,7 +529,7 @@
 	if ((slot->info == NULL) || (slot->ops == NULL))
 		return -EINVAL;
 
-	strncpy(slot->kobj.name, slot->name, KOBJ_NAME_LEN);
+	strlcpy(slot->kobj.name, slot->name, KOBJ_NAME_LEN);
 	kobj_set_kset_s(slot, hotplug_slots_subsys);
 
 	/* this can fail if we have already registered a slot with the same name */
diff -urN linux-2.5.69-bk19/drivers/i2c/chips/adm1021.c linux-2.5.70/drivers/i2c/chips/adm1021.c
--- linux-2.5.69-bk19/drivers/i2c/chips/adm1021.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/i2c/chips/adm1021.c	2003-05-26 19:02:21.000000000 -0700
@@ -310,7 +310,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strncpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	new_client->id = adm1021_id++;
diff -urN linux-2.5.69-bk19/drivers/i2c/chips/it87.c linux-2.5.70/drivers/i2c/chips/it87.c
--- linux-2.5.69-bk19/drivers/i2c/chips/it87.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/i2c/chips/it87.c	2003-05-26 19:02:21.000000000 -0700
@@ -692,7 +692,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strncpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
 
 	data->type = kind;
 
diff -urN linux-2.5.69-bk19/drivers/i2c/chips/lm75.c linux-2.5.70/drivers/i2c/chips/lm75.c
--- linux-2.5.69-bk19/drivers/i2c/chips/lm75.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/i2c/chips/lm75.c	2003-05-26 19:02:21.000000000 -0700
@@ -194,7 +194,7 @@
 	}
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strncpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->dev.name, name, DEVICE_NAME_SIZE);
 
 	new_client->id = lm75_id++;
 	data->valid = 0;
diff -urN linux-2.5.69-bk19/drivers/i2c/chips/w83781d.c linux-2.5.70/drivers/i2c/chips/w83781d.c
--- linux-2.5.69-bk19/drivers/i2c/chips/w83781d.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/i2c/chips/w83781d.c	2003-05-26 19:02:21.000000000 -0700
@@ -1198,7 +1198,7 @@
 		request_region(address, W83781D_EXTENT, type_name);
 
 	/* Fill in the remaining client fields and put it into the global list */
-	strncpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
+	strlcpy(new_client->dev.name, client_name, DEVICE_NAME_SIZE);
 	data->type = kind;
 
 	data->valid = 0;
@@ -1271,7 +1271,7 @@
 			data->lm75[i].adapter = adapter;
 			data->lm75[i].driver = &w83781d_driver;
 			data->lm75[i].flags = 0;
-			strncpy(data->lm75[i].dev.name, client_name,
+			strlcpy(data->lm75[i].dev.name, client_name,
 				DEVICE_NAME_SIZE);
 			if (kind == w83783s)
 				break;
diff -urN linux-2.5.69-bk19/drivers/i2c/i2c-core.c linux-2.5.70/drivers/i2c/i2c-core.c
--- linux-2.5.69-bk19/drivers/i2c/i2c-core.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/i2c/i2c-core.c	2003-05-26 19:02:21.000000000 -0700
@@ -105,7 +105,7 @@
 	memset(&adap->class_dev, 0x00, sizeof(struct class_device));
 	adap->class_dev.dev = &adap->dev;
 	adap->class_dev.class = &i2c_adapter_class;
-	strncpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE);
+	strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE);
 	class_device_register(&adap->class_dev);
 
 	/* inform drivers of new adapters */
diff -urN linux-2.5.69-bk19/drivers/ide/Kconfig linux-2.5.70/drivers/ide/Kconfig
--- linux-2.5.69-bk19/drivers/ide/Kconfig	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/drivers/ide/Kconfig	2003-05-26 19:02:21.000000000 -0700
@@ -549,7 +549,7 @@
 	  If unsure, say N.
 
 config BLK_DEV_HPT366
-	tristate "HPT366/368/370 chipset support"
+	tristate "HPT36X/37X chipset support"
 	depends on BLK_DEV_IDEDMA_PCI
 	---help---
 	  HPT366 is an Ultra DMA chipset for ATA-66.
diff -urN linux-2.5.69-bk19/drivers/ide/Makefile linux-2.5.70/drivers/ide/Makefile
--- linux-2.5.69-bk19/drivers/ide/Makefile	2003-05-04 16:53:29.000000000 -0700
+++ linux-2.5.70/drivers/ide/Makefile	2003-05-26 19:02:21.000000000 -0700
@@ -12,7 +12,7 @@
 
 # Core IDE code - must come before legacy
 
-obj-$(CONFIG_BLK_DEV_IDE)		+= ide-io.o ide-probe.o ide-geometry.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
+obj-$(CONFIG_BLK_DEV_IDE)		+= ide-io.o ide-probe.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
 obj-$(CONFIG_BLK_DEV_IDEDISK)		+= ide-disk.o
 obj-$(CONFIG_BLK_DEV_IDECD)		+= ide-cd.o
 obj-$(CONFIG_BLK_DEV_IDETAPE)		+= ide-tape.o
diff -urN linux-2.5.69-bk19/drivers/ide/ide-geometry.c linux-2.5.70/drivers/ide/ide-geometry.c
--- linux-2.5.69-bk19/drivers/ide/ide-geometry.c	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/drivers/ide/ide-geometry.c	1969-12-31 16:00:00.000000000 -0800
@@ -1,135 +0,0 @@
-/*
- * linux/drivers/ide/ide-geometry.c
- */
-#include <linux/config.h>
-#include <linux/ide.h>
-#include <linux/mc146818rtc.h>
-#include <asm/io.h>
-
-extern unsigned long current_capacity (ide_drive_t *);
-
-/*
- * If heads is nonzero: find a translation with this many heads and S=63.
- * Otherwise: find out how OnTrack Disk Manager would translate the disk.
- */
-
-static void ontrack(ide_drive_t *drive, int heads, unsigned int *c, int *h, int *s) 
-{
-	static const u8 dm_head_vals[] = {4, 8, 16, 32, 64, 128, 255, 0};
-	const u8 *headp = dm_head_vals;
-	unsigned long total;
-
-	/*
-	 * The specs say: take geometry as obtained from Identify,
-	 * compute total capacity C*H*S from that, and truncate to
-	 * 1024*255*63. Now take S=63, H the first in the sequence
-	 * 4, 8, 16, 32, 64, 128, 255 such that 63*H*1024 >= total.
-	 * [Please tell aeb@cwi.nl in case this computes a
-	 * geometry different from what OnTrack uses.]
-	 */
-	total = DRIVER(drive)->capacity(drive);
-
-	*s = 63;
-
-	if (heads) {
-		*h = heads;
-		*c = total / (63 * heads);
-		return;
-	}
-
-	while (63 * headp[0] * 1024 < total && headp[1] != 0)
-		 headp++;
-	*h = headp[0];
-	*c = total / (63 * headp[0]);
-}
-
-/*
- * This routine is called from the partition-table code in pt/msdos.c.
- * It has two tasks:
- * (i) to handle Ontrack DiskManager by offsetting everything by 63 sectors,
- *  or to handle EZdrive by remapping sector 0 to sector 1.
- * (ii) to invent a translated geometry.
- * Part (i) is suppressed if the user specifies the "noremap" option
- * on the command line.
- * Part (ii) is suppressed if the user specifies an explicit geometry.
- *
- * The ptheads parameter is either 0 or tells about the number of
- * heads shown by the end of the first nonempty partition.
- * If this is either 16, 32, 64, 128, 240 or 255 we'll believe it.
- *
- * The xparm parameter has the following meaning:
- *	 0 = convert to CHS with fewer than 1024 cyls
- *	     using the same method as Ontrack DiskManager.
- *	 1 = same as "0", plus offset everything by 63 sectors.
- *	-1 = similar to "0", plus redirect sector 0 to sector 1.
- *	 2 = convert to a CHS geometry with "ptheads" heads.
- *
- * Returns 0 if the translation was not possible, if the device was not 
- * an IDE disk drive, or if a geometry was "forced" on the commandline.
- * Returns 1 if the geometry translation was successful.
- */
-
-int ide_xlate_1024 (struct block_device *bdev, int xparm, int ptheads, const char *msg)
-{
-	ide_drive_t *drive = bdev->bd_disk->private_data;
-	const char *msg1 = "";
-	int heads = 0;
-	int c, h, s;
-	int transl = 1;		/* try translation */
-	int ret = 0;
-
-	/* remap? */
-	if (drive->remap_0_to_1 != 2) {
-		if (xparm == 1) {		/* DM */
-			drive->sect0 = 63;
-			msg1 = " [remap +63]";
-			ret = 1;
-		} else if (xparm == -1) {	/* EZ-Drive */
-			if (drive->remap_0_to_1 == 0) {
-				drive->remap_0_to_1 = 1;
-				msg1 = " [remap 0->1]";
-				ret = 1;
-			}
-		}
-	}
-
-	/* There used to be code here that assigned drive->id->CHS
-	   to drive->CHS and that to drive->bios_CHS. However,
-	   some disks have id->C/H/S = 4092/16/63 but are larger than 2.1 GB.
-	   In such cases that code was wrong.  Moreover,
-	   there seems to be no reason to do any of these things. */
-
-	/* translate? */
-	if (drive->forced_geom)
-		transl = 0;
-
-	/* does ptheads look reasonable? */
-	if (ptheads == 32 || ptheads == 64 || ptheads == 128 ||
-	    ptheads == 240 || ptheads == 255)
-		heads = ptheads;
-
-	if (xparm == 2) {
-		if (!heads ||
-		   (drive->bios_head >= heads && drive->bios_sect == 63))
-			transl = 0;
-	}
-	if (xparm == -1) {
-		if (drive->bios_head > 16)
-			transl = 0;     /* we already have a translation */
-	}
-
-	if (transl) {
-		ontrack(drive, heads, &c, &h, &s);
-		drive->bios_cyl = c;
-		drive->bios_head = h;
-		drive->bios_sect = s;
-		ret = 1;
-	}
-
-	set_capacity(drive->disk, current_capacity(drive));
-
-	if (ret)
-		printk("%s%s [%d/%d/%d]", msg, msg1,
-		       drive->bios_cyl, drive->bios_head, drive->bios_sect);
-	return ret;
-}
diff -urN linux-2.5.69-bk19/drivers/ide/ide-probe.c linux-2.5.70/drivers/ide/ide-probe.c
--- linux-2.5.69-bk19/drivers/ide/ide-probe.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/ide/ide-probe.c	2003-05-26 19:02:21.000000000 -0700
@@ -693,7 +693,7 @@
 	u32 i = 0;
 
 	/* register with global device tree */
-	strncpy(hwif->gendev.bus_id,hwif->name,BUS_ID_SIZE);
+	strlcpy(hwif->gendev.bus_id,hwif->name,BUS_ID_SIZE);
 	snprintf(hwif->gendev.name,DEVICE_NAME_SIZE,"IDE Controller");
 	hwif->gendev.driver_data = hwif;
 	if (hwif->pci_dev)
@@ -1443,8 +1443,6 @@
 }
 
 #ifdef MODULE
-extern int (*ide_xlate_1024_hook)(struct block_device *, int, int, const char *);
-
 int init_module (void)
 {
 	unsigned int index;
@@ -1453,14 +1451,12 @@
 		ide_unregister(index);
 	ideprobe_init();
 	create_proc_ide_interfaces();
-	ide_xlate_1024_hook = ide_xlate_1024;
 	return 0;
 }
 
 void cleanup_module (void)
 {
 	ide_probe = NULL;
-	ide_xlate_1024_hook = 0;
 }
 MODULE_LICENSE("GPL");
 #endif /* MODULE */
diff -urN linux-2.5.69-bk19/drivers/ide/ide-proc.c linux-2.5.70/drivers/ide/ide-proc.c
--- linux-2.5.69-bk19/drivers/ide/ide-proc.c	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/ide/ide-proc.c	2003-05-26 19:02:21.000000000 -0700
@@ -522,8 +522,7 @@
 			if (*p != ':')
 				goto parse_error;
 			len = IDE_MIN(p - start, MAX_LEN);
-			strncpy(name, start, IDE_MIN(len, MAX_LEN));
-			name[len] = 0;
+			strlcpy(name, start, IDE_MIN(len, MAX_LEN));
 
 			if (n > 0) {
 				--n;
diff -urN linux-2.5.69-bk19/drivers/ide/ide.c linux-2.5.70/drivers/ide/ide.c
--- linux-2.5.69-bk19/drivers/ide/ide.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/ide/ide.c	2003-05-26 19:02:21.000000000 -0700
@@ -1398,7 +1398,7 @@
 		goto abort;
 	if (DRIVER(drive)->cleanup(drive))
 		goto abort;
-	strncpy(drive->driver_req, driver, 9);
+	strlcpy(drive->driver_req, driver, sizeof(drive->driver_req));
 	if (ata_attach(drive)) {
 		spin_lock(&drives_lock);
 		list_del_init(&drive->list);
@@ -1695,6 +1695,33 @@
 	return 0;	/* zero = nothing matched */
 }
 
+#ifdef CONFIG_BLK_DEV_PDC4030
+static int __initdata probe_pdc4030;
+extern void init_pdc4030(void);
+#endif
+#ifdef CONFIG_BLK_DEV_ALI14XX
+static int __initdata probe_ali14xx;
+extern void init_ali14xx(void);
+#endif
+#ifdef CONFIG_BLK_DEV_UMC8672
+static int __initdata probe_umc8672;
+extern void init_umc8672(void);
+#endif
+#ifdef CONFIG_BLK_DEV_DTC2278
+static int __initdata probe_dtc2278;
+extern void init_dtc2278(void);
+#endif
+#ifdef CONFIG_BLK_DEV_HT6560B
+static int __initdata probe_ht6560b;
+extern void init_ht6560b(void);
+#endif
+#ifdef CONFIG_BLK_DEV_QD65XX
+static int __initdata probe_qd65xx;
+extern void init_qd65xx(void);
+#endif
+
+static int __initdata is_chipset_set[MAX_HWIFS];
+
 /*
  * ide_setup() gets called VERY EARLY during initialization,
  * to handle kernel "command line" strings beginning with "hdx="
@@ -1708,6 +1735,8 @@
  * "hdx=nowerr"		: ignore the WRERR_STAT bit on this drive
  * "hdx=cdrom"		: drive is present, and is a cdrom drive
  * "hdx=cyl,head,sect"	: disk drive is present, with specified geometry
+ * "hdx=remap63"	: add 63 to all sector numbers (for OnTrack DM)
+ * "hdx=remap"		: remap 0->1 (for EZDrive)
  * "hdx=noremap"	: do not remap 0->1 even though EZD was detected
  * "hdx=autotune"	: driver will attempt to tune interface speed
  *				to the fastest PIO mode supported,
@@ -1827,18 +1856,18 @@
 	 * Look for drive options:  "hdx="
 	 */
 	if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
-		const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
-				"serialize", "autotune", "noautotune",
-				"slow", "swapdata", "bswap", "flash",
-				"remap", "noremap", "scsi", "biostimings",
-				NULL};
+		const char *hd_words[] = {
+			"none", "noprobe", "nowerr", "cdrom", "serialize",
+			"autotune", "noautotune", "slow", "swapdata", "bswap",
+			"flash", "remap", "noremap", "scsi", "biostimings",
+			"remap63", NULL };
 		unit = s[2] - 'a';
 		hw   = unit / MAX_DRIVES;
 		unit = unit % MAX_DRIVES;
 		hwif = &ide_hwifs[hw];
 		drive = &hwif->drives[unit];
 		if (strncmp(s + 4, "ide-", 4) == 0) {
-			strncpy(drive->driver_req, s + 4, 9);
+			strlcpy(drive->driver_req, s + 4, sizeof(drive->driver_req));
 			goto done;
 		}
 		/*
@@ -1881,8 +1910,8 @@
 			case -8: /* "slow" */
 				drive->slow = 1;
 				goto done;
-			case -9: /* "swapdata" or "bswap" */
-			case -10:
+			case -9: /* "swapdata" */
+			case -10: /* "bswap" */
 				drive->bswap = 1;
 				goto done;
 			case -11: /* "flash" */
@@ -1905,6 +1934,9 @@
 			case -15: /* "biostimings" */
 				drive->autotune = IDE_TUNE_BIOS;
 				goto done;
+			case -16: /* "remap63" */
+				drive->sect0 = 63;
+				goto done;
 			case 3: /* cyl,head,sect */
 				drive->media	= ide_disk;
 				drive->cyl	= drive->bios_cyl  = vals[0];
@@ -1939,67 +1971,58 @@
 	if (s[3] >= '0' && s[3] <= max_hwif) {
 		/*
 		 * Be VERY CAREFUL changing this: note hardcoded indexes below
-		 * -8,-9,-10 : are reserved for future idex calls to ease the hardcoding.
+		 * -9,-10 : are reserved for future idex calls to ease the hardcoding.
 		 */
 		const char *ide_words[] = {
 			"noprobe", "serialize", "autotune", "noautotune", 
-			"reset", "dma", "ata66", "minus8", "minus9", "minus10",
-			"four", "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278", 
-			"umc8672", "ali14xx", "dc4030", "biostimings", NULL };
+			"reset", "dma", "ata66", "biostimings", "minus9",
+			"minus10", "four", "qd65xx", "ht6560b", "cmd640_vlb",
+			"dtc2278", "umc8672", "ali14xx", "dc4030", NULL };
 		hw = s[3] - '0';
 		hwif = &ide_hwifs[hw];
 		i = match_parm(&s[4], ide_words, vals, 3);
 
 		/*
-		 * Cryptic check to ensure chipset not already set for hwif:
+		 * Cryptic check to ensure chipset not already set for hwif.
+		 * Note: we can't depend on hwif->chipset here.
 		 */
-		if (i > 0 || i <= -11) {			/* is parameter a chipset name? */
-			if (hwif->chipset != ide_unknown)
-				goto bad_option;	/* chipset already specified */
-			if (i <= -11 && i != -18 && hw != 0)
-				goto bad_hwif;		/* chipset drivers are for "ide0=" only */
-			if (i <= -11 && i != -18 && ide_hwifs[hw+1].chipset != ide_unknown)
-				goto bad_option;	/* chipset for 2nd port already specified */
+		if ((i >= -18 && i <= -11) || (i > 0 && i <= 3)) {
+			/* chipset already specified */
+			if (is_chipset_set[hw])
+				goto bad_option;
+			if (i > -18 && i <= -11) {
+				/* these drivers are for "ide0=" only */
+				if (hw != 0)
+					goto bad_hwif;
+				/* chipset already specified for 2nd port */
+				if (is_chipset_set[hw+1])
+					goto bad_option;
+			}
+			is_chipset_set[hw] = 1;
 			printk("\n");
 		}
 
 		switch (i) {
-			case -19: /* "biostimings" */
-				hwif->drives[0].autotune = IDE_TUNE_BIOS;
-				hwif->drives[1].autotune = IDE_TUNE_BIOS;
-				goto done;
 #ifdef CONFIG_BLK_DEV_PDC4030
 			case -18: /* "dc4030" */
-			{
-				extern void init_pdc4030(void);
-				init_pdc4030();
+				probe_pdc4030 = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_PDC4030 */
+#endif
 #ifdef CONFIG_BLK_DEV_ALI14XX
 			case -17: /* "ali14xx" */
-			{
-				extern void init_ali14xx (void);
-				init_ali14xx();
+				probe_ali14xx = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_ALI14XX */
+#endif
 #ifdef CONFIG_BLK_DEV_UMC8672
 			case -16: /* "umc8672" */
-			{
-				extern void init_umc8672 (void);
-				init_umc8672();
+				probe_umc8672 = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_UMC8672 */
+#endif
 #ifdef CONFIG_BLK_DEV_DTC2278
 			case -15: /* "dtc2278" */
-			{
-				extern void init_dtc2278 (void);
-				init_dtc2278();
+				probe_dtc2278 = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_DTC2278 */
+#endif
 #ifdef CONFIG_BLK_DEV_CMD640
 			case -14: /* "cmd640_vlb" */
 			{
@@ -2007,23 +2030,17 @@
 				cmd640_vlb = 1;
 				goto done;
 			}
-#endif /* CONFIG_BLK_DEV_CMD640 */
+#endif
 #ifdef CONFIG_BLK_DEV_HT6560B
 			case -13: /* "ht6560b" */
-			{
-				extern void init_ht6560b (void);
-				init_ht6560b();
+				probe_ht6560b = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_HT6560B */
+#endif
 #ifdef CONFIG_BLK_DEV_QD65XX
 			case -12: /* "qd65xx" */
-			{
-				extern void init_qd65xx (void);
-				init_qd65xx();
+				probe_qd65xx = 1;
 				goto done;
-			}
-#endif /* CONFIG_BLK_DEV_QD65XX */
+#endif
 #ifdef CONFIG_BLK_DEV_4DRIVES
 			case -11: /* "four" drives on one set of ports */
 			{
@@ -2038,8 +2055,11 @@
 #endif /* CONFIG_BLK_DEV_4DRIVES */
 			case -10: /* minus10 */
 			case -9: /* minus9 */
-			case -8: /* minus8 */
 				goto bad_option;
+			case -8: /* "biostimings" */
+				hwif->drives[0].autotune = IDE_TUNE_BIOS;
+				hwif->drives[1].autotune = IDE_TUNE_BIOS;
+				goto done;
 			case -7: /* ata66 */
 #ifdef CONFIG_BLK_DEV_IDEPCI
 				hwif->udma_four = 1;
@@ -2478,6 +2498,31 @@
 
 	init_ide_data();
 
+#ifdef CONFIG_BLK_DEV_PDC4030
+	if (probe_pdc4030)
+		init_pdc4030();
+#endif
+#ifdef CONFIG_BLK_DEV_ALI14XX
+	if (probe_ali14xx)
+		init_ali14xx();
+#endif
+#ifdef CONFIG_BLK_DEV_UMC8672
+	if (probe_umc8672)
+		init_umc8672();
+#endif
+#ifdef CONFIG_BLK_DEV_DTC2278
+	if (probe_dtc2278)
+		init_dtc2278();
+#endif
+#ifdef CONFIG_BLK_DEV_HT6560B
+	if (probe_ht6560b)
+		init_ht6560b();
+#endif
+#ifdef CONFIG_BLK_DEV_QD65XX
+	if (probe_qd65xx)
+		init_qd65xx();
+#endif
+
 	initializing = 1;
 	ide_init_builtin_drivers();
 	initializing = 0;
diff -urN linux-2.5.69-bk19/drivers/input/misc/uinput.c linux-2.5.70/drivers/input/misc/uinput.c
--- linux-2.5.69-bk19/drivers/input/misc/uinput.c	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/drivers/input/misc/uinput.c	2003-05-26 19:02:21.000000000 -0700
@@ -192,15 +192,14 @@
 	if (NULL != dev->name) 
 		kfree(dev->name);
 
-	size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE);
-	dev->name = kmalloc(size + 1, GFP_KERNEL);
+	size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1;
+	dev->name = kmalloc(size, GFP_KERNEL);
 	if (!dev->name) {
 		retval = -ENOMEM;
 		goto exit;
 	}
 
-	strncpy(dev->name, user_dev->name, size);
-	dev->name[size] = '\0';
+	strlcpy(dev->name, user_dev->name, size);
 	dev->id.bustype	= user_dev->id.bustype;
 	dev->id.vendor	= user_dev->id.vendor;
 	dev->id.product	= user_dev->id.product;
diff -urN linux-2.5.69-bk19/drivers/isdn/act2000/module.c linux-2.5.70/drivers/isdn/act2000/module.c
--- linux-2.5.69-bk19/drivers/isdn/act2000/module.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/act2000/module.c	2003-05-26 19:02:21.000000000 -0700
@@ -601,7 +601,7 @@
 		ISDN_FEATURE_P_UNKNOWN;
         card->interface.hl_hdrlen = 20;
         card->ptype = ISDN_PTYPE_EURO;
-        strncpy(card->interface.id, id, sizeof(card->interface.id) - 1);
+        strlcpy(card->interface.id, id, sizeof(card->interface.id));
         for (i=0; i<ACT2000_BCH; i++) {
                 card->bch[i].plci = 0x8000;
                 card->bch[i].ncci = 0x8000;
diff -urN linux-2.5.69-bk19/drivers/isdn/capi/capi.c linux-2.5.70/drivers/isdn/capi/capi.c
--- linux-2.5.69-bk19/drivers/isdn/capi/capi.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/capi/capi.c	2003-05-26 19:02:21.000000000 -0700
@@ -1460,8 +1460,7 @@
 
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
-		strncpy(rev, p + 2, sizeof(rev));
-		rev[sizeof(rev)-1] = 0;
+		strlcpy(rev, p + 2, sizeof(rev));
 		if ((p = strchr(rev, '$')) != 0 && p > rev)
 		   *(p-1) = 0;
 	} else
diff -urN linux-2.5.69-bk19/drivers/isdn/capi/capifs.c linux-2.5.70/drivers/isdn/capi/capifs.c
--- linux-2.5.69-bk19/drivers/isdn/capi/capifs.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/capi/capifs.c	2003-05-26 19:02:21.000000000 -0700
@@ -234,8 +234,7 @@
 	int err;
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
-		strncpy(rev, p + 2, sizeof(rev));
-		rev[sizeof(rev)-1] = 0;
+		strlcpy(rev, p + 2, sizeof(rev));
 		if ((p = strchr(rev, '$')) != 0 && p > rev)
 		   *(p-1) = 0;
 	} else
diff -urN linux-2.5.69-bk19/drivers/isdn/capi/kcapi.c linux-2.5.70/drivers/isdn/capi/kcapi.c
--- linux-2.5.69-bk19/drivers/isdn/capi/kcapi.c	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/drivers/isdn/capi/kcapi.c	2003-05-26 19:02:21.000000000 -0700
@@ -631,14 +631,14 @@
 	struct capi_ctr *card;
 
 	if (contr == 0) {
-		strncpy(buf, capi_manufakturer, CAPI_MANUFACTURER_LEN);
+		strlcpy(buf, capi_manufakturer, sizeof(buf));
 		return CAPI_NOERROR;
 	}
 	card = get_capi_ctr_by_nr(contr);
 	if (!card || card->cardstate != CARD_RUNNING) 
 		return CAPI_REGNOTINSTALLED;
 
-	strncpy(buf, card->manu, CAPI_MANUFACTURER_LEN);
+	strlcpy(buf, card->manu, sizeof(buf));
 	return CAPI_NOERROR;
 }
 
@@ -667,14 +667,14 @@
 	struct capi_ctr *card;
 
 	if (contr == 0) {
-		strncpy(serial, driver_serial, CAPI_SERIAL_LEN);
+		strlcpy(serial, driver_serial, sizeof(serial));
 		return CAPI_NOERROR;
 	}
 	card = get_capi_ctr_by_nr(contr);
 	if (!card || card->cardstate != CARD_RUNNING) 
 		return CAPI_REGNOTINSTALLED;
 
-	strncpy((void *) serial, card->serial, CAPI_SERIAL_LEN);
+	strlcpy((void *) serial, card->serial, sizeof(serial));
 	return CAPI_NOERROR;
 }
 
@@ -873,8 +873,7 @@
         kcapi_proc_init();
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
-		strncpy(rev, p + 2, sizeof(rev));
-		rev[sizeof(rev)-1] = 0;
+		strlcpy(rev, p + 2, sizeof(rev));
 		if ((p = strchr(rev, '$')) != 0 && p > rev)
 		   *(p-1) = 0;
 	} else
diff -urN linux-2.5.69-bk19/drivers/isdn/eicon/eicon_idi.c linux-2.5.70/drivers/isdn/eicon/eicon_idi.c
--- linux-2.5.69-bk19/drivers/isdn/eicon/eicon_idi.c	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/drivers/isdn/eicon/eicon_idi.c	2003-05-26 19:02:21.000000000 -0700
@@ -1118,8 +1118,7 @@
 		//eicon_log(NULL, 128, "sT30:universal_7 = %x\n", t30->universal_7);
 		eicon_log(NULL, 128, "sT30:station_id_len = %x\n", t30->station_id_len);
 		eicon_log(NULL, 128, "sT30:head_line_len = %x\n", t30->head_line_len);
-		strncpy(st, t30->station_id, t30->station_id_len);
-		st[t30->station_id_len] = 0;
+		strlcpy(st, t30->station_id, t30->station_id_len + 1);
 		eicon_log(NULL, 128, "sT30:station_id = <%s>\n", st);
 	}
 	return(sizeof(eicon_t30_s));
@@ -1195,8 +1194,7 @@
 		//eicon_log(ccard, 128, "rT30:universal_7 = %x\n", p->universal_7);
 		eicon_log(ccard, 128, "rT30:station_id_len = %x\n", p->station_id_len);
 		eicon_log(ccard, 128, "rT30:head_line_len = %x\n", p->head_line_len);
-		strncpy(st, p->station_id, p->station_id_len);
-		st[p->station_id_len] = 0;
+		strlcpy(st, p->station_id, p->station_id_len + 1);
 		eicon_log(ccard, 128, "rT30:station_id = <%s>\n", st);
 	}
 	if (!chan->fax) {
diff -urN linux-2.5.69-bk19/drivers/isdn/eicon/eicon_mod.c linux-2.5.70/drivers/isdn/eicon/eicon_mod.c
--- linux-2.5.69-bk19/drivers/isdn/eicon/eicon_mod.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/eicon/eicon_mod.c	2003-05-26 19:02:21.000000000 -0700
@@ -848,7 +848,7 @@
 			ISDN_FEATURE_P_UNKNOWN;
 		card->interface.hl_hdrlen = 20;
 		card->ptype = ISDN_PTYPE_UNKNOWN;
-		strncpy(card->interface.id, id, sizeof(card->interface.id) - 1);
+		strlcpy(card->interface.id, id, sizeof(card->interface.id));
 		card->myid = -1;
 		card->type = Type;
 		switch (Type) {
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/avm/avm_cs.c linux-2.5.70/drivers/isdn/hardware/avm/avm_cs.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/avm/avm_cs.c	2003-05-04 16:52:49.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/avm/avm_cs.c	2003-05-26 19:02:21.000000000 -0700
@@ -320,7 +320,7 @@
 
 	devname[0] = 0;
 	if( !first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 1 ) {
-	    strncpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
+	    strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
 			sizeof(devname));
 	}
 	/*
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/avm/b1.c linux-2.5.70/drivers/isdn/hardware/avm/b1.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/avm/b1.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/avm/b1.c	2003-05-26 19:02:21.000000000 -0700
@@ -433,9 +433,9 @@
 	     j++, i += cinfo->versionbuf[i] + 1)
 		cinfo->version[j] = &cinfo->versionbuf[i + 1];
 
-	strncpy(ctrl->serial, cinfo->version[VER_SERIAL], CAPI_SERIAL_LEN);
+	strlcpy(ctrl->serial, cinfo->version[VER_SERIAL], sizeof(ctrl->serial));
 	memcpy(&ctrl->profile, cinfo->version[VER_PROFILE],sizeof(capi_profile));
-	strncpy(ctrl->manu, "AVM GmbH", CAPI_MANUFACTURER_LEN);
+	strlcpy(ctrl->manu, "AVM GmbH", sizeof(ctrl->manu));
 	dversion = cinfo->version[VER_DRIVER];
 	ctrl->version.majorversion = 2;
 	ctrl->version.minorversion = 0;
@@ -785,8 +785,7 @@
 	char rev[32];
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
-		strncpy(rev, p + 2, sizeof(rev));
-		rev[sizeof(rev)-1] = 0;
+		strlcpy(rev, p + 2, sizeof(rev));
 		if ((p = strchr(rev, '$')) != 0 && p > rev)
 		   *(p-1) = 0;
 	} else
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/avm/b1dma.c linux-2.5.70/drivers/isdn/hardware/avm/b1dma.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/avm/b1dma.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/avm/b1dma.c	2003-05-26 19:02:21.000000000 -0700
@@ -945,8 +945,7 @@
 	char rev[32];
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
-		strncpy(rev, p + 2, sizeof(rev));
-		rev[sizeof(rev)-1] = 0;
+		strlcpy(rev, p + 2, sizeof(rev));
 		if ((p = strchr(rev, '$')) != 0 && p > rev)
 		   *(p-1) = 0;
 	} else
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/eicon/capifunc.c linux-2.5.70/drivers/isdn/hardware/eicon/capifunc.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/eicon/capifunc.c	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/eicon/capifunc.c	2003-05-26 19:02:21.000000000 -0700
@@ -512,7 +512,7 @@
 	sync_req.GetName.Req = 0;
 	sync_req.GetName.Rc = IDI_SYNC_REQ_GET_NAME;
 	card->d.request((ENTITY *) & sync_req);
-	strncpy(card->name, sync_req.GetName.name, sizeof(card->name));
+	strlcpy(card->name, sync_req.GetName.name, sizeof(card->name));
 	ctrl = &card->capi_ctrl;
 	strcpy(ctrl->name, card->name);
 	ctrl->register_appl = diva_register_appl;
@@ -528,7 +528,7 @@
 		return (0);
 	}
 	card->Id = find_free_id();
-	strncpy(ctrl->manu, M_COMPANY, CAPI_MANUFACTURER_LEN);
+	strlcpy(ctrl->manu, M_COMPANY, sizeof(ctrl->manu));
 	ctrl->version.majorversion = 2;
 	ctrl->version.minorversion = 0;
 	ctrl->version.majormanuversion = DRRELMAJOR;
@@ -544,7 +544,7 @@
 		sprintf(serial, "%ld", sync_req.GetSerial.serial);
 	}
 	serial[CAPI_SERIAL_LEN - 1] = 0;
-	strncpy(ctrl->serial, serial, CAPI_SERIAL_LEN);
+	strlcpy(ctrl->serial, serial, sizeof(ctrl->serial));
 
 	a = &adapter[card->Id - 1];
 	card->adapter = a;
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/eicon/divasfunc.c linux-2.5.70/drivers/isdn/hardware/eicon/divasfunc.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/eicon/divasfunc.c	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/eicon/divasfunc.c	2003-05-26 19:02:21.000000000 -0700
@@ -77,16 +77,10 @@
 		d.features = IoAdapters[card - 1]->Properties.Features;
 		DBG_TRC(("DIDD register A(%d) channels=%d", card,
 			 d.channels))
-		    /* workaround for different Name in structure */
-		    strncpy(IoAdapters[card - 1]->Name,
-			    IoAdapters[card - 1]->Properties.Name, MIN(30,
-								       strlen
-								       (IoAdapters
-									[card
-									 -
-									 1]->
-									Properties.
-									Name)));
+		/* workaround for different Name in structure */
+		strlcpy(IoAdapters[card - 1]->Name,
+			IoAdapters[card - 1]->Properties.Name,
+			sizeof(IoAdapters[card - 1]->Name));
 		req.didd_remove_adapter.e.Req = 0;
 		req.didd_add_adapter.e.Rc = IDI_SYNC_REQ_DIDD_ADD_ADAPTER;
 		req.didd_add_adapter.info.descriptor = (void *) &d;
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/eicon/i4l_idi.c linux-2.5.70/drivers/isdn/hardware/eicon/i4l_idi.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/eicon/i4l_idi.c	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/eicon/i4l_idi.c	2003-05-26 19:02:21.000000000 -0700
@@ -1127,8 +1127,7 @@
 		//eicon_log(NULL, 128, "sT30:universal_7 = %x\n", t30->universal_7);
 		eicon_log(NULL, 128, "sT30:station_id_len = %x\n", t30->station_id_len);
 		eicon_log(NULL, 128, "sT30:head_line_len = %x\n", t30->head_line_len);
-		strncpy(st, t30->station_id, t30->station_id_len);
-		st[t30->station_id_len] = 0;
+		strlcpy(st, t30->station_id, t30->station_id_len + 1);
 		eicon_log(NULL, 128, "sT30:station_id = <%s>\n", st);
 	}
 	return(sizeof(eicon_t30_s));
@@ -1204,8 +1203,7 @@
 		//eicon_log(ccard, 128, "rT30:universal_7 = %x\n", p->universal_7);
 		eicon_log(ccard, 128, "rT30:station_id_len = %x\n", p->station_id_len);
 		eicon_log(ccard, 128, "rT30:head_line_len = %x\n", p->head_line_len);
-		strncpy(st, p->station_id, p->station_id_len);
-		st[p->station_id_len] = 0;
+		strlcpy(st, p->station_id, p->station_id_len + 1);
 		eicon_log(ccard, 128, "rT30:station_id = <%s>\n", st);
 	}
 	if (!chan->fax) {
diff -urN linux-2.5.69-bk19/drivers/isdn/hardware/eicon/um_idi.c linux-2.5.70/drivers/isdn/hardware/eicon/um_idi.c
--- linux-2.5.69-bk19/drivers/isdn/hardware/eicon/um_idi.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hardware/eicon/um_idi.c	2003-05-26 19:02:21.000000000 -0700
@@ -66,8 +66,8 @@
 		sync_req.GetName.Req = 0;
 		sync_req.GetName.Rc = IDI_SYNC_REQ_GET_NAME;
 		(*(a->d.request)) ((ENTITY *) & sync_req);
-		strncpy(features->name, sync_req.GetName.name,
-			sizeof(features->name) - 1);
+		strlcpy(features->name, sync_req.GetName.name,
+			sizeof(features->name));
 
 		sync_req.GetSerial.Req = 0;
 		sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
diff -urN linux-2.5.69-bk19/drivers/isdn/hisax/avma1_cs.c linux-2.5.70/drivers/isdn/hisax/avma1_cs.c
--- linux-2.5.69-bk19/drivers/isdn/hisax/avma1_cs.c	2003-05-04 16:53:34.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hisax/avma1_cs.c	2003-05-26 19:02:21.000000000 -0700
@@ -335,7 +335,7 @@
 
 	devname[0] = 0;
 	if( !first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 1 ) {
-	    strncpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
+	    strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
 			sizeof(devname));
 	}
 	/*
diff -urN linux-2.5.69-bk19/drivers/isdn/hisax/callc.c linux-2.5.70/drivers/isdn/hisax/callc.c
--- linux-2.5.69-bk19/drivers/isdn/hisax/callc.c	2003-05-04 16:53:29.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hisax/callc.c	2003-05-26 19:02:21.000000000 -0700
@@ -1209,7 +1209,7 @@
 			kfree(csta->channel[i].b_st);
 			csta->channel[i].b_st = NULL;
 		} else
-			printk(KERN_WARNING "CallcFreeChan b_st ch%d allready freed\n", i);
+			printk(KERN_WARNING "CallcFreeChan b_st ch%d already freed\n", i);
 		if (i || test_bit(FLG_TWO_DCHAN, &csta->HW_Flags)) {
 			release_d_st(csta->channel + i);
 		} else
@@ -1478,11 +1478,11 @@
 		return;
 	switch(cm->para[3]) {
 		case 4: /* Suspend */
-			strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
+			strlcpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
 			FsmEvent(&chanp->fi, EV_SUSPEND, cm);
 			break;
 		case 5: /* Resume */
-			strncpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
+			strlcpy(chanp->setup.phone, &cm->para[5], cm->para[5] +1);
 			if (chanp->fi.state == ST_NULL) {
 				FsmEvent(&chanp->fi, EV_RESUME, cm);
 			} else {
diff -urN linux-2.5.69-bk19/drivers/isdn/hisax/tei.c linux-2.5.70/drivers/isdn/hisax/tei.c
--- linux-2.5.69-bk19/drivers/isdn/hisax/tei.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hisax/tei.c	2003-05-26 19:02:21.000000000 -0700
@@ -145,7 +145,7 @@
 
 	if (st->l2.tei != -1) {
 		st->ma.tei_m.printdebug(&st->ma.tei_m,
-			"assign request for allready asigned tei %d",
+			"assign request for already assigned tei %d",
 			st->l2.tei);
 		return;
 	}
diff -urN linux-2.5.69-bk19/drivers/isdn/hisax/teleint.c linux-2.5.70/drivers/isdn/hisax/teleint.c
--- linux-2.5.69-bk19/drivers/isdn/hisax/teleint.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hisax/teleint.c	2003-05-26 19:02:21.000000000 -0700
@@ -95,7 +95,7 @@
 	register int max_delay = 20000;
 	register int i;
 	
-	/* fifo write without cli because it's allready done  */
+	/* fifo write without cli because it's already done  */
 	byteout(ale, off);
 	for (i = 0; i<size; i++) {
 		ret = HFC_BUSY & bytein(ale);
diff -urN linux-2.5.69-bk19/drivers/isdn/hysdn/hycapi.c linux-2.5.70/drivers/isdn/hysdn/hycapi.c
--- linux-2.5.69-bk19/drivers/isdn/hysdn/hycapi.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/hysdn/hycapi.c	2003-05-26 19:02:21.000000000 -0700
@@ -227,7 +227,7 @@
 		return;
 	}
 	if(chk == 1) {
-		printk(KERN_INFO "HYSDN: apl %d allready registered\n", appl);
+		printk(KERN_INFO "HYSDN: apl %d already registered\n", appl);
 		return;
 	}
 	MaxBDataBlocks = rp->datablkcnt > CAPI_MAXDATAWINDOW ? CAPI_MAXDATAWINDOW : rp->datablkcnt;
diff -urN linux-2.5.69-bk19/drivers/isdn/i4l/isdn_net_lib.c linux-2.5.70/drivers/isdn/i4l/isdn_net_lib.c
--- linux-2.5.69-bk19/drivers/isdn/i4l/isdn_net_lib.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/i4l/isdn_net_lib.c	2003-05-26 19:02:21.000000000 -0700
@@ -270,8 +270,7 @@
 	int chidx = -1;
 	char drvid[25];
 
-	strncpy(drvid, cfg->drvid, 24);
-	drvid[24] = 0;
+	strlcpy(drvid, cfg->drvid, sizeof(drvid));
 
 	if (cfg->exclusive && !strlen(drvid)) {
 		/* If we want to bind exclusively, need to specify drv/chan */
@@ -562,8 +561,7 @@
 	if (retval)
 		goto out;
 
-	strncpy(mlp->msn, cfg->eaz, ISDN_MSNLEN-1);
-	mlp->msn[ISDN_MSNLEN-1] = 0;
+	strlcpy(mlp->msn, cfg->eaz, sizeof(mlp->msn));
 	mlp->onhtime = cfg->onhtime;
 	idev->charge = cfg->charge;
 	mlp->l2_proto = cfg->l2_proto;
@@ -864,7 +862,7 @@
 
 	slot = idev->isdn_slot;
 
-	strncpy(phone->phone, slot->num, ISDN_MSNLEN);
+	strlcpy(phone->phone, slot->num, sizeof(phone->phone));
 	phone->outgoing = USG_OUTGOING(slot->usage);
 
 	if (copy_to_user(peer, phone, sizeof(*peer)))
diff -urN linux-2.5.69-bk19/drivers/isdn/i4l/isdn_ppp.c linux-2.5.70/drivers/isdn/i4l/isdn_ppp.c
--- linux-2.5.69-bk19/drivers/isdn/i4l/isdn_ppp.c	2003-05-04 16:53:33.000000000 -0700
+++ linux-2.5.70/drivers/isdn/i4l/isdn_ppp.c	2003-05-26 19:02:21.000000000 -0700
@@ -467,11 +467,11 @@
 		memset(&pci, 0, sizeof(pci));
 
 		mlp = idev->mlp;
-		strncpy(pci.local_num, mlp->msn, 63);
+		strlcpy(pci.local_num, mlp->msn, sizeof(pci.local_num));
 		i = 0;
 		list_for_each_entry(phone, &mlp->phone[1], list) {
 			if (i++ == idev->dial) {
-				strncpy(pci.remote_num,phone->num,63);
+				strlcpy(pci.remote_num,phone->num,sizeof(pci.remote_num));
 				break;
 			}
 		}
diff -urN linux-2.5.69-bk19/drivers/isdn/icn/icn.c linux-2.5.70/drivers/isdn/icn/icn.c
--- linux-2.5.69-bk19/drivers/isdn/icn/icn.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/icn/icn.c	2003-05-26 19:02:21.000000000 -0700
@@ -509,7 +509,7 @@
 				char *s = strpbrk(t, ",");
 
 				*s++ = '\0';
-				strncpy(cmd.parm.setup.phone, t,
+				strlcpy(cmd.parm.setup.phone, t,
 					sizeof(cmd.parm.setup.phone));
 				s = strpbrk(t = s, ",");
 				*s++ = '\0';
@@ -525,7 +525,7 @@
 				else
 					cmd.parm.setup.si2 =
 					    simple_strtoul(t, NULL, 10);
-				strncpy(cmd.parm.setup.eazmsn, s,
+				strlcpy(cmd.parm.setup.eazmsn, s,
 					sizeof(cmd.parm.setup.eazmsn));
 			}
 			cmd.parm.setup.plan = 0;
@@ -540,19 +540,19 @@
 			cmd.parm.setup.screen = 0;
 			break;
 		case 5:
-			strncpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num) - 1);
+			strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
 			break;
 		case 6:
-			sprintf(cmd.parm.num, "%d",
+			snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
 			     (int) simple_strtoul(status + 7, NULL, 16));
 			break;
 		case 7:
 			status += 3;
 			if (strlen(status) == 4)
-				sprintf(cmd.parm.num, "%s%c%c",
+				snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
 				     status + 2, *status, *(status + 1));
 			else
-				strncpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num) - 1);
+				strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
 			break;
 		case 8:
 			card->flags &= ~ICN_FLAGS_B1ACTIVE;
@@ -1558,7 +1558,7 @@
 	    ISDN_FEATURE_L3_TRANS |
 	    ISDN_FEATURE_P_UNKNOWN;
 	card->ptype = ISDN_PTYPE_UNKNOWN;
-	strncpy(card->interface.id, id, sizeof(card->interface.id) - 1);
+	strlcpy(card->interface.id, id, sizeof(card->interface.id));
 	card->msg_buf_write = card->msg_buf;
 	card->msg_buf_read = card->msg_buf;
 	card->msg_buf_end = &card->msg_buf[sizeof(card->msg_buf) - 1];
diff -urN linux-2.5.69-bk19/drivers/isdn/isdnloop/isdnloop.c linux-2.5.70/drivers/isdn/isdnloop/isdnloop.c
--- linux-2.5.69-bk19/drivers/isdn/isdnloop/isdnloop.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/isdn/isdnloop/isdnloop.c	2003-05-26 19:02:21.000000000 -0700
@@ -125,7 +125,7 @@
 	char *s = strpbrk(t, ",");
 
 	*s++ = '\0';
-	strncpy(cmd->parm.setup.phone, t, sizeof(cmd->parm.setup.phone));
+	strlcpy(cmd->parm.setup.phone, t, sizeof(cmd->parm.setup.phone));
 	s = strpbrk(t = s, ",");
 	*s++ = '\0';
 	if (!strlen(t))
@@ -139,7 +139,7 @@
 	else
 		cmd->parm.setup.si2 =
 		    simple_strtoul(t, NULL, 10);
-	strncpy(cmd->parm.setup.eazmsn, s, sizeof(cmd->parm.setup.eazmsn));
+	strlcpy(cmd->parm.setup.eazmsn, s, sizeof(cmd->parm.setup.eazmsn));
 	cmd->parm.setup.plan = 0;
 	cmd->parm.setup.screen = 0;
 }
@@ -228,21 +228,21 @@
 			break;
 		case 5:
 			/* CIF */
-			strncpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num) - 1);
+			strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
 			break;
 		case 6:
 			/* AOC */
-			sprintf(cmd.parm.num, "%d",
+			snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
 			     (int) simple_strtoul(status + 7, NULL, 16));
 			break;
 		case 7:
 			/* CAU */
 			status += 3;
 			if (strlen(status) == 4)
-				sprintf(cmd.parm.num, "%s%c%c",
+				snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
 				     status + 2, *status, *(status + 1));
 			else
-				strncpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num) - 1);
+				strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
 			break;
 		case 8:
 			/* Misc Errors on L1 and L2 */
@@ -1467,7 +1467,7 @@
 	    ISDN_FEATURE_L3_TRANS |
 	    ISDN_FEATURE_P_UNKNOWN;
 	card->ptype = ISDN_PTYPE_UNKNOWN;
-	strncpy(card->interface.id, id, sizeof(card->interface.id) - 1);
+	strlcpy(card->interface.id, id, sizeof(card->interface.id));
 	card->msg_buf_write = card->msg_buf;
 	card->msg_buf_read = card->msg_buf;
 	card->msg_buf_end = &card->msg_buf[sizeof(card->msg_buf) - 1];
diff -urN linux-2.5.69-bk19/drivers/mca/mca-legacy.c linux-2.5.70/drivers/mca/mca-legacy.c
--- linux-2.5.69-bk19/drivers/mca/mca-legacy.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/mca/mca-legacy.c	2003-05-26 19:02:21.000000000 -0700
@@ -278,8 +278,7 @@
 	if(!mca_dev)
 		return;
 
-	strncpy(mca_dev->dev.name, name, sizeof(mca_dev->dev.name));
-	mca_dev->dev.name[sizeof(mca_dev->dev.name) - 1] = '\0';
+	strlcpy(mca_dev->dev.name, name, sizeof(mca_dev->dev.name));
 }
 EXPORT_SYMBOL(mca_set_adapter_name);
 
diff -urN linux-2.5.69-bk19/drivers/md/dm-ioctl.c linux-2.5.70/drivers/md/dm-ioctl.c
--- linux-2.5.69-bk19/drivers/md/dm-ioctl.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/md/dm-ioctl.c	2003-05-26 19:02:21.000000000 -0700
@@ -488,9 +488,9 @@
 		 * Sneakily write in both the name and the uuid
 		 * while we have the cell.
 		 */
-		strncpy(param->name, hc->name, sizeof(param->name));
+		strlcpy(param->name, hc->name, sizeof(param->name));
 		if (hc->uuid)
-			strncpy(param->uuid, hc->uuid, sizeof(param->uuid) - 1);
+			strlcpy(param->uuid, hc->uuid, sizeof(param->uuid));
 		else
 			param->uuid[0] = '\0';
 
@@ -626,7 +626,7 @@
 		spec->status = 0;
 		spec->sector_start = ti->begin;
 		spec->length = ti->len;
-		strncpy(spec->target_type, ti->type->name,
+		strlcpy(spec->target_type, ti->type->name,
 			sizeof(spec->target_type));
 
 		outptr += sizeof(struct dm_target_spec);
diff -urN linux-2.5.69-bk19/drivers/media/common/saa7146_fops.c linux-2.5.70/drivers/media/common/saa7146_fops.c
--- linux-2.5.69-bk19/drivers/media/common/saa7146_fops.c	2003-05-04 16:53:29.000000000 -0700
+++ linux-2.5.70/drivers/media/common/saa7146_fops.c	2003-05-26 19:02:21.000000000 -0700
@@ -430,7 +430,7 @@
 	DEB_EE(("dev:%p, name:'%s'\n",dev,name));
  
  	*vid = device_template;
-	strncpy(vid->name, name, 32);
+	strlcpy(vid->name, name, sizeof(vid->name));
 	vid->priv = dev;
 
 	// fixme: -1 should be an insmod parameter *for the extension* (like "video_nr");
diff -urN linux-2.5.69-bk19/drivers/media/common/saa7146_video.c linux-2.5.70/drivers/media/common/saa7146_video.c
--- linux-2.5.69-bk19/drivers/media/common/saa7146_video.c	2003-05-04 16:53:33.000000000 -0700
+++ linux-2.5.70/drivers/media/common/saa7146_video.c	2003-05-26 19:02:21.000000000 -0700
@@ -801,7 +801,7 @@
 		DEB_EE(("VIDIOC_QUERYCAP\n"));
 		
                 strcpy(cap->driver, "saa7146 v4l2");
-		strncpy(cap->card, dev->ext->name, sizeof(cap->card));
+		strlcpy(cap->card, dev->ext->name, sizeof(cap->card));
 		sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name);
 		cap->version = SAA7146_VERSION_CODE;
 		cap->capabilities =
@@ -868,7 +868,7 @@
 			}
 			memset(f,0,sizeof(*f));
 			f->index = index;
-			strncpy(f->description,formats[index].name,31);
+			strlcpy(f->description,formats[index].name,sizeof(f->description));
 			f->pixelformat = formats[index].pixelformat;
 			break;
 		}
diff -urN linux-2.5.69-bk19/drivers/media/video/adv7175.c linux-2.5.70/drivers/media/video/adv7175.c
--- linux-2.5.69-bk19/drivers/media/video/adv7175.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/media/video/adv7175.c	2003-05-26 19:02:21.000000000 -0700
@@ -191,7 +191,7 @@
 		// We should never get here!!!
 		dname = unknown_name;
 	}
-	strncpy(client->dev.name, dname, DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, dname, DEVICE_NAME_SIZE);
 	init_MUTEX(&encoder->lock);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
diff -urN linux-2.5.69-bk19/drivers/media/video/bt819.c linux-2.5.70/drivers/media/video/bt819.c
--- linux-2.5.69-bk19/drivers/media/video/bt819.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/bt819.c	2003-05-26 19:02:21.000000000 -0700
@@ -172,7 +172,7 @@
 	}
 
 	memset(decoder, 0, sizeof(struct bt819));
-	strncpy(client->dev.name, "bt819", DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, "bt819", DEVICE_NAME_SIZE);
 	i2c_set_clientdata(client, decoder);
 	decoder->client = client;
 	decoder->addr = addr;
diff -urN linux-2.5.69-bk19/drivers/media/video/bt856.c linux-2.5.70/drivers/media/video/bt856.c
--- linux-2.5.69-bk19/drivers/media/video/bt856.c	2003-05-04 16:52:49.000000000 -0700
+++ linux-2.5.70/drivers/media/video/bt856.c	2003-05-26 19:02:21.000000000 -0700
@@ -123,7 +123,7 @@
 
 
 	memset(encoder, 0, sizeof(struct bt856));
-	strncpy(client->dev.name, "bt856", DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, "bt856", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = client->addr;
diff -urN linux-2.5.69-bk19/drivers/media/video/bttv-driver.c linux-2.5.70/drivers/media/video/bttv-driver.c
--- linux-2.5.69-bk19/drivers/media/video/bttv-driver.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/media/video/bttv-driver.c	2003-05-26 19:02:21.000000000 -0700
@@ -2309,7 +2309,7 @@
 		if (0 == v4l2)
 			return -EINVAL;
                 strcpy(cap->driver,"bttv");
-                strncpy(cap->card,btv->video_dev.name,sizeof(cap->card));
+                strlcpy(cap->card,btv->video_dev.name,sizeof(cap->card));
 		sprintf(cap->bus_info,"PCI:%s",btv->dev->slot_name);
 		cap->version = BTTV_VERSION_CODE;
 		cap->capabilities =
@@ -2367,7 +2367,7 @@
 		f->index       = index;
 		f->type        = type;
 		f->pixelformat = bttv_formats[i].fourcc;
-		strncpy(f->description,bttv_formats[i].name,31);
+		strlcpy(f->description,bttv_formats[i].name,sizeof(f->description));
 		return 0;
 	}
 
diff -urN linux-2.5.69-bk19/drivers/media/video/cpia_pp.c linux-2.5.70/drivers/media/video/cpia_pp.c
--- linux-2.5.69-bk19/drivers/media/video/cpia_pp.c	2003-05-04 16:52:49.000000000 -0700
+++ linux-2.5.70/drivers/media/video/cpia_pp.c	2003-05-26 19:02:21.000000000 -0700
@@ -605,8 +605,8 @@
 			return -EINVAL;
 		}
 		if((err = ReadPacket(cam, buffer, 8)) < 0) {
-			return err;
 			DBG("Error reading command result\n");
+                       return err;
 		}
 		memcpy(data, buffer, databytes);
 	} else if(command[0] == DATA_OUT) {
diff -urN linux-2.5.69-bk19/drivers/media/video/saa5249.c linux-2.5.70/drivers/media/video/saa5249.c
--- linux-2.5.69-bk19/drivers/media/video/saa5249.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa5249.c	2003-05-26 19:02:21.000000000 -0700
@@ -171,7 +171,7 @@
 		return -ENOMEM;
 	}
 	memset(t, 0, sizeof(*t));
-	strncpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
 	init_MUTEX(&t->lock);
 	
 	/*
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7110.c linux-2.5.70/drivers/media/video/saa7110.c
--- linux-2.5.69-bk19/drivers/media/video/saa7110.c	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7110.c	2003-05-26 19:02:21.000000000 -0700
@@ -176,7 +176,7 @@
 
 	/* clear our private data */
 	memset(decoder, 0, sizeof(*decoder));
-	strncpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, IF_NAME, DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7111.c linux-2.5.70/drivers/media/video/saa7111.c
--- linux-2.5.69-bk19/drivers/media/video/saa7111.c	2003-05-04 16:53:13.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7111.c	2003-05-26 19:02:21.000000000 -0700
@@ -122,7 +122,7 @@
 	}
 
 	memset(decoder, 0, sizeof(*decoder));
-	strncpy(client->dev.name, "saa7111", DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, "saa7111", DEVICE_NAME_SIZE);
 	decoder->client = client;
 	i2c_set_clientdata(client, decoder);
 	decoder->addr = addr;
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-oss.c linux-2.5.70/drivers/media/video/saa7134/saa7134-oss.c
--- linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-oss.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7134/saa7134-oss.c	2003-05-26 19:02:21.000000000 -0700
@@ -636,8 +636,8 @@
 	{
 		mixer_info info;
 		memset(&info,0,sizeof(info));
-                strncpy(info.id,   "TV audio", sizeof(info.id)-1);
-                strncpy(info.name, dev->name,  sizeof(info.name)-1);
+                strlcpy(info.id,   "TV audio", sizeof(info.id));
+                strlcpy(info.name, dev->name,  sizeof(info.name));
                 info.modify_counter = dev->oss.count;
                 if (copy_to_user((void *)arg, &info, sizeof(info)))
                         return -EFAULT;
@@ -647,8 +647,8 @@
 	{
 		_old_mixer_info info;
 		memset(&info,0,sizeof(info));
-                strncpy(info.id,   "TV audio", sizeof(info.id)-1);
-                strncpy(info.name, dev->name,  sizeof(info.name)-1);
+                strlcpy(info.id,   "TV audio", sizeof(info.id));
+                strlcpy(info.name, dev->name,  sizeof(info.name));
                 if (copy_to_user((void *)arg, &info, sizeof(info)))
                         return -EFAULT;
 		return 0;
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-ts.c linux-2.5.70/drivers/media/video/saa7134/saa7134-ts.c
--- linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-ts.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7134/saa7134-ts.c	2003-05-26 19:02:21.000000000 -0700
@@ -251,7 +251,7 @@
 
 		memset(cap,0,sizeof(*cap));
                 strcpy(cap->driver, "saa7134");
-		strncpy(cap->card, saa7134_boards[dev->board].name,
+		strlcpy(cap->card, saa7134_boards[dev->board].name,
 			sizeof(cap->card));
 		sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name);
 		cap->version = SAA7134_VERSION_CODE;
@@ -300,7 +300,7 @@
 		
 		memset(f,0,sizeof(*f));
 		f->index = index;
-		strncpy(f->description, "MPEG TS", 31);
+		strlcpy(f->description, "MPEG TS", sizeof(f->description));
 		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 		f->pixelformat = V4L2_PIX_FMT_MPEG;
 		return 0;
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-video.c linux-2.5.70/drivers/media/video/saa7134/saa7134-video.c
--- linux-2.5.69-bk19/drivers/media/video/saa7134/saa7134-video.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7134/saa7134-video.c	2003-05-26 19:02:21.000000000 -0700
@@ -1501,7 +1501,7 @@
 		
 		memset(cap,0,sizeof(*cap));
                 strcpy(cap->driver, "saa7134");
-		strncpy(cap->card, saa7134_boards[dev->board].name,
+		strlcpy(cap->card, saa7134_boards[dev->board].name,
 			sizeof(cap->card));
 		sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name);
 		cap->version = SAA7134_VERSION_CODE;
@@ -1733,7 +1733,7 @@
 			memset(f,0,sizeof(*f));
 			f->index = index;
 			f->type  = type;
-			strncpy(f->description,formats[index].name,31);
+			strlcpy(f->description,formats[index].name,sizeof(f->description));
 			f->pixelformat = formats[index].fourcc;
 			break;
 		case V4L2_BUF_TYPE_VBI_CAPTURE:
@@ -1901,7 +1901,7 @@
 
 		memset(cap,0,sizeof(*cap));
                 strcpy(cap->driver, "saa7134");
-		strncpy(cap->card, saa7134_boards[dev->board].name,
+		strlcpy(cap->card, saa7134_boards[dev->board].name,
 			sizeof(cap->card));
 		sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name);
 		cap->version = SAA7134_VERSION_CODE;
diff -urN linux-2.5.69-bk19/drivers/media/video/saa7185.c linux-2.5.70/drivers/media/video/saa7185.c
--- linux-2.5.69-bk19/drivers/media/video/saa7185.c	2003-05-04 16:52:59.000000000 -0700
+++ linux-2.5.70/drivers/media/video/saa7185.c	2003-05-26 19:02:21.000000000 -0700
@@ -202,7 +202,7 @@
 
 
 	memset(encoder, 0, sizeof(*encoder));
-	strncpy(client->dev.name, "saa7185", DEVICE_NAME_SIZE);
+	strlcpy(client->dev.name, "saa7185", DEVICE_NAME_SIZE);
 	encoder->client = client;
 	i2c_set_clientdata(client, encoder);
 	encoder->addr = addr;
diff -urN linux-2.5.69-bk19/drivers/media/video/tuner.c linux-2.5.70/drivers/media/video/tuner.c
--- linux-2.5.69-bk19/drivers/media/video/tuner.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/tuner.c	2003-05-26 19:02:21.000000000 -0700
@@ -824,7 +824,7 @@
 	if (type < TUNERS) {
 		t->type = type;
 		printk("tuner(bttv): type forced to %d (%s) [insmod]\n",t->type,tuners[t->type].name);
-		strncpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
 	}
         i2c_attach_client(client);
         if (t->type == TUNER_MT2032)
@@ -875,7 +875,7 @@
 		t->type = *iarg;
 		printk("tuner: type set to %d (%s)\n",
                         t->type,tuners[t->type].name);
-		strncpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
+		strlcpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
 		if (t->type == TUNER_MT2032)
                         mt2032_init(client);
 		break;
diff -urN linux-2.5.69-bk19/drivers/media/video/tvmixer.c linux-2.5.70/drivers/media/video/tvmixer.c
--- linux-2.5.69-bk19/drivers/media/video/tvmixer.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/tvmixer.c	2003-05-26 19:02:21.000000000 -0700
@@ -83,8 +83,8 @@
 	
         if (cmd == SOUND_MIXER_INFO) {
                 mixer_info info;
-                strncpy(info.id, "tv card", sizeof(info.id));
-                strncpy(info.name, i2c_clientname(client), sizeof(info.name));
+                strlcpy(info.id, "tv card", sizeof(info.id));
+                strlcpy(info.name, i2c_clientname(client), sizeof(info.name));
                 info.modify_counter = 42 /* FIXME */;
                 if (copy_to_user((void *)arg, &info, sizeof(info)))
                         return -EFAULT;
@@ -92,8 +92,8 @@
         }
         if (cmd == SOUND_OLD_MIXER_INFO) {
                 _old_mixer_info info;
-                strncpy(info.id, "tv card", sizeof(info.id));
-                strncpy(info.name, i2c_clientname(client), sizeof(info.name));
+                strlcpy(info.id, "tv card", sizeof(info.id));
+                strlcpy(info.name, i2c_clientname(client), sizeof(info.name));
                 if (copy_to_user((void *)arg, &info, sizeof(info)))
                         return -EFAULT;
                 return 0;
diff -urN linux-2.5.69-bk19/drivers/media/video/v4l2-common.c linux-2.5.70/drivers/media/video/v4l2-common.c
--- linux-2.5.69-bk19/drivers/media/video/v4l2-common.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/media/video/v4l2-common.c	2003-05-26 19:02:21.000000000 -0700
@@ -113,7 +113,7 @@
 		vs->frameperiod.denominator = 25;
 		vs->framelines = 625;
 	}
-	strncpy(vs->name,name,sizeof(vs->name));
+	strlcpy(vs->name,name,sizeof(vs->name));
 	return 0;
 }
 
diff -urN linux-2.5.69-bk19/drivers/media/video/videodev.c linux-2.5.70/drivers/media/video/videodev.c
--- linux-2.5.69-bk19/drivers/media/video/videodev.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/media/video/videodev.c	2003-05-26 19:02:21.000000000 -0700
@@ -286,7 +286,7 @@
 	video_dev_proc_entry->owner = THIS_MODULE;
 }
 
-static void videodev_proc_destroy(void)
+static void __exit videodev_proc_destroy(void)
 {
 	if (video_dev_proc_entry != NULL)
 		remove_proc_entry("dev", video_proc_entry);
diff -urN linux-2.5.69-bk19/drivers/media/video/zr36067.c linux-2.5.70/drivers/media/video/zr36067.c
--- linux-2.5.69-bk19/drivers/media/video/zr36067.c	2003-05-04 16:53:56.000000000 -0700
+++ linux-2.5.70/drivers/media/video/zr36067.c	2003-05-26 19:02:21.000000000 -0700
@@ -264,11 +264,11 @@
 /*
  *   Allocate the V4L grab buffers
  *
- *   These have to be pysically contiguous.
+ *   These have to be physically contiguous.
  *   If v4l_bufsize <= MAX_KMALLOC_MEM we use kmalloc
  *   else we try to allocate them with bigphysarea_alloc_pages
  *   if the bigphysarea patch is present in the kernel,
- *   else we try to use high memory (if the user has bootet
+ *   else we try to use high memory (if the user has booted
  *   Linux with the necessary memory left over).
  */
 
@@ -280,7 +280,7 @@
 	for (i = 0; i < v4l_nbufs; i++) {
 		if (zr->v4l_gbuf[i].fbuffer)
 			printk(KERN_WARNING
-			       "%s: v4l_fbuffer_alloc: buffer %d allready allocated ???\n",
+			       "%s: v4l_fbuffer_alloc: buffer %d already allocated ???\n",
 			       zr->name, i);
 
 		//udelay(20);
@@ -413,7 +413,7 @@
 	for (i = 0; i < zr->jpg_nbufs; i++) {
 		if (zr->jpg_gbuf[i].frag_tab)
 			printk(KERN_WARNING
-			       "%s: jpg_fbuffer_alloc: buffer %d allready allocated ???\n",
+			       "%s: jpg_fbuffer_alloc: buffer %d already allocated ???\n",
 			       zr->name, i);
 
 		/* Allocate fragment table for this buffer */
@@ -445,7 +445,7 @@
 			for (off = 0; off < zr->jpg_bufsize; off += PAGE_SIZE)
 				SetPageReserved(virt_to_page(mem + off));
 		} else {
-			/* jpg_bufsize is allreay page aligned */
+			/* jpg_bufsize is already page aligned */
 			for (j = 0; j < zr->jpg_bufsize / PAGE_SIZE; j++) 
 			{
 				mem = get_zeroed_page(GFP_KERNEL);
@@ -935,7 +935,7 @@
 				fmt);
 
 		/* Start and length of each line MUST be 4-byte aligned.
-		   This should be allready checked before the call to this routine.
+		   This should be already checked before the call to this routine.
 		   All error messages are internal driver checking only! */
 
 		/* video display top and bottom registers */
@@ -3242,7 +3242,7 @@
 	case 0:
 		if (zr->user > 1) {
 			DEBUG1(printk(KERN_WARNING
-			       "%s: zoran_open: Buz is allready in use\n",
+			       "%s: zoran_open: Buz is already in use\n",
 			       zr->name));
 			return -EBUSY;
 		}
@@ -3356,7 +3356,7 @@
 			struct video_capability b;
 			DEBUG2(printk("%s: ioctl VIDIOCGCAP\n", zr->name));
 
-			strncpy(b.name, zr->video_dev.name,
+			strlcpy(b.name, zr->video_dev.name,
 				sizeof(b.name));
 			b.type =
 			    VID_TYPE_CAPTURE | VID_TYPE_OVERLAY |
@@ -4067,7 +4067,7 @@
 
 			if (zr->jpg_buffers_allocated) {
 				DEBUG1(printk(KERN_ERR
-				       "%s: BUZIOC_REQBUFS: buffers allready allocated\n",
+				       "%s: BUZIOC_REQBUFS: buffers already allocated\n",
 				       zr->name));
 				return -EINVAL;
 			}
diff -urN linux-2.5.69-bk19/drivers/message/fusion/mptctl.c linux-2.5.70/drivers/message/fusion/mptctl.c
--- linux-2.5.69-bk19/drivers/message/fusion/mptctl.c	2003-05-04 16:52:50.000000000 -0700
+++ linux-2.5.70/drivers/message/fusion/mptctl.c	2003-05-26 19:02:21.000000000 -0700
@@ -1317,7 +1317,7 @@
 
 	/* Set the Version Strings.
 	 */
-	strncpy (karg.driverVersion, MPT_LINUX_PACKAGE_NAME, MPT_IOCTL_VERSION_LENGTH);
+	strlcpy (karg.driverVersion, MPT_LINUX_PACKAGE_NAME, MPT_IOCTL_VERSION_LENGTH);
 
 	karg.busChangeEvent = 0;
 	karg.hostId = ioc->pfacts[port].PortSCSIID;
@@ -1517,8 +1517,8 @@
 #else
 	karg.chip_type = ioc->chip_type;
 #endif
-	strncpy (karg.name, ioc->name, MPT_MAX_NAME);
-	strncpy (karg.product, ioc->prod_name, MPT_PRODUCT_LENGTH);
+	strlcpy (karg.name, ioc->name, MPT_MAX_NAME);
+	strlcpy (karg.product, ioc->prod_name, MPT_PRODUCT_LENGTH);
 
 	/* Copy the data from kernel memory to user memory
 	 */
@@ -2488,7 +2488,7 @@
 	cfg.dir = 0;	/* read */
 	cfg.timeout = 10;
 
-	strncpy(karg.serial_number, " ", 24);
+	strlcpy(karg.serial_number, " ", sizeof(karg.serial_number));
 	if (mpt_config(ioc, &cfg) == 0) {
 		if (cfg.hdr->PageLength > 0) {
 			/* Issue the second config page request */
@@ -2500,7 +2500,8 @@
 				if (mpt_config(ioc, &cfg) == 0) {
 					ManufacturingPage0_t *pdata = (ManufacturingPage0_t *) pbuf;
 					if (strlen(pdata->BoardTracerNumber) > 1)
-						strncpy(karg.serial_number, pdata->BoardTracerNumber, 24);
+						strlcpy(karg.serial_number, pdata->BoardTracerNumber,
+							sizeof(karg.serial_number));
 				}
 				pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, pbuf, buf_dma);
 				pbuf = NULL;
diff -urN linux-2.5.69-bk19/drivers/mtd/chips/jedec.c linux-2.5.70/drivers/mtd/chips/jedec.c
--- linux-2.5.69-bk19/drivers/mtd/chips/jedec.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/mtd/chips/jedec.c	2003-05-26 19:02:21.000000000 -0700
@@ -168,8 +168,7 @@
    /* Generate a part name that includes the number of different chips and
       other configuration information */
    count = 1;
-   strncpy(Part,map->name,sizeof(Part)-10);
-   Part[sizeof(Part)-11] = 0;
+   strlcpy(Part,map->name,sizeof(Part)-10);
    strcat(Part," ");
    Uniq = 0;
    for (I = 0; priv->chips[I].jedec != 0 && I < MAX_JEDEC_CHIPS; I++)
@@ -246,8 +245,7 @@
    //   printk("Part: '%s'\n",Part);
    
    memset(MTD,0,sizeof(*MTD));
-  // strncpy(MTD->name,Part,sizeof(MTD->name));
-  // MTD->name[sizeof(MTD->name)-1] = 0;
+  // strlcpy(MTD->name,Part,sizeof(MTD->name));
    MTD->name = map->name;
    MTD->type = MTD_NORFLASH;
    MTD->flags = MTD_CAP_NORFLASH;
diff -urN linux-2.5.69-bk19/drivers/mtd/cmdline.c linux-2.5.70/drivers/mtd/cmdline.c
--- linux-2.5.69-bk19/drivers/mtd/cmdline.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/mtd/cmdline.c	2003-05-26 19:02:21.000000000 -0700
@@ -187,8 +187,7 @@
 	parts[this_part].mask_flags = mask_flags;
 	if (name)
 	{
-		strncpy(extra_mem, name, name_len);
-		extra_mem[name_len] = 0;
+		strlcpy(extra_mem, name, name_len + 1);
 	}
 	else
 	{
@@ -267,8 +266,7 @@
 		this_mtd->parts = parts;
 		this_mtd->num_parts = num_parts;
 		this_mtd->mtd_id = (char*)(this_mtd + 1);
-		strncpy(this_mtd->mtd_id, mtd_id, mtd_id_len);
-		this_mtd->mtd_id[mtd_id_len] = 0;
+		strlcpy(this_mtd->mtd_id, mtd_id, mtd_id_len + 1);
 
 		/* link into chain */
 		this_mtd->next = partitions;	    	
diff -urN linux-2.5.69-bk19/drivers/parisc/ccio-dma.c linux-2.5.70/drivers/parisc/ccio-dma.c
--- linux-2.5.69-bk19/drivers/parisc/ccio-dma.c	2003-05-04 16:53:03.000000000 -0700
+++ linux-2.5.70/drivers/parisc/ccio-dma.c	2003-05-26 19:02:21.000000000 -0700
@@ -1522,7 +1522,7 @@
 	memset(ioc, 0, sizeof(struct ioc));
 
 	ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";
-	strncpy(dev->dev.name, ioc->name, sizeof(dev->dev.name));
+	strlcpy(dev->dev.name, ioc->name, sizeof(dev->dev.name));
 
 	printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa);
 
diff -urN linux-2.5.69-bk19/drivers/parisc/led.c linux-2.5.70/drivers/parisc/led.c
--- linux-2.5.69-bk19/drivers/parisc/led.c	2003-05-04 16:53:09.000000000 -0700
+++ linux-2.5.70/drivers/parisc/led.c	2003-05-26 19:02:21.000000000 -0700
@@ -667,7 +667,7 @@
 	tasklet_disable(&led_tasklet);
 
 	/* copy display string to buffer for procfs */
-	strncpy(lcd_text, str, sizeof(lcd_text)-1);
+	strlcpy(lcd_text, str, sizeof(lcd_text));
 	
 	/* Set LCD Cursor to 1st character */
 	gsc_writeb(lcd_info.reset_cmd1, LCD_CMD_REG);
diff -urN linux-2.5.69-bk19/drivers/pci/pool.c linux-2.5.70/drivers/pci/pool.c
--- linux-2.5.69-bk19/drivers/pci/pool.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/pci/pool.c	2003-05-26 19:02:21.000000000 -0700
@@ -128,8 +128,7 @@
 	if (!(retval = kmalloc (sizeof *retval, SLAB_KERNEL)))
 		return retval;
 
-	strncpy (retval->name, name, sizeof retval->name);
-	retval->name [sizeof retval->name - 1] = 0;
+	strlcpy (retval->name, name, sizeof retval->name);
 
 	retval->dev = pdev;
 
diff -urN linux-2.5.69-bk19/drivers/pcmcia/cs.c linux-2.5.70/drivers/pcmcia/cs.c
--- linux-2.5.69-bk19/drivers/pcmcia/cs.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/cs.c	2003-05-26 19:02:21.000000000 -0700
@@ -1026,7 +1026,7 @@
     if (!client) return CS_OUT_OF_RESOURCE;
     memset(client, '\0', sizeof(client_t));
     client->client_magic = CLIENT_MAGIC;
-    strncpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
+    strlcpy(client->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
     client->Socket = req->Socket;
     client->Function = req->Function;
     client->state = CLIENT_UNBOUND;
@@ -1069,7 +1069,7 @@
     }
     if (!region || (region->mtd != NULL))
 	return CS_BAD_OFFSET;
-    strncpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
+    strlcpy(region->dev_info, (char *)req->dev_info, DEV_NAME_LEN);
     
     DEBUG(1, "cs: bind_mtd(): attr 0x%x, offset 0x%x, dev %s\n",
 	  req->Attributes, req->CardOffset, (char *)req->dev_info);
diff -urN linux-2.5.69-bk19/drivers/pcmcia/ds.c linux-2.5.70/drivers/pcmcia/ds.c
--- linux-2.5.69-bk19/drivers/pcmcia/ds.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/ds.c	2003-05-26 19:02:21.000000000 -0700
@@ -480,8 +480,7 @@
 			/* Try to handle "next" here some way? */
 		}
 		if (dev && dev->driver) {
-			strncpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
-			bind_info->name[DEV_NAME_LEN-1] = '\0';
+			strlcpy(bind_info->name, dev->driver->name, DEV_NAME_LEN);
 			bind_info->major = 0;
 			bind_info->minor = 0;
 			bind_info->next = NULL;
@@ -507,8 +506,7 @@
 	    if (node == bind_info->next) break;
     if (node == NULL) return -ENODEV;
 
-    strncpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
-    bind_info->name[DEV_NAME_LEN-1] = '\0';
+    strlcpy(bind_info->name, node->dev_name, DEV_NAME_LEN);
     bind_info->major = node->major;
     bind_info->minor = node->minor;
     bind_info->next = node->next;
diff -urN linux-2.5.69-bk19/drivers/pcmcia/i82092.c linux-2.5.70/drivers/pcmcia/i82092.c
--- linux-2.5.69-bk19/drivers/pcmcia/i82092.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/i82092.c	2003-05-26 19:02:21.000000000 -0700
@@ -178,7 +178,7 @@
 	pci_set_drvdata(dev, &cls_d);
 	cls_d->class_dev.class = &pcmcia_socket_class;
 	cls_d->class_dev.dev = &dev->dev;
-	strncpy(cls_d->class_dev.class_id, dev->dev.name, BUS_ID_SIZE);
+	strlcpy(cls_d->class_dev.class_id, dev->dev.name, BUS_ID_SIZE);
 	class_set_devdata(&cls_d->class_dev, cls_d);
 	class_device_register(&cls_d->class_dev);
 
diff -urN linux-2.5.69-bk19/drivers/pcmcia/i82365.c linux-2.5.70/drivers/pcmcia/i82365.c
--- linux-2.5.69-bk19/drivers/pcmcia/i82365.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/i82365.c	2003-05-26 19:02:21.000000000 -0700
@@ -1560,7 +1560,7 @@
     i82365_data.nsock = sockets;
     i82365_class_data.dev = &i82365_device.dev;
     i82365_class_data.class_data = &i82365_data;
-    strncpy(i82365_class_data.class_id, "i82365", BUS_ID_SIZE);
+    strlcpy(i82365_class_data.class_id, "i82365", BUS_ID_SIZE);
     
     platform_device_register(&i82365_device);
     class_device_register(&i82365_class_data);
diff -urN linux-2.5.69-bk19/drivers/pcmcia/pci_socket.c linux-2.5.70/drivers/pcmcia/pci_socket.c
--- linux-2.5.69-bk19/drivers/pcmcia/pci_socket.c	2003-05-04 16:53:56.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/pci_socket.c	2003-05-26 19:02:21.000000000 -0700
@@ -155,7 +155,7 @@
 	socket->cls_d.ops = &pci_socket_operations;
 	socket->cls_d.class_dev.class = &pcmcia_socket_class;
 	socket->cls_d.class_dev.dev = &dev->dev;
-	strncpy(socket->cls_d.class_dev.class_id, dev->dev.bus_id, BUS_ID_SIZE);
+	strlcpy(socket->cls_d.class_dev.class_id, dev->dev.bus_id, BUS_ID_SIZE);
 	class_set_devdata(&socket->cls_d.class_dev, &socket->cls_d);
 
 	/* prepare pci_socket_t */
diff -urN linux-2.5.69-bk19/drivers/pcmcia/tcic.c linux-2.5.70/drivers/pcmcia/tcic.c
--- linux-2.5.69-bk19/drivers/pcmcia/tcic.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/pcmcia/tcic.c	2003-05-26 19:02:21.000000000 -0700
@@ -527,7 +527,7 @@
     tcic_data.nsock = sockets;
     tcic_class_data.dev = &tcic_device.dev;
     tcic_class_data.class_data = &tcic_data;
-    strncpy(tcic_class_data.class_id, "tcic-pcmcia", BUS_ID_SIZE);
+    strlcpy(tcic_class_data.class_id, "tcic-pcmcia", BUS_ID_SIZE);
     
     platform_device_register(&tcic_device);
     class_device_register(&tcic_class_data);
diff -urN linux-2.5.69-bk19/drivers/pnp/core.c linux-2.5.70/drivers/pnp/core.c
--- linux-2.5.69-bk19/drivers/pnp/core.c	2003-05-04 16:53:06.000000000 -0700
+++ linux-2.5.70/drivers/pnp/core.c	2003-05-26 19:02:21.000000000 -0700
@@ -69,7 +69,7 @@
 
 	protocol->number = nodenum;
 	sprintf(protocol->dev.bus_id, "pnp%d", nodenum);
-	strncpy(protocol->dev.name,protocol->name,DEVICE_NAME_SIZE);
+	strlcpy(protocol->dev.name,protocol->name,DEVICE_NAME_SIZE);
 	return device_register(&protocol->dev);
 }
 
diff -urN linux-2.5.69-bk19/drivers/s390/block/dasd.c linux-2.5.70/drivers/s390/block/dasd.c
--- linux-2.5.69-bk19/drivers/s390/block/dasd.c	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/drivers/s390/block/dasd.c	2003-05-26 19:02:21.000000000 -0700
@@ -7,7 +7,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.94 $
+ * $Revision: 1.99 $
  */
 
 #include <linux/config.h>
@@ -297,19 +297,23 @@
 	    device->target >= DASD_STATE_KNOWN)
 		rc = dasd_state_new_to_known(device);
 
-	if (device->state == DASD_STATE_KNOWN &&
+	if (!rc &&
+	    device->state == DASD_STATE_KNOWN &&
 	    device->target >= DASD_STATE_BASIC)
 		rc = dasd_state_known_to_basic(device);
 
-	if (device->state == DASD_STATE_BASIC &&
+	if (!rc &&
+	    device->state == DASD_STATE_BASIC &&
 	    device->target >= DASD_STATE_ACCEPT)
 		rc = dasd_state_basic_to_accept(device);
 
-	if (device->state == DASD_STATE_ACCEPT &&
+	if (!rc &&
+	    device->state == DASD_STATE_ACCEPT &&
 	    device->target >= DASD_STATE_READY)
 		rc = dasd_state_accept_to_ready(device);
 
-	if (device->state == DASD_STATE_READY &&
+	if (!rc &&
+	    device->state == DASD_STATE_READY &&
 	    device->target >= DASD_STATE_ONLINE)
 		rc = dasd_state_ready_to_online(device);
 
@@ -729,6 +733,7 @@
 			DBF_DEV_EVENT(DBF_ERR, device, "%s",
 				      "I/O error, retry");
 			break;
+		case -EINVAL:
 		case -EBUSY:
 			DBF_DEV_EVENT(DBF_ERR, device, "%s",
 				      "device busy, retry later");
@@ -1727,7 +1732,7 @@
 dasd_release(struct inode *inp, struct file *filp)
 {
 	struct gendisk *disk = inp->i_bdev->bd_disk;
-	struct dasd_device *device = isk->private_data;
+	struct dasd_device *device = disk->private_data;
 
 	if (device->state < DASD_STATE_ACCEPT) {
 		DBF_DEV_EVENT(DBF_ERR, device, " %s",
@@ -2051,7 +2056,7 @@
 		rc = -ENOMEM;
 		goto failed;
 	}
-	debug_register_view(dasd_debug_area, &debug_sprintf_view);
+	debug_register_view(dasd_debug_area, &debug_hex_ascii_view);
 	debug_set_level(dasd_debug_area, DBF_ERR);
 
 	DBF_EVENT(DBF_EMERG, "%s", "debug area created");
diff -urN linux-2.5.69-bk19/drivers/s390/block/dasd_ioctl.c linux-2.5.70/drivers/s390/block/dasd_ioctl.c
--- linux-2.5.69-bk19/drivers/s390/block/dasd_ioctl.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/s390/block/dasd_ioctl.c	2003-05-26 19:02:21.000000000 -0700
@@ -59,7 +59,6 @@
 	new->no = no;
 	new->handler = handler;
 	list_add(&new->list, &dasd_ioctl_list);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -76,7 +75,6 @@
 		return -EINVAL;
 	list_del(&old->list);
 	kfree(old);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
diff -urN linux-2.5.69-bk19/drivers/s390/block/xpram.c linux-2.5.70/drivers/s390/block/xpram.c
--- linux-2.5.69-bk19/drivers/s390/block/xpram.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/s390/block/xpram.c	2003-05-26 19:02:21.000000000 -0700
@@ -36,6 +36,7 @@
 #include <linux/hdreg.h>  /* HDIO_GETGEO */
 #include <linux/device.h>
 #include <linux/bio.h>
+#include <linux/devfs_fs_kernel.h>
 #include <asm/uaccess.h>
 
 #define XPRAM_NAME	"xpram"
@@ -459,7 +460,7 @@
 		disk->private_data = &xpram_devices[i];
 		disk->queue = &xpram_queue;
 		sprintf(disk->disk_name, "slram%d", i);
-		sprintf(disk->disk_name, "slram/%d", i);
+		sprintf(disk->devfs_name, "slram/%d", i);
 		set_capacity(disk, xpram_sizes[i] << 1);
 		add_disk(disk);
 	}
diff -urN linux-2.5.69-bk19/drivers/s390/char/con3215.c linux-2.5.70/drivers/s390/char/con3215.c
--- linux-2.5.69-bk19/drivers/s390/char/con3215.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/con3215.c	2003-05-26 19:02:21.000000000 -0700
@@ -697,12 +697,12 @@
 	    raw->queued_read != NULL) {
 		raw->flags |= RAW3215_CLOSING;
 		add_wait_queue(&raw->empty_wait, &wait);
-		current->state = TASK_INTERRUPTIBLE;
+		set_current_state(TASK_INTERRUPTIBLE);
 		spin_unlock_irqrestore(raw->lock, flags);
 		schedule();
 		spin_lock_irqsave(raw->lock, flags);
 		remove_wait_queue(&raw->empty_wait, &wait);
-		current->state = TASK_RUNNING;
+		set_current_state(TASK_RUNNING);
 		raw->flags &= ~(RAW3215_ACTIVE | RAW3215_CLOSING);
 	}
 	spin_unlock_irqrestore(raw->lock, flags);
diff -urN linux-2.5.69-bk19/drivers/s390/char/sclp.c linux-2.5.70/drivers/s390/char/sclp.c
--- linux-2.5.69-bk19/drivers/s390/char/sclp.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/sclp.c	2003-05-26 19:02:21.000000000 -0700
@@ -18,7 +18,9 @@
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
+#include <linux/init.h>
 #include <asm/s390_ext.h>
+#include <asm/processor.h>
 
 #include "sclp.h"
 
@@ -49,7 +51,7 @@
 /* Timer for init mask retries. */
 static struct timer_list retry_timer;
 
-static unsigned long sclp_status = 0;
+static volatile unsigned long sclp_status = 0;
 /* some status flags */
 #define SCLP_INIT		0
 #define SCLP_RUNNING		1
@@ -275,20 +277,24 @@
 	struct list_head *l;
 	struct sclp_req *req, *tmp;
 
+	spin_lock(&sclp_lock);
 	/*
 	 * Only process interrupt if sclp is initialized.
 	 * This avoids strange effects for a pending request
 	 * from before the last re-ipl.
 	 */
-	if (!test_bit(SCLP_INIT, &sclp_status))
+	if (!test_bit(SCLP_INIT, &sclp_status)) {
+		/* Now clear the running bit */
+		clear_bit(SCLP_RUNNING, &sclp_status);
+		spin_unlock(&sclp_lock);
 		return;
+	}
 	ext_int_param = S390_lowcore.ext_params;
 	finished_sccb = ext_int_param & EXT_INT_SCCB_MASK;
 	evbuf_pending = ext_int_param & (EXT_INT_EVBUF_PENDING |
 					 EXT_INT_STATECHANGE_PENDING);
 	irq_enter();
 	req = NULL;
-	spin_lock(&sclp_lock);
 	if (finished_sccb != 0U) {
 		list_for_each(l, &sclp_req_queue) {
 			tmp = list_entry(l, struct sclp_req, list);
@@ -299,9 +305,6 @@
 			}
 		}
 	}
-	/* Head queue a read sccb if an event buffer is pending */
-	if (evbuf_pending)
-		__sclp_unconditional_read();
 	spin_unlock(&sclp_lock);
 	/* Perform callback */
 	if (req != NULL) {
@@ -309,8 +312,13 @@
 		if (req->callback != NULL)
 			req->callback(req, req->callback_data);
 	}
+	spin_lock(&sclp_lock);
+	/* Head queue a read sccb if an event buffer is pending */
+	if (evbuf_pending)
+		__sclp_unconditional_read();
 	/* Now clear the running bit */
 	clear_bit(SCLP_RUNNING, &sclp_status);
+	spin_unlock(&sclp_lock);
 	/* and start next request on the queue */
 	sclp_start_request();
 	irq_exit();
@@ -344,8 +352,10 @@
 		      : "=m" (psw_mask) : "a" (&psw_mask) : "memory");
 
 	/* wait until ISR signals receipt of interrupt */
-	while (test_bit(SCLP_RUNNING, &sclp_status))
+	while (test_bit(SCLP_RUNNING, &sclp_status)) {
 		barrier();
+		cpu_relax();
+	}
 
 	/* disable external interruptions */
 	asm volatile ("SSM 0(%0)"
@@ -631,6 +641,14 @@
 		/* Already initialized. */
 		return 0;
 
+	spin_lock_init(&sclp_lock);
+	INIT_LIST_HEAD(&sclp_req_queue);
+
+	/* init event list */
+	INIT_LIST_HEAD(&sclp_reg_list);
+	list_add(&sclp_state_change_event.list, &sclp_reg_list);
+	list_add(&sclp_quiesce_event.list, &sclp_reg_list);
+
 	/*
 	 * request the 0x2401 external interrupt
 	 * The sclp driver is initialized early (before kmalloc works). We
@@ -640,14 +658,6 @@
 					      &ext_int_info_hwc) != 0)
 		return -EBUSY;
 
-	spin_lock_init(&sclp_lock);
-	INIT_LIST_HEAD(&sclp_req_queue);
-
-	/* init event list */
-	INIT_LIST_HEAD(&sclp_reg_list);
-	list_add(&sclp_state_change_event.list, &sclp_reg_list);
-	list_add(&sclp_quiesce_event.list, &sclp_reg_list);
-
 	/* enable service-signal external interruptions,
 	 * Control Register 0 bit 22 := 1
 	 * (besides PSW bit 7 must be set to 1 sometimes for external
@@ -762,6 +772,8 @@
 	return unprocessed;
 }
 
+module_init(sclp_init);
+
 EXPORT_SYMBOL(sclp_add_request);
 EXPORT_SYMBOL(sclp_sync_wait);
 EXPORT_SYMBOL(sclp_register);
diff -urN linux-2.5.69-bk19/drivers/s390/char/sclp_con.c linux-2.5.70/drivers/s390/char/sclp_con.c
--- linux-2.5.69-bk19/drivers/s390/char/sclp_con.c	2003-05-04 16:53:29.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/sclp_con.c	2003-05-26 19:02:21.000000000 -0700
@@ -15,9 +15,11 @@
 #include <linux/timer.h>
 #include <linux/jiffies.h>
 #include <linux/bootmem.h>
+#include <linux/err.h>
 
 #include "sclp.h"
 #include "sclp_rw.h"
+#include "sclp_tty.h"
 
 #define SCLP_CON_PRINT_HEADER "sclp console driver: "
 
@@ -69,10 +71,23 @@
 }
 
 static inline void
-__sclp_conbuf_emit(struct sclp_buffer *buffer)
+sclp_conbuf_emit(void)
 {
+	struct sclp_buffer* buffer;
+	unsigned long flags;
+	int count;
+
+	spin_lock_irqsave(&sclp_con_lock, flags);
+	buffer = sclp_conbuf;
+	sclp_conbuf = NULL;
+	if (buffer == NULL) {
+		spin_unlock_irqrestore(&sclp_con_lock, flags);
+		return;
+	}
 	list_add_tail(&buffer->list, &sclp_con_outqueue);
-	if (sclp_con_buffer_count++ == 0)
+	count = sclp_con_buffer_count++;
+	spin_unlock_irqrestore(&sclp_con_lock, flags);
+	if (count == 0)
 		sclp_emit_buffer(buffer, sclp_conbuf_callback);
 }
 
@@ -83,14 +98,7 @@
 static void
 sclp_console_timeout(unsigned long data)
 {
-	unsigned long flags;
-
-	spin_lock_irqsave(&sclp_con_lock, flags);
-	if (sclp_conbuf != NULL) {
-		__sclp_conbuf_emit(sclp_conbuf);
-		sclp_conbuf = NULL;
-	}
-	spin_unlock_irqrestore(&sclp_con_lock, flags);
+	sclp_conbuf_emit();
 }
 
 /*
@@ -134,8 +142,9 @@
 		 * output buffer. Emit the buffer, create a new buffer
 		 * and then output the rest of the string.
 		 */
-		__sclp_conbuf_emit(sclp_conbuf);
-		sclp_conbuf = NULL;
+		spin_unlock_irqrestore(&sclp_con_lock, flags);
+		sclp_conbuf_emit();
+		spin_lock_irqsave(&sclp_con_lock, flags);
 		message += written;
 		count -= written;
 	} while (count > 0);
@@ -150,11 +159,11 @@
 	spin_unlock_irqrestore(&sclp_con_lock, flags);
 }
 
-/* returns the device number of the SCLP console */
-static kdev_t
-sclp_console_device(struct console *c)
+static struct tty_driver *
+sclp_console_device(struct console *c, int *index)
 {
-	return	mk_kdev(sclp_console_major, sclp_console_minor);
+	*index = c->index;
+	return &sclp_tty_driver;
 }
 
 /*
@@ -167,13 +176,10 @@
 {
 	unsigned long flags;
 
+	sclp_conbuf_emit();
 	spin_lock_irqsave(&sclp_con_lock, flags);
 	if (timer_pending(&sclp_con_timer))
 		del_timer(&sclp_con_timer);
-	if (sclp_conbuf != NULL) {
-		__sclp_conbuf_emit(sclp_conbuf);
-		sclp_conbuf = NULL;
-	}
 	while (sclp_con_buffer_count > 0) {
 		spin_unlock_irqrestore(&sclp_con_lock, flags);
 		sclp_sync_wait();
@@ -204,17 +210,19 @@
 {
 	void *page;
 	int i;
+	int rc;
 
 	if (!CONSOLE_IS_SCLP)
 		return 0;
-	if (sclp_rw_init() != 0)
-		return 0;
+	rc = sclp_rw_init();
+	if (rc)
+		return rc;
 	/* Allocate pages for output buffering */
 	INIT_LIST_HEAD(&sclp_con_pages);
 	for (i = 0; i < MAX_CONSOLE_PAGES; i++) {
 		page = alloc_bootmem_low_pages(PAGE_SIZE);
 		if (page == NULL)
-			return 0;
+			return -ENOMEM;
 		list_add_tail((struct list_head *) page, &sclp_con_pages);
 	}
 	INIT_LIST_HEAD(&sclp_con_outqueue);
diff -urN linux-2.5.69-bk19/drivers/s390/char/sclp_tty.c linux-2.5.70/drivers/s390/char/sclp_tty.c
--- linux-2.5.69-bk19/drivers/s390/char/sclp_tty.c	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/sclp_tty.c	2003-05-26 19:02:21.000000000 -0700
@@ -16,6 +16,8 @@
 #include <linux/sched.h>
 #include <linux/wait.h>
 #include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/init.h>
 #include <asm/uaccess.h>
 
 #include "ctrlchar.h"
@@ -55,7 +57,7 @@
 static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE];
 static unsigned short int sclp_tty_chars_count;
 
-static struct tty_driver sclp_tty_driver;
+struct tty_driver sclp_tty_driver;
 static struct tty_struct * sclp_tty_table[1];
 static struct termios * sclp_tty_termios[1];
 static struct termios * sclp_tty_termios_locked[1];
@@ -710,7 +712,7 @@
 	.receiver_fn = sclp_tty_receiver
 };
 
-void
+int __init
 sclp_tty_init(void)
 {
 	void *page;
@@ -718,20 +720,20 @@
 	int rc;
 
 	if (!CONSOLE_IS_SCLP)
-		return;
+		return 0;
 	rc = sclp_rw_init();
-	if (rc != 0) {
+	if (rc) {
 		printk(KERN_ERR SCLP_TTY_PRINT_HEADER
 		       "could not register tty - "
 		       "sclp_rw_init returned %d\n", rc);
-		return;
+		return rc;
 	}
 	/* Allocate pages for output buffering */
 	INIT_LIST_HEAD(&sclp_tty_pages);
 	for (i = 0; i < MAX_KMEM_PAGES; i++) {
 		page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
 		if (page == NULL)
-			return;
+			return -ENOMEM;
 		list_add_tail((struct list_head *) page, &sclp_tty_pages);
 	}
 	INIT_LIST_HEAD(&sclp_tty_outqueue);
@@ -753,8 +755,9 @@
 	sclp_tty_chars_count = 0;
 	sclp_tty = NULL;
 
-	if (sclp_register(&sclp_input_event) != 0)
-		return;
+	rc = sclp_register(&sclp_input_event);
+	if (rc)
+		return rc;
 
 	memset (&sclp_tty_driver, 0, sizeof(struct tty_driver));
 	sclp_tty_driver.magic = TTY_DRIVER_MAGIC;
@@ -810,8 +813,10 @@
 	sclp_tty_driver.write_proc = NULL;
 
 	rc = tty_register_driver(&sclp_tty_driver);
-	if (rc != 0)
+	if (rc)
 		printk(KERN_ERR SCLP_TTY_PRINT_HEADER
 		       "could not register tty - "
-		       "sclp_drv_register returned %d\n", rc);
+		       "tty_register_driver returned %d\n", rc);
+	return rc;
 }
+module_init(sclp_tty_init);
diff -urN linux-2.5.69-bk19/drivers/s390/char/sclp_tty.h linux-2.5.70/drivers/s390/char/sclp_tty.h
--- linux-2.5.69-bk19/drivers/s390/char/sclp_tty.h	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/sclp_tty.h	2003-05-26 19:02:21.000000000 -0700
@@ -12,6 +12,8 @@
 #define __SCLP_TTY_H__
 
 #include <linux/ioctl.h>
+#include <linux/termios.h>
+#include <linux/tty_driver.h>
 
 /* This is the type of data structures storing sclp ioctl setting. */
 struct sclp_ioctls {
@@ -64,4 +66,6 @@
 /* get the number of buffers/pages got from kernel at startup */
 #define TIOCSCLPGKBUF	_IOR(SCLP_IOCTL_LETTER, 20, unsigned short)
 
+extern struct tty_driver sclp_tty_driver;
+
 #endif	/* __SCLP_TTY_H__ */
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_34xx.c linux-2.5.70/drivers/s390/char/tape_34xx.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_34xx.c	2003-05-04 16:53:12.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_34xx.c	2003-05-26 19:02:21.000000000 -0700
@@ -10,7 +10,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/bio.h>
@@ -1042,7 +1041,7 @@
 {
 	int rc;
 
-	DBF_EVENT(3, "34xx init: $Revision: 1.7 $\n");
+	DBF_EVENT(3, "34xx init: $Revision: 1.8 $\n");
 	/* Register driver for 3480/3490 tapes. */
 	rc = ccw_driver_register(&tape_34xx_driver);
 	if (rc)
@@ -1061,7 +1060,7 @@
 MODULE_DEVICE_TABLE(ccw, tape_34xx_ids);
 MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH");
 MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape "
-		   "device driver ($Revision: 1.7 $)");
+		   "device driver ($Revision: 1.8 $)");
 MODULE_LICENSE("GPL");
 
 module_init(tape_34xx_init);
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_block.c linux-2.5.70/drivers/s390/char/tape_block.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_block.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_block.c	2003-05-26 19:02:21.000000000 -0700
@@ -237,14 +237,13 @@
 	blk_queue_segment_boundary(q, -1L);
 
 	disk->major = tapeblock_major;
-	disk->first_minor = i;
+	disk->first_minor = device->first_minor;
 	disk->fops = &tapeblock_fops;
 	disk->private_data = device;
 	disk->queue = q;
-	set_capacity(disk, size);
+	//set_capacity(disk, size);
 
-	sprintf(disk->disk_name, "tBLK%d", i);
-	sprintf(disk->disk_name, "tBLK/%d", i);
+	sprintf(disk->disk_name, "tBLK/%d", device->first_minor / TAPE_MINORS_PER_DEV);
 
 	add_disk(disk);
 	d->disk = disk;
@@ -302,10 +301,16 @@
 static int
 tapeblock_open(struct inode *inode, struct file *filp)
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
+	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct tape_device *device = disk->private_data;
 	int rc;
 
+	/*
+	 * FIXME: this new tapeblock_open function is from 2.5.69.
+	 * It doesn't do tape_get_device anymore but picks the device
+	 * pointer from disk->private_data. It is stored in 
+	 * tapeblock_setup_device but WITHOUT proper ref-counting.
+	 */
 	rc = tape_open(device);
 	if (rc)
 		goto put_device;
@@ -333,7 +338,7 @@
 static int
 tapeblock_release(struct inode *inode, struct file *filp)
 {
-	struct gendisk *disk = inp->i_bdev->bd_disk;
+	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct tape_device *device = disk->private_data;
 
 	tape_release(device);
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_char.c linux-2.5.70/drivers/s390/char/tape_char.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_char.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_char.c	2003-05-26 19:02:21.000000000 -0700
@@ -37,6 +37,7 @@
 
 static struct file_operations tape_fops =
 {
+	.owner = THIS_MODULE,
 	.read = tapechar_read,
 	.write = tapechar_write,
 	.ioctl = tapechar_ioctl,
@@ -237,13 +238,11 @@
 	struct tape_device *device;
 	int minor, rc;
 
-	MOD_INC_USE_COUNT;
 	if (major(filp->f_dentry->d_inode->i_rdev) != tapechar_major)
 		return -ENODEV;
 	minor = minor(filp->f_dentry->d_inode->i_rdev);
 	device = tape_get_device(minor / TAPE_MINORS_PER_DEV);
 	if (IS_ERR(device)) {
-		MOD_DEC_USE_COUNT;
 		return PTR_ERR(device);
 	}
 	DBF_EVENT(6, "TCHAR:open: %x\n", minor(inode->i_rdev));
@@ -257,7 +256,6 @@
 		tape_release(device);
 	}
 	tape_put_device(device);
-	MOD_DEC_USE_COUNT;
 	return rc;
 }
 
@@ -293,7 +291,6 @@
 	tape_release(device);
 	tape_unassign(device);
 	tape_put_device(device);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_core.c linux-2.5.70/drivers/s390/char/tape_core.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_core.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_core.c	2003-05-26 19:02:21.000000000 -0700
@@ -11,7 +11,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/init.h>	     // for kernel parameters
 #include <linux/kmod.h>	     // for requesting modules
@@ -904,7 +903,7 @@
 {
 	tape_dbf_area = debug_register ( "tape", 1, 2, 3*sizeof(long));
 	debug_register_view(tape_dbf_area, &debug_sprintf_view);
-	DBF_EVENT(3, "tape init: ($Revision: 1.23 $)\n");
+	DBF_EVENT(3, "tape init: ($Revision: 1.25 $)\n");
 	tape_proc_init();
 	tapechar_init ();
 	tapeblock_init ();
@@ -929,12 +928,17 @@
 MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and "
 	      "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)");
 MODULE_DESCRIPTION("Linux on zSeries channel attached "
-		   "tape device driver ($Revision: 1.23 $)");
+		   "tape device driver ($Revision: 1.25 $)");
 
 module_init(tape_init);
 module_exit(tape_exit);
 
 EXPORT_SYMBOL(tape_dbf_area);
+EXPORT_SYMBOL(tape_generic_remove);
+EXPORT_SYMBOL(tape_disable_device);
+EXPORT_SYMBOL(tape_generic_probe);
+EXPORT_SYMBOL(tape_enable_device);
+EXPORT_SYMBOL(tape_put_device);
 EXPORT_SYMBOL(tape_state_verbose);
 EXPORT_SYMBOL(tape_op_verbose);
 EXPORT_SYMBOL(tape_state_set);
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_proc.c linux-2.5.70/drivers/s390/char/tape_proc.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_proc.c	2003-05-04 16:53:13.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_proc.c	2003-05-26 19:02:21.000000000 -0700
@@ -12,7 +12,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/vmalloc.h>
 #include <linux/seq_file.h>
diff -urN linux-2.5.69-bk19/drivers/s390/char/tape_std.c linux-2.5.70/drivers/s390/char/tape_std.c
--- linux-2.5.69-bk19/drivers/s390/char/tape_std.c	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/drivers/s390/char/tape_std.c	2003-05-26 19:02:21.000000000 -0700
@@ -11,7 +11,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/stddef.h>
 #include <linux/kernel.h>
 #include <linux/bio.h>
diff -urN linux-2.5.69-bk19/drivers/s390/cio/blacklist.c linux-2.5.70/drivers/s390/cio/blacklist.c
--- linux-2.5.69-bk19/drivers/s390/cio/blacklist.c	2003-05-04 16:53:09.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/blacklist.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/blacklist.c
  *   S/390 common I/O routines -- blacklisting of specific devices
- *   $Revision: 1.23 $
+ *   $Revision: 1.24 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -197,7 +197,7 @@
 			while (++devno < __MAX_SUBCHANNELS)
 				if (!test_bit(devno, bl_dev))
 					break;
-			len += sprintf(page + len, "-0x%04lx", devno);
+			len += sprintf(page + len, "-0x%04lx", --devno);
 		}
 		len += sprintf(page + len, "\n");
 	}
diff -urN linux-2.5.69-bk19/drivers/s390/cio/chsc.c linux-2.5.70/drivers/s390/cio/chsc.c
--- linux-2.5.69-bk19/drivers/s390/cio/chsc.c	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/chsc.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/chsc.c
  *   S/390 common I/O routines -- channel subsystem call
- *   $Revision: 1.67 $
+ *   $Revision: 1.69 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -71,12 +71,11 @@
 }
 
 /* FIXME: this is _always_ called for every subchannel. shouldn't we
- *	  process more than one at a time?*/
+ *	  process more than one at a time? */
 static int
-chsc_get_sch_desc_irq(int irq)
+chsc_get_sch_desc_irq(int irq, void *page)
 {
 	int ccode, chpid, j;
-	int ret;
 
 	struct {
 		struct chsc_header request;
@@ -100,11 +99,7 @@
 		u16 fla[8];	  /* full link addresses 0-7 */
 	} *ssd_area;
 
-	ssd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
-	if (!ssd_area) {
-		CIO_CRW_EVENT(0, "No memory for ssd area!\n");
-		return -ENOMEM;
-	}
+	ssd_area = page;
 
 	ssd_area->request = (struct chsc_header) {
 		.length = 0x0010,
@@ -117,34 +112,29 @@
 	ccode = chsc(ssd_area);
 	if (ccode > 0) {
 		pr_debug("chsc returned with ccode = %d\n", ccode);
-		ret = (ccode == 3) ? -ENODEV : -EBUSY;
-		goto out;
+		return (ccode == 3) ? -ENODEV : -EBUSY;
 	}
 
 	switch (ssd_area->response.code) {
 	case 0x0001: /* everything ok */
-		ret = 0;
 		break;
 	case 0x0002:
 		CIO_CRW_EVENT(2, "Invalid command!\n");
 	case 0x0003:
 		CIO_CRW_EVENT(2, "Error in chsc request block!\n");
-		ret = -EINVAL;
+		return -EINVAL;
 		break;
 	case 0x0004:
 		CIO_CRW_EVENT(2, "Model does not provide ssd\n");
-		ret = -EOPNOTSUPP;
+		return -EOPNOTSUPP;
 		break;
 	default:
 		CIO_CRW_EVENT(2, "Unknown CHSC response %d\n",
 			      ssd_area->response.code);
-		ret = -EIO;
+		return -EIO;
 		break;
 	}
 
-	if (ret != 0)
-		goto out;
-
 	/*
 	 * ssd_area->st stores the type of the detected
 	 * subchannel, with the following definitions:
@@ -167,14 +157,14 @@
 		 * time since this code was written; since we don't know which
 		 * fields have meaning and what to do with it we just jump out
 		 */
-		goto out;
+		return 0;
 	} else {
 		const char *type[4] = {"I/O", "chsc", "message", "ADM"};
 		CIO_CRW_EVENT(6, "ssd: sch %x is %s subchannel\n",
 			      irq, type[ssd_area->st]);
 		if (ioinfo[irq] == NULL)
 			/* FIXME: we should do device rec. here... */
-			goto out;
+			return 0;
 
 		ioinfo[irq]->ssd_info.valid = 1;
 		ioinfo[irq]->ssd_info.type = ssd_area->st;
@@ -195,9 +185,8 @@
 			ioinfo[irq]->ssd_info.fla[j]   = ssd_area->fla[j];
 		}
 	}
-out:
-	free_page ((unsigned long) ssd_area);
-	return ret;
+
+	return 0;
 }
 
 static int
@@ -205,6 +194,7 @@
 {
 	int irq;
 	int err;
+	void *page;
 
 	CIO_TRACE_EVENT( 4, "gsdesc");
 
@@ -212,11 +202,15 @@
 	 * get information about chpids and link addresses
 	 * by executing the chsc command 'store subchannel description'
 	 */
+	page = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!page)
+		return -ENOMEM;
+
 	for (irq = 0; irq <= highest_subchannel; irq++) {
 		/*
 		 * retrieve information for each sch
 		 */
-		err = chsc_get_sch_desc_irq(irq);
+		err = chsc_get_sch_desc_irq(irq, page);
 		if (err) {
 			static int cio_chsc_err_msg;
 
@@ -230,8 +224,10 @@
 			}
 			return err;
 		}
+		clear_page(page);
 	}
 	cio_chsc_desc_avail = 1;
+	free_page((unsigned long)page);
 	return 0;
 }
 
@@ -352,14 +348,14 @@
 
 static int
 s390_process_res_acc_sch(u8 chpid, __u16 fla, u32 fla_mask,
-			 struct subchannel *sch)
+			 struct subchannel *sch, void *page)
 {
 	int found;
 	int chp;
 	int ccode;
 	
 	/* Update our ssd_info */
-	if (chsc_get_sch_desc_irq(sch->irq))
+	if (chsc_get_sch_desc_irq(sch->irq, page))
 		return 0;
 	
 	found = 0;
@@ -396,6 +392,7 @@
 	int irq;
 	int ret;
 	char dbf_txt[15];
+	void *page;
 
 	sprintf(dbf_txt, "accpr%x", chpid);
 	CIO_TRACE_EVENT( 2, dbf_txt);
@@ -412,22 +409,13 @@
 	 * will we have to do.
 	 */
 
-	if (!cio_chsc_desc_avail)
-		chsc_get_sch_descriptions();
-
-	if (!cio_chsc_desc_avail) {
-		/*
-		 * Something went wrong...
-		 */
-		CIO_CRW_EVENT(0, "Error: Could not retrieve "
-			      "subchannel descriptions, will not process css"
-			      "machine check...\n");
-		return;
-	}
-
 	if (!test_bit(chpid, chpids_logical))
 		return; /* no need to do the rest */
 
+	page = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!page)
+		return;
+
 	for (irq = 0; irq < __MAX_SUBCHANNELS; irq++) {
 		int chp_mask;
 
@@ -450,7 +438,10 @@
 	
 		spin_lock_irq(&sch->lock);
 
-		chp_mask = s390_process_res_acc_sch(chpid, fla, fla_mask, sch);
+		chp_mask = s390_process_res_acc_sch(chpid, fla, fla_mask,
+						    sch, page);
+		clear_page(page);
+
 		if (chp_mask == 0) {
 
 			spin_unlock_irq(&sch->lock);
@@ -475,6 +466,7 @@
 		if (fla_mask != 0)
 			break;
 	}
+	free_page((unsigned long)page);
 }
 
 static void
diff -urN linux-2.5.69-bk19/drivers/s390/cio/cio.c linux-2.5.70/drivers/s390/cio/cio.c
--- linux-2.5.69-bk19/drivers/s390/cio/cio.c	2003-05-04 16:53:56.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/cio.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/cio.c
  *   S/390 common I/O routines -- low level i/o calls
- *   $Revision: 1.97 $
+ *   $Revision: 1.98 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -146,7 +146,7 @@
 		/* Not status pending or not operational. */
 		return 1;
 	sch = ioinfo[tpi_info->irq];
-	if (sch)
+	if (!sch)
 		return 1;
 	irq_enter ();
 	spin_lock(&sch->lock);
@@ -658,8 +658,7 @@
 	 * before entering the spinlock we may already have
 	 * processed the interrupt on a different CPU...
 	 */
-	if (!console_subchannel_in_use ||
-	    console_subchannel.schib.scsw.actl == 0)
+	if (!console_subchannel_in_use)
 		return;
 
 	/* disable all but isc 7 (console device) */
diff -urN linux-2.5.69-bk19/drivers/s390/cio/css.c linux-2.5.70/drivers/s390/cio/css.c
--- linux-2.5.69-bk19/drivers/s390/cio/css.c	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/css.c	2003-05-26 19:02:21.000000000 -0700
@@ -97,7 +97,7 @@
 	sch->dev.bus = &css_bus_type;
 
 	/* Set a name for the subchannel */
-	strncpy (sch->dev.name, subchannel_types[sch->st], DEVICE_NAME_SIZE);
+	strlcpy (sch->dev.name, subchannel_types[sch->st], DEVICE_NAME_SIZE);
 	snprintf (sch->dev.bus_id, DEVICE_ID_SIZE, "0:%04x", sch->irq);
 
 	/* make it known to the system */
diff -urN linux-2.5.69-bk19/drivers/s390/cio/device.c linux-2.5.70/drivers/s390/cio/device.c
--- linux-2.5.69-bk19/drivers/s390/cio/device.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/device.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/device.c
  *  bus driver for ccw devices
- *   $Revision: 1.53 $
+ *   $Revision: 1.54 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
@@ -316,11 +316,63 @@
 	return count;
 }
 
+static void ccw_device_unbox_recog(void *data);
+
+static ssize_t
+stlck_store(struct device *dev, const char *buf, size_t count)
+{
+	struct ccw_device *cdev = to_ccwdev(dev);
+	int ret;
+
+	/* We don't care what was piped to the attribute 8) */
+	ret = ccw_device_stlck(cdev);
+	if (ret != 0) {
+		printk(KERN_WARNING
+		       "Unconditional reserve failed on device %s, rc=%d\n",
+		       dev->bus_id, ret);
+		return ret;
+	}
+
+	/*
+	 * Device was successfully unboxed.
+	 * Trigger removal of stlck attribute and device recognition.
+	 */
+	INIT_WORK(&cdev->private->kick_work,
+		  ccw_device_unbox_recog, (void *) cdev);
+	queue_work(ccw_device_work, &cdev->private->kick_work);
+	
+	return 0;
+}
+
 static DEVICE_ATTR(chpids, 0444, chpids_show, NULL);
 static DEVICE_ATTR(pimpampom, 0444, pimpampom_show, NULL);
 static DEVICE_ATTR(devtype, 0444, devtype_show, NULL);
 static DEVICE_ATTR(cutype, 0444, cutype_show, NULL);
 static DEVICE_ATTR(online, 0644, online_show, online_store);
+static DEVICE_ATTR(steal_lock, 0200, NULL, stlck_store);
+
+/* A device has been unboxed. Start device recognition. */
+static void
+ccw_device_unbox_recog(void *data)
+{
+	struct ccw_device *cdev;
+
+	cdev = (struct ccw_device *)data;
+	if (!cdev)
+		return;
+
+	/* Remove stlck attribute. */
+	device_remove_file(&cdev->dev, &dev_attr_steal_lock);
+
+	spin_lock_irq(cdev->ccwlock);
+
+	/* Device is no longer boxed. */
+	cdev->private->state = DEV_STATE_NOT_OPER;
+
+	/* Finally start device recognition. */
+	ccw_device_recognition(cdev);
+	spin_unlock_irq(cdev->ccwlock);
+}
 
 static inline int
 subchannel_add_files (struct device *dev)
@@ -348,6 +400,19 @@
 	return ret;
 }
 
+/*
+ * Add a "steal lock" attribute to boxed devices.
+ * This allows to trigger an unconditional reserve ccw to eckd dasds
+ * (if the device is something else, there should be no problems more than
+ * a command reject; we don't have any means of finding out the device's
+ * type if it was boxed at ipl/attach).
+ */
+void
+ccw_device_add_stlck(struct ccw_device *cdev)
+{
+	device_create_file(&cdev->dev, &dev_attr_steal_lock);
+}
+
 /* this is a simple abstraction for device_register that sets the
  * correct bus type and adds the bus specific files */
 static int
diff -urN linux-2.5.69-bk19/drivers/s390/cio/device.h linux-2.5.70/drivers/s390/cio/device.h
--- linux-2.5.69-bk19/drivers/s390/cio/device.h	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/device.h	2003-05-26 19:02:21.000000000 -0700
@@ -95,6 +95,9 @@
 
 void ccw_device_call_handler(struct ccw_device *);
 
+void ccw_device_add_stlck(struct ccw_device *);
+int ccw_device_stlck(struct ccw_device *);
+
 /* qdio needs this. */
 void ccw_device_set_timeout(struct ccw_device *, int);
 #endif
diff -urN linux-2.5.69-bk19/drivers/s390/cio/device_fsm.c linux-2.5.70/drivers/s390/cio/device_fsm.c
--- linux-2.5.69-bk19/drivers/s390/cio/device_fsm.c	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/device_fsm.c	2003-05-26 19:02:21.000000000 -0700
@@ -132,6 +132,7 @@
 		CIO_DEBUG(KERN_WARNING, 2,
 			  "SenseID : boxed device %04X on subchannel %04X\n",
 			  sch->schib.pmcw.dev, sch->irq);
+		ccw_device_add_stlck(cdev);
 		break;
 	}
 	io_subchannel_recog_done(cdev);
@@ -588,6 +589,29 @@
 			      ERR_PTR(-ETIMEDOUT));
 }
 
+static void
+ccw_device_stlck_done(struct ccw_device *cdev, enum dev_event dev_event)
+{
+	struct irb *irb;
+
+	switch (dev_event) {
+	case DEV_EVENT_INTERRUPT:
+		irb = (struct irb *) __LC_IRB;
+		/* Check for unsolicited interrupt. */
+		if (irb->scsw.stctl ==
+		    (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS))
+			goto out_wakeup;
+
+		ccw_device_accumulate_irb(cdev, irb);
+		/* We don't care about basic sense etc. */
+		break;
+	default: /* timeout */
+		break;
+	}
+out_wakeup:
+	wake_up(&cdev->private->wait_q);
+}
+
 /*
  * No operation action. This is used e.g. to ignore a timeout event in
  * state offline.
@@ -662,8 +686,8 @@
 	},
 	[DEV_STATE_BOXED] {
 		[DEV_EVENT_NOTOPER]	ccw_device_offline_notoper,
-		[DEV_EVENT_INTERRUPT]	ccw_device_bug,
-		[DEV_EVENT_TIMEOUT]	ccw_device_nop,
+		[DEV_EVENT_INTERRUPT]	ccw_device_stlck_done,
+		[DEV_EVENT_TIMEOUT]	ccw_device_stlck_done,
 		[DEV_EVENT_VERIFY]	ccw_device_nop,
 	},
 	/* states to wait for i/o completion before doing something */
diff -urN linux-2.5.69-bk19/drivers/s390/cio/device_ops.c linux-2.5.70/drivers/s390/cio/device_ops.c
--- linux-2.5.69-bk19/drivers/s390/cio/device_ops.c	2003-05-04 16:53:36.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/device_ops.c	2003-05-26 19:02:21.000000000 -0700
@@ -6,6 +6,7 @@
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
+ *               Cornelia Huck (cohuck@de.ibm.com)
  */
 #include <linux/config.h>
 #include <linux/module.h>
@@ -379,6 +380,52 @@
 	return ret;
 }
 
+/*
+ * Try to issue an unconditional reserve on a boxed device.
+ */
+int
+ccw_device_stlck(struct ccw_device *cdev)
+{
+	char buf[32];
+	unsigned long flags;
+	struct subchannel *sch;
+	int ret;
+
+	if (!cdev)
+		return -ENODEV;
+
+	sch = to_subchannel(cdev->dev.parent);
+	
+	CIO_TRACE_EVENT(2, "stl lock");
+	CIO_TRACE_EVENT(2, cdev->dev.bus_id);
+
+	/* Setup ccw. This cmd code seems not to be in use elsewhere. */
+	cdev->private->iccws[0].cmd_code = CCW_CMD_STLCK;
+	cdev->private->iccws[0].cda = (__u32) __pa(buf);
+	cdev->private->iccws[0].count = 32;
+	cdev->private->iccws[0].flags = CCW_FLAG_SLI;
+
+	spin_lock_irqsave(&sch->lock, flags);
+	ret = cio_start(sch, cdev->private->iccws, 0xE2D3C3D2, 0);
+	spin_unlock_irqrestore(&sch->lock, flags);
+	if (ret)
+		return ret;
+
+	wait_event(cdev->private->wait_q, sch->schib.scsw.actl == 0);
+	spin_lock_irqsave(&sch->lock, flags);
+
+	if ((cdev->private->irb.scsw.dstat !=
+	     (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) ||
+	    (cdev->private->irb.scsw.cstat != 0))
+		ret = -EIO;
+
+	/* Clear irb. */
+	memset(&cdev->private->irb, 0, sizeof(struct irb));
+	spin_unlock_irqrestore(&sch->lock, flags);
+
+	return ret;
+}
+
 // FIXME: these have to go:
 
 int
diff -urN linux-2.5.69-bk19/drivers/s390/cio/qdio.c linux-2.5.70/drivers/s390/cio/qdio.c
--- linux-2.5.69-bk19/drivers/s390/cio/qdio.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/s390/cio/qdio.c	2003-05-26 19:02:21.000000000 -0700
@@ -55,7 +55,7 @@
 #include "ioasm.h"
 #include "chsc.h"
 
-#define VERSION_QDIO_C "$Revision: 1.48 $"
+#define VERSION_QDIO_C "$Revision: 1.49 $"
 
 /****************** MODULE PARAMETER VARIABLES ********************/
 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
@@ -1668,6 +1668,7 @@
 
 	switch (irq_ptr->state) {
 	case QDIO_IRQ_STATE_INACTIVE:
+		/* FIXME: defer this past interrupt time */
 		qdio_establish_handle_irq(cdev, cstat, dstat);
 		break;
 
@@ -1763,7 +1764,8 @@
 		u8  ocnt;
 	} *ssqd_area;
 
-	ssqd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	/* FIXME make this GFP_KERNEL */
+	ssqd_area = (void *)get_zeroed_page(GFP_ATOMIC | GFP_DMA);
 	if (!ssqd_area) {
 	        QDIO_PRINT_WARN("Could not get memory for chsc. Using all " \
 				"SIGAs for sch x%x.\n", sch);
@@ -2644,6 +2646,7 @@
 		return result;
 	}
 	
+	/* FIXME: don't wait forever if hardware is broken */
 	wait_event(cdev->private->wait_q,
 		   irq_ptr->state == QDIO_IRQ_STATE_ESTABLISHED ||
 		   irq_ptr->state == QDIO_IRQ_STATE_ERR);
diff -urN linux-2.5.69-bk19/drivers/s390/net/ctcmain.c linux-2.5.70/drivers/s390/net/ctcmain.c
--- linux-2.5.69-bk19/drivers/s390/net/ctcmain.c	2003-05-04 16:53:12.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/ctcmain.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,5 +1,5 @@
 /*
- * $Id: ctcmain.c,v 1.40 2003/04/08 16:00:17 mschwide Exp $
+ * $Id: ctcmain.c,v 1.42 2003/05/23 17:45:57 felfert Exp $
  *
  * CTC / ESCON network driver
  *
@@ -36,7 +36,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.40 $
+ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.42 $
  *
  */
 
@@ -272,7 +272,7 @@
 print_banner(void)
 {
 	static int printed = 0;
-	char vbuf[] = "$Revision: 1.40 $";
+	char vbuf[] = "$Revision: 1.42 $";
 	char *version = vbuf;
 
 	if (printed)
@@ -1966,7 +1966,7 @@
 	if (priv->channel[READ]->cdev == cdev)
 		ch = priv->channel[READ];
 	else if (priv->channel[WRITE]->cdev == cdev)
-		ch = priv->channel[READ];
+		ch = priv->channel[WRITE];
 	else {
 		printk(KERN_ERR
 		       "ctc: Can't determine channel for interrupt, "
@@ -2582,7 +2582,6 @@
 	file->private_data = kmalloc(STATS_BUFSIZE, GFP_KERNEL);
 	if (file->private_data == NULL)
 		return -ENOMEM;
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -2590,7 +2589,6 @@
 ctc_stat_close(struct inode *inode, struct file *file)
 {
 	kfree(file->private_data);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -2753,8 +2751,8 @@
 	dev->addr_len = 0;
 	dev->type = ARPHRD_SLIP;
 	dev->tx_queue_len = 100;
-	dev->owner = THIS_MODULE;
 	dev->flags = IFF_POINTOPOINT | IFF_NOARP;
+	SET_MODULE_OWNER(&tun->dev);
 	return dev;
 }
 
@@ -2915,7 +2913,7 @@
 
 	ctc_add_attributes(&cgdev->dev);
 
-	strncpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name));
+	strlcpy(privptr->fsm->name, dev->name, sizeof (privptr->fsm->name));
 
 	print_banner();
 
diff -urN linux-2.5.69-bk19/drivers/s390/net/ctctty.c linux-2.5.70/drivers/s390/net/ctctty.c
--- linux-2.5.69-bk19/drivers/s390/net/ctctty.c	2003-05-04 16:53:31.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/ctctty.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,5 +1,5 @@
 /*
- * $Id: ctctty.c,v 1.10 2003/03/21 18:47:31 aberg Exp $
+ * $Id: ctctty.c,v 1.11 2003/05/06 09:40:55 mschwide Exp $
  *
  * CTC / ESCON network driver, tty interface.
  *
diff -urN linux-2.5.69-bk19/drivers/s390/net/cu3088.c linux-2.5.70/drivers/s390/net/cu3088.c
--- linux-2.5.69-bk19/drivers/s390/net/cu3088.c	2003-05-04 16:53:09.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/cu3088.c	2003-05-26 19:02:21.000000000 -0700
@@ -80,8 +80,7 @@
 		if (!(end = strchr(start, delim[i])))
 			return count;
 		len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start);
-		strncpy (bus_ids[i], start, len);
-		bus_ids[i][len] = '\0';
+		strlcpy (bus_ids[i], start, len);
 		argv[i] = bus_ids[i];
 		start = end + 1;
 	}
diff -urN linux-2.5.69-bk19/drivers/s390/net/fsm.c linux-2.5.70/drivers/s390/net/fsm.c
--- linux-2.5.69-bk19/drivers/s390/net/fsm.c	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/fsm.c	2003-05-26 19:02:21.000000000 -0700
@@ -26,7 +26,7 @@
 		return NULL;
 	}
 	memset(this, 0, sizeof(fsm_instance));
-	strncpy(this->name, name, sizeof(this->name));
+	strlcpy(this->name, name, sizeof(this->name));
 
 	f = (fsm *)kmalloc(sizeof(fsm), order);
 	if (f == NULL) {
diff -urN linux-2.5.69-bk19/drivers/s390/net/iucv.c linux-2.5.70/drivers/s390/net/iucv.c
--- linux-2.5.69-bk19/drivers/s390/net/iucv.c	2003-05-04 16:53:01.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/iucv.c	2003-05-26 19:02:21.000000000 -0700
@@ -1,5 +1,5 @@
 /* 
- * $Id: iucv.c,v 1.10 2003/03/28 08:54:40 mschwide Exp $
+ * $Id: iucv.c,v 1.11 2003/04/15 16:45:37 aberg Exp $
  *
  * IUCV network driver
  *
@@ -29,7 +29,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.10 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.11 $
  *
  */
 
@@ -332,7 +332,7 @@
 static void
 iucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.10 $";
+	char vbuf[] = "$Revision: 1.11 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
@@ -842,7 +842,6 @@
 		}
 		register_flag = 1;
 	}
-	MOD_INC_USE_COUNT;
 	iucv_debug(1, "exiting");
 	return new_handler;
 }				/* end of register function */
@@ -903,7 +902,6 @@
 	iucv_remove_handler(h);
 	kfree(h);
 
-	MOD_DEC_USE_COUNT;
 	iucv_debug(1, "exiting");
 	return 0;
 }
diff -urN linux-2.5.69-bk19/drivers/s390/net/lcs.c linux-2.5.70/drivers/s390/net/lcs.c
--- linux-2.5.69-bk19/drivers/s390/net/lcs.c	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/lcs.c	2003-05-26 19:02:21.000000000 -0700
@@ -1786,7 +1786,7 @@
 		dev->set_multicast_list = lcs_set_multicast_list;
 #endif
 	dev->get_stats = lcs_getstats;
-	dev->owner = THIS_MODULE;
+	SET_MODULE_OWNER(&tun->dev);
 	netif_stop_queue(dev);
 	lcs_stopcard(card);
 	return 0;
diff -urN linux-2.5.69-bk19/drivers/s390/net/netiucv.c linux-2.5.70/drivers/s390/net/netiucv.c
--- linux-2.5.69-bk19/drivers/s390/net/netiucv.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/s390/net/netiucv.c	2003-05-26 19:02:21.000000000 -0700
@@ -1630,8 +1630,8 @@
 	dev->addr_len            = 0;
 	dev->type                = ARPHRD_SLIP;
 	dev->tx_queue_len        = NETIUCV_QUEUELEN_DEFAULT;
-	dev->owner               = THIS_MODULE;
 	dev->flags	         = IFF_POINTOPOINT | IFF_NOARP;
+	SET_MODULE_OWNER(&tun->dev);
 	return dev;
 }
 
diff -urN linux-2.5.69-bk19/drivers/scsi/NCR_D700.c linux-2.5.70/drivers/scsi/NCR_D700.c
--- linux-2.5.69-bk19/drivers/scsi/NCR_D700.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/scsi/NCR_D700.c	2003-05-26 19:02:21.000000000 -0700
@@ -332,7 +332,7 @@
 	}
 
 	mca_device_set_claim(mca_dev, 1);
-	strncpy(dev->name, "NCR_D700", sizeof(dev->name));
+	strlcpy(dev->name, "NCR_D700", sizeof(dev->name));
 	dev_set_drvdata(dev, p);
 	return 0;
 }
diff -urN linux-2.5.69-bk19/drivers/scsi/aacraid/aachba.c linux-2.5.70/drivers/scsi/aacraid/aachba.c
--- linux-2.5.69-bk19/drivers/scsi/aacraid/aachba.c	2003-05-26 19:02:16.000000000 -0700
+++ linux-2.5.70/drivers/scsi/aacraid/aachba.c	2003-05-26 19:02:21.000000000 -0700
@@ -1130,7 +1130,7 @@
 	else
 		qd.unmapped = 0;
 
-	strncpy(qd.name, fsa_dev_ptr->devname[qd.cnum], 8);
+	strlcpy(qd.name, fsa_dev_ptr->devname[qd.cnum], sizeof(qd.name));
 
 	if (copy_to_user(arg, &qd, sizeof (struct aac_query_disk)))
 		return -EFAULT;
diff -urN linux-2.5.69-bk19/drivers/scsi/eata.c linux-2.5.70/drivers/scsi/eata.c
--- linux-2.5.69-bk19/drivers/scsi/eata.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/eata.c	2003-05-26 19:02:22.000000000 -0700
@@ -449,10 +449,6 @@
 
 #include <linux/version.h>
 
-#ifndef LinuxVersionCode
-#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
-#endif
-
 #define MAX_INT_PARAM 10
 
 #if defined(MODULE)
diff -urN linux-2.5.69-bk19/drivers/scsi/eata_pio.c linux-2.5.70/drivers/scsi/eata_pio.c
--- linux-2.5.69-bk19/drivers/scsi/eata_pio.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/eata_pio.c	2003-05-26 19:02:22.000000000 -0700
@@ -736,10 +736,8 @@
 	memset(hd->ccb, 0, (sizeof(struct eata_ccb) * ntohs(gc->queuesiz)));
 	memset(hd->reads, 0, sizeof(unsigned long) * 26);
 
-	strncpy(SD(sh)->vendor, &buff[8], 8);
-	SD(sh)->vendor[8] = 0;
-	strncpy(SD(sh)->name, &buff[16], 17);
-	SD(sh)->name[17] = 0;
+	strlcpy(SD(sh)->vendor, &buff[8], sizeof(SD(sh)->vendor));
+	strlcpy(SD(sh)->name, &buff[16], sizeof(SD(sh)->name));
 	SD(sh)->revision[0] = buff[32];
 	SD(sh)->revision[1] = buff[33];
 	SD(sh)->revision[2] = buff[34];
diff -urN linux-2.5.69-bk19/drivers/scsi/gdth.c linux-2.5.70/drivers/scsi/gdth.c
--- linux-2.5.69-bk19/drivers/scsi/gdth.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/gdth.c	2003-05-26 19:02:22.000000000 -0700
@@ -2295,15 +2295,15 @@
         TRACE2(("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD OK\n"));
         printk("GDT CTR%d Vendor: %s\n",hanum,oemstr->text.oem_company_name);
         /* Save the Host Drive inquiry data */
-        strncpy(ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,7);
-        ha->oem_name[7] = '\0';
+        strlcpy(ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,
+		sizeof(ha->oem_name));
     } else {
         /* Old method, based on PCI ID */
         TRACE2(("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD failed\n"));
         if (ha->oem_id == OEM_ID_INTEL)
-            strcpy(ha->oem_name,"Intel  ");
+            strlcpy(ha->oem_name,"Intel  ", sizeof(ha->oem_name));
         else
-            strcpy(ha->oem_name,"ICP    ");
+            strlcpy(ha->oem_name,"ICP    ", sizeof(ha->oem_name));
     }
 
     /* scanning for host drives */
diff -urN linux-2.5.69-bk19/drivers/scsi/in2000.c linux-2.5.70/drivers/scsi/in2000.c
--- linux-2.5.69-bk19/drivers/scsi/in2000.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/in2000.c	2003-05-26 19:02:22.000000000 -0700
@@ -1820,8 +1820,7 @@
 	int i;
 	char *p1, *p2;
 
-	strncpy(setup_buffer, str, SETUP_BUFFER_SIZE);
-	setup_buffer[SETUP_BUFFER_SIZE - 1] = '\0';
+	strlcpy(setup_buffer, str, SETUP_BUFFER_SIZE);
 	p1 = setup_buffer;
 	i = 0;
 	while (*p1 && (i < MAX_SETUP_ARGS)) {
diff -urN linux-2.5.69-bk19/drivers/scsi/ncr53c8xx.c linux-2.5.70/drivers/scsi/ncr53c8xx.c
--- linux-2.5.69-bk19/drivers/scsi/ncr53c8xx.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/ncr53c8xx.c	2003-05-26 19:02:22.000000000 -0700
@@ -3701,7 +3701,7 @@
 	/*
 	**	Store input informations in the host data structure.
 	*/
-	strncpy(np->chip_name, device->chip.name, sizeof(np->chip_name) - 1);
+	strlcpy(np->chip_name, device->chip.name, sizeof(np->chip_name));
 	np->unit	= unit;
 	np->verbose	= driver_setup.verbose;
 	sprintf(np->inst_name, "ncr53c%s-%d", np->chip_name, np->unit);
@@ -5033,7 +5033,7 @@
 	char inst_name[16];
 
 	/* Local copy so we don't access np after freeing it! */
-	strncpy(inst_name, ncr_name(np), 16);
+	strlcpy(inst_name, ncr_name(np), sizeof(inst_name));
 
 	printk("%s: releasing host resources\n", ncr_name(np));
 
diff -urN linux-2.5.69-bk19/drivers/scsi/osst.c linux-2.5.70/drivers/scsi/osst.c
--- linux-2.5.69-bk19/drivers/scsi/osst.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/osst.c	2003-05-26 19:02:22.000000000 -0700
@@ -2227,8 +2227,7 @@
 	}
 	if (strncmp(header->ident_str, "ADR_SEQ", 7) != 0 &&
 	    strncmp(header->ident_str, "ADR-SEQ", 7) != 0) {
-		strncpy(id_string, header->ident_str, 7);
-		id_string[7] = 0;
+		strlcpy(id_string, header->ident_str, 8);
 #if DEBUG
 		printk(OSST_DEB_MSG "%s:D: Invalid header identification string %s\n", name, id_string);
 #endif
diff -urN linux-2.5.69-bk19/drivers/scsi/sim710.c linux-2.5.70/drivers/scsi/sim710.c
--- linux-2.5.69-bk19/drivers/scsi/sim710.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/sim710.c	2003-05-26 19:02:22.000000000 -0700
@@ -253,7 +253,7 @@
 	} else {
 		return -ENODEV;
 	}
-	strncpy(dev->name, name, sizeof(dev->name));
+	strlcpy(dev->name, name, sizeof(dev->name));
 	mca_device_set_claim(mca_dev, 1);
 	base = mca_device_transform_ioport(mca_dev, base);
 	irq_vector = mca_device_transform_irq(mca_dev, irq_vector);
diff -urN linux-2.5.69-bk19/drivers/scsi/sym53c8xx.c linux-2.5.70/drivers/scsi/sym53c8xx.c
--- linux-2.5.69-bk19/drivers/scsi/sym53c8xx.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/sym53c8xx.c	2003-05-26 19:02:22.000000000 -0700
@@ -5454,7 +5454,7 @@
 	/*
 	**	Store input informations in the host data structure.
 	*/
-	strncpy(np->chip_name, device->chip.name, sizeof(np->chip_name) - 1);
+	strlcpy(np->chip_name, device->chip.name, sizeof(np->chip_name));
 	np->unit	= unit;
 	np->verbose	= driver_setup.verbose;
 	sprintf(np->inst_name, NAME53C "%s-%d", np->chip_name, np->unit);
diff -urN linux-2.5.69-bk19/drivers/scsi/sym53c8xx_2/sym_glue.c linux-2.5.70/drivers/scsi/sym53c8xx_2/sym_glue.c
--- linux-2.5.69-bk19/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/scsi/sym53c8xx_2/sym_glue.c	2003-05-26 19:02:22.000000000 -0700
@@ -1987,7 +1987,7 @@
 	/*
 	 *  Edit its name.
 	 */
-	strncpy(np->s.chip_name, dev->chip.name, sizeof(np->s.chip_name)-1);
+	strlcpy(np->s.chip_name, dev->chip.name, sizeof(np->s.chip_name));
 	sprintf(np->s.inst_name, "sym%d", np->s.unit);
 
 	/*
diff -urN linux-2.5.69-bk19/drivers/serial/core.c linux-2.5.70/drivers/serial/core.c
--- linux-2.5.69-bk19/drivers/serial/core.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/serial/core.c	2003-05-26 19:02:22.000000000 -0700
@@ -2023,7 +2023,7 @@
 }
 
 /*
- * This reverses the affects of uart_configure_port, hanging up the
+ * This reverses the effects of uart_configure_port, hanging up the
  * port before removal.
  */
 static void
diff -urN linux-2.5.69-bk19/drivers/usb/gadget/zero.c linux-2.5.70/drivers/usb/gadget/zero.c
--- linux-2.5.69-bk19/drivers/usb/gadget/zero.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/usb/gadget/zero.c	2003-05-26 19:02:22.000000000 -0700
@@ -1205,8 +1205,7 @@
 	/* a real value would likely come through some id prom
 	 * or module option.  this one takes at least two packets.
 	 */
-	strncpy (serial, "0123456789.0123456789.0123456789", sizeof serial);
-	serial [sizeof serial - 1] = 0;
+	strlcpy (serial, "0123456789.0123456789.0123456789", sizeof serial);
 
 	return usb_gadget_register_driver (&zero_driver);
 }
diff -urN linux-2.5.69-bk19/drivers/usb/misc/brlvger.c linux-2.5.70/drivers/usb/misc/brlvger.c
--- linux-2.5.69-bk19/drivers/usb/misc/brlvger.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/usb/misc/brlvger.c	2003-05-26 19:02:22.000000000 -0700
@@ -708,12 +708,10 @@
 	case BRLVGER_GET_INFO: {
 		struct brlvger_info vi;
 
-		strncpy(vi.driver_version, DRIVER_VERSION,
+		strlcpy(vi.driver_version, DRIVER_VERSION,
 			sizeof(vi.driver_version));
-		vi.driver_version[sizeof(vi.driver_version)-1] = 0;
-		strncpy(vi.driver_banner, longbanner,
+		strlcpy(vi.driver_banner, longbanner,
 			sizeof(vi.driver_banner));
-		vi.driver_banner[sizeof(vi.driver_banner)-1] = 0;
 
 		vi.display_length = priv->plength;
 		
diff -urN linux-2.5.69-bk19/drivers/usb/net/kaweth.c linux-2.5.70/drivers/usb/net/kaweth.c
--- linux-2.5.69-bk19/drivers/usb/net/kaweth.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/usb/net/kaweth.c	2003-05-26 19:02:22.000000000 -0700
@@ -670,7 +670,7 @@
 	switch (ethcmd) {
 	case ETHTOOL_GDRVINFO: {
 		struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
-		strncpy(info.driver, "kaweth", sizeof(info.driver)-1);
+		strlcpy(info.driver, "kaweth", sizeof(info.driver));
 		if (copy_to_user(useraddr, &info, sizeof(info)))
 			return -EFAULT;
 		return 0;
diff -urN linux-2.5.69-bk19/drivers/usb/net/pegasus.c linux-2.5.70/drivers/usb/net/pegasus.c
--- linux-2.5.69-bk19/drivers/usb/net/pegasus.c	2003-05-04 16:53:56.000000000 -0700
+++ linux-2.5.70/drivers/usb/net/pegasus.c	2003-05-26 19:02:22.000000000 -0700
@@ -927,10 +927,10 @@
 	/* get driver-specific version/etc. info */
 	case ETHTOOL_GDRVINFO:{
 			struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
-			strncpy(info.driver, driver_name,
-				sizeof (info.driver) - 1);
-			strncpy(info.version, DRIVER_VERSION,
-				sizeof (info.version) - 1);
+			strlcpy(info.driver, driver_name,
+				sizeof (info.driver));
+			strlcpy(info.version, DRIVER_VERSION,
+				sizeof (info.version));
 			if (copy_to_user(useraddr, &info, sizeof (info)))
 				return -EFAULT;
 			return 0;
diff -urN linux-2.5.69-bk19/drivers/video/amifb.c linux-2.5.70/drivers/video/amifb.c
--- linux-2.5.69-bk19/drivers/video/amifb.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/video/amifb.c	2003-05-26 19:02:22.000000000 -0700
@@ -254,7 +254,7 @@
         moved to optimize use of dma (useful for OCS/ECS overscan displays)
       - ddfstop is ddfstrt+ddfsize-fetchsize
       - If C= didn't change anything for AGA, then at following positions the
-        dma bus is allready used:
+        dma bus is already used:
         ddfstrt <  48 -> memory refresh
                 <  96 -> disk dma
                 < 160 -> audio dma
diff -urN linux-2.5.69-bk19/drivers/video/aty/atyfb_base.c linux-2.5.70/drivers/video/aty/atyfb_base.c
--- linux-2.5.69-bk19/drivers/video/aty/atyfb_base.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/video/aty/atyfb_base.c	2003-05-26 19:02:22.000000000 -0700
@@ -2425,7 +2425,7 @@
 			 && (!strncmp(this_opt, "Mach64:", 7))) {
 			static unsigned char m64_num;
 			static char mach64_str[80];
-			strncpy(mach64_str, this_opt + 7, 80);
+			strlcpy(mach64_str, this_opt + 7, sizeof(mach64_str));
 			if (!store_video_par(mach64_str, m64_num)) {
 				m64_num++;
 				mach64_count = m64_num;
diff -urN linux-2.5.69-bk19/drivers/video/bw2.c linux-2.5.70/drivers/video/bw2.c
--- linux-2.5.69-bk19/drivers/video/bw2.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/video/bw2.c	2003-05-26 19:02:22.000000000 -0700
@@ -194,8 +194,7 @@
 static void
 bw2_init_fix(struct fb_info *info, int linebytes)
 {
-	strncpy(info->fix.id, "bwtwo", sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_MONO01;
diff -urN linux-2.5.69-bk19/drivers/video/cg14.c linux-2.5.70/drivers/video/cg14.c
--- linux-2.5.69-bk19/drivers/video/cg14.c	2003-05-04 16:53:42.000000000 -0700
+++ linux-2.5.70/drivers/video/cg14.c	2003-05-26 19:02:22.000000000 -0700
@@ -337,8 +337,7 @@
 {
 	struct cg14_par *par = (struct cg14_par *)info->par;
 
-	strncpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_TRUECOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/cg3.c linux-2.5.70/drivers/video/cg3.c
--- linux-2.5.69-bk19/drivers/video/cg3.c	2003-05-04 16:53:33.000000000 -0700
+++ linux-2.5.70/drivers/video/cg3.c	2003-05-26 19:02:22.000000000 -0700
@@ -253,8 +253,7 @@
 {
 	struct cg3_par *par = (struct cg3_par *)info->par;
 
-	strncpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/cirrusfb.c linux-2.5.70/drivers/video/cirrusfb.c
--- linux-2.5.69-bk19/drivers/video/cirrusfb.c	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/drivers/video/cirrusfb.c	2003-05-26 19:02:22.000000000 -0700
@@ -2777,9 +2777,8 @@
 	fb_info->gen.parsize = sizeof (struct clgenfb_par);
 	fb_info->gen.fbhw = &clgen_hwswitch;
 
-	strncpy (fb_info->gen.info.modename, clgen_board_info[btype].name,
+	strlcpy (fb_info->gen.info.modename, clgen_board_info[btype].name,
 		 sizeof (fb_info->gen.info.modename));
-	fb_info->gen.info.modename [sizeof (fb_info->gen.info.modename) - 1] = 0;
 
 	fb_info->gen.info.fbops = &clgenfb_ops;
 	fb_info->gen.info.disp = &disp;
diff -urN linux-2.5.69-bk19/drivers/video/console/sticore.c linux-2.5.70/drivers/video/console/sticore.c
--- linux-2.5.69-bk19/drivers/video/console/sticore.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/drivers/video/console/sticore.c	2003-05-26 19:02:22.000000000 -0700
@@ -273,7 +273,7 @@
 static int __init sti_setup(char *str)
 {
 	if (str)
-		strncpy (default_sti_path, str, sizeof (default_sti_path));
+		strlcpy (default_sti_path, str, sizeof (default_sti_path));
 	
 	return 0;
 }
diff -urN linux-2.5.69-bk19/drivers/video/cyber2000fb.c linux-2.5.70/drivers/video/cyber2000fb.c
--- linux-2.5.69-bk19/drivers/video/cyber2000fb.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/video/cyber2000fb.c	2003-05-26 19:02:22.000000000 -0700
@@ -1128,7 +1128,7 @@
 		info->disable_extregs = cyber2000fb_disable_extregs;
 		info->info            = int_cfb_info;
 
-		strncpy(info->dev_name, int_cfb_info->fb.fix.id, sizeof(info->dev_name));
+		strlcpy(info->dev_name, int_cfb_info->fb.fix.id, sizeof(info->dev_name));
 	}
 
 	return int_cfb_info != NULL;
@@ -1319,7 +1319,7 @@
 			continue;
 
 		if (strncmp(opt, "font:", 5) == 0) {
-			strncpy(default_font_storage, opt + 5, sizeof(default_font_storage));
+			strlcpy(default_font_storage, opt + 5, sizeof(default_font_storage));
 			default_font = default_font_storage;
 			continue;
 		}
diff -urN linux-2.5.69-bk19/drivers/video/fbmem.c linux-2.5.70/drivers/video/fbmem.c
--- linux-2.5.69-bk19/drivers/video/fbmem.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/video/fbmem.c	2003-05-26 19:02:22.000000000 -0700
@@ -943,7 +943,7 @@
 int
 fb_blank(struct fb_info *info, int blank)
 {	
-	/* ??? Varible sized stack allocation.  */
+	/* ??? Variable sized stack allocation.  */
 	u16 black[info->cmap.len];
 	struct fb_cmap cmap;
 	
@@ -990,7 +990,8 @@
 			return -EFAULT;
 		return 0;
 	case FBIOGET_FSCREENINFO:
-		return copy_to_user((void *) arg, &info->fix, sizeof(fix)) ? -EFAULT : 0;
+		return copy_to_user((void *) arg, &info->fix,
+				    sizeof(fix)) ? -EFAULT : 0;
 	case FBIOPUTCMAP:
 		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
 			return -EFAULT;
diff -urN linux-2.5.69-bk19/drivers/video/ffb.c linux-2.5.70/drivers/video/ffb.c
--- linux-2.5.69-bk19/drivers/video/ffb.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/video/ffb.c	2003-05-26 19:02:22.000000000 -0700
@@ -810,8 +810,7 @@
 	} else
 		ffb_type_name = "Elite 3D";
 
-	strncpy(info->fix.id, ffb_type_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, ffb_type_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_TRUECOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/leo.c linux-2.5.70/drivers/video/leo.c
--- linux-2.5.69-bk19/drivers/video/leo.c	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/drivers/video/leo.c	2003-05-26 19:02:22.000000000 -0700
@@ -336,8 +336,7 @@
 {
 	struct leo_par *par = (struct leo_par *)info->par;
 
-	strncpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_TRUECOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/matrox/matroxfb_base.c linux-2.5.70/drivers/video/matrox/matroxfb_base.c
--- linux-2.5.69-bk19/drivers/video/matrox/matroxfb_base.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/video/matrox/matroxfb_base.c	2003-05-26 19:02:22.000000000 -0700
@@ -2364,7 +2364,7 @@
 		else if (!strncmp(this_opt, "vesa:", 5))
 			vesa = simple_strtoul(this_opt+5, NULL, 0);
 		else if (!strncmp(this_opt, "font:", 5))
-			strncpy(fontname, this_opt+5, sizeof(fontname)-1);
+			strlcpy(fontname, this_opt+5, sizeof(fontname));
 		else if (!strncmp(this_opt, "maxclk:", 7))
 			maxclk = simple_strtoul(this_opt+7, NULL, 0);
 		else if (!strncmp(this_opt, "fh:", 3))
@@ -2374,7 +2374,7 @@
 		else if (!strncmp(this_opt, "mem:", 4))
 			mem = simple_strtoul(this_opt+4, NULL, 0);
 		else if (!strncmp(this_opt, "mode:", 5))
-			strncpy(videomode, this_opt+5, sizeof(videomode)-1);
+			strlcpy(videomode, this_opt+5, sizeof(videomode));
 		else if (!strncmp(this_opt, "dfp:", 4)) {
 			dfp_type = simple_strtoul(this_opt+4, NULL, 0);
 			dfp = 1;
@@ -2454,7 +2454,7 @@
 			else if (!strcmp(this_opt, "dfp"))
 				dfp = value;
 			else {
-				strncpy(videomode, this_opt, sizeof(videomode)-1);
+				strlcpy(videomode, this_opt, sizeof(videomode));
 			}
 		}
 	}
diff -urN linux-2.5.69-bk19/drivers/video/p9100.c linux-2.5.70/drivers/video/p9100.c
--- linux-2.5.69-bk19/drivers/video/p9100.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/video/p9100.c	2003-05-26 19:02:22.000000000 -0700
@@ -250,8 +250,7 @@
 {
 	struct p9100_par *par = (struct p9100_par *)info->par;
 
-	strncpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/pm2fb.c linux-2.5.70/drivers/video/pm2fb.c
--- linux-2.5.69-bk19/drivers/video/pm2fb.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/video/pm2fb.c	2003-05-26 19:02:22.000000000 -0700
@@ -2307,9 +2307,7 @@
 }
 
 static void __init pm2fb_font_setup(char* options) {
-
-	strncpy(pm2fb_options.font, options, sizeof(pm2fb_options.font));
-	pm2fb_options.font[sizeof(pm2fb_options.font)-1]='\0';
+	strlcpy(pm2fb_options.font, options, sizeof(pm2fb_options.font));
 }
 
 static void __init pm2fb_var_setup(char* options) {
diff -urN linux-2.5.69-bk19/drivers/video/pm3fb.c linux-2.5.70/drivers/video/pm3fb.c
--- linux-2.5.69-bk19/drivers/video/pm3fb.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/drivers/video/pm3fb.c	2003-05-26 19:02:22.000000000 -0700
@@ -2631,8 +2631,7 @@
 		DPRINTK(1, "Fontname %s too long\n", lf);
 		return;
 	}
-	strncpy(fontn[board_num], lf, lfs);
-	fontn[board_num][lfs] = '\0';
+	strlcpy(fontn[board_num], lf, lfs + 1);
 }
 
 static void pm3fb_bootdepth_setup(char *bds, unsigned long board_num)
diff -urN linux-2.5.69-bk19/drivers/video/radeonfb.c linux-2.5.70/drivers/video/radeonfb.c
--- linux-2.5.69-bk19/drivers/video/radeonfb.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/drivers/video/radeonfb.c	2003-05-26 19:02:22.000000000 -0700
@@ -2243,8 +2243,7 @@
         info->screen_base = (char *)rinfo->fb_base;
 
 	/* Fill fix common fields */
-	strncpy(info->fix.id, rinfo->name, sizeof(info->fix.id));
-	info->fix.id[sizeof(info->fix.id) - 1] = '\0';
+	strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id));
         info->fix.smem_start = rinfo->fb_base_phys;
         info->fix.smem_len = rinfo->video_ram;
         info->fix.type = FB_TYPE_PACKED_PIXELS;
diff -urN linux-2.5.69-bk19/drivers/video/retz3fb.c linux-2.5.70/drivers/video/retz3fb.c
--- linux-2.5.69-bk19/drivers/video/retz3fb.c	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/drivers/video/retz3fb.c	2003-05-26 19:02:22.000000000 -0700
@@ -1336,8 +1336,7 @@
 			z3fb_inverse = 1;
 			fb_invert_cmaps();
 		} else if (!strncmp(this_opt, "font:", 5)) {
-			strncpy(fontname, this_opt+5, 39);
-			fontname[39] = '\0';
+			strlcpy(fontname, this_opt+5, sizeof(fontname));
 		} else
 			z3fb_mode = get_video_mode(this_opt);
 	}
@@ -1410,7 +1409,7 @@
 		fb_info->switch_con = &z3fb_switch;
 		fb_info->updatevar = &z3fb_updatevar;
 		fb_info->flags = FBINFO_FLAG_DEFAULT;
-		strncpy(fb_info->fontname, fontname, 40);
+		strlcpy(fb_info->fontname, fontname, sizeof(fb_info->fontname));
 
 		if (z3fb_mode == -1)
 			retz3fb_default = retz3fb_predefined[0].var;
diff -urN linux-2.5.69-bk19/drivers/video/sstfb.c linux-2.5.70/drivers/video/sstfb.c
--- linux-2.5.69-bk19/drivers/video/sstfb.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/drivers/video/sstfb.c	2003-05-26 19:02:22.000000000 -0700
@@ -1462,7 +1462,7 @@
 		goto fail;
 	}
 	sst_get_memsize(info, &fix->smem_len);
-	strncpy(fix->id, spec->name, sizeof(fix->id));
+	strlcpy(fix->id, spec->name, sizeof(fix->id));
 
 	iprintk("%s (revision %d) with %s dac\n",
 		fix->id, par->revision, par->dac_sw.name);
diff -urN linux-2.5.69-bk19/drivers/video/stifb.c linux-2.5.70/drivers/video/stifb.c
--- linux-2.5.69-bk19/drivers/video/stifb.c	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/drivers/video/stifb.c	2003-05-26 19:02:22.000000000 -0700
@@ -1235,7 +1235,7 @@
 	}
 
 
-	/* get framebuffer pysical and virtual base addr & len (64bit ready) */
+	/* get framebuffer physical and virtual base addr & len (64bit ready) */
 	fix->smem_start = fb->sti->regions_phys[1] | 0xffffffff00000000;
 	fix->smem_len = fb->sti->regions[1].region_desc.length * 4096;
 
diff -urN linux-2.5.69-bk19/drivers/video/tcx.c linux-2.5.70/drivers/video/tcx.c
--- linux-2.5.69-bk19/drivers/video/tcx.c	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/drivers/video/tcx.c	2003-05-26 19:02:22.000000000 -0700
@@ -290,8 +290,7 @@
 	else
 		tcx_name = "TCX24";
 
-	strncpy(info->fix.id, tcx_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, tcx_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
diff -urN linux-2.5.69-bk19/drivers/video/tgafb.c linux-2.5.70/drivers/video/tgafb.c
--- linux-2.5.69-bk19/drivers/video/tgafb.c	2003-05-04 16:53:35.000000000 -0700
+++ linux-2.5.70/drivers/video/tgafb.c	2003-05-26 19:02:22.000000000 -0700
@@ -1341,8 +1341,7 @@
 		break;
 	}
 
-	strncpy(info->fix.id, tga_type_name, sizeof(info->fix.id) - 1);
-	info->fix.id[sizeof(info->fix.id)-1] = 0;
+	strlcpy(info->fix.id, tga_type_name, sizeof(info->fix.id));
 
 	info->fix.type = FB_TYPE_PACKED_PIXELS;
 	info->fix.type_aux = 0;
diff -urN linux-2.5.69-bk19/fs/autofs4/root.c linux-2.5.70/fs/autofs4/root.c
--- linux-2.5.69-bk19/fs/autofs4/root.c	2003-05-04 16:52:49.000000000 -0700
+++ linux-2.5.70/fs/autofs4/root.c	2003-05-26 19:02:22.000000000 -0700
@@ -147,7 +147,6 @@
 {
 	struct inode * dir = dentry->d_parent->d_inode;
 	struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
-	struct autofs_info *ino;
 	int oz_mode = autofs4_oz_mode(sbi);
 
 	/* Pending dentry */
@@ -162,8 +161,6 @@
 	if (dentry->d_inode == NULL)
 		return (dentry->d_time - jiffies <= AUTOFS_NEGATIVE_TIMEOUT);
 
-	ino = autofs4_dentry_ino(dentry);
-
 	/* Check for a non-mountpoint directory with no contents */
 	spin_lock(&dcache_lock);
 	if (S_ISDIR(dentry->d_inode->i_mode) &&
diff -urN linux-2.5.69-bk19/fs/compat.c linux-2.5.70/fs/compat.c
--- linux-2.5.69-bk19/fs/compat.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/fs/compat.c	2003-05-26 19:02:22.000000000 -0700
@@ -378,6 +378,7 @@
 	return 0;
 }
 
+#ifndef HAVE_ARCH_GET_COMPAT_FLOCK64
 static int get_compat_flock64(struct flock *kfl, struct compat_flock64 *ufl)
 {
 	if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)) ||
@@ -389,7 +390,9 @@
 		return -EFAULT;
 	return 0;
 }
+#endif
 
+#ifndef HAVE_ARCH_PUT_COMPAT_FLOCK64
 static int put_compat_flock64(struct flock *kfl, struct compat_flock64 *ufl)
 {
 	if (!access_ok(VERIFY_WRITE, ufl, sizeof(*ufl)) ||
@@ -401,6 +404,7 @@
 		return -EFAULT;
 	return 0;
 }
+#endif
 
 extern asmlinkage long sys_fcntl(unsigned int, unsigned int, unsigned long);
 
diff -urN linux-2.5.69-bk19/fs/devpts/inode.c linux-2.5.70/fs/devpts/inode.c
--- linux-2.5.69-bk19/fs/devpts/inode.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/fs/devpts/inode.c	2003-05-26 19:02:22.000000000 -0700
@@ -183,9 +183,8 @@
 	err = register_filesystem(&devpts_fs_type);
 	if (!err) {
 		devpts_mnt = kern_mount(&devpts_fs_type);
-		err = PTR_ERR(devpts_mnt);
-		if (!IS_ERR(devpts_mnt))
-			err = 0;
+		if (IS_ERR(devpts_mnt))
+			err = PTR_ERR(devpts_mnt);
 	}
 	return err;
 }
diff -urN linux-2.5.69-bk19/fs/intermezzo/methods.c linux-2.5.70/fs/intermezzo/methods.c
--- linux-2.5.69-bk19/fs/intermezzo/methods.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/fs/intermezzo/methods.c	2003-05-26 19:02:22.000000000 -0700
@@ -251,8 +251,8 @@
         if (ops == NULL) {
                 CERROR("prepare to die: unrecognized cache type for Filter\n");
         }
-        return ops;
         FEXIT;
+        return ops;
 }
 
 
diff -urN linux-2.5.69-bk19/fs/isofs/inode.c linux-2.5.70/fs/isofs/inode.c
--- linux-2.5.69-bk19/fs/isofs/inode.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/fs/isofs/inode.c	2003-05-26 19:02:22.000000000 -0700
@@ -1279,11 +1279,12 @@
 	}
 #endif
 
-	inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec =
-		iso_date(de->date, high_sierra);
-	inode->i_mtime.tv_nsec = 0;
-	inode->i_atime.tv_nsec = 0;
-	inode->i_mtime.tv_nsec = 0;
+	inode->i_mtime.tv_sec =
+	inode->i_atime.tv_sec =
+	inode->i_ctime.tv_sec = iso_date(de->date, high_sierra);
+	inode->i_mtime.tv_nsec =
+	inode->i_atime.tv_nsec =
+	inode->i_ctime.tv_nsec = 0;
 
 	ei->i_first_extent = (isonum_733 (de->extent) +
 			      isonum_711 (de->ext_attr_length));
diff -urN linux-2.5.69-bk19/fs/partitions/msdos.c linux-2.5.70/fs/partitions/msdos.c
--- linux-2.5.69-bk19/fs/partitions/msdos.c	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/fs/partitions/msdos.c	2003-05-26 19:02:22.000000000 -0700
@@ -20,27 +20,15 @@
  */
 
 #include <linux/config.h>
-#include <linux/buffer_head.h>		/* for invalidate_bdev() */
-
-#ifdef CONFIG_BLK_DEV_IDE
-#include <linux/hdreg.h>
-#include <linux/ide.h>	/* IDE xlate */
-#elif defined(CONFIG_BLK_DEV_IDE_MODULE)
-#include <linux/module.h>
-
-int (*ide_xlate_1024_hook)(struct block_device *, int, int, const char *);
-EXPORT_SYMBOL(ide_xlate_1024_hook);
-#define ide_xlate_1024 ide_xlate_1024_hook
-#endif
 
 #include "check.h"
 #include "msdos.h"
 #include "efi.h"
 
 /*
- * Many architectures don't like unaligned accesses, which is
- * frequently the case with the nr_sects and start_sect partition
- * table entries.
+ * Many architectures don't like unaligned accesses, while
+ * the nr_sects and start_sect partition table entries are
+ * at a 2 (mod 4) address.
  */
 #include <asm/unaligned.h>
 
diff -urN linux-2.5.69-bk19/include/asm-s390/ccwdev.h linux-2.5.70/include/asm-s390/ccwdev.h
--- linux-2.5.69-bk19/include/asm-s390/ccwdev.h	2003-05-04 16:53:40.000000000 -0700
+++ linux-2.5.70/include/asm-s390/ccwdev.h	2003-05-26 19:02:22.000000000 -0700
@@ -11,39 +11,12 @@
 #define _S390_CCWDEV_H_
 
 #include <linux/device.h>
+#include <linux/mod_devicetable.h>
 
 /* structs from asm/cio.h */
 struct irb;
 struct ccw1;
 
-/* the id is used to identify what hardware a device driver supports. It 
- * is used both by the ccw subsystem driver for probing and from
- * user space for automatic module loading.
- *
- * References:
- *   - struct usb_device_id (include/linux/usb.h)
- *   - devreg_hc_t (include/linux/s390dyn.h)
- *   - chandev_model_info (drivers/s390/misc/chandev.c)
- */
-struct ccw_device_id {
-	__u16	match_flags;	/* which fields to match against */
-
-	__u16	cu_type;	/* control unit type     */
-	__u16	dev_type;	/* device type           */
-	__u8	cu_model;	/* control unit model    */
-	__u8	dev_model;	/* device model          */
-
-	unsigned long driver_info;
-};
-
-enum match_flag {
-	CCW_DEVICE_ID_MATCH_CU_TYPE      = 0x01,
-	CCW_DEVICE_ID_MATCH_CU_MODEL     = 0x02,
-	CCW_DEVICE_ID_MATCH_DEVICE_TYPE  = 0x04,
-	CCW_DEVICE_ID_MATCH_DEVICE_MODEL = 0x08,
-	/* CCW_DEVICE_ID_MATCH_ANY	     = 0x10, */
-};
-
 /* simplified initializers for struct ccw_device:
  * CCW_DEVICE and CCW_DEVICE_DEVTYPE initialize one
  * entry in your MODULE_DEVICE_TABLE and set the match_flag correctly */
diff -urN linux-2.5.69-bk19/include/asm-s390/cio.h linux-2.5.70/include/asm-s390/cio.h
--- linux-2.5.69-bk19/include/asm-s390/cio.h	2003-05-04 16:53:41.000000000 -0700
+++ linux-2.5.70/include/asm-s390/cio.h	2003-05-26 19:02:22.000000000 -0700
@@ -128,6 +128,7 @@
 #define CCW_CMD_NOOP		0x03
 #define CCW_CMD_BASIC_SENSE	0x04
 #define CCW_CMD_TIC		0x08
+#define CCW_CMD_STLCK           0x14
 #define CCW_CMD_SENSE_PGID	0x34
 #define CCW_CMD_SUSPEND_RECONN	0x5B
 #define CCW_CMD_RDC		0x64
diff -urN linux-2.5.69-bk19/include/asm-s390/compat.h linux-2.5.70/include/asm-s390/compat.h
--- linux-2.5.69-bk19/include/asm-s390/compat.h	2003-05-04 16:53:02.000000000 -0700
+++ linux-2.5.70/include/asm-s390/compat.h	2003-05-26 19:02:22.000000000 -0700
@@ -4,6 +4,7 @@
  * Architecture specific compatibility types
  */
 #include <linux/types.h>
+#include <linux/sched.h>
 
 #define COMPAT_USER_HZ	100
 
@@ -122,4 +123,14 @@
 	return (void *)(unsigned long)(uptr & 0x7fffffffUL);
 }
 
+static inline void *compat_alloc_user_space(long len)
+{
+	unsigned long stack;
+
+	stack = KSTK_ESP(current);
+	if (test_thread_flag(TIF_31BIT))
+		stack &= 0x7fffffffUL;
+	return (void *) (stack - len);
+}
+
 #endif /* _ASM_S390X_COMPAT_H */
diff -urN linux-2.5.69-bk19/include/asm-s390/hardirq.h linux-2.5.70/include/asm-s390/hardirq.h
--- linux-2.5.69-bk19/include/asm-s390/hardirq.h	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/include/asm-s390/hardirq.h	2003-05-26 19:02:22.000000000 -0700
@@ -83,7 +83,7 @@
 #define invoke_softirq() do_call_softirq()
 
 #ifdef CONFIG_PREEMPT
-# define in_atomic()	(in_interrupt() || preempt_count() == PREEMPT_ACTIVE)
+# define in_atomic()	((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked())
 # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
 #else
 # define in_atomic()	(preempt_count() != 0)
diff -urN linux-2.5.69-bk19/include/asm-s390/pgtable.h linux-2.5.70/include/asm-s390/pgtable.h
--- linux-2.5.69-bk19/include/asm-s390/pgtable.h	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/include/asm-s390/pgtable.h	2003-05-26 19:02:22.000000000 -0700
@@ -218,9 +218,9 @@
 /* Mask and four different kinds of invalid pages. */
 #define _PAGE_INVALID_MASK	0x601
 #define _PAGE_INVALID_EMPTY	0x400
-#define _PAGE_INVALID_NONE	0x001
-#define _PAGE_INVALID_SWAP	0x200
-#define _PAGE_INVALID_FILE	0x201
+#define _PAGE_INVALID_NONE	0x401
+#define _PAGE_INVALID_SWAP	0x600
+#define _PAGE_INVALID_FILE	0x601
 
 #ifndef __s390x__
 
diff -urN linux-2.5.69-bk19/include/asm-s390/posix_types.h linux-2.5.70/include/asm-s390/posix_types.h
--- linux-2.5.69-bk19/include/asm-s390/posix_types.h	2003-05-04 16:52:48.000000000 -0700
+++ linux-2.5.70/include/asm-s390/posix_types.h	2003-05-26 19:02:22.000000000 -0700
@@ -65,6 +65,7 @@
 typedef __kernel_gid_t __kernel_old_gid_t;
 typedef __kernel_uid_t __kernel_uid32_t;
 typedef __kernel_gid_t __kernel_gid32_t;
+typedef unsigned short __kernel_old_dev_t;
 
 #endif /* __s390x__ */
 
diff -urN linux-2.5.69-bk19/include/asm-s390/system.h linux-2.5.70/include/asm-s390/system.h
--- linux-2.5.69-bk19/include/asm-s390/system.h	2003-05-04 16:53:57.000000000 -0700
+++ linux-2.5.70/include/asm-s390/system.h	2003-05-26 19:02:22.000000000 -0700
@@ -25,12 +25,9 @@
 
 #ifdef __s390x__
 #define __FLAG_SHIFT 56
-extern void __misaligned_u16(void);
-extern void __misaligned_u32(void);
-extern void __misaligned_u64(void);
-#else /* __s390x__ */
+#else /* ! __s390x__ */
 #define __FLAG_SHIFT 24
-#endif /* __s390x__ */
+#endif /* ! __s390x__ */
 
 static inline void save_fp_regs(s390_fp_regs *fpregs)
 {
@@ -301,56 +298,52 @@
 
 #define __ctl_load(array, low, high) ({ \
 	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-                "   lctlg 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \
+		"   bras  1,0f\n" \
+                "   lctlg 0,0,0(%0)\n" \
+		"0: ex    %1,0(1)" \
+		: : "a" (&array), "a" (((low)<<4)+(high)) : "1" ); \
 	})
 
 #define __ctl_store(array, low, high) ({ \
 	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-		"   stctg 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); \
+		"   bras  1,0f\n" \
+		"   stctg 0,0,0(%1)\n" \
+		"0: ex    %2,0(1)" \
+		: "=m" (array) : "a" (&array), "a" (((low)<<4)+(high)) : "1" ); \
 	})
 
 #define __ctl_set_bit(cr, bit) ({ \
         __u8 __dummy[24]; \
         __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    aghi  1,7\n" \
-                "    nill  1,0xfff8\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctg 0,0,0(1)\n" \
-                "    lctlg 0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    lg    0,0(1)\n" \
-                "    ogr   0,%2\n"       /* set the bit */ \
-                "    stg   0,0(1)\n" \
-                "1:  ex    %1,6(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (1L<<(bit)) \
-                : "cc", "0", "1", "2"); \
+                "    bras  1,0f\n"       /* skip indirect insns */ \
+                "    stctg 0,0,0(%1)\n" \
+                "    lctlg 0,0,0(%1)\n" \
+                "0:  ex    %2,0(1)\n"    /* execute stctl */ \
+                "    lg    0,0(%1)\n" \
+                "    ogr   0,%3\n"       /* set the bit */ \
+                "    stg   0,0(%1)\n" \
+                "1:  ex    %2,6(1)"      /* execute lctl */ \
+                : "=m" (__dummy) \
+		: "a" ((((unsigned long) &__dummy) + 7) & ~7UL), \
+		  "a" (cr*17), "a" (1L<<(bit)) \
+                : "cc", "0", "1" ); \
         })
 
 #define __ctl_clear_bit(cr, bit) ({ \
-        __u8 __dummy[24]; \
+        __u8 __dummy[16]; \
         __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    aghi  1,7\n" \
-                "    nill  1,0xfff8\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctg 0,0,0(1)\n" \
-                "    lctlg 0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    lg    0,0(1)\n" \
-                "    ngr   0,%2\n"       /* set the bit */ \
-                "    stg   0,0(1)\n" \
-                "1:  ex    %1,6(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (~(1L<<(bit))) \
-                : "cc", "0", "1", "2"); \
+                "    bras  1,0f\n"       /* skip indirect insns */ \
+                "    stctg 0,0,0(%1)\n" \
+                "    lctlg 0,0,0(%1)\n" \
+                "0:  ex    %2,0(1)\n"    /* execute stctl */ \
+                "    lg    0,0(%1)\n" \
+                "    ngr   0,%3\n"       /* set the bit */ \
+                "    stg   0,0(%1)\n" \
+                "1:  ex    %2,6(1)"      /* execute lctl */ \
+                : "=m" (__dummy) \
+		: "a" ((((unsigned long) &__dummy) + 7) & ~7UL), \
+		  "a" (cr*17), "a" (~(1L<<(bit))) \
+                : "cc", "0", "1" ); \
         })
 
 #else /* __s390x__ */
@@ -360,58 +353,52 @@
 
 #define __ctl_load(array, low, high) ({ \
 	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-                "   lctl 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \
+		"   bras  1,0f\n" \
+                "   lctl 0,0,0(%0)\n" \
+		"0: ex    %1,0(1)" \
+		: : "a" (&array), "a" (((low)<<4)+(high)) : "1" ); \
 	})
 
 #define __ctl_store(array, low, high) ({ \
 	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-		"   stctl 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); \
+		"   bras  1,0f\n" \
+		"   stctl 0,0,0(%1)\n" \
+		"0: ex    %2,0(1)" \
+		: "=m" (array) : "a" (&array), "a" (((low)<<4)+(high)): "1" ); \
 	})
 
 #define __ctl_set_bit(cr, bit) ({ \
         __u8 __dummy[16]; \
         __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    ahi   1,7\n" \
-                "    srl   1,3\n" \
-                "    sll   1,3\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctl 0,0,0(1)\n" \
-                "    lctl  0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    l     0,0(1)\n" \
-                "    or    0,%2\n"       /* set the bit */ \
-                "    st    0,0(1)\n" \
-                "1:  ex    %1,4(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (1<<(bit)) \
-                : "cc", "0", "1", "2"); \
+                "    bras  1,0f\n"       /* skip indirect insns */ \
+                "    stctl 0,0,0(%1)\n" \
+                "    lctl  0,0,0(%1)\n" \
+                "0:  ex    %2,0(1)\n"    /* execute stctl */ \
+                "    l     0,0(%1)\n" \
+                "    or    0,%3\n"       /* set the bit */ \
+                "    st    0,0(%1)\n" \
+                "1:  ex    %2,4(1)"      /* execute lctl */ \
+                : "=m" (__dummy) \
+		: "a" ((((unsigned long) &__dummy) + 7) & ~7UL), \
+		  "a" (cr*17), "a" (1<<(bit)) \
+                : "cc", "0", "1" ); \
         })
 
 #define __ctl_clear_bit(cr, bit) ({ \
         __u8 __dummy[16]; \
         __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    ahi   1,7\n" \
-                "    srl   1,3\n" \
-                "    sll   1,3\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctl 0,0,0(1)\n" \
-                "    lctl  0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    l     0,0(1)\n" \
-                "    nr    0,%2\n"       /* set the bit */ \
-                "    st    0,0(1)\n" \
-                "1:  ex    %1,4(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (~(1<<(bit))) \
-                : "cc", "0", "1", "2"); \
+                "    bras  1,0f\n"       /* skip indirect insns */ \
+                "    stctl 0,0,0(%1)\n" \
+                "    lctl  0,0,0(%1)\n" \
+                "0:  ex    %2,0(1)\n"    /* execute stctl */ \
+                "    l     0,0(%1)\n" \
+                "    nr    0,%3\n"       /* set the bit */ \
+                "    st    0,0(%1)\n" \
+                "1:  ex    %2,4(1)"      /* execute lctl */ \
+                : "=m" (__dummy) \
+		: "a" ((((unsigned long) &__dummy) + 7) & ~7UL), \
+		  "a" (cr*17), "a" (~(1<<(bit))) \
+                : "cc", "0", "1" ); \
         })
 #endif /* __s390x__ */
 
diff -urN linux-2.5.69-bk19/include/asm-s390/tlbflush.h linux-2.5.70/include/asm-s390/tlbflush.h
--- linux-2.5.69-bk19/include/asm-s390/tlbflush.h	2003-05-04 16:53:56.000000000 -0700
+++ linux-2.5.70/include/asm-s390/tlbflush.h	2003-05-26 19:02:22.000000000 -0700
@@ -76,13 +76,16 @@
 	}
 #endif /* __s390x__ */
 	{
-		long dummy = 0;
+		register unsigned long addr asm("4");
+		long dummy;
+
+		dummy = 0;
+		addr = ((unsigned long) &dummy) + 1;
 		__asm__ __volatile__ (
-			"    la   4,1(%0)\n"
 			"    slr  2,2\n"
 			"    slr  3,3\n"
-			"    csp  2,4"
-			: : "a" (&dummy) : "cc", "2", "3", "4" );
+			"    csp  2,%0"
+			: : "a" (addr) : "cc", "2", "3" );
 	}
 }
 
diff -urN linux-2.5.69-bk19/include/asm-s390/uaccess.h linux-2.5.70/include/asm-s390/uaccess.h
--- linux-2.5.69-bk19/include/asm-s390/uaccess.h	2003-05-04 16:53:07.000000000 -0700
+++ linux-2.5.70/include/asm-s390/uaccess.h	2003-05-26 19:02:22.000000000 -0700
@@ -113,82 +113,83 @@
 
 #define __put_user_asm_8(x, ptr, err) \
 ({								\
+	register __typeof__(x) const * __from asm("2");		\
+	register __typeof__(*(ptr)) * __to asm("4");		\
+	__from = &(x);						\
+	__to = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  2,%2\n"				\
-		"   la	  4,%1\n"				\
 		"   sacf  512\n"				\
-		"0: mvc	  0(8,4),0(2)\n"			\
+		"0: mvc	  0(8,%1),0(%2)\n"			\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "m" (*(__u64*)(ptr)), "m" (x), "K" (-EFAULT)	\
-		: "cc", "2", "4" );				\
+		: "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0)	\
+		: "cc" );					\
 })
 
 #else /* __s390x__ */
 
 #define __put_user_asm_8(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) * __ptr asm("4");		\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%1\n"				\
 		"   sacf  512\n"				\
-		"0: stg	  %2,0(4)\n"				\
+		"0: stg	  %2,0(%1)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "m" (*(__u64*)(ptr)), "d" (x), "K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "d" (x), "K" (-EFAULT), "0" (0)	\
+		: "cc" );					\
 })
 
 #endif /* __s390x__ */
 
 #define __put_user_asm_4(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) * __ptr asm("4");		\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%1\n"				\
 		"   sacf  512\n"				\
-		"0: st	  %2,0(4)\n"				\
+		"0: st	  %2,0(%1)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "m" (*(__u32*)(ptr)), "d" (x), "K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "d" (x), "K" (-EFAULT), "0" (0)	\
+		: "cc" );					\
 })
 
 #define __put_user_asm_2(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) * __ptr asm("4");		\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%1\n"				\
 		"   sacf  512\n"				\
-		"0: sth	  %2,0(4)\n"				\
+		"0: sth	  %2,0(%1)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "m" (*(__u16*)(ptr)), "d" (x), "K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "d" (x), "K" (-EFAULT), "0" (0)	\
+		: "cc" );					\
 })
 
 #define __put_user_asm_1(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) * __ptr asm("4");		\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%1\n"				\
 		"   sacf  512\n"				\
-		"0: stc	  %2,0(4)\n"				\
+		"0: stc	  %2,0(%1)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err)					\
-		: "m" (*(__u8*)(ptr)), "d" (x),	"K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "d" (x),	"K" (-EFAULT), "0" (0)	\
+		: "cc" );					\
 })
 
 #define __put_user(x, ptr) \
@@ -223,35 +224,36 @@
 
 #define __get_user_asm_8(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) const * __from asm("2");	\
+	register __typeof__(x) * __to asm("4");			\
+	__from = (ptr);						\
+	__to = &(x);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  2,%1\n"				\
-		"   la	  4,%2\n"				\
 		"   sacf  512\n"				\
-		"0: mvc	  0(8,2),0(4)\n"			\
+		"0: mvc	  0(8,%1),0(%2)\n"			\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err), "=m" (x)				\
-		: "m" (*(const __u64*)(ptr)),"K" (-EFAULT)	\
-		: "cc", "2", "4" );				\
+		: "a" (__to),"a" (__from),"K" (-EFAULT),"0" (0)	\
+		: "cc" );					\
 })
 
 #else /* __s390x__ */
 
 #define __get_user_asm_8(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) const * __ptr asm("4");	\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%2\n"				\
 		"   sacf  512\n"				\
-		"0: lg	  %1,0(4)\n"				\
+		"0: lg	  %1,0(%2)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err), "=d" (x)				\
-		: "m" (*(const __u64*)(ptr)),"K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "K" (-EFAULT), "0" (0)		\
+		: "cc" );					\
 })
 
 #endif /* __s390x__ */
@@ -259,48 +261,48 @@
 
 #define __get_user_asm_4(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) const * __ptr asm("4");	\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%2\n"				\
 		"   sacf  512\n"				\
-		"0: l	  %1,0(4)\n"				\
+		"0: l	  %1,0(%2)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err), "=d" (x)				\
-		: "m" (*(const __u32*)(ptr)),"K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "K" (-EFAULT), "0" (0)		\
+		: "cc" );					\
 })
 
 #define __get_user_asm_2(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) const * __ptr asm("4");	\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%2\n"				\
 		"   sacf  512\n"				\
-		"0: lh	  %1,0(4)\n"				\
+		"0: lh	  %1,0(%2)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err), "=d" (x)				\
-		: "m" (*(const __u16*)(ptr)),"K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "K" (-EFAULT), "0" (0)		\
+		: "cc" );					\
 })
 
 #define __get_user_asm_1(x, ptr, err) \
 ({								\
+	register __typeof__(*(ptr)) const * __ptr asm("4");	\
+	__ptr = (ptr);						\
 	__asm__ __volatile__ (					\
-		"   sr	  %0,%0\n"				\
-		"   la	  4,%2\n"				\
 		"   sr	  %1,%1\n"				\
 		"   sacf  512\n"				\
-		"0: ic	  %1,0(4)\n"				\
+		"0: ic	  %1,0(%2)\n"				\
 		"   sacf  0\n"					\
 		"1:\n"						\
 		__uaccess_fixup					\
 		: "=&d" (err), "=d" (x)				\
-		: "m" (*(const __u8*)(ptr)),"K" (-EFAULT)	\
-		: "cc", "4" );					\
+		: "a" (__ptr), "K" (-EFAULT), "0" (0)		\
+		: "cc" );					\
 })
 
 #define __get_user(x, ptr)					\
diff -urN linux-2.5.69-bk19/include/linux/compat_ioctl.h linux-2.5.70/include/linux/compat_ioctl.h
--- linux-2.5.69-bk19/include/linux/compat_ioctl.h	2003-05-04 16:53:42.000000000 -0700
+++ linux-2.5.70/include/linux/compat_ioctl.h	2003-05-26 19:02:22.000000000 -0700
@@ -38,12 +38,14 @@
 COMPATIBLE_IOCTL(TIOCGPTN)
 COMPATIBLE_IOCTL(TIOCSPTLCK)
 COMPATIBLE_IOCTL(TIOCSERGETLSR)
+#ifdef CONFIG_FB
 /* Big F */
 COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
 COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
 COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
 COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP)
 COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP)
+#endif
 /* Little f */
 COMPATIBLE_IOCTL(FIOCLEX)
 COMPATIBLE_IOCTL(FIONCLEX)
@@ -65,6 +67,7 @@
 COMPATIBLE_IOCTL(HDIO_DRIVE_CMD)
 COMPATIBLE_IOCTL(HDIO_SET_PIO_MODE)
 COMPATIBLE_IOCTL(HDIO_SET_NICE)
+#ifndef CONFIG_ARCH_S390
 /* 0x02 -- Floppy ioctls */
 COMPATIBLE_IOCTL(FDMSGON)
 COMPATIBLE_IOCTL(FDMSGOFF)
@@ -82,6 +85,7 @@
 COMPATIBLE_IOCTL(FDTWADDLE)
 COMPATIBLE_IOCTL(FDFMTTRK)
 COMPATIBLE_IOCTL(FDRAWCMD)
+#endif
 /* 0x12 */
 COMPATIBLE_IOCTL(BLKROSET)
 COMPATIBLE_IOCTL(BLKROGET)
@@ -186,6 +190,7 @@
 COMPATIBLE_IOCTL(VT_RESIZEX)
 COMPATIBLE_IOCTL(VT_LOCKSWITCH)
 COMPATIBLE_IOCTL(VT_UNLOCKSWITCH)
+#if defined(CONFIG_VIDEO_DEV) || defined(CONFIG_VIDEO_DEV_MODULE)
 /* Little v */
 /* Little v, the video4linux ioctls (conflict?) */
 COMPATIBLE_IOCTL(VIDIOCGCAP)
@@ -212,6 +217,8 @@
 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+5, int))
 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+6, int))
 COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+7, int))
+#endif
+#if defined(CONFIG_RTC) || defined (CONFIG_RTC_MODULE)
 /* Little p (/dev/rtc, /dev/envctrl, etc.) */
 COMPATIBLE_IOCTL(RTC_AIE_ON)
 COMPATIBLE_IOCTL(RTC_AIE_OFF)
@@ -227,6 +234,7 @@
 COMPATIBLE_IOCTL(RTC_SET_TIME)
 COMPATIBLE_IOCTL(RTC_WKALM_SET)
 COMPATIBLE_IOCTL(RTC_WKALM_RD)
+#endif
 /* Little m */
 COMPATIBLE_IOCTL(MTIOCTOP)
 /* Socket level stuff */
@@ -278,6 +286,7 @@
 COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
 COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
 COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
+#if defined(CONFIG_PPP) || defined(CONFIG_PPP_MODULE)
 /* PPP stuff */
 COMPATIBLE_IOCTL(PPPIOCGFLAGS)
 COMPATIBLE_IOCTL(PPPIOCSFLAGS)
@@ -311,6 +320,7 @@
 /* PPPOX */
 COMPATIBLE_IOCTL(PPPOEIOCSFWD)
 COMPATIBLE_IOCTL(PPPOEIOCDFWD)
+#endif
 /* LP */
 COMPATIBLE_IOCTL(LPGETSTATUS)
 /* CDROM stuff */
@@ -353,6 +363,7 @@
 COMPATIBLE_IOCTL(LOOP_CLR_FD)
 /* Big A */
 /* sparc only */
+#if defined(CONFIG_SOUND) || defined (CONFIG_SOUND_MODULE)
 /* Big Q for sound/OSS */
 COMPATIBLE_IOCTL(SNDCTL_SEQ_RESET)
 COMPATIBLE_IOCTL(SNDCTL_SEQ_SYNC)
@@ -507,6 +518,7 @@
 COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
 COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
 COMPATIBLE_IOCTL(OSS_GETVERSION)
+#endif
 /* AUTOFS */
 COMPATIBLE_IOCTL(AUTOFS_IOC_READY)
 COMPATIBLE_IOCTL(AUTOFS_IOC_FAIL)
@@ -523,6 +535,7 @@
 COMPATIBLE_IOCTL(RAW_GETBIND)
 /* SMB ioctls which do not need any translations */
 COMPATIBLE_IOCTL(SMB_IOC_NEWCONN)
+#if defined(CONFIG_ATM) || defined(CONFIG_ATM_MODULE)
 /* Little a */
 COMPATIBLE_IOCTL(ATMSIGD_CTRL)
 COMPATIBLE_IOCTL(ATMARPD_CTRL)
@@ -539,28 +552,7 @@
 COMPATIBLE_IOCTL(ATMTCP_REMOVE)
 COMPATIBLE_IOCTL(ATMMPC_CTRL)
 COMPATIBLE_IOCTL(ATMMPC_DATA)
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-/* 0xfe - lvm */
-COMPATIBLE_IOCTL(VG_SET_EXTENDABLE)
-COMPATIBLE_IOCTL(VG_STATUS_GET_COUNT)
-COMPATIBLE_IOCTL(VG_STATUS_GET_NAMELIST)
-COMPATIBLE_IOCTL(VG_REMOVE)
-COMPATIBLE_IOCTL(VG_RENAME)
-COMPATIBLE_IOCTL(VG_REDUCE)
-COMPATIBLE_IOCTL(PE_LOCK_UNLOCK)
-COMPATIBLE_IOCTL(PV_FLUSH)
-COMPATIBLE_IOCTL(LVM_LOCK_LVM)
-COMPATIBLE_IOCTL(LVM_GET_IOP_VERSION)
-#ifdef LVM_TOTAL_RESET
-COMPATIBLE_IOCTL(LVM_RESET)
-#endif
-COMPATIBLE_IOCTL(LV_SET_ACCESS)
-COMPATIBLE_IOCTL(LV_SET_STATUS)
-COMPATIBLE_IOCTL(LV_SET_ALLOCATION)
-COMPATIBLE_IOCTL(LE_REMAP)
-COMPATIBLE_IOCTL(LV_BMAP)
-COMPATIBLE_IOCTL(LV_SNAPSHOT_USE_RATE)
-#endif /* LVM */
+#endif
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 COMPATIBLE_IOCTL(DRM_IOCTL_GET_MAGIC)
 COMPATIBLE_IOCTL(DRM_IOCTL_IRQ_BUSID)
@@ -596,6 +588,7 @@
 COMPATIBLE_IOCTL(RNDADDENTROPY)
 COMPATIBLE_IOCTL(RNDZAPENTCNT)
 COMPATIBLE_IOCTL(RNDCLEARPOOL)
+#if defined(CONFIG_BT) || defined(CONFIG_BT_MODULE)
 /* Bluetooth ioctls */
 COMPATIBLE_IOCTL(HCIDEVUP)
 COMPATIBLE_IOCTL(HCIDEVDOWN)
@@ -615,6 +608,8 @@
 COMPATIBLE_IOCTL(HCISETACLMTU)
 COMPATIBLE_IOCTL(HCISETSCOMTU)
 COMPATIBLE_IOCTL(HCIINQUIRY)
+#endif
+#ifdef CONFIG_PCI
 /* Misc. */
 COMPATIBLE_IOCTL(0x41545900)		/* ATYIO_CLKR */
 COMPATIBLE_IOCTL(0x41545901)		/* ATYIO_CLKW */
@@ -622,6 +617,8 @@
 COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_IO)
 COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_MEM)
 COMPATIBLE_IOCTL(PCIIOC_WRITE_COMBINE)
+#endif
+#if defined(CONFIG_USB) || defined(CONFIG_USB_MODULE)
 /* USB */
 COMPATIBLE_IOCTL(USBDEVFS_RESETEP)
 COMPATIBLE_IOCTL(USBDEVFS_SETINTERFACE)
@@ -634,6 +631,8 @@
 COMPATIBLE_IOCTL(USBDEVFS_HUB_PORTINFO)
 COMPATIBLE_IOCTL(USBDEVFS_RESET)
 COMPATIBLE_IOCTL(USBDEVFS_CLEAR_HALT)
+#endif
+#if defined(CONFIG_MTD) || defined(CONFIG_MTD_MODULE)
 /* MTD */
 COMPATIBLE_IOCTL(MEMGETINFO)
 COMPATIBLE_IOCTL(MEMERASE)
@@ -641,6 +640,7 @@
 COMPATIBLE_IOCTL(MEMUNLOCK)
 COMPATIBLE_IOCTL(MEMGETREGIONCOUNT)
 COMPATIBLE_IOCTL(MEMGETREGIONINFO)
+#endif
 /* NBD */
 COMPATIBLE_IOCTL(NBD_SET_SOCK)
 COMPATIBLE_IOCTL(NBD_SET_BLKSIZE)
diff -urN linux-2.5.69-bk19/include/linux/console.h linux-2.5.70/include/linux/console.h
--- linux-2.5.69-bk19/include/linux/console.h	2003-05-04 16:53:13.000000000 -0700
+++ linux-2.5.70/include/linux/console.h	2003-05-26 19:02:22.000000000 -0700
@@ -96,7 +96,7 @@
 {
 	char	name[8];
 	void	(*write)(struct console *, const char *, unsigned);
-	int	(*read)(struct console *, const char *, unsigned);
+	int	(*read)(struct console *, char *, unsigned);
 	struct tty_driver *(*device)(struct console *, int *);
 	void	(*unblank)(void);
 	int	(*setup)(struct console *, char *);
diff -urN linux-2.5.69-bk19/include/linux/ide.h linux-2.5.70/include/linux/ide.h
--- linux-2.5.69-bk19/include/linux/ide.h	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/include/linux/ide.h	2003-05-26 19:02:22.000000000 -0700
@@ -1299,12 +1299,6 @@
 extern int ide_wait_stat(ide_startstop_t *, ide_drive_t *, u8, u8, unsigned long);
 
 /*
- * This routine is called from the partition-table code in genhd.c
- * to "convert" a drive to a logical geometry with fewer than 1024 cyls.
- */
-extern int ide_xlate_1024(struct block_device *, int, int, const char *);
-
-/*
  * Return the current idea about the total capacity of this drive.
  */
 extern unsigned long current_capacity (ide_drive_t *drive);
diff -urN linux-2.5.69-bk19/include/linux/mod_devicetable.h linux-2.5.70/include/linux/mod_devicetable.h
--- linux-2.5.69-bk19/include/linux/mod_devicetable.h	2003-05-04 16:53:55.000000000 -0700
+++ linux-2.5.70/include/linux/mod_devicetable.h	2003-05-26 19:02:22.000000000 -0700
@@ -130,4 +130,22 @@
 #define USB_DEVICE_ID_MATCH_INT_SUBCLASS	0x0100
 #define USB_DEVICE_ID_MATCH_INT_PROTOCOL	0x0200
 
+/* s390 CCW devices */
+struct ccw_device_id {
+	__u16	match_flags;	/* which fields to match against */
+
+	__u16	cu_type;	/* control unit type     */
+	__u16	dev_type;	/* device type           */
+	__u8	cu_model;	/* control unit model    */
+	__u8	dev_model;	/* device model          */
+
+	kernel_ulong_t driver_info;
+};
+
+#define CCW_DEVICE_ID_MATCH_CU_TYPE		0x01
+#define CCW_DEVICE_ID_MATCH_CU_MODEL		0x02
+#define CCW_DEVICE_ID_MATCH_DEVICE_TYPE		0x04
+#define CCW_DEVICE_ID_MATCH_DEVICE_MODEL	0x08
+
+
 #endif /* LINUX_MOD_DEVICETABLE_H */
diff -urN linux-2.5.69-bk19/include/linux/mtd/mtd.h linux-2.5.70/include/linux/mtd/mtd.h
--- linux-2.5.69-bk19/include/linux/mtd/mtd.h	2003-05-04 16:52:49.000000000 -0700
+++ linux-2.5.70/include/linux/mtd/mtd.h	2003-05-26 19:02:22.000000000 -0700
@@ -260,10 +260,11 @@
 #define MTD_DEBUG_LEVEL3	(3)	/* Noisy   */
 
 #ifdef CONFIG_MTD_DEBUG
-#define DEBUG(n, args...)			\
-	if (n <=  CONFIG_MTD_DEBUG_VERBOSE) {	\
-		printk(KERN_INFO args);	\
-	}
+#define DEBUG(n, args...)				\
+ 	do {						\
+		if (n <= CONFIG_MTD_DEBUG_VERBOSE)	\
+			printk(KERN_INFO args);		\
+	} while(0)
 #else /* CONFIG_MTD_DEBUG */
 #define DEBUG(n, args...)
 #endif /* CONFIG_MTD_DEBUG */
diff -urN linux-2.5.69-bk19/include/linux/tty.h linux-2.5.70/include/linux/tty.h
--- linux-2.5.69-bk19/include/linux/tty.h	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/include/linux/tty.h	2003-05-26 19:02:22.000000000 -0700
@@ -253,9 +253,6 @@
  * treatment, but (1) the default 80x24 is usually right and (2) it's
  * most often used by a windowing system, which will set the correct
  * size each time the window is created or resized anyway.
- * IMPORTANT: since this structure is dynamically allocated, it must
- * be no larger than 4096 bytes.  Changing TTY_FLIPBUF_SIZE will change
- * the size of this structure, and it needs to be done with care.
  * 						- TYT, 9/14/92
  */
 struct tty_struct {
diff -urN linux-2.5.69-bk19/include/sound/trident.h linux-2.5.70/include/sound/trident.h
--- linux-2.5.69-bk19/include/sound/trident.h	2003-05-04 16:53:32.000000000 -0700
+++ linux-2.5.70/include/sound/trident.h	2003-05-26 19:02:22.000000000 -0700
@@ -57,14 +57,8 @@
 /* Trident chipsets have 1GB memory limit */
 #ifdef __alpha__
 #define TRIDENT_DMA_TYPE        SNDRV_DMA_TYPE_PCI_16MB
-#define TRIDENT_GFP_FLAGS	GFP_DMA
 #else
 #define TRIDENT_DMA_TYPE        SNDRV_DMA_TYPE_PCI
-#if defined(__i386__) && !defined(CONFIG_1GB)
-#define TRIDENT_GFP_FLAGS	GFP_DMA
-#else
-#define TRIDENT_GFP_FLAGS	0
-#endif
 #endif
 
 #define SNDRV_SEQ_DEV_ID_TRIDENT			"trident-synth"
diff -urN linux-2.5.69-bk19/kernel/sched.c linux-2.5.70/kernel/sched.c
--- linux-2.5.69-bk19/kernel/sched.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/kernel/sched.c	2003-05-26 19:02:22.000000000 -0700
@@ -500,9 +500,12 @@
 					resched_task(rq->curr);
 			}
 			success = 1;
-		} else
-			if (unlikely(kick) && task_running(rq, p))
-				resched_task(rq->curr);
+		}
+#if CONFIG_SMP
+	       	else
+			if (unlikely(kick) && task_running(rq, p) && (p->thread_info->cpu != smp_processor_id()))
+				smp_send_reschedule(p->thread_info->cpu);
+#endif
 		p->state = TASK_RUNNING;
 	}
 	task_rq_unlock(rq, &flags);
diff -urN linux-2.5.69-bk19/kernel/suspend.c linux-2.5.70/kernel/suspend.c
--- linux-2.5.69-bk19/kernel/suspend.c	2003-05-04 16:53:08.000000000 -0700
+++ linux-2.5.70/kernel/suspend.c	2003-05-26 19:02:22.000000000 -0700
@@ -201,7 +201,8 @@
 /* 0 = success, else # of processes that we failed to stop */
 int freeze_processes(void)
 {
-	int todo, start_time;
+       int todo;
+       unsigned long start_time;
 	struct task_struct *g, *p;
 	
 	printk( "Stopping tasks: " );
diff -urN linux-2.5.69-bk19/net/irda/irlmp_event.c linux-2.5.70/net/irda/irlmp_event.c
--- linux-2.5.69-bk19/net/irda/irlmp_event.c	2003-05-26 19:02:17.000000000 -0700
+++ linux-2.5.70/net/irda/irlmp_event.c	2003-05-26 19:02:22.000000000 -0700
@@ -714,7 +714,7 @@
 		break;
 	case LM_CONNECT_RESPONSE:
 		IRDA_DEBUG(0, "%s(), LM_CONNECT_RESPONSE, "
-			   "error, LSAP allready connected\n", __FUNCTION__);
+			   "error, LSAP already connected\n", __FUNCTION__);
 		/* Keep state */
 		break;
 	case LM_DISCONNECT_REQUEST:
diff -urN linux-2.5.69-bk19/scripts/file2alias.c linux-2.5.70/scripts/file2alias.c
--- linux-2.5.69-bk19/scripts/file2alias.c	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/scripts/file2alias.c	2003-05-26 19:02:22.000000000 -0700
@@ -147,6 +147,28 @@
 	return 1;
 }
 
+/* looks like: "ccw:tNmNdtNdmN" */ 
+static int do_ccw_entry(const char *filename,
+			struct ccw_device_id *id, char *alias)
+{
+	id->match_flags = TO_NATIVE(id->match_flags);
+	id->cu_type = TO_NATIVE(id->cu_type);
+	id->cu_model = TO_NATIVE(id->cu_model);
+	id->dev_type = TO_NATIVE(id->dev_type);
+	id->dev_model = TO_NATIVE(id->dev_model);
+
+	strcpy(alias, "ccw:");
+	ADD(alias, "t", id->match_flags&CCW_DEVICE_ID_MATCH_CU_TYPE,
+	    id->cu_type);
+	ADD(alias, "m", id->match_flags&CCW_DEVICE_ID_MATCH_CU_MODEL,
+	    id->cu_model);
+	ADD(alias, "dt", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
+	    id->dev_type);
+	ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_TYPE,
+	    id->dev_model);
+	return 1;
+}
+
 /* Ignore any prefix, eg. v850 prepends _ */
 static inline int sym_is(const char *symbol, const char *name)
 {
@@ -210,6 +232,9 @@
 	else if (sym_is(symname, "__mod_ieee1394_device_table"))
 		do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
 			 do_ieee1394_entry, mod);
+	else if (sym_is(symname, "__mod_ccw_device_table"))
+		do_table(symval, sym->st_size, sizeof(struct ccw_device_id),
+			 do_ccw_entry, mod);
 }
 
 /* Now add out buffered information to the generated C source */
diff -urN linux-2.5.69-bk19/scripts/fixdep.c linux-2.5.70/scripts/fixdep.c
--- linux-2.5.69-bk19/scripts/fixdep.c	2003-05-04 16:53:14.000000000 -0700
+++ linux-2.5.70/scripts/fixdep.c	2003-05-26 19:02:22.000000000 -0700
@@ -21,7 +21,7 @@
  *
  * If the user re-runs make *config, linux/autoconf.h will be
  * regenerated.  make notices that and will rebuild every file which
- * includes autconf.h, i.e. basically all files. This is extremely
+ * includes autoconf.h, i.e. basically all files. This is extremely
  * annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
  * 
  * So we play the same trick that "mkdep" played before. We replace
@@ -72,7 +72,7 @@
  *   cmd_<target> = <cmdline>
  *
  * and then basically copies the .<target>.d file to stdout, in the
- * process filtering out the dependency on linux/autconf.h and adding
+ * process filtering out the dependency on linux/autoconf.h and adding
  * dependencies on include/config/my/option.h for every
  * CONFIG_MY_OPTION encountered in any of the prequisites.
  *
diff -urN linux-2.5.69-bk19/sound/oss/Kconfig linux-2.5.70/sound/oss/Kconfig
--- linux-2.5.69-bk19/sound/oss/Kconfig	2003-05-04 16:53:37.000000000 -0700
+++ linux-2.5.70/sound/oss/Kconfig	2003-05-26 19:02:22.000000000 -0700
@@ -37,20 +37,36 @@
 config SOUND_CMPCI_FM
 	bool "Enable legacy FM"
 	depends on SOUND_CMPCI
+	help
+	  Say Y here to enable the legacy FM (frequency-modulation) synthesis
+	  support on a card using the CMI8338 or CMI8378 chipset.
+	  Say N here if you don't need this.
 
 config SOUND_CMPCI_FMIO
 	hex "FM I/O 388, 3C8, 3E0, 3E8"
 	depends on SOUND_CMPCI_FM
 	default "388"
+	help
+	  Set the base I/O address for FM synthesis control on a card using
+	  the CMI8338 or CMI8378 chipset.
+	  The default is 388; other choices are 3c8, 3e0, or 3e8.
 
 config SOUND_CMPCI_MIDI
 	bool "Enable legacy MPU-401"
 	depends on SOUND_CMPCI
+	help
+	  Say Y here to enable the legacy MP401 MIDI synthesis support on a
+	  card using the CMI8338 or CMI8378 chipset.
+	  Say N here if you don't need this.
 
 config SOUND_CMPCI_MPUIO
 	hex "MPU-401 I/O 330, 320, 310, 300"
 	depends on SOUND_CMPCI_MIDI
 	default "330"
+	help
+	  Set the base I/O address for MP401 MIDI synthesis control on a card
+	  using the CMI8338 or CMI8378 chipset.
+	  The default is 330; other choices are 320, 310, or 300.
 
 config SOUND_CMPCI_JOYSTICK
 	bool "Enable joystick"
@@ -75,6 +91,10 @@
 config SOUND_CMPCI_SPDIFINVERSE
 	bool "Inverse S/PDIF in for CMI8738"
 	depends on SOUND_CMPCI_CM8738
+	help
+	  Say Y here to have the driver invert the signal presented on SPDIF IN
+	  of a card using the CMI8338 or CMI8378 chipset.
+	  Say N here if you don't need this.
 
 config SOUND_CMPCI_SPDIFLOOP
 	bool "Enable S/PDIF loop for CMI8738"
@@ -101,10 +121,16 @@
 config SOUND_CMPCI_LINE_REAR
 	bool "Use Line-in as Read-out"
 	depends on SOUND_CMPCI_CM8738 && SOUND_CMPCI_SPEAKERS!=2
+	help
+	  Say Y here to enable using line-in jack as an output jack for a rear
+	  speaker.  Say N here if you don't need this.
 
 config SOUND_CMPCI_LINE_BASS
 	bool "Use Line-in as Bass"
 	depends on SOUND_CMPCI_CM8738 && SOUND_CMPCI_SPEAKERS!=2
+	help
+	  Say Y here to enable using line-in jack as an output jack for a bass
+	  speaker.  Say N here if you don't need this.
 
 config SOUND_EMU10K1
 	tristate "Creative SBLive! (EMU10K1)"
@@ -237,6 +263,10 @@
 config SOUND_VRC5477
 	tristate "NEC Vrc5477 AC97 sound"
 	depends on SOUND_PRIME!=n && DDB5477 && SOUND
+	help
+	  Say Y here to enable sound support for the NEC Vrc5477 chip, an
+	  integrated, multi-function controller chip for MIPS CPUs.  Works
+	  with the AC97 codec.
 
 config SOUND_TRIDENT
 	tristate "Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core"
@@ -1015,6 +1045,10 @@
 	int "SC-6600 CDROM Interface (4=None, 3=IDE, 1=Panasonic, 0=?Sony?)"
 	depends on SC6600
 	default "4"
+	help
+	  This is used to activate the CD-ROM interface of the Audio Excel
+	  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
+	  CD-ROM present.
 
 config SC6600_CDROMBASE
 	hex "SC-6600 CDROM Interface I/O Address"
