diff --git a/Makefile b/Makefile
index ea83721623e83dd2661b9ea955c2510c48476b0d..4682dfdbb96ca6ff9138c2631d7376788715c033 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 0
-EXTRAVERSION = -test4
+EXTRAVERSION = -test5
 
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
diff --git a/drivers/block/noop-iosched.c b/drivers/block/noop-iosched.c
index 7511b955de70bb1e87a2dc78abb4de3afe6ef9da..ffef40be1f927afee43ffae4ad1285212d141652 100644
--- a/drivers/block/noop-iosched.c
+++ b/drivers/block/noop-iosched.c
@@ -24,8 +24,10 @@ int elevator_noop_merge(request_queue_t *q, struct request **req,
 	struct request *__rq;
 	int ret;
 
-	if ((ret = elv_try_last_merge(q, bio)))
+	if ((ret = elv_try_last_merge(q, bio))) {
+		*req = q->last_merge;
 		return ret;
+	}
 
 	while ((entry = entry->prev) != &q->queue_head) {
 		__rq = list_entry_rq(entry);
diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c
index e11984b2bb038055849c0c071566b4e25bcc6c78..b8dfd136058eea9fada8086cc696941a3661d6da 100644
--- a/drivers/net/wan/sdla.c
+++ b/drivers/net/wan/sdla.c
@@ -1719,9 +1719,9 @@ static void __exit exit_sdla(void)
 	
 	unregister_frad(devname);
 }
-#endif
 
 MODULE_LICENSE("GPL");
 
 module_init(init_sdla);
 module_exit(exit_sdla);
+#endif
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
index d7765bf8f224453565d5aae00ce486d005661366..8ded3cf74f28bc554524786040aa7075abd5ea46 100644
--- a/drivers/serial/sa1100.c
+++ b/drivers/serial/sa1100.c
@@ -398,7 +398,7 @@ static int sa1100_startup(struct uart_port *port)
 	 * Allocate the IRQ
 	 */
 	retval = request_irq(sport->port.irq, sa1100_int, 0,
-			     "serial_sa1100", sport);
+			     "sa11x0-uart", sport);
 	if (retval)
 		return retval;
 
@@ -568,7 +568,7 @@ static int sa1100_request_port(struct uart_port *port)
 	struct sa1100_port *sport = (struct sa1100_port *)port;
 
 	return request_mem_region(sport->port.mapbase, UART_PORT_SIZE,
-			"serial_sa1100") != NULL ? 0 : -EBUSY;
+			"sa11x0-uart") != NULL ? 0 : -EBUSY;
 }
 
 /*
@@ -858,71 +858,91 @@ static struct uart_driver sa1100_reg = {
 	.cons			= SA1100_CONSOLE,
 };
 
-static int sa1100_serial_suspend(struct device *dev, u32 state, u32 level)
+static int sa1100_serial_suspend(struct device *_dev, u32 state, u32 level)
 {
-	int i;
+	struct sa1100_port *sport = dev_get_drvdata(_dev);
+
+	if (sport)
+		uart_suspend_port(&sa1100_reg, &sport->port, level);
+
+	return 0;
+}
+
+static int sa1100_serial_resume(struct device *_dev, u32 level)
+{
+	struct sa1100_port *sport = dev_get_drvdata(_dev);
 
-	for (i = 0; i < NR_PORTS; i++)
-		uart_suspend_port(&sa1100_reg, &sa1100_ports[i].port, level);
+	if (sport)
+		uart_resume_port(&sa1100_reg, &sport->port, level);
 
 	return 0;
 }
 
-static int sa1100_serial_resume(struct device *dev, u32 level)
+static int sa1100_serial_probe(struct device *_dev)
 {
+	struct platform_device *dev = to_platform_device(_dev);
+	struct resource *res = dev->resource;
 	int i;
 
-	for (i = 0; i < NR_PORTS; i++)
-		uart_resume_port(&sa1100_reg, &sa1100_ports[i].port, level);
+	for (i = 0; i < dev->num_resources; i++, res++)
+		if (res->flags & IORESOURCE_MEM)
+			break;
+
+	if (i < dev->num_resources) {
+		for (i = 0; i < NR_PORTS; i++) {
+			if (sa1100_ports[i].port.mapbase != res->start)
+				continue;
+
+			uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
+			dev_set_drvdata(_dev, &sa1100_ports[i]);
+			break;
+		}
+	}
+
+	return 0;
+}
+
+static int sa1100_serial_remove(struct device *_dev)
+{
+	struct sa1100_port *sport = dev_get_drvdata(_dev);
+
+	dev_set_drvdata(_dev, NULL);
+
+	if (sport)
+		uart_remove_one_port(&sa1100_reg, &sport->port);
 
 	return 0;
 }
 
 static struct device_driver sa11x0_serial_driver = {
-	.name		= "sa11x0_serial",
-	.bus		= &system_bus_type,
+	.name		= "sa11x0-uart",
+	.bus		= &platform_bus_type,
+	.probe		= sa1100_serial_probe,
+	.remove		= sa1100_serial_remove,
 	.suspend	= sa1100_serial_suspend,
 	.resume		= sa1100_serial_resume,
 };
 
-/*
- * This "device" covers _all_ ISA 8250-compatible serial devices.
- */
-static struct sys_device sa11x0_serial_devs = {
-	.name		= "sa11x0_serial",
-	.id		= 0,
-	.dev = {
-		.driver	= &sa11x0_serial_driver,
-	},
-};
-
 static int __init sa1100_serial_init(void)
 {
 	int ret;
 
 	printk(KERN_INFO "Serial: SA11x0 driver $Revision: 1.50 $\n");
 
-	driver_register(&sa11x0_serial_driver);
-	sys_device_register(&sa11x0_serial_devs);
-
 	sa1100_init_ports();
+
 	ret = uart_register_driver(&sa1100_reg);
 	if (ret == 0) {
-		int i;
-
-		for (i = 0; i < NR_PORTS; i++)
-			uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
+		ret = driver_register(&sa11x0_serial_driver);
+		if (ret)
+			uart_unregister_driver(&sa1100_reg);
 	}
 	return ret;
 }
 
 static void __exit sa1100_serial_exit(void)
 {
-	int i;
-
-	for (i = 0; i < NR_PORTS; i++)
-		uart_remove_one_port(&sa1100_reg, &sa1100_ports[i].port);
-
+	driver_unregister(&sa11x0_serial_driver);
 	uart_unregister_driver(&sa1100_reg);
 }
 
