[kernel] r11082 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series

Maximilian Attems maks at alioth.debian.org
Wed Apr 16 11:05:50 UTC 2008


Author: maks
Date: Wed Apr 16 11:05:49 2008
New Revision: 11082

Log:
update to 2.6.25-rc9-git3

oops fix series file still referencing old nuked git patch.


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc9-git3
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc9-git3
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc9-git3	Wed Apr 16 11:05:49 2008
@@ -0,0 +1,2242 @@
+diff --git a/Documentation/filesystems/seq_file.txt b/Documentation/filesystems/seq_file.txt
+index cc6cdb9..7fb8e6d 100644
+--- a/Documentation/filesystems/seq_file.txt
++++ b/Documentation/filesystems/seq_file.txt
+@@ -92,7 +92,7 @@ implementations; in most cases the start() function should check for a
+ "past end of file" condition and return NULL if need be.
+ 
+ For more complicated applications, the private field of the seq_file
+-structure can be used. There is also a special value whch can be returned
++structure can be used. There is also a special value which can be returned
+ by the start() function called SEQ_START_TOKEN; it can be used if you wish
+ to instruct your show() function (described below) to print a header at the
+ top of the output. SEQ_START_TOKEN should only be used if the offset is
+@@ -146,7 +146,7 @@ the four functions we have just defined:
+ This structure will be needed to tie our iterator to the /proc file in
+ a little bit.
+ 
+-It's worth noting that the interator value returned by start() and
++It's worth noting that the iterator value returned by start() and
+ manipulated by the other functions is considered to be completely opaque by
+ the seq_file code. It can thus be anything that is useful in stepping
+ through the data to be output. Counters can be useful, but it could also be
+@@ -262,7 +262,7 @@ routines useful:
+ 
+ These helpers will interpret pos as a position within the list and iterate
+ accordingly.  Your start() and next() functions need only invoke the
+-seq_list_* helpers with a pointer to the appropriate list_head structure.  
++seq_list_* helpers with a pointer to the appropriate list_head structure.
+ 
+ 
+ The extra-simple version
+diff --git a/Documentation/vm/hugetlbpage.txt b/Documentation/vm/hugetlbpage.txt
+index f962d01..3102b81 100644
+--- a/Documentation/vm/hugetlbpage.txt
++++ b/Documentation/vm/hugetlbpage.txt
+@@ -88,10 +88,9 @@ hugepages from the buddy allocator, if the normal pool is exhausted. As
+ these surplus hugepages go out of use, they are freed back to the buddy
+ allocator.
+ 
+-Caveat: Shrinking the pool via nr_hugepages while a surplus is in effect
+-will allow the number of surplus huge pages to exceed the overcommit
+-value, as the pool hugepages (which must have been in use for a surplus
+-hugepages to be allocated) will become surplus hugepages.  As long as
++Caveat: Shrinking the pool via nr_hugepages such that it becomes less
++than the number of hugepages in use will convert the balance to surplus
++huge pages even if it would exceed the overcommit value.  As long as
+ this condition holds, however, no more surplus huge pages will be
+ allowed on the system until one of the two sysctls are increased
+ sufficiently, or the surplus huge pages go out of use and are freed.
+diff --git a/arch/frv/kernel/traps.c b/arch/frv/kernel/traps.c
+index 2f7e668..7089c24 100644
+--- a/arch/frv/kernel/traps.c
++++ b/arch/frv/kernel/traps.c
+@@ -73,7 +73,7 @@ asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, un
+ 		      epcr0, esr0, esfr1);
+ 
+ 	info.si_errno	= 0;
+-	info.si_addr	= (void *) ((epcr0 & EPCR0_PC) ? (epcr0 & EPCR0_PC) : __frame->pc);
++	info.si_addr	= (void *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
+ 
+ 	switch (__frame->tbr & TBR_TT) {
+ 	case TBR_TT_ILLEGAL_INSTR:
+diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
+index e282c34..53d0a8e 100644
+--- a/arch/ia64/pci/pci.c
++++ b/arch/ia64/pci/pci.c
+@@ -362,7 +362,12 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus)
+ 	info.name = name;
+ 	acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window,
+ 			&info);
+-
++	/*
++	 * See arch/x86/pci/acpi.c.
++	 * The desired pci bus might already be scanned in a quirk. We
++	 * should handle the case here, but it appears that IA64 hasn't
++	 * such quirk. So we just ignore the case now.
++	 */
+ 	pbus = pci_scan_bus_parented(NULL, bus, &pci_root_ops, controller);
+ 	if (pbus)
+ 		pcibios_setup_root_windows(pbus, controller);
+diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
+index 58fccc9..06213d1 100644
+--- a/arch/parisc/kernel/signal.c
++++ b/arch/parisc/kernel/signal.c
+@@ -534,7 +534,8 @@ insert_restart_trampoline(struct pt_regs *regs)
+ 		 * Flushing one cacheline is cheap.
+ 		 * "sync" on bigger (> 4 way) boxes is not.
+ 		 */
+-		flush_icache_range(regs->gr[30], regs->gr[30] + 4);
++		flush_user_dcache_range(regs->gr[30], regs->gr[30] + 4);
++		flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
+ 
+ 		regs->gr[31] = regs->gr[30] + 8;
+ 		/* Preserve original r28. */
+diff --git a/arch/sh/boot/compressed/head_32.S b/arch/sh/boot/compressed/head_32.S
+index a8399b0..06ac31f 100644
+--- a/arch/sh/boot/compressed/head_32.S
++++ b/arch/sh/boot/compressed/head_32.S
+@@ -7,7 +7,6 @@
+ 
+ .text
+ 
+-#include <linux/linkage.h>
+ #include <asm/page.h>
+ 
+ 	.global	startup
+diff --git a/arch/sh/boot/compressed/head_64.S b/arch/sh/boot/compressed/head_64.S
+index 1d4ecbf..f72c198 100644
+--- a/arch/sh/boot/compressed/head_64.S
++++ b/arch/sh/boot/compressed/head_64.S
+@@ -13,7 +13,6 @@
+  * Modification for compressed loader:
+  *   Copyright (C) 2002 Stuart Menefy (stuart.menefy at st.com)
+  */
+-#include <linux/linkage.h>
+ #include <asm/cache.h>
+ #include <asm/cpu/mmu_context.h>
+ #include <asm/cpu/registers.h>
+diff --git a/arch/sh/kernel/process_64.c b/arch/sh/kernel/process_64.c
+index 046999b..0283d81 100644
+--- a/arch/sh/kernel/process_64.c
++++ b/arch/sh/kernel/process_64.c
+@@ -28,6 +28,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/mmu_context.h>
++#include <asm/fpu.h>
+ 
+ struct task_struct *last_task_used_math = NULL;
+ 
+diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c
+index f6fbdfa..d453c47 100644
+--- a/arch/sh/kernel/ptrace_64.c
++++ b/arch/sh/kernel/ptrace_64.c
+@@ -33,6 +33,7 @@
+ #include <asm/system.h>
+ #include <asm/processor.h>
+ #include <asm/mmu_context.h>
++#include <asm/fpu.h>
+ 
+ /* This mask defines the bits of the SR which the user is not allowed to
+    change, which are everything except S, Q, M, PR, SZ, FR. */
+diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c
+index d80de39..45bb333 100644
+--- a/arch/sh/kernel/sh_ksyms_32.c
++++ b/arch/sh/kernel/sh_ksyms_32.c
+@@ -149,3 +149,4 @@ EXPORT_SYMBOL(clear_page);
+ EXPORT_SYMBOL(copy_page);
+ EXPORT_SYMBOL(__clear_user);
+ EXPORT_SYMBOL(_ebss);
++EXPORT_SYMBOL(empty_zero_page);
+diff --git a/arch/sh/kernel/sh_ksyms_64.c b/arch/sh/kernel/sh_ksyms_64.c
+index dd38a68..b6410ce 100644
+--- a/arch/sh/kernel/sh_ksyms_64.c
++++ b/arch/sh/kernel/sh_ksyms_64.c
+@@ -44,6 +44,7 @@ EXPORT_SYMBOL(__put_user_asm_l);
+ EXPORT_SYMBOL(__get_user_asm_l);
+ EXPORT_SYMBOL(copy_page);
+ EXPORT_SYMBOL(__copy_user);
++EXPORT_SYMBOL(empty_zero_page);
+ EXPORT_SYMBOL(memcpy);
+ EXPORT_SYMBOL(__udelay);
+ EXPORT_SYMBOL(__ndelay);
+diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c
+index 80bde19..552eb81 100644
+--- a/arch/sh/kernel/signal_64.c
++++ b/arch/sh/kernel/signal_64.c
+@@ -26,6 +26,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/cacheflush.h>
++#include <asm/fpu.h>
+ 
+ #define REG_RET 9
+ #define REG_ARG1 2
+diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
+index baa4fa3..e08b3bf 100644
+--- a/arch/sh/kernel/traps_32.c
++++ b/arch/sh/kernel/traps_32.c
+@@ -25,6 +25,7 @@
+ #include <linux/limits.h>
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
++#include <asm/fpu.h>
+ 
+ #ifdef CONFIG_SH_KGDB
+ #include <asm/kgdb.h>
+diff --git a/arch/sh/kernel/traps_64.c b/arch/sh/kernel/traps_64.c
+index 1b58a74..a85831c 100644
+--- a/arch/sh/kernel/traps_64.c
++++ b/arch/sh/kernel/traps_64.c
+@@ -30,6 +30,7 @@
+ #include <asm/atomic.h>
+ #include <asm/processor.h>
+ #include <asm/pgtable.h>
++#include <asm/fpu.h>
+ 
+ #undef DEBUG_EXCEPTION
+ #ifdef DEBUG_EXCEPTION
+diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
+index 0234f28..378136f 100644
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -219,8 +219,21 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
+ 	if (pxm >= 0)
+ 		sd->node = pxm_to_node(pxm);
+ #endif
++	/*
++	 * Maybe the desired pci bus has been already scanned. In such case
++	 * it is unnecessary to scan the pci bus with the given domain,busnum.
++	 */
++	bus = pci_find_bus(domain, busnum);
++	if (bus) {
++		/*
++		 * If the desired bus exits, the content of bus->sysdata will
++		 * be replaced by sd.
++		 */
++		memcpy(bus->sysdata, sd, sizeof(*sd));
++		kfree(sd);
++	} else
++		bus = pci_scan_bus_parented(NULL, busnum, &pci_root_ops, sd);
+ 
+-	bus = pci_scan_bus_parented(NULL, busnum, &pci_root_ops, sd);
+ 	if (!bus)
+ 		kfree(sd);
+ 
+@@ -228,7 +241,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
+ 	if (bus != NULL) {
+ 		if (pxm >= 0) {
+ 			printk("bus %d -> pxm %d -> node %d\n",
+-				busnum, pxm, sd->node);
++				busnum, pxm, pxm_to_node(pxm));
+ 		}
+ 	}
+ #endif
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index 5b6760e..2d1955c 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -373,10 +373,11 @@ int acpi_bus_receive_event(struct acpi_bus_event *event)
+ 	}
+ 
+ 	spin_lock_irqsave(&acpi_bus_event_lock, flags);
+-	entry =
+-	    list_entry(acpi_bus_event_list.next, struct acpi_bus_event, node);
+-	if (entry)
++	if (!list_empty(&acpi_bus_event_list)) {
++		entry = list_entry(acpi_bus_event_list.next,
++				   struct acpi_bus_event, node);
+ 		list_del(&entry->node);
++	}
+ 	spin_unlock_irqrestore(&acpi_bus_event_lock, flags);
+ 
+ 	if (!entry)
+diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
+index ce830fe..511a830 100644
+--- a/drivers/ata/pata_ali.c
++++ b/drivers/ata/pata_ali.c
+@@ -36,7 +36,7 @@
+ #define DRV_NAME "pata_ali"
+ #define DRV_VERSION "0.7.5"
+ 
+-int ali_atapi_dma = 0;
++static int ali_atapi_dma = 0;
+ module_param_named(atapi_dma, ali_atapi_dma, int, 0644);
+ MODULE_PARM_DESC(atapi_dma, "Enable ATAPI DMA (0=disable, 1=enable)");
+ 
+diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
+index 840d1c4..019e367 100644
+--- a/drivers/ata/sata_svw.c
++++ b/drivers/ata/sata_svw.c
+@@ -531,8 +531,8 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en
+  * */
+ static const struct pci_device_id k2_sata_pci_tbl[] = {
+ 	{ PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 },
+-	{ PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw4 },
+-	{ PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw8 },
++	{ PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw8 },
++	{ PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw4 },
+ 	{ PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 },
+ 	{ PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 },
+ 	{ PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 },
+diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c
+index ced83c2..ef1a300 100644
+--- a/drivers/isdn/i4l/isdn_net.c
++++ b/drivers/isdn/i4l/isdn_net.c
+@@ -2010,6 +2010,7 @@ isdn_net_init(struct net_device *ndev)
+ 	ndev->flags = IFF_NOARP|IFF_POINTOPOINT;
+ 	ndev->type = ARPHRD_ETHER;
+ 	ndev->addr_len = ETH_ALEN;
++	ndev->validate_addr = NULL;
+ 
+ 	/* for clients with MPPP maybe higher values better */
+ 	ndev->tx_queue_len = 30;
+diff --git a/drivers/leds/leds-ams-delta.c b/drivers/leds/leds-ams-delta.c
+index 9e30774..c37bb0d 100644
+--- a/drivers/leds/leds-ams-delta.c
++++ b/drivers/leds/leds-ams-delta.c
+@@ -140,6 +140,7 @@ static struct platform_driver ams_delta_led_driver = {
+ 	.resume		= ams_delta_led_resume,
+ 	.driver		= {
+ 		.name = "ams-delta-led",
++		.owner = THIS_MODULE,
+ 	},
+ };
+ 
+@@ -159,3 +160,4 @@ module_exit(ams_delta_led_exit);
+ MODULE_AUTHOR("Jonathan McDowell <noodles at earth.li>");
+ MODULE_DESCRIPTION("Amstrad Delta LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:ams-delta-led");
+diff --git a/drivers/leds/leds-atmel-pwm.c b/drivers/leds/leds-atmel-pwm.c
+index af61f55..28db6c1 100644
+--- a/drivers/leds/leds-atmel-pwm.c
++++ b/drivers/leds/leds-atmel-pwm.c
+@@ -132,6 +132,9 @@ static int __exit pwmled_remove(struct platform_device *pdev)
+ 	return 0;
+ }
+ 
++/* work with hotplug and coldplug */
++MODULE_ALIAS("platform:leds-atmel-pwm");
++
+ static struct platform_driver pwmled_driver = {
+ 	.driver = {
+ 		.name =		"leds-atmel-pwm",
+diff --git a/drivers/leds/leds-clevo-mail.c b/drivers/leds/leds-clevo-mail.c
+index 6c3d33b..5750b08 100644
+--- a/drivers/leds/leds-clevo-mail.c
++++ b/drivers/leds/leds-clevo-mail.c
+@@ -170,6 +170,7 @@ static struct platform_driver clevo_mail_led_driver = {
+ 	.resume		= clevo_mail_led_resume,
+ 	.driver		= {
+ 		.name		= KBUILD_MODNAME,
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+diff --git a/drivers/leds/leds-cm-x270.c b/drivers/leds/leds-cm-x270.c
+index 9aebef0..accc7ed 100644
+--- a/drivers/leds/leds-cm-x270.c
++++ b/drivers/leds/leds-cm-x270.c
+@@ -101,6 +101,7 @@ static struct platform_driver cmx270led_driver = {
+ #endif
+ 	.driver		= {
+ 		.name		= "cm-x270-led",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -120,3 +121,4 @@ module_exit(cmx270led_exit);
+ MODULE_AUTHOR("Mike Rapoport <mike at compulab.co.il>");
+ MODULE_DESCRIPTION("CM-x270 LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:cm-x270-led");
+diff --git a/drivers/leds/leds-cobalt-qube.c b/drivers/leds/leds-cobalt-qube.c
+index d2b54b5..096881a 100644
+--- a/drivers/leds/leds-cobalt-qube.c
++++ b/drivers/leds/leds-cobalt-qube.c
+@@ -75,6 +75,9 @@ static int __devexit cobalt_qube_led_remove(struct platform_device *pdev)
+ 	return 0;
+ }
+ 
++/* work with hotplug and coldplug */
++MODULE_ALIAS("platform:cobalt-qube-leds");
++
+ static struct platform_driver cobalt_qube_led_driver = {
+ 	.probe	= cobalt_qube_led_probe,
+ 	.remove	= __devexit_p(cobalt_qube_led_remove),
+diff --git a/drivers/leds/leds-corgi.c b/drivers/leds/leds-corgi.c
+index e45f6c4..29e931f 100644
+--- a/drivers/leds/leds-corgi.c
++++ b/drivers/leds/leds-corgi.c
+@@ -99,6 +99,7 @@ static struct platform_driver corgiled_driver = {
+ #endif
+ 	.driver		= {
+ 		.name		= "corgi-led",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -118,3 +119,4 @@ module_exit(corgiled_exit);
+ MODULE_AUTHOR("Richard Purdie <rpurdie at openedhand.com>");
+ MODULE_DESCRIPTION("Corgi LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:corgi-led");
+diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
+index 4c0b058..1aae8b3 100644
+--- a/drivers/leds/leds-gpio.c
++++ b/drivers/leds/leds-gpio.c
+@@ -199,3 +199,4 @@ module_exit(gpio_led_exit);
+ MODULE_AUTHOR("Raphael Assenat <raph at 8d.com>");
+ MODULE_DESCRIPTION("GPIO LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:leds-gpio");
+diff --git a/drivers/leds/leds-h1940.c b/drivers/leds/leds-h1940.c
+index 677c993..6e51c9b 100644
+--- a/drivers/leds/leds-h1940.c
++++ b/drivers/leds/leds-h1940.c
+@@ -139,6 +139,7 @@ static int h1940leds_remove(struct platform_device *pdev)
+ static struct platform_driver h1940leds_driver = {
+ 	.driver		= {
+ 		.name	= "h1940-leds",
++		.owner	= THIS_MODULE,
+ 	},
+ 	.probe		= h1940leds_probe,
+ 	.remove		= h1940leds_remove,
+@@ -161,3 +162,4 @@ module_exit(h1940leds_exit);
+ MODULE_AUTHOR("Arnaud Patard <arnaud.patard at rtp-net.org>");
+ MODULE_DESCRIPTION("LED driver for the iPAQ H1940");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:h1940-leds");
+diff --git a/drivers/leds/leds-hp6xx.c b/drivers/leds/leds-hp6xx.c
+index 82d4ec3..870f5a3 100644
+--- a/drivers/leds/leds-hp6xx.c
++++ b/drivers/leds/leds-hp6xx.c
+@@ -90,6 +90,9 @@ static int hp6xxled_remove(struct platform_device *pdev)
+ 	return 0;
+ }
+ 
++/* work with hotplug and coldplug */
++MODULE_ALIAS("platform:hp6xx-led");
++
+ static struct platform_driver hp6xxled_driver = {
+ 	.probe		= hp6xxled_probe,
+ 	.remove		= hp6xxled_remove,
+@@ -99,6 +102,7 @@ static struct platform_driver hp6xxled_driver = {
+ #endif
+ 	.driver		= {
+ 		.name		= "hp6xx-led",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+diff --git a/drivers/leds/leds-s3c24xx.c b/drivers/leds/leds-s3c24xx.c
+index 0fd6407..0d10e11 100644
+--- a/drivers/leds/leds-s3c24xx.c
++++ b/drivers/leds/leds-s3c24xx.c
+@@ -160,3 +160,4 @@ module_exit(s3c24xx_led_exit);
+ MODULE_AUTHOR("Ben Dooks <ben at simtec.co.uk>");
+ MODULE_DESCRIPTION("S3C24XX LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:s3c24xx_led");
+diff --git a/drivers/leds/leds-spitz.c b/drivers/leds/leds-spitz.c
+index 93e1012..87007cc 100644
+--- a/drivers/leds/leds-spitz.c
++++ b/drivers/leds/leds-spitz.c
+@@ -105,6 +105,7 @@ static struct platform_driver spitzled_driver = {
+ #endif
+ 	.driver		= {
+ 		.name		= "spitz-led",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -124,3 +125,4 @@ module_exit(spitzled_exit);
+ MODULE_AUTHOR("Richard Purdie <rpurdie at openedhand.com>");
+ MODULE_DESCRIPTION("Spitz LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:spitz-led");
+diff --git a/drivers/leds/leds-tosa.c b/drivers/leds/leds-tosa.c
+index 9e0a188..7ebecc4 100644
+--- a/drivers/leds/leds-tosa.c
++++ b/drivers/leds/leds-tosa.c
+@@ -109,6 +109,7 @@ static struct platform_driver tosaled_driver = {
+ 	.resume		= tosaled_resume,
+ 	.driver		= {
+ 		.name		= "tosa-led",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -128,3 +129,4 @@ module_exit(tosaled_exit);
+ MODULE_AUTHOR("Dirk Opfer <Dirk at Opfer-Online.de>");
+ MODULE_DESCRIPTION("Tosa LED driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:tosa-led");
+diff --git a/drivers/misc/atmel-ssc.c b/drivers/misc/atmel-ssc.c
+index 058ccac..e171650 100644
+--- a/drivers/misc/atmel-ssc.c
++++ b/drivers/misc/atmel-ssc.c
+@@ -154,6 +154,7 @@ static struct platform_driver ssc_driver = {
+ 	.remove		= __devexit_p(ssc_remove),
+ 	.driver		= {
+ 		.name		= "ssc",
++		.owner		= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -172,3 +173,4 @@ module_exit(ssc_exit);
+ MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt at atmel.com>");
+ MODULE_DESCRIPTION("SSC driver for Atmel AVR32 and AT91");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:ssc");
+diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c
+index f8d3b9a..0d5ce03 100644
+--- a/drivers/misc/atmel_pwm.c
++++ b/drivers/misc/atmel_pwm.c
+@@ -407,3 +407,4 @@ module_exit(pwm_exit);
+ 
+ MODULE_DESCRIPTION("Driver for AT32/AT91 PWM module");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:atmel_pwm");
+diff --git a/drivers/misc/hdpuftrs/hdpu_cpustate.c b/drivers/misc/hdpuftrs/hdpu_cpustate.c
+index aa8ce7a..302e924 100644
+--- a/drivers/misc/hdpuftrs/hdpu_cpustate.c
++++ b/drivers/misc/hdpuftrs/hdpu_cpustate.c
+@@ -164,6 +164,7 @@ static struct platform_driver hdpu_cpustate_driver = {
+ 	.remove = hdpu_cpustate_remove,
+ 	.driver = {
+ 		.name = HDPU_CPUSTATE_NAME,
++		.owner = THIS_MODULE,
+ 	},
+ };
+ 
+@@ -248,3 +249,4 @@ module_exit(cpustate_exit);
+ 
+ MODULE_AUTHOR("Brian Waite");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:" HDPU_CPUSTATE_NAME);
+diff --git a/drivers/misc/hdpuftrs/hdpu_nexus.c b/drivers/misc/hdpuftrs/hdpu_nexus.c
+index 2887b21..2fa36f7 100644
+--- a/drivers/misc/hdpuftrs/hdpu_nexus.c
++++ b/drivers/misc/hdpuftrs/hdpu_nexus.c
+@@ -55,6 +55,7 @@ static struct platform_driver hdpu_nexus_driver = {
+ 	.remove = hdpu_nexus_remove,
+ 	.driver = {
+ 		.name = HDPU_NEXUS_NAME,
++		.owner = THIS_MODULE,
+ 	},
+ };
+ 
+@@ -151,3 +152,4 @@ module_exit(nexus_exit);
+ 
+ MODULE_AUTHOR("Brian Waite");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:" HDPU_NEXUS_NAME);
+diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c
+index 21acecc..a28fc2f 100644
+--- a/drivers/mmc/host/at91_mci.c
++++ b/drivers/mmc/host/at91_mci.c
+@@ -1075,3 +1075,4 @@ module_exit(at91_mci_exit);
+ MODULE_DESCRIPTION("AT91 Multimedia Card Interface driver");
+ MODULE_AUTHOR("Nick Randell");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:at91_mci");
+diff --git a/drivers/mmc/host/au1xmmc.c b/drivers/mmc/host/au1xmmc.c
+index c3926eb..cc5f7bc 100644
+--- a/drivers/mmc/host/au1xmmc.c
++++ b/drivers/mmc/host/au1xmmc.c
+@@ -998,6 +998,7 @@ static struct platform_driver au1xmmc_driver = {
+ 	.resume        = NULL,
+ 	.driver        = {
+ 		.name  = DRIVER_NAME,
++		.owner = THIS_MODULE,
+ 	},
+ };
+ 
+@@ -1018,5 +1019,6 @@ module_exit(au1xmmc_exit);
+ MODULE_AUTHOR("Advanced Micro Devices, Inc");
+ MODULE_DESCRIPTION("MMC/SD driver for the Alchemy Au1XXX");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:au1xxx-mmc");
+ #endif
+ 
+diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c
+index f2070a1..95f33e8 100644
+--- a/drivers/mmc/host/imxmmc.c
++++ b/drivers/mmc/host/imxmmc.c
+@@ -1128,6 +1128,7 @@ static struct platform_driver imxmci_driver = {
+ 	.resume		= imxmci_resume,
+ 	.driver		= {
+ 		.name		= DRIVER_NAME,
++		.owner		= THIS_MODULE,
+ 	}
+ };
+ 
+@@ -1147,3 +1148,4 @@ module_exit(imxmci_exit);
+ MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver");
+ MODULE_AUTHOR("Sascha Hauer, Pengutronix");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:imx-mmc");
+diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
+index c9dfeb1..90c358b 100644
+--- a/drivers/mmc/host/omap.c
++++ b/drivers/mmc/host/omap.c
+@@ -1255,6 +1255,7 @@ static struct platform_driver mmc_omap_driver = {
+ 	.resume		= mmc_omap_resume,
+ 	.driver		= {
+ 		.name	= DRIVER_NAME,
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -1273,5 +1274,5 @@ module_exit(mmc_omap_exit);
+ 
+ MODULE_DESCRIPTION("OMAP Multimedia Card driver");
+ MODULE_LICENSE("GPL");
+-MODULE_ALIAS(DRIVER_NAME);
++MODULE_ALIAS("platform:" DRIVER_NAME);
+ MODULE_AUTHOR("Juha Yrjölä");
+diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
+index 1ea8482..65210fc 100644
+--- a/drivers/mmc/host/pxamci.c
++++ b/drivers/mmc/host/pxamci.c
+@@ -693,6 +693,7 @@ static struct platform_driver pxamci_driver = {
+ 	.resume		= pxamci_resume,
+ 	.driver		= {
+ 		.name	= DRIVER_NAME,
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -711,3 +712,4 @@ module_exit(pxamci_exit);
+ 
+ MODULE_DESCRIPTION("PXA Multimedia Card Interface Driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pxa2xx-mci");
+diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c
+index 4d5f374..be624a0 100644
+--- a/drivers/mmc/host/wbsd.c
++++ b/drivers/mmc/host/wbsd.c
+@@ -1948,6 +1948,7 @@ static struct platform_driver wbsd_driver = {
+ 	.resume		= wbsd_platform_resume,
+ 	.driver		= {
+ 		.name	= DRIVER_NAME,
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h
+index 93b7fb2..a8d3280 100644
+--- a/drivers/net/ehea/ehea.h
++++ b/drivers/net/ehea/ehea.h
+@@ -40,7 +40,7 @@
+ #include <asm/io.h>
+ 
+ #define DRV_NAME	"ehea"
+-#define DRV_VERSION	"EHEA_0089"
++#define DRV_VERSION	"EHEA_0090"
+ 
+ /* eHEA capability flags */
+ #define DLPAR_PORT_ADD_REM 1
+@@ -371,6 +371,7 @@ struct ehea_port_res {
+ 	struct ehea_q_skb_arr rq2_skba;
+ 	struct ehea_q_skb_arr rq3_skba;
+ 	struct ehea_q_skb_arr sq_skba;
++	int sq_skba_size;
+ 	spinlock_t netif_queue;
+ 	int queue_stopped;
+ 	int swqe_refill_th;
+diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
+index 07c742d..f460b62 100644
+--- a/drivers/net/ehea/ehea_main.c
++++ b/drivers/net/ehea/ehea_main.c
+@@ -349,7 +349,8 @@ static void ehea_refill_rq1(struct ehea_port_res *pr, int index, int nr_of_wqes)
+ 	pr->rq1_skba.os_skbs = 0;
+ 
+ 	if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
+-		pr->rq1_skba.index = index;
++		if (nr_of_wqes > 0)
++			pr->rq1_skba.index = index;
+ 		pr->rq1_skba.os_skbs = fill_wqes;
+ 		return;
+ 	}
+@@ -1464,7 +1465,9 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr,
+ 			  init_attr->act_nr_rwqes_rq2,
+ 			  init_attr->act_nr_rwqes_rq3);
+ 
+-	ret = ehea_init_q_skba(&pr->sq_skba, init_attr->act_nr_send_wqes + 1);
++	pr->sq_skba_size = init_attr->act_nr_send_wqes + 1;
++
++	ret = ehea_init_q_skba(&pr->sq_skba, pr->sq_skba_size);
+ 	ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1);
+ 	ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1);
+ 	ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1);
+@@ -2621,6 +2624,22 @@ void ehea_purge_sq(struct ehea_qp *orig_qp)
+ 	}
+ }
+ 
++void ehea_flush_sq(struct ehea_port *port)
++{
++	int i;
++
++	for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) {
++		struct ehea_port_res *pr = &port->port_res[i];
++		int swqe_max = pr->sq_skba_size - 2 - pr->swqe_ll_count;
++		int k = 0;
++		while (atomic_read(&pr->swqe_avail) < swqe_max) {
++			msleep(5);
++			if (++k == 20)
++				break;
++		}
++	}
++}
++
+ int ehea_stop_qps(struct net_device *dev)
+ {
+ 	struct ehea_port *port = netdev_priv(dev);
+@@ -2845,6 +2864,7 @@ static void ehea_rereg_mrs(struct work_struct *work)
+ 					if (dev->flags & IFF_UP) {
+ 						down(&port->port_lock);
+ 						netif_stop_queue(dev);
++						ehea_flush_sq(port);
+ 						ret = ehea_stop_qps(dev);
+ 						if (ret) {
+ 							up(&port->port_lock);
+diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
+index 419f533..9f088a4 100644
+--- a/drivers/net/forcedeth.c
++++ b/drivers/net/forcedeth.c
+@@ -5316,8 +5316,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
+ 
+ 	/* check the workaround bit for correct mac address order */
+ 	txreg = readl(base + NvRegTransmitPoll);
+-	if ((txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) ||
+-	    (id->driver_data & DEV_HAS_CORRECT_MACADDR)) {
++	if (id->driver_data & DEV_HAS_CORRECT_MACADDR) {
+ 		/* mac address is already in correct order */
+ 		dev->dev_addr[0] = (np->orig_mac[0] >>  0) & 0xff;
+ 		dev->dev_addr[1] = (np->orig_mac[0] >>  8) & 0xff;
+@@ -5325,6 +5324,22 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
+ 		dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff;
+ 		dev->dev_addr[4] = (np->orig_mac[1] >>  0) & 0xff;
+ 		dev->dev_addr[5] = (np->orig_mac[1] >>  8) & 0xff;
++	} else if (txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) {
++		/* mac address is already in correct order */
++		dev->dev_addr[0] = (np->orig_mac[0] >>  0) & 0xff;
++		dev->dev_addr[1] = (np->orig_mac[0] >>  8) & 0xff;
++		dev->dev_addr[2] = (np->orig_mac[0] >> 16) & 0xff;
++		dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff;
++		dev->dev_addr[4] = (np->orig_mac[1] >>  0) & 0xff;
++		dev->dev_addr[5] = (np->orig_mac[1] >>  8) & 0xff;
++		/*
++		 * Set orig mac address back to the reversed version.
++		 * This flag will be cleared during low power transition.
++		 * Therefore, we should always put back the reversed address.
++		 */
++		np->orig_mac[0] = (dev->dev_addr[5] << 0) + (dev->dev_addr[4] << 8) +
++			(dev->dev_addr[3] << 16) + (dev->dev_addr[2] << 24);
++		np->orig_mac[1] = (dev->dev_addr[1] << 0) + (dev->dev_addr[0] << 8);
+ 	} else {
+ 		/* need to reverse mac address to correct order */
+ 		dev->dev_addr[0] = (np->orig_mac[1] >>  8) & 0xff;
+@@ -5595,7 +5610,9 @@ out:
+ static int nv_resume(struct pci_dev *pdev)
+ {
+ 	struct net_device *dev = pci_get_drvdata(pdev);
++	u8 __iomem *base = get_hwbase(dev);
+ 	int rc = 0;
++	u32 txreg;
+ 
+ 	if (!netif_running(dev))
+ 		goto out;
+@@ -5606,6 +5623,11 @@ static int nv_resume(struct pci_dev *pdev)
+ 	pci_restore_state(pdev);
+ 	pci_enable_wake(pdev, PCI_D0, 0);
+ 
++	/* restore mac address reverse flag */
++	txreg = readl(base + NvRegTransmitPoll);
++	txreg |= NVREG_TRANSMITPOLL_MAC_ADDR_REV;
++	writel(txreg, base + NvRegTransmitPoll);
++
+ 	rc = nv_open(dev);
+ out:
+ 	return rc;
+diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c
+index af869cf..940e204 100644
+--- a/drivers/net/fs_enet/fs_enet-main.c
++++ b/drivers/net/fs_enet/fs_enet-main.c
+@@ -835,7 +835,8 @@ static int fs_enet_close(struct net_device *dev)
+ 
+ 	netif_stop_queue(dev);
+ 	netif_carrier_off(dev);
+-	napi_disable(&fep->napi);
++	if (fep->fpi->use_napi)
++		napi_disable(&fep->napi);
+ 	phy_stop(fep->phydev);
+ 
+ 	spin_lock_irqsave(&fep->lock, flags);
+diff --git a/drivers/net/macb.c b/drivers/net/macb.c
+index 1d210ed..489c7c3 100644
+--- a/drivers/net/macb.c
++++ b/drivers/net/macb.c
+@@ -242,12 +242,12 @@ static int macb_mii_init(struct macb *bp)
+ 	/* Enable managment port */
+ 	macb_writel(bp, NCR, MACB_BIT(MPE));
+ 
+-	bp->mii_bus.name = "MACB_mii_bus",
+-	bp->mii_bus.read = &macb_mdio_read,
+-	bp->mii_bus.write = &macb_mdio_write,
+-	bp->mii_bus.reset = &macb_mdio_reset,
+-	bp->mii_bus.id = bp->pdev->id,
+-	bp->mii_bus.priv = bp,
++	bp->mii_bus.name = "MACB_mii_bus";
++	bp->mii_bus.read = &macb_mdio_read;
++	bp->mii_bus.write = &macb_mdio_write;
++	bp->mii_bus.reset = &macb_mdio_reset;
++	bp->mii_bus.id = bp->pdev->id;
++	bp->mii_bus.priv = bp;
+ 	bp->mii_bus.dev = &bp->dev->dev;
+ 	pdata = bp->pdev->dev.platform_data;
+ 
+@@ -1257,6 +1257,8 @@ static int __exit macb_remove(struct platform_device *pdev)
+ 
+ 	if (dev) {
+ 		bp = netdev_priv(dev);
++		if (bp->phy_dev)
++			phy_disconnect(bp->phy_dev);
+ 		mdiobus_unregister(&bp->mii_bus);
+ 		kfree(bp->mii_bus.irq);
+ 		unregister_netdev(dev);
+diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c
+index 37b4239..15fcee5 100644
+--- a/drivers/net/sc92031.c
++++ b/drivers/net/sc92031.c
+@@ -1446,6 +1446,7 @@ static int __devinit sc92031_probe(struct pci_dev *pdev,
+ 	}
+ 
+ 	pci_set_drvdata(pdev, dev);
++	SET_NETDEV_DEV(dev, &pdev->dev);
+ 
+ #if SC92031_USE_BAR == 0
+ 	dev->mem_start = pci_resource_start(pdev, SC92031_USE_BAR);
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index 853bce0..f226bca 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -154,6 +154,7 @@ static const char *yukon2_name[] = {
+ 	"EC",		/* 0xb6 */
+ 	"FE",		/* 0xb7 */
+ 	"FE+",		/* 0xb8 */
++	"Supreme",	/* 0xb9 */
+ };
+ 
+ static void sky2_set_multicast(struct net_device *dev);
+diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c
+index 4020e9e..63a54e2 100644
+--- a/drivers/net/smc91x.c
++++ b/drivers/net/smc91x.c
+@@ -1326,9 +1326,11 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id)
+ 	SMC_SET_INT_MASK(mask);
+ 	spin_unlock(&lp->lock);
+ 
++#ifndef CONFIG_NET_POLL_CONTROLLER
+ 	if (timeout == MAX_IRQ_LOOPS)
+ 		PRINTK("%s: spurious interrupt (mask = 0x%02x)\n",
+ 		       dev->name, mask);
++#endif
+ 	DBG(3, "%s: Interrupt done (%d loops)\n",
+ 	       dev->name, MAX_IRQ_LOOPS - timeout);
+ 
+diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
+index d4655b2..96043c5 100644
+--- a/drivers/net/tg3.c
++++ b/drivers/net/tg3.c
+@@ -64,8 +64,8 @@
+ 
+ #define DRV_MODULE_NAME		"tg3"
+ #define PFX DRV_MODULE_NAME	": "
+-#define DRV_MODULE_VERSION	"3.89"
+-#define DRV_MODULE_RELDATE	"April 03, 2008"
++#define DRV_MODULE_VERSION	"3.90"
++#define DRV_MODULE_RELDATE	"April 12, 2008"
+ 
+ #define TG3_DEF_MAC_MODE	0
+ #define TG3_DEF_RX_MODE		0
+@@ -12578,7 +12578,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
+ 				  const struct pci_device_id *ent)
+ {
+ 	static int tg3_version_printed = 0;
+-	unsigned long tg3reg_base, tg3reg_len;
++	resource_size_t tg3reg_base;
++	unsigned long tg3reg_len;
+ 	struct net_device *dev;
+ 	struct tg3 *tp;
+ 	int err, pm_cap;
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 7b816a0..5b5d875 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -67,9 +67,42 @@
+ #include <asm/system.h>
+ #include <asm/uaccess.h>
+ 
++/* Uncomment to enable debugging */
++/* #define TUN_DEBUG 1 */
++
+ #ifdef TUN_DEBUG
+ static int debug;
++
++#define DBG  if(tun->debug)printk
++#define DBG1 if(debug==2)printk
++#else
++#define DBG( a... )
++#define DBG1( a... )
++#endif
++
++struct tun_struct {
++	struct list_head        list;
++	unsigned long 		flags;
++	int			attached;
++	uid_t			owner;
++	gid_t			group;
++
++	wait_queue_head_t	read_wait;
++	struct sk_buff_head	readq;
++
++	struct net_device	*dev;
++
++	struct fasync_struct    *fasync;
++
++	unsigned long if_flags;
++	u8 dev_addr[ETH_ALEN];
++	u32 chr_filter[2];
++	u32 net_filter[2];
++
++#ifdef TUN_DEBUG
++	int debug;
+ #endif
++};
+ 
+ /* Network device part of the driver */
+ 
+@@ -253,8 +286,11 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv,
+ 			return -EFAULT;
+ 	}
+ 
+-	if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV)
++	if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) {
+ 		align = NET_IP_ALIGN;
++		if (unlikely(len < ETH_HLEN))
++			return -EINVAL;
++	}
+ 
+ 	if (!(skb = alloc_skb(len + align, GFP_KERNEL))) {
+ 		tun->dev->stats.rx_dropped++;
+diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c
+index 8cc3166..0ee4c16 100644
+--- a/drivers/net/ucc_geth.c
++++ b/drivers/net/ucc_geth.c
+@@ -3833,6 +3833,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
+ 	struct device_node *phy;
+ 	int err, ucc_num, max_speed = 0;
+ 	const phandle *ph;
++	const u32 *fixed_link;
+ 	const unsigned int *prop;
+ 	const char *sprop;
+ 	const void *mac_addr;
+@@ -3923,18 +3924,38 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
+ 
+ 	ug_info->uf_info.regs = res.start;
+ 	ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
++	fixed_link = of_get_property(np, "fixed-link", NULL);
++	if (fixed_link) {
++		ug_info->mdio_bus = 0;
++		ug_info->phy_address = fixed_link[0];
++		phy = NULL;
++	} else {
++		ph = of_get_property(np, "phy-handle", NULL);
++		phy = of_find_node_by_phandle(*ph);
+ 
+-	ph = of_get_property(np, "phy-handle", NULL);
+-	phy = of_find_node_by_phandle(*ph);
++		if (phy == NULL)
++			return -ENODEV;
+ 
+-	if (phy == NULL)
+-		return -ENODEV;
++		/* set the PHY address */
++		prop = of_get_property(phy, "reg", NULL);
++		if (prop == NULL)
++			return -1;
++		ug_info->phy_address = *prop;
++
++		/* Set the bus id */
++		mdio = of_get_parent(phy);
++
++		if (mdio == NULL)
++			return -1;
+ 
+-	/* set the PHY address */
+-	prop = of_get_property(phy, "reg", NULL);
+-	if (prop == NULL)
+-		return -1;
+-	ug_info->phy_address = *prop;
++		err = of_address_to_resource(mdio, 0, &res);
++		of_node_put(mdio);
++
++		if (err)
++			return -1;
++
++		ug_info->mdio_bus = res.start;
++	}
+ 
+ 	/* get the phy interface type, or default to MII */
+ 	prop = of_get_property(np, "phy-connection-type", NULL);
+@@ -3979,20 +4000,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma
+ 		ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_4;
+ 	}
+ 
+-	/* Set the bus id */
+-	mdio = of_get_parent(phy);
+-
+-	if (mdio == NULL)
+-		return -1;
+-
+-	err = of_address_to_resource(mdio, 0, &res);
+-	of_node_put(mdio);
+-
+-	if (err)
+-		return -1;
+-
+-	ug_info->mdio_bus = res.start;
+-
+ 	if (netif_msg_probe(&debug))
+ 		printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n",
+ 			ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs,
+diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig
+index a3df09e..8005dd1 100644
+--- a/drivers/net/wan/Kconfig
++++ b/drivers/net/wan/Kconfig
+@@ -150,9 +150,13 @@ config HDLC_FR
+ 
+ config HDLC_PPP
+ 	tristate "Synchronous Point-to-Point Protocol (PPP) support"
+-	depends on HDLC
++	depends on HDLC && BROKEN
+ 	help
+ 	  Generic HDLC driver supporting PPP over WAN connections.
++	  This module is currently broken and will cause a kernel panic
++	  when a device configured in PPP mode is activated.
++
++	  It will be replaced by new PPP implementation in Linux 2.6.26.
+ 
+ 	  If unsure, say N.
+ 
+diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
+index 385e145..6849685 100644
+--- a/drivers/pcmcia/at91_cf.c
++++ b/drivers/pcmcia/at91_cf.c
+@@ -419,3 +419,4 @@ module_exit(at91_cf_exit);
+ MODULE_DESCRIPTION("AT91 Compact Flash Driver");
+ MODULE_AUTHOR("David Brownell");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:at91_cf");
+diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c
+index 2df216b..bb6db3a 100644
+--- a/drivers/pcmcia/omap_cf.c
++++ b/drivers/pcmcia/omap_cf.c
+@@ -344,6 +344,7 @@ static int omap_cf_resume(struct platform_device *pdev)
+ static struct platform_driver omap_cf_driver = {
+ 	.driver = {
+ 		.name	= (char *) driver_name,
++		.owner	= THIS_MODULE,
+ 	},
+ 	.remove		= __exit_p(omap_cf_remove),
+ 	.suspend	= omap_cf_suspend,
+@@ -368,3 +369,4 @@ module_exit(omap_cf_exit);
+ 
+ MODULE_DESCRIPTION("OMAP CF Driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:omap_cf");
+diff --git a/drivers/pcmcia/pxa2xx_base.c b/drivers/pcmcia/pxa2xx_base.c
+index e439044..9414163 100644
+--- a/drivers/pcmcia/pxa2xx_base.c
++++ b/drivers/pcmcia/pxa2xx_base.c
+@@ -239,6 +239,7 @@ static struct platform_driver pxa2xx_pcmcia_driver = {
+ 	.resume 	= pxa2xx_drv_pcmcia_resume,
+ 	.driver		= {
+ 		.name	= "pxa2xx-pcmcia",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -258,3 +259,4 @@ module_exit(pxa2xx_pcmcia_exit);
+ MODULE_AUTHOR("Stefan Eletzhofer <stefan.eletzhofer at inquant.de> and Ian Molton <spyro at f2s.com>");
+ MODULE_DESCRIPTION("Linux PCMCIA Card Services: PXA2xx core socket driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:pxa2xx-pcmcia");
+diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
+index b485170..dcdc142 100644
+--- a/drivers/rtc/rtc-cmos.c
++++ b/drivers/rtc/rtc-cmos.c
+@@ -198,9 +198,8 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
+ 
+ 	/* Writing 0xff means "don't care" or "match all".  */
+ 
+-	mon = t->time.tm_mon;
+-	mon = (mon < 12) ? BIN2BCD(mon) : 0xff;
+-	mon++;
++	mon = t->time.tm_mon + 1;
++	mon = (mon <= 12) ? BIN2BCD(mon) : 0xff;
+ 
+ 	mday = t->time.tm_mday;
+ 	mday = (mday >= 1 && mday <= 31) ? BIN2BCD(mday) : 0xff;
+diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c
+index 430997e..55492fa 100644
+--- a/drivers/serial/atmel_serial.c
++++ b/drivers/serial/atmel_serial.c
+@@ -1577,3 +1577,4 @@ module_exit(atmel_serial_exit);
+ MODULE_AUTHOR("Rick Bronson");
+ MODULE_DESCRIPTION("Atmel AT91 / AT32 serial port driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:atmel_usart");
+diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c
+index 0aa345b..46bb47f 100644
+--- a/drivers/serial/bfin_5xx.c
++++ b/drivers/serial/bfin_5xx.c
+@@ -1243,6 +1243,7 @@ static struct platform_driver bfin_serial_driver = {
+ 	.resume		= bfin_serial_resume,
+ 	.driver		= {
+ 		.name	= "bfin-uart",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -1301,3 +1302,4 @@ MODULE_AUTHOR("Aubrey.Li <aubrey.li at analog.com>");
+ MODULE_DESCRIPTION("Blackfin generic serial port driver");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_CHARDEV_MAJOR(BFIN_SERIAL_MAJOR);
++MODULE_ALIAS("platform:bfin-uart");
+diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c
+index 56af1f5..16ba9ac 100644
+--- a/drivers/serial/imx.c
++++ b/drivers/serial/imx.c
+@@ -1090,6 +1090,7 @@ static struct platform_driver serial_imx_driver = {
+ 	.resume		= serial_imx_resume,
+ 	.driver		= {
+ 	        .name	= "imx-uart",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -1124,3 +1125,4 @@ module_exit(imx_serial_exit);
+ MODULE_AUTHOR("Sascha Hauer");
+ MODULE_DESCRIPTION("IMX generic serial port driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:imx-uart");
+diff --git a/drivers/serial/mcf.c b/drivers/serial/mcf.c
+index e76fc72..7e164e0 100644
+--- a/drivers/serial/mcf.c
++++ b/drivers/serial/mcf.c
+@@ -649,5 +649,6 @@ module_exit(mcf_exit);
+ MODULE_AUTHOR("Greg Ungerer <gerg at snapgear.com>");
+ MODULE_DESCRIPTION("Freescale ColdFire UART driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:mcfuart");
+ 
+ /****************************************************************************/
+diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
+index a638f23..d93b357 100644
+--- a/drivers/serial/mpc52xx_uart.c
++++ b/drivers/serial/mpc52xx_uart.c
+@@ -1188,6 +1188,8 @@ mpc52xx_uart_resume(struct platform_device *dev)
+ }
+ #endif
+ 
++/* work with hotplug and coldplug */
++MODULE_ALIAS("platform:mpc52xx-psc");
+ 
+ static struct platform_driver mpc52xx_uart_platform_driver = {
+ 	.probe		= mpc52xx_uart_probe,
+diff --git a/drivers/serial/mpsc.c b/drivers/serial/mpsc.c
+index cb3a919..e8819c4 100644
+--- a/drivers/serial/mpsc.c
++++ b/drivers/serial/mpsc.c
+@@ -1964,6 +1964,7 @@ static struct platform_driver mpsc_driver = {
+ 	.remove	= mpsc_drv_remove,
+ 	.driver	= {
+ 		.name	= MPSC_CTLR_NAME,
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -2007,3 +2008,4 @@ MODULE_DESCRIPTION("Generic Marvell MPSC serial/UART driver $Revision: 1.00 $");
+ MODULE_VERSION(MPSC_VERSION);
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_CHARDEV_MAJOR(MPSC_MAJOR);
++MODULE_ALIAS("platform:" MPSC_CTLR_NAME);
+diff --git a/drivers/serial/netx-serial.c b/drivers/serial/netx-serial.c
+index b56f7db..3123ffe 100644
+--- a/drivers/serial/netx-serial.c
++++ b/drivers/serial/netx-serial.c
+@@ -713,6 +713,7 @@ static struct platform_driver serial_netx_driver = {
+ 
+ 	.driver		= {
+ 		.name   = DRIVER_NAME,
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -745,3 +746,4 @@ module_exit(netx_serial_exit);
+ MODULE_AUTHOR("Sascha Hauer");
+ MODULE_DESCRIPTION("NetX serial port driver");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:" DRIVER_NAME);
+diff --git a/drivers/serial/pnx8xxx_uart.c b/drivers/serial/pnx8xxx_uart.c
+index 8d01c59..d0e5a79 100644
+--- a/drivers/serial/pnx8xxx_uart.c
++++ b/drivers/serial/pnx8xxx_uart.c
+@@ -850,3 +850,4 @@ MODULE_AUTHOR("Embedded Alley Solutions, Inc.");
+ MODULE_DESCRIPTION("PNX8XXX SoCs serial port driver");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_PNX8XXX_MAJOR);
++MODULE_ALIAS("platform:pnx8xxx-uart");
+diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c
+index 352fcb8..b4f7ffb 100644
+--- a/drivers/serial/pxa.c
++++ b/drivers/serial/pxa.c
+@@ -833,6 +833,7 @@ static struct platform_driver serial_pxa_driver = {
+ 	.resume		= serial_pxa_resume,
+ 	.driver		= {
+ 	        .name	= "pxa2xx-uart",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -861,4 +862,4 @@ module_init(serial_pxa_init);
+ module_exit(serial_pxa_exit);
+ 
+ MODULE_LICENSE("GPL");
+-
++MODULE_ALIAS("platform:pxa2xx-uart");
+diff --git a/drivers/serial/s3c2410.c b/drivers/serial/s3c2410.c
+index 45de193..4ffa258 100644
+--- a/drivers/serial/s3c2410.c
++++ b/drivers/serial/s3c2410.c
+@@ -1935,3 +1935,7 @@ console_initcall(s3c24xx_serial_initconsole);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Ben Dooks <ben at simtec.co.uk>");
+ MODULE_DESCRIPTION("Samsung S3C2410/S3C2440/S3C2412 Serial port driver");
++MODULE_ALIAS("platform:s3c2400-uart");
++MODULE_ALIAS("platform:s3c2410-uart");
++MODULE_ALIAS("platform:s3c2412-uart");
++MODULE_ALIAS("platform:s3c2440-uart");
+diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
+index 58a83c2..67b2338 100644
+--- a/drivers/serial/sa1100.c
++++ b/drivers/serial/sa1100.c
+@@ -884,6 +884,7 @@ static struct platform_driver sa11x0_serial_driver = {
+ 	.resume		= sa1100_serial_resume,
+ 	.driver		= {
+ 		.name	= "sa11x0-uart",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -917,3 +918,4 @@ MODULE_AUTHOR("Deep Blue Solutions Ltd");
+ MODULE_DESCRIPTION("SA1100 generic serial port driver $Revision: 1.50 $");
+ MODULE_LICENSE("GPL");
+ MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_SA1100_MAJOR);
++MODULE_ALIAS("platform:sa11x0-uart");
+diff --git a/drivers/serial/sc26xx.c b/drivers/serial/sc26xx.c
+index a350b6d..ae2a9e2 100644
+--- a/drivers/serial/sc26xx.c
++++ b/drivers/serial/sc26xx.c
+@@ -732,6 +732,7 @@ static struct platform_driver sc26xx_driver = {
+ 	.remove	= __devexit_p(sc26xx_driver_remove),
+ 	.driver	= {
+ 		.name	= "SC26xx",
++		.owner	= THIS_MODULE,
+ 	},
+ };
+ 
+@@ -753,3 +754,4 @@ MODULE_AUTHOR("Thomas Bogendörfer");
+ MODULE_DESCRIPTION("SC681/SC2692 serial driver");
+ MODULE_VERSION("1.0");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:SC26xx");
+diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c
+index 9d244d1..eff5930 100644
+--- a/drivers/serial/sh-sci.c
++++ b/drivers/serial/sh-sci.c
+@@ -1552,3 +1552,4 @@ module_init(sci_init);
+ module_exit(sci_exit);
+ 
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:sh-sci");
+diff --git a/drivers/serial/uartlite.c b/drivers/serial/uartlite.c
+index 4e06ab6..b565d5a 100644
+--- a/drivers/serial/uartlite.c
++++ b/drivers/serial/uartlite.c
+@@ -561,6 +561,9 @@ static int __devexit ulite_remove(struct platform_device *pdev)
+ 	return ulite_release(&pdev->dev);
+ }
+ 
++/* work with hotplug and coldplug */
++MODULE_ALIAS("platform:uartlite");
++
+ static struct platform_driver ulite_platform_driver = {
+ 	.probe	= ulite_probe,
+ 	.remove	= __devexit_p(ulite_remove),
+diff --git a/drivers/serial/vr41xx_siu.c b/drivers/serial/vr41xx_siu.c
+index 6fd51b0..98ab649 100644
+--- a/drivers/serial/vr41xx_siu.c
++++ b/drivers/serial/vr41xx_siu.c
+@@ -960,3 +960,6 @@ static void __exit vr41xx_siu_exit(void)
+ 
+ module_init(vr41xx_siu_init);
+ module_exit(vr41xx_siu_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:SIU");
+diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c
+index e75103a..b7476b8 100644
+--- a/drivers/spi/spi_s3c24xx.c
++++ b/drivers/spi/spi_s3c24xx.c
+@@ -192,8 +192,11 @@ static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
+ 	hw->len = t->len;
+ 	hw->count = 0;
+ 
++	init_completion(&hw->done);
++
+ 	/* send the first byte */
+ 	writeb(hw_txbyte(hw, 0), hw->regs + S3C2410_SPTDAT);
++
+ 	wait_for_completion(&hw->done);
+ 
+ 	return hw->count;
+@@ -235,6 +238,7 @@ static irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
+ 
+ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
+ {
++	struct s3c2410_spi_info *pdata;
+ 	struct s3c24xx_spi *hw;
+ 	struct spi_master *master;
+ 	struct resource *res;
+@@ -251,10 +255,10 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
+ 	memset(hw, 0, sizeof(struct s3c24xx_spi));
+ 
+ 	hw->master = spi_master_get(master);
+-	hw->pdata = pdev->dev.platform_data;
++	hw->pdata = pdata = pdev->dev.platform_data;
+ 	hw->dev = &pdev->dev;
+ 
+-	if (hw->pdata == NULL) {
++	if (pdata == NULL) {
+ 		dev_err(&pdev->dev, "No platform data supplied\n");
+ 		err = -ENOENT;
+ 		goto err_no_pdata;
+@@ -263,6 +267,10 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
+ 	platform_set_drvdata(pdev, hw);
+ 	init_completion(&hw->done);
+ 
++	/* setup the master state. */
++
++	master->num_chipselect = hw->pdata->num_cs;
++
+ 	/* setup the state for the bitbang driver */
+ 
+ 	hw->bitbang.master         = hw->master;
+@@ -330,13 +338,13 @@ static int __init s3c24xx_spi_probe(struct platform_device *pdev)
+ 
+ 	/* setup any gpio we can */
+ 
+-	if (!hw->pdata->set_cs) {
++	if (!pdata->set_cs) {
+ 		hw->set_cs = s3c24xx_spi_gpiocs;
+ 
+-		s3c2410_gpio_setpin(hw->pdata->pin_cs, 1);
+-		s3c2410_gpio_cfgpin(hw->pdata->pin_cs, S3C2410_GPIO_OUTPUT);
++		s3c2410_gpio_setpin(pdata->pin_cs, 1);
++		s3c2410_gpio_cfgpin(pdata->pin_cs, S3C2410_GPIO_OUTPUT);
+ 	} else
+-		hw->set_cs = hw->pdata->set_cs;
++		hw->set_cs = pdata->set_cs;
+ 
+ 	/* register our spi controller */
+ 
+diff --git a/drivers/thermal/thermal.c b/drivers/thermal/thermal.c
+index 8b86e53..7f79bbf 100644
+--- a/drivers/thermal/thermal.c
++++ b/drivers/thermal/thermal.c
+@@ -196,6 +196,10 @@ static struct device_attribute trip_point_attrs[] = {
+ 	__ATTR(trip_point_8_temp, 0444, trip_point_temp_show, NULL),
+ 	__ATTR(trip_point_9_type, 0444, trip_point_type_show, NULL),
+ 	__ATTR(trip_point_9_temp, 0444, trip_point_temp_show, NULL),
++	__ATTR(trip_point_10_type, 0444, trip_point_type_show, NULL),
++	__ATTR(trip_point_10_temp, 0444, trip_point_temp_show, NULL),
++	__ATTR(trip_point_11_type, 0444, trip_point_type_show, NULL),
++	__ATTR(trip_point_11_temp, 0444, trip_point_temp_show, NULL),
+ };
+ 
+ #define TRIP_POINT_ATTR_ADD(_dev, _index, result)     \
+diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
+index 1194f5e..01072f4 100644
+--- a/drivers/video/fbmem.c
++++ b/drivers/video/fbmem.c
+@@ -1521,6 +1521,7 @@ module_init(fbmem_init);
+ static void __exit
+ fbmem_exit(void)
+ {
++	remove_proc_entry("fb", NULL);
+ 	class_destroy(fb_class);
+ 	unregister_chrdev(FB_MAJOR, "fb");
+ }
+diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c
+index 3e8683d..a99d46f 100644
+--- a/fs/ext2/xattr.c
++++ b/fs/ext2/xattr.c
+@@ -835,7 +835,7 @@ ext2_xattr_cache_insert(struct buffer_head *bh)
+ 	struct mb_cache_entry *ce;
+ 	int error;
+ 
+-	ce = mb_cache_entry_alloc(ext2_xattr_cache);
++	ce = mb_cache_entry_alloc(ext2_xattr_cache, GFP_NOFS);
+ 	if (!ce)
+ 		return -ENOMEM;
+ 	error = mb_cache_entry_insert(ce, bh->b_bdev, bh->b_blocknr, &hash);
+diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c
+index a6ea4d6..4285654 100644
+--- a/fs/ext3/xattr.c
++++ b/fs/ext3/xattr.c
+@@ -1126,7 +1126,7 @@ ext3_xattr_cache_insert(struct buffer_head *bh)
+ 	struct mb_cache_entry *ce;
+ 	int error;
+ 
+-	ce = mb_cache_entry_alloc(ext3_xattr_cache);
++	ce = mb_cache_entry_alloc(ext3_xattr_cache, GFP_NOFS);
+ 	if (!ce) {
+ 		ea_bdebug(bh, "out of memory");
+ 		return;
+diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+index d796213..e9054c1 100644
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -1386,7 +1386,7 @@ ext4_xattr_cache_insert(struct buffer_head *bh)
+ 	struct mb_cache_entry *ce;
+ 	int error;
+ 
+-	ce = mb_cache_entry_alloc(ext4_xattr_cache);
++	ce = mb_cache_entry_alloc(ext4_xattr_cache, GFP_NOFS);
+ 	if (!ce) {
+ 		ea_bdebug(bh, "out of memory");
+ 		return;
+diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
+index f9c5dd6..dcc2734 100644
+--- a/fs/jffs2/file.c
++++ b/fs/jffs2/file.c
+@@ -129,7 +129,7 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
+ 	struct inode *inode = mapping->host;
+ 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
+ 	pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+-	uint32_t pageofs = pos & (PAGE_CACHE_SIZE - 1);
++	uint32_t pageofs = index << PAGE_CACHE_SHIFT;
+ 	int ret = 0;
+ 
+ 	pg = __grab_cache_page(mapping, index);
+diff --git a/fs/locks.c b/fs/locks.c
+index d83fab1..43c0af2 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -1801,17 +1801,21 @@ again:
+ 	if (error)
+ 		goto out;
+ 
+-	for (;;) {
+-		error = vfs_lock_file(filp, cmd, file_lock, NULL);
+-		if (error != -EAGAIN || cmd == F_SETLK)
+-			break;
+-		error = wait_event_interruptible(file_lock->fl_wait,
+-				!file_lock->fl_next);
+-		if (!error)
+-			continue;
++	if (filp->f_op && filp->f_op->lock != NULL)
++		error = filp->f_op->lock(filp, cmd, file_lock);
++	else {
++		for (;;) {
++			error = posix_lock_file(filp, file_lock, NULL);
++			if (error != -EAGAIN || cmd == F_SETLK)
++				break;
++			error = wait_event_interruptible(file_lock->fl_wait,
++					!file_lock->fl_next);
++			if (!error)
++				continue;
+ 
+-		locks_delete_block(file_lock);
+-		break;
++			locks_delete_block(file_lock);
++			break;
++		}
+ 	}
+ 
+ 	/*
+@@ -1925,17 +1929,21 @@ again:
+ 	if (error)
+ 		goto out;
+ 
+-	for (;;) {
+-		error = vfs_lock_file(filp, cmd, file_lock, NULL);
+-		if (error != -EAGAIN || cmd == F_SETLK64)
+-			break;
+-		error = wait_event_interruptible(file_lock->fl_wait,
+-				!file_lock->fl_next);
+-		if (!error)
+-			continue;
++	if (filp->f_op && filp->f_op->lock != NULL)
++		error = filp->f_op->lock(filp, cmd, file_lock);
++	else {
++		for (;;) {
++			error = posix_lock_file(filp, file_lock, NULL);
++			if (error != -EAGAIN || cmd == F_SETLK64)
++				break;
++			error = wait_event_interruptible(file_lock->fl_wait,
++					!file_lock->fl_next);
++			if (!error)
++				continue;
+ 
+-		locks_delete_block(file_lock);
+-		break;
++			locks_delete_block(file_lock);
++			break;
++		}
+ 	}
+ 
+ 	/*
+diff --git a/fs/mbcache.c b/fs/mbcache.c
+index eb31b73..ec88ff3 100644
+--- a/fs/mbcache.c
++++ b/fs/mbcache.c
+@@ -399,11 +399,11 @@ mb_cache_destroy(struct mb_cache *cache)
+  * if no more memory was available.
+  */
+ struct mb_cache_entry *
+-mb_cache_entry_alloc(struct mb_cache *cache)
++mb_cache_entry_alloc(struct mb_cache *cache, gfp_t gfp_flags)
+ {
+ 	struct mb_cache_entry *ce;
+ 
+-	ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL);
++	ce = kmem_cache_alloc(cache->c_entry_cache, gfp_flags);
+ 	if (ce) {
+ 		atomic_inc(&cache->c_entry_count);
+ 		INIT_LIST_HEAD(&ce->e_lru_list);
+diff --git a/include/asm-arm/arch-s3c2410/spi.h b/include/asm-arm/arch-s3c2410/spi.h
+index 7ca0ed9..352d338 100644
+--- a/include/asm-arm/arch-s3c2410/spi.h
++++ b/include/asm-arm/arch-s3c2410/spi.h
+@@ -15,6 +15,7 @@
+ 
+ struct s3c2410_spi_info {
+ 	unsigned long		 pin_cs;	/* simple gpio cs */
++	unsigned int		 num_cs;	/* total chipselects */
+ 
+ 	void (*set_cs)(struct s3c2410_spi_info *spi, int cs, int pol);
+ };
+diff --git a/include/asm-um/tlb.h b/include/asm-um/tlb.h
+index 39fc475..5240fa1 100644
+--- a/include/asm-um/tlb.h
++++ b/include/asm-um/tlb.h
+@@ -1,6 +1,7 @@
+ #ifndef __UM_TLB_H
+ #define __UM_TLB_H
+ 
++#include <linux/pagemap.h>
+ #include <linux/swap.h>
+ #include <asm/percpu.h>
+ #include <asm/pgalloc.h>
+diff --git a/include/linux/Kbuild b/include/linux/Kbuild
+index 9cdd12a..cedbbd8 100644
+--- a/include/linux/Kbuild
++++ b/include/linux/Kbuild
+@@ -86,6 +86,7 @@ header-y += if_plip.h
+ header-y += if_ppp.h
+ header-y += if_slip.h
+ header-y += if_strip.h
++header-y += if_tun.h
+ header-y += if_tunnel.h
+ header-y += in6.h
+ header-y += in_route.h
+@@ -229,7 +230,6 @@ unifdef-y += if_link.h
+ unifdef-y += if_pppol2tp.h
+ unifdef-y += if_pppox.h
+ unifdef-y += if_tr.h
+-unifdef-y += if_tun.h
+ unifdef-y += if_vlan.h
+ unifdef-y += if_wanpipe.h
+ unifdef-y += igmp.h
+diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h
+index 72f1c5f..8c71fe2 100644
+--- a/include/linux/if_tun.h
++++ b/include/linux/if_tun.h
+@@ -18,47 +18,8 @@
+ #ifndef __IF_TUN_H
+ #define __IF_TUN_H
+ 
+-/* Uncomment to enable debugging */
+-/* #define TUN_DEBUG 1 */
+-
+ #include <linux/types.h>
+ 
+-#ifdef __KERNEL__
+-
+-#ifdef TUN_DEBUG
+-#define DBG  if(tun->debug)printk
+-#define DBG1 if(debug==2)printk
+-#else
+-#define DBG( a... )
+-#define DBG1( a... )
+-#endif
+-
+-struct tun_struct {
+-	struct list_head        list;
+-	unsigned long 		flags;
+-	int			attached;
+-	uid_t			owner;
+-	gid_t			group;
+-
+-	wait_queue_head_t	read_wait;
+-	struct sk_buff_head	readq;
+-
+-	struct net_device	*dev;
+-
+-	struct fasync_struct    *fasync;
+-
+-	unsigned long if_flags;
+-	u8 dev_addr[ETH_ALEN];
+-	u32 chr_filter[2];
+-	u32 net_filter[2];
+-
+-#ifdef TUN_DEBUG	
+-	int debug;
+-#endif  
+-};
+-
+-#endif /* __KERNEL__ */
+-
+ /* Read queue size */
+ #define TUN_READQ_SIZE	500
+ 
+diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
+index 4aaefc3..134c8e5 100644
+--- a/include/linux/ipv6.h
++++ b/include/linux/ipv6.h
+@@ -53,7 +53,7 @@ struct ipv6_opt_hdr {
+ 	/* 
+ 	 * TLV encoded option data follows.
+ 	 */
+-};
++} __attribute__ ((packed));	/* required for some archs */
+ 
+ #define ipv6_destopt_hdr ipv6_opt_hdr
+ #define ipv6_hopopt_hdr  ipv6_opt_hdr
+diff --git a/include/linux/mbcache.h b/include/linux/mbcache.h
+index 99e044b..a09b84e 100644
+--- a/include/linux/mbcache.h
++++ b/include/linux/mbcache.h
+@@ -34,7 +34,7 @@ void mb_cache_destroy(struct mb_cache *);
+ 
+ /* Functions on cache entries */
+ 
+-struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *);
++struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *, gfp_t);
+ int mb_cache_entry_insert(struct mb_cache_entry *, struct block_device *,
+ 			  sector_t, unsigned int[]);
+ void mb_cache_entry_release(struct mb_cache_entry *);
+diff --git a/include/linux/thermal.h b/include/linux/thermal.h
+index 818ca1c..90c1c19 100644
+--- a/include/linux/thermal.h
++++ b/include/linux/thermal.h
+@@ -50,7 +50,7 @@ struct thermal_cooling_device_ops {
+ };
+ 
+ #define THERMAL_TRIPS_NONE -1
+-#define THERMAL_MAX_TRIPS 10
++#define THERMAL_MAX_TRIPS 12
+ #define THERMAL_NAME_LENGTH 20
+ struct thermal_cooling_device {
+ 	int id;
+diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
+index ba33db0..7040a78 100644
+--- a/include/net/inet_ecn.h
++++ b/include/net/inet_ecn.h
+@@ -47,7 +47,7 @@ static inline __u8 INET_ECN_encapsulate(__u8 outer, __u8 inner)
+     } while (0)
+ 
+ #define	IP6_ECN_flow_xmit(sk, label) do {				\
+-	if (INET_ECN_is_capable(inet_sk(sk)->tos))			\
++	if (INET_ECN_is_capable(inet6_sk(sk)->tclass))			\
+ 		(label) |= htonl(INET_ECN_ECT_0 << 20);			\
+     } while (0)
+ 
+diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h
+index 10ae2da..35b1e83 100644
+--- a/include/net/sctp/command.h
++++ b/include/net/sctp/command.h
+@@ -104,6 +104,7 @@ typedef enum {
+ 	SCTP_CMD_ADAPTATION_IND, /* generate and send adaptation event */
+ 	SCTP_CMD_ASSOC_SHKEY,    /* generate the association shared keys */
+ 	SCTP_CMD_T1_RETRAN,	 /* Mark for retransmission after T1 timeout  */
++	SCTP_CMD_UPDATE_INITTAG, /* Update peer inittag */
+ 	SCTP_CMD_LAST
+ } sctp_verb_t;
+ 
+diff --git a/include/net/sctp/ulpevent.h b/include/net/sctp/ulpevent.h
+index 9bcfc12..7ea12e8 100644
+--- a/include/net/sctp/ulpevent.h
++++ b/include/net/sctp/ulpevent.h
+@@ -67,7 +67,7 @@ struct sctp_ulpevent {
+ };
+ 
+ /* Retrieve the skb this event sits inside of. */
+-static inline struct sk_buff *sctp_event2skb(struct sctp_ulpevent *ev)
++static inline struct sk_buff *sctp_event2skb(const struct sctp_ulpevent *ev)
+ {
+ 	return container_of((void *)ev, struct sk_buff, cb);
+ }
+diff --git a/kernel/printk.c b/kernel/printk.c
+index c46a20a..bdd4ea8 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -643,8 +643,21 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu)
+ {
+ 	int retval = 0;
+ 
+-	if (can_use_console(cpu))
+-		retval = !try_acquire_console_sem();
++	if (!try_acquire_console_sem()) {
++		retval = 1;
++
++		/*
++		 * If we can't use the console, we need to release
++		 * the console semaphore by hand to avoid flushing
++		 * the buffer. We need to hold the console semaphore
++		 * in order to do this test safely.
++		 */
++		if (!can_use_console(cpu)) {
++			console_locked = 0;
++			up(&console_sem);
++			retval = 0;
++		}
++	}
+ 	printk_cpu = UINT_MAX;
+ 	spin_unlock(&logbuf_lock);
+ 	return retval;
+diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
+index 86a9337..0080968 100644
+--- a/kernel/sched_fair.c
++++ b/kernel/sched_fair.c
+@@ -510,10 +510,8 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
+ 
+ 	if (!initial) {
+ 		/* sleeps upto a single latency don't count. */
+-		if (sched_feat(NEW_FAIR_SLEEPERS)) {
+-			vruntime -= calc_delta_fair(sysctl_sched_latency,
+-						    &cfs_rq->load);
+-		}
++		if (sched_feat(NEW_FAIR_SLEEPERS))
++			vruntime -= sysctl_sched_latency;
+ 
+ 		/* ensure we never gain time by being placed backwards. */
+ 		vruntime = max_vruntime(se->vruntime, vruntime);
+diff --git a/mm/oom_kill.c b/mm/oom_kill.c
+index f255eda..beb592f 100644
+--- a/mm/oom_kill.c
++++ b/mm/oom_kill.c
+@@ -423,7 +423,7 @@ void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask)
+ 	struct task_struct *p;
+ 
+ 	cgroup_lock();
+-	rcu_read_lock();
++	read_lock(&tasklist_lock);
+ retry:
+ 	p = select_bad_process(&points, mem);
+ 	if (PTR_ERR(p) == -1UL)
+@@ -436,7 +436,7 @@ retry:
+ 				"Memory cgroup out of memory"))
+ 		goto retry;
+ out:
+-	rcu_read_unlock();
++	read_unlock(&tasklist_lock);
+ 	cgroup_unlock();
+ }
+ #endif
+diff --git a/mm/sparse.c b/mm/sparse.c
+index f6a43c0..98d6b39 100644
+--- a/mm/sparse.c
++++ b/mm/sparse.c
+@@ -149,8 +149,18 @@ static inline int sparse_early_nid(struct mem_section *section)
+ /* Record a memory area against a node. */
+ void __init memory_present(int nid, unsigned long start, unsigned long end)
+ {
++	unsigned long max_arch_pfn = 1UL << (MAX_PHYSMEM_BITS-PAGE_SHIFT);
+ 	unsigned long pfn;
+ 
++	/*
++	 * Sanity checks - do not allow an architecture to pass
++	 * in larger pfns than the maximum scope of sparsemem:
++	 */
++	if (start >= max_arch_pfn)
++		return;
++	if (end >= max_arch_pfn)
++		end = max_arch_pfn;
++
+ 	start &= PAGE_SECTION_MASK;
+ 	for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) {
+ 		unsigned long section = pfn_to_section_nr(pfn);
+diff --git a/mm/vmstat.c b/mm/vmstat.c
+index 422d960..7c7286e 100644
+--- a/mm/vmstat.c
++++ b/mm/vmstat.c
+@@ -388,6 +388,7 @@ static char * const migratetype_names[MIGRATE_TYPES] = {
+ 	"Reclaimable",
+ 	"Movable",
+ 	"Reserve",
++	"Isolate",
+ };
+ 
+ static void *frag_start(struct seq_file *m, loff_t *pos)
+diff --git a/net/ax25/ax25_uid.c b/net/ax25/ax25_uid.c
+index 5f4eb73..57aeba7 100644
+--- a/net/ax25/ax25_uid.c
++++ b/net/ax25/ax25_uid.c
+@@ -218,9 +218,11 @@ void __exit ax25_uid_free(void)
+ 	struct hlist_node *node;
+ 
+ 	write_lock(&ax25_uid_lock);
++again:
+ 	ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
+ 		hlist_del_init(&ax25_uid->uid_node);
+ 		ax25_uid_put(ax25_uid);
++		goto again;
+ 	}
+ 	write_unlock(&ax25_uid_lock);
+ }
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index 1c0efd8..af7e8be 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -110,7 +110,8 @@ static inline __be16 pppoe_proto(const struct sk_buff *skb)
+  * ipt_REJECT needs it.  Future netfilter modules might
+  * require us to fill additional fields. */
+ static struct net_device __fake_net_device = {
+-	.hard_header_len	= ETH_HLEN
++	.hard_header_len	= ETH_HLEN,
++	.nd_net			= &init_net,
+ };
+ 
+ static struct rtable __fake_rtable = {
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 0d0fd28..6087013 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -2131,8 +2131,8 @@ EXPORT_SYMBOL_GPL(skb_pull_rcsum);
+  *	@features: features for the output path (see dev->features)
+  *
+  *	This function performs segmentation on the given skb.  It returns
+- *	the segment at the given position.  It returns NULL if there are
+- *	no more segments to generate, or when an error is encountered.
++ *	a pointer to the first in a list of new skbs for the segments.
++ *	In case of error it returns ERR_PTR(err).
+  */
+ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
+ {
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 2654c14..7a0567b 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -1725,7 +1725,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
+ 	sk->sk_rcvtimeo		=	MAX_SCHEDULE_TIMEOUT;
+ 	sk->sk_sndtimeo		=	MAX_SCHEDULE_TIMEOUT;
+ 
+-	sk->sk_stamp = ktime_set(-1L, -1L);
++	sk->sk_stamp = ktime_set(-1L, 0);
+ 
+ 	atomic_set(&sk->sk_refcnt, 1);
+ 	atomic_set(&sk->sk_drops, 0);
+diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h
+index 287a62b..ba2ef94 100644
+--- a/net/dccp/dccp.h
++++ b/net/dccp/dccp.h
+@@ -325,6 +325,12 @@ static inline int dccp_bad_service_code(const struct sock *sk,
+  * This is used for transmission as well as for reception.
+  */
+ struct dccp_skb_cb {
++	union {
++		struct inet_skb_parm	h4;
++#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
++		struct inet6_skb_parm	h6;
++#endif
++	} header;
+ 	__u8  dccpd_type:4;
+ 	__u8  dccpd_ccval:4;
+ 	__u8  dccpd_reset_code,
+diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
+index 474075a..b337044 100644
+--- a/net/dccp/ipv4.c
++++ b/net/dccp/ipv4.c
+@@ -489,7 +489,6 @@ static int dccp_v4_send_response(struct sock *sk, struct request_sock *req,
+ 
+ 		dh->dccph_checksum = dccp_v4_csum_finish(skb, ireq->loc_addr,
+ 							      ireq->rmt_addr);
+-		memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
+ 		err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr,
+ 					    ireq->rmt_addr,
+ 					    ireq->opt);
+diff --git a/net/dccp/output.c b/net/dccp/output.c
+index 3b763db..3d7d628 100644
+--- a/net/dccp/output.c
++++ b/net/dccp/output.c
+@@ -126,7 +126,6 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
+ 
+ 		DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
+ 
+-		memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
+ 		err = icsk->icsk_af_ops->queue_xmit(skb, 0);
+ 		return net_xmit_eval(err);
+ 	}
+diff --git a/net/dccp/proto.c b/net/dccp/proto.c
+index e3f5d37..c91d3c1 100644
+--- a/net/dccp/proto.c
++++ b/net/dccp/proto.c
+@@ -1057,6 +1057,9 @@ static int __init dccp_init(void)
+ 	int ehash_order, bhash_order, i;
+ 	int rc = -ENOBUFS;
+ 
++	BUILD_BUG_ON(sizeof(struct dccp_skb_cb) >
++		     FIELD_SIZEOF(struct sk_buff, cb));
++
+ 	dccp_hashinfo.bind_bucket_cachep =
+ 		kmem_cache_create("dccp_bind_bucket",
+ 				  sizeof(struct inet_bind_bucket), 0,
+diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
+index a7b4175..a80839b 100644
+--- a/net/ethernet/eth.c
++++ b/net/ethernet/eth.c
+@@ -301,7 +301,7 @@ static int eth_change_mtu(struct net_device *dev, int new_mtu)
+ static int eth_validate_addr(struct net_device *dev)
+ {
+ 	if (!is_valid_ether_addr(dev->dev_addr))
+-		return -EINVAL;
++		return -EADDRNOTAVAIL;
+ 
+ 	return 0;
+ }
+diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c
+index 52926c8..a12dd32 100644
+--- a/net/ipv4/netfilter/ipt_CLUSTERIP.c
++++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c
+@@ -82,8 +82,8 @@ clusterip_config_put(struct clusterip_config *c)
+ static inline void
+ clusterip_config_entry_put(struct clusterip_config *c)
+ {
++	write_lock_bh(&clusterip_lock);
+ 	if (atomic_dec_and_test(&c->entries)) {
+-		write_lock_bh(&clusterip_lock);
+ 		list_del(&c->list);
+ 		write_unlock_bh(&clusterip_lock);
+ 
+@@ -96,7 +96,9 @@ clusterip_config_entry_put(struct clusterip_config *c)
+ #ifdef CONFIG_PROC_FS
+ 		remove_proc_entry(c->pde->name, c->pde->parent);
+ #endif
++		return;
+ 	}
++	write_unlock_bh(&clusterip_lock);
+ }
+ 
+ static struct clusterip_config *
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index a65935a..e08955b 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -371,25 +371,26 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
+ 	 */
+ 	in6_dev_hold(ndev);
+ 
++#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
++	if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
++		printk(KERN_INFO
++		       "%s: Disabled Multicast RS\n",
++		       dev->name);
++		ndev->cnf.rtr_solicits = 0;
++	}
++#endif
++
+ #ifdef CONFIG_IPV6_PRIVACY
+ 	setup_timer(&ndev->regen_timer, ipv6_regen_rndid, (unsigned long)ndev);
+ 	if ((dev->flags&IFF_LOOPBACK) ||
+ 	    dev->type == ARPHRD_TUNNEL ||
+-#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
++	    dev->type == ARPHRD_TUNNEL6 ||
+ 	    dev->type == ARPHRD_SIT ||
+-#endif
+ 	    dev->type == ARPHRD_NONE) {
+ 		printk(KERN_INFO
+ 		       "%s: Disabled Privacy Extensions\n",
+ 		       dev->name);
+ 		ndev->cnf.use_tempaddr = -1;
+-
+-		if (dev->type == ARPHRD_SIT && (dev->priv_flags & IFF_ISATAP)) {
+-			printk(KERN_INFO
+-			       "%s: Disabled Multicast RS\n",
+-			       dev->name);
+-			ndev->cnf.rtr_solicits = 0;
+-		}
+ 	} else {
+ 		in6_dev_hold(ndev);
+ 		ipv6_regen_rndid((unsigned long) ndev);
+diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
+index 8897ccf..0a6fbc1 100644
+--- a/net/ipv6/raw.c
++++ b/net/ipv6/raw.c
+@@ -372,8 +372,10 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
+ 	read_lock(&raw_v6_hashinfo.lock);
+ 	sk = sk_head(&raw_v6_hashinfo.ht[hash]);
+ 	if (sk != NULL) {
+-		saddr = &ipv6_hdr(skb)->saddr;
+-		daddr = &ipv6_hdr(skb)->daddr;
++		struct ipv6hdr *hdr = (struct ipv6hdr *) skb->data;
++
++		saddr = &hdr->saddr;
++		daddr = &hdr->daddr;
+ 		net = skb->dev->nd_net;
+ 
+ 		while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
+index c5c16b4..4d75544 100644
+--- a/net/sched/cls_u32.c
++++ b/net/sched/cls_u32.c
+@@ -411,8 +411,10 @@ static void u32_destroy(struct tcf_proto *tp)
+ 			}
+ 		}
+ 
+-		for (ht=tp_c->hlist; ht; ht = ht->next)
++		for (ht = tp_c->hlist; ht; ht = ht->next) {
++			ht->refcnt--;
+ 			u32_clear_hnode(tp, ht);
++		}
+ 
+ 		while ((ht = tp_c->hlist) != NULL) {
+ 			tp_c->hlist = ht->next;
+@@ -441,8 +443,12 @@ static int u32_delete(struct tcf_proto *tp, unsigned long arg)
+ 	if (tp->root == ht)
+ 		return -EINVAL;
+ 
+-	if (--ht->refcnt == 0)
++	if (ht->refcnt == 1) {
++		ht->refcnt--;
+ 		u32_destroy_hnode(tp, ht);
++	} else {
++		return -EBUSY;
++	}
+ 
+ 	return 0;
+ }
+@@ -568,7 +574,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
+ 		if (ht == NULL)
+ 			return -ENOBUFS;
+ 		ht->tp_c = tp_c;
+-		ht->refcnt = 0;
++		ht->refcnt = 1;
+ 		ht->divisor = divisor;
+ 		ht->handle = handle;
+ 		ht->prio = tp->prio;
+diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
+index b1e05d7..85f1495 100644
+--- a/net/sctp/ipv6.c
++++ b/net/sctp/ipv6.c
+@@ -110,8 +110,9 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
+ 		spin_lock_bh(&sctp_local_addr_lock);
+ 		list_for_each_entry_safe(addr, temp,
+ 					&sctp_local_addr_list, list) {
+-			if (ipv6_addr_equal(&addr->a.v6.sin6_addr,
+-					     &ifa->addr)) {
++			if (addr->a.sa.sa_family == AF_INET6 &&
++					ipv6_addr_equal(&addr->a.v6.sin6_addr,
++						&ifa->addr)) {
+ 				found = 1;
+ 				addr->valid = 0;
+ 				list_del_rcu(&addr->list);
+diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
+index 1bb3c5c..c071446 100644
+--- a/net/sctp/outqueue.c
++++ b/net/sctp/outqueue.c
+@@ -793,6 +793,9 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
+ 			break;
+ 
+ 		case SCTP_CID_ABORT:
++			if (sctp_test_T_bit(chunk)) {
++				packet->vtag = asoc->c.my_vtag;
++			}
+ 		case SCTP_CID_SACK:
+ 		case SCTP_CID_HEARTBEAT:
+ 		case SCTP_CID_HEARTBEAT_ACK:
+diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
+index f90091a..c2dd65d 100644
+--- a/net/sctp/protocol.c
++++ b/net/sctp/protocol.c
+@@ -647,7 +647,9 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
+ 		spin_lock_bh(&sctp_local_addr_lock);
+ 		list_for_each_entry_safe(addr, temp,
+ 					&sctp_local_addr_list, list) {
+-			if (addr->a.v4.sin_addr.s_addr == ifa->ifa_local) {
++			if (addr->a.sa.sa_family == AF_INET &&
++					addr->a.v4.sin_addr.s_addr ==
++					ifa->ifa_local) {
+ 				found = 1;
+ 				addr->valid = 0;
+ 				list_del_rcu(&addr->list);
+diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
+index 578630e..36ebb39 100644
+--- a/net/sctp/sm_make_chunk.c
++++ b/net/sctp/sm_make_chunk.c
+@@ -1982,7 +1982,10 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
+ 					struct sctp_chunk *chunk,
+ 					struct sctp_chunk **err_chunk)
+ {
++	struct sctp_hmac_algo_param *hmacs;
+ 	int retval = SCTP_IERROR_NO_ERROR;
++	__u16 n_elt, id = 0;
++	int i;
+ 
+ 	/* FIXME - This routine is not looking at each parameter per the
+ 	 * chunk type, i.e., unrecognized parameters should be further
+@@ -2056,9 +2059,29 @@ static sctp_ierror_t sctp_verify_param(const struct sctp_association *asoc,
+ 		break;
+ 
+ 	case SCTP_PARAM_HMAC_ALGO:
+-		if (sctp_auth_enable)
+-			break;
+-		/* Fall Through */
++		if (!sctp_auth_enable)
++			goto fallthrough;
++
++		hmacs = (struct sctp_hmac_algo_param *)param.p;
++		n_elt = (ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) >> 1;
++
++		/* SCTP-AUTH: Section 6.1
++		 * The HMAC algorithm based on SHA-1 MUST be supported and
++		 * included in the HMAC-ALGO parameter.
++		 */
++		for (i = 0; i < n_elt; i++) {
++			id = ntohs(hmacs->hmac_ids[i]);
++
++			if (id == SCTP_AUTH_HMAC_ID_SHA1)
++				break;
++		}
++
++		if (id != SCTP_AUTH_HMAC_ID_SHA1) {
++			sctp_process_inv_paramlength(asoc, param.p, chunk,
++						     err_chunk);
++			retval = SCTP_IERROR_ABORT;
++		}
++		break;
+ fallthrough:
+ 	default:
+ 		SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 28eb38e..a4763fd 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -1536,6 +1536,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
+ 			error = sctp_auth_asoc_init_active_key(asoc,
+ 						GFP_ATOMIC);
+ 			break;
++		case SCTP_CMD_UPDATE_INITTAG:
++			asoc->peer.i.init_tag = cmd->obj.u32;
++			break;
+ 
+ 		default:
+ 			printk(KERN_WARNING "Impossible command: %u, %p\n",
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index f2ed647..07194c2 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -4144,6 +4144,24 @@ static sctp_disposition_t sctp_sf_abort_violation(
+ 		goto nomem;
+ 
+ 	if (asoc) {
++		/* Treat INIT-ACK as a special case during COOKIE-WAIT. */
++		if (chunk->chunk_hdr->type == SCTP_CID_INIT_ACK &&
++		    !asoc->peer.i.init_tag) {
++			sctp_initack_chunk_t *initack;
++
++			initack = (sctp_initack_chunk_t *)chunk->chunk_hdr;
++			if (!sctp_chunk_length_valid(chunk,
++						     sizeof(sctp_initack_chunk_t)))
++				abort->chunk_hdr->flags |= SCTP_CHUNK_FLAG_T;
++			else {
++				unsigned int inittag;
++
++				inittag = ntohl(initack->init_hdr.init_tag);
++				sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_INITTAG,
++						SCTP_U32(inittag));
++			}
++		}
++
+ 		sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+ 		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
+ 
+@@ -4349,6 +4367,7 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const struct sctp_endpoint *ep,
+ 				       sctp_cmd_seq_t *commands)
+ {
+ 	struct sctp_chunk *repl;
++	struct sctp_association* my_asoc;
+ 
+ 	/* The comment below says that we enter COOKIE-WAIT AFTER
+ 	 * sending the INIT, but that doesn't actually work in our
+@@ -4372,8 +4391,8 @@ sctp_disposition_t sctp_sf_do_prm_asoc(const struct sctp_endpoint *ep,
+ 	/* Cast away the const modifier, as we want to just
+ 	 * rerun it through as a sideffect.
+ 	 */
+-	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC,
+-			SCTP_ASOC((struct sctp_association *) asoc));
++	my_asoc = (struct sctp_association *)asoc;
++	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(my_asoc));
+ 
+ 	/* Choose transport for INIT. */
+ 	sctp_add_cmd_sf(commands, SCTP_CMD_INIT_CHOOSE_TRANSPORT,
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c
+index d994d82..998e63a 100644
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -5868,11 +5868,12 @@ SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg,
+ 				  sctp_cmsgs_t *cmsgs)
+ {
+ 	struct cmsghdr *cmsg;
++	struct msghdr *my_msg = (struct msghdr *)msg;
+ 
+ 	for (cmsg = CMSG_FIRSTHDR(msg);
+ 	     cmsg != NULL;
+-	     cmsg = CMSG_NXTHDR((struct msghdr*)msg, cmsg)) {
+-		if (!CMSG_OK(msg, cmsg))
++	     cmsg = CMSG_NXTHDR(my_msg, cmsg)) {
++		if (!CMSG_OK(my_msg, cmsg))
+ 			return -EINVAL;
+ 
+ 		/* Should we parse this header or ignore?  */
+diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c
+index b43f1f1..ce6cda6 100644
+--- a/net/sctp/ulpevent.c
++++ b/net/sctp/ulpevent.c
+@@ -859,7 +859,7 @@ __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event)
+ 	union sctp_notification *notification;
+ 	struct sk_buff *skb;
+ 
+-	skb = sctp_event2skb((struct sctp_ulpevent *)event);
++	skb = sctp_event2skb(event);
+ 	notification = (union sctp_notification *) skb->data;
+ 	return notification->sn_header.sn_type;
+ }

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Wed Apr 16 11:05:49 2008
@@ -1,4 +1,4 @@
-+ bugfix/all/patch-2.6.25-rc8-git8
++ bugfix/all/patch-2.6.25-rc9-git3
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch



More information about the Kernel-svn-changes mailing list