diff --git a/include/asm-i386/ioctl.h b/include/asm-i386/ioctl.h
index c75f20ade6b9311292efbf94a07860448f39402a..2e98645a3788acf0356ac39513b442de9b28db19 100644
--- a/include/asm-i386/ioctl.h
+++ b/include/asm-i386/ioctl.h
@@ -52,11 +52,21 @@
 	 ((nr)   << _IOC_NRSHIFT) | \
 	 ((size) << _IOC_SIZESHIFT))
 
+/* provoke compile error for invalid uses of size argument */
+extern int __invalid_size_argument_for_IOC;
+#define _IOC_TYPECHECK(t) \
+	((sizeof(t) == sizeof(t[1]) && \
+	  sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
+	  sizeof(t) : __invalid_size_argument_for_IOC)
+
 /* used to create numbers */
 #define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
-#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
-#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
-#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
+#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
+#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
+#define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
 
 /* used to decode ioctl numbers.. */
 #define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
diff --git a/include/sound/hdsp.h b/include/sound/hdsp.h
index 5f64cc2cf4e4536e5f37378e9166ca90b3738f24..84d73d20cc83102a56817f99f223294e1a96f8e8 100644
--- a/include/sound/hdsp.h
+++ b/include/sound/hdsp.h
@@ -71,7 +71,8 @@ struct _snd_hdsp_firmware {
 	unsigned long firmware_data[24413];
 };
 
-#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, hdsp_firmware_t)
+/* This ioctl is marked bad because the type is bigger than the IOCTL description */
+#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW_BAD('H', 0x42, hdsp_firmware_t)
 
 typedef struct _snd_hdsp_version hdsp_version_t;
 
diff --git a/include/sound/sscape_ioctl.h b/include/sound/sscape_ioctl.h
index baaa75e258f90ce9a1cdfacb93a7d4658d7c5300..aadc930a6ba4767b5b48d82b26b50bd02c59174f 100644
--- a/include/sound/sscape_ioctl.h
+++ b/include/sound/sscape_ioctl.h
@@ -14,6 +14,8 @@ struct sscape_microcode
 };
 
 #define SND_SSCAPE_LOAD_BOOTB  _IOWR('P', 100, struct sscape_bootblock)
-#define SND_SSCAPE_LOAD_MCODE  _IOW('P', 101, struct sscape_microcode)
+
+/* This ioctl is marked bad because the type is bigger than the IOCTL description */
+#define SND_SSCAPE_LOAD_MCODE  _IOW_BAD('P', 101, struct sscape_microcode)
 
 #endif