[kernel] r6437 - in dists/sid/linux-2.6/debian: . patches patches/series

Bastian Blank waldi at costa.debian.org
Mon Apr 17 21:58:37 UTC 2006


Author: waldi
Date: Mon Apr 17 21:58:35 2006
New Revision: 6437

Added:
   dists/sid/linux-2.6/debian/patches/2.6.16.6   (contents, props changed)
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/8
Log:
Add stable release 2.6.16.6.

* debian/changelog: Update.
* debian/patches/series/8: Enable 2.6.16.6.
* debian/patches/2.6.16.6: Add.


Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Mon Apr 17 21:58:35 2006
@@ -1,6 +1,30 @@
 linux-2.6 (2.6.16-8) UNRELEASED; urgency=low
 
-  * Fix ABI-breakage introduced by -7. (closes: #363032)
+  * Fix ABI-breakage introduced in -7. (closes: #363032)
+  * Add stable release 2.6.16.6:
+    - ext3: Fix missed mutex unlock
+    - RLIMIT_CPU: fix handling of a zero limit
+    - alpha: SMP boot fixes
+    - m32r: security fix of {get, put}_user macros
+    - m32r: Fix cpu_possible_map and cpu_present_map initialization for SMP kernel
+    - shmat: stop mprotect from giving write permission to a readonly attachment (CVE-2006-1524)
+    - powerpc: fix incorrect SA_ONSTACK behaviour for 64-bit processes
+    - MPBL0010 driver sysfs permissions wide open
+    - cciss: bug fix for crash when running hpacucli
+    - fuse: fix oops in fuse_send_readpages()
+    - Fix utime(2) in the case that no times parameter was passed in.
+    - Fix buddy list race that could lead to page lru list corruptions
+    - NETFILTER: Fix fragmentation issues with bridge netfilter
+    - USB: remove __init from usb_console_setup
+    - Fix suspend with traced tasks
+    - isd200: limit to BLK_DEV_IDE
+    - edac_752x needs CONFIG_HOTPLUG
+    - fix non-leader exec under ptrace
+    - sky2: bad memory reference on dual port cards
+    - atm: clip causes unregister hang
+    - powerpc: iSeries needs slb_initialize to be called
+    - Fix block device symlink name
+    - Incorrect signature sent on SMB Read
 
  -- Bastian Blank <waldi at debian.org>  Mon, 17 Apr 2006 23:22:20 +0200
 

Added: dists/sid/linux-2.6/debian/patches/2.6.16.6
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/2.6.16.6	Mon Apr 17 21:58:35 2006
@@ -0,0 +1,1753 @@
+diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
+index b4e5f8f..45308bd 100644
+--- a/arch/alpha/kernel/setup.c
++++ b/arch/alpha/kernel/setup.c
+@@ -24,6 +24,7 @@
+ #include <linux/config.h>	/* CONFIG_ALPHA_LCA etc */
+ #include <linux/mc146818rtc.h>
+ #include <linux/console.h>
++#include <linux/cpu.h>
+ #include <linux/errno.h>
+ #include <linux/init.h>
+ #include <linux/string.h>
+@@ -477,6 +478,22 @@ page_is_ram(unsigned long pfn)
+ #undef PFN_PHYS
+ #undef PFN_MAX
+ 
++static int __init
++register_cpus(void)
++{
++	int i;
++
++	for_each_possible_cpu(i) {
++		struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
++		if (!p)
++			return -ENOMEM;
++		register_cpu(p, i, NULL);
++	}
++	return 0;
++}
++
++arch_initcall(register_cpus);
++
+ void __init
+ setup_arch(char **cmdline_p)
+ {
+diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
+index 02c2db0..1852554 100644
+--- a/arch/alpha/kernel/smp.c
++++ b/arch/alpha/kernel/smp.c
+@@ -439,7 +439,7 @@ setup_smp(void)
+ 			if ((cpu->flags & 0x1cc) == 0x1cc) {
+ 				smp_num_probed++;
+ 				/* Assume here that "whami" == index */
+-				cpu_set(i, cpu_possible_map);
++				cpu_set(i, cpu_present_mask);
+ 				cpu->pal_revision = boot_cpu_palrev;
+ 			}
+ 
+@@ -450,9 +450,8 @@ setup_smp(void)
+ 		}
+ 	} else {
+ 		smp_num_probed = 1;
+-		cpu_set(boot_cpuid, cpu_possible_map);
++		cpu_set(boot_cpuid, cpu_present_mask);
+ 	}
+-	cpu_present_mask = cpumask_of_cpu(boot_cpuid);
+ 
+ 	printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
+ 	       smp_num_probed, cpu_possible_map.bits[0]);
+@@ -488,9 +487,8 @@ void __devinit
+ smp_prepare_boot_cpu(void)
+ {
+ 	/*
+-	 * Mark the boot cpu (current cpu) as both present and online
++	 * Mark the boot cpu (current cpu) as online
+ 	 */ 
+-	cpu_set(smp_processor_id(), cpu_present_mask);
+ 	cpu_set(smp_processor_id(), cpu_online_map);
+ }
+ 
+diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c
+index be8b711..6000950 100644
+--- a/arch/m32r/kernel/m32r_ksyms.c
++++ b/arch/m32r/kernel/m32r_ksyms.c
+@@ -38,10 +38,6 @@ EXPORT_SYMBOL(__udelay);
+ EXPORT_SYMBOL(__delay);
+ EXPORT_SYMBOL(__const_udelay);
+ 
+-EXPORT_SYMBOL(__get_user_1);
+-EXPORT_SYMBOL(__get_user_2);
+-EXPORT_SYMBOL(__get_user_4);
+-
+ EXPORT_SYMBOL(strpbrk);
+ EXPORT_SYMBOL(strstr);
+ 
+diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c
+index d742037..542ed93 100644
+--- a/arch/m32r/kernel/setup.c
++++ b/arch/m32r/kernel/setup.c
+@@ -9,6 +9,7 @@
+ 
+ #include <linux/config.h>
+ #include <linux/init.h>
++#include <linux/kernel.h>
+ #include <linux/stddef.h>
+ #include <linux/fs.h>
+ #include <linux/sched.h>
+@@ -218,8 +219,6 @@ static unsigned long __init setup_memory
+ extern unsigned long setup_memory(void);
+ #endif	/* CONFIG_DISCONTIGMEM */
+ 
+-#define M32R_PCC_PCATCR	0x00ef7014	/* will move to m32r.h */
+-
+ void __init setup_arch(char **cmdline_p)
+ {
+ 	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
+@@ -268,15 +267,14 @@ void __init setup_arch(char **cmdline_p)
+ 	paging_init();
+ }
+ 
+-static struct cpu cpu[NR_CPUS];
++static struct cpu cpu_devices[NR_CPUS];
+ 
+ static int __init topology_init(void)
+ {
+-	int cpu_id;
++	int i;
+ 
+-	for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++)
+-		if (cpu_possible(cpu_id))
+-			register_cpu(&cpu[cpu_id], cpu_id, NULL);
++	for_each_present_cpu(i)
++		register_cpu(&cpu_devices[i], i, NULL);
+ 
+ 	return 0;
+ }
+diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c
+index d7ec16e..840b434 100644
+--- a/arch/m32r/kernel/smpboot.c
++++ b/arch/m32r/kernel/smpboot.c
+@@ -39,8 +39,10 @@
+  *		Martin J. Bligh	: 	Added support for multi-quad systems
+  */
+ 
++#include <linux/module.h>
+ #include <linux/config.h>
+ #include <linux/init.h>
++#include <linux/kernel.h>
+ #include <linux/mm.h>
+ #include <linux/smp_lock.h>
+ #include <linux/irq.h>
+@@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map;
+ 
+ /* Bitmask of currently online CPUs */
+ cpumask_t cpu_online_map;
++EXPORT_SYMBOL(cpu_online_map);
+ 
+ cpumask_t cpu_bootout_map;
+ cpumask_t cpu_bootin_map;
+-cpumask_t cpu_callout_map;
+ static cpumask_t cpu_callin_map;
++cpumask_t cpu_callout_map;
++EXPORT_SYMBOL(cpu_callout_map);
++cpumask_t cpu_possible_map = CPU_MASK_ALL;
++EXPORT_SYMBOL(cpu_possible_map);
+ 
+ /* Per CPU bogomips and other parameters */
+ struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned;
+@@ -110,7 +116,6 @@ static unsigned int calibration_result;
+ 
+ void smp_prepare_boot_cpu(void);
+ void smp_prepare_cpus(unsigned int);
+-static void smp_tune_scheduling(void);
+ static void init_ipi_lock(void);
+ static void do_boot_cpu(int);
+ int __cpu_up(unsigned int);
+@@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned in
+ 	}
+ 	for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++)
+ 		physid_set(phys_id, phys_cpu_present_map);
++#ifndef CONFIG_HOTPLUG_CPU
++	cpu_present_map = cpu_possible_map;
++#endif
+ 
+ 	show_mp_info(nr_cpu);
+ 
+@@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned in
+ 	 * Setup boot CPU information
+ 	 */
+ 	smp_store_cpu_info(0); /* Final full version of the data */
+-	smp_tune_scheduling();
+ 
+ 	/*
+ 	 * If SMP should be disabled, then really disable it!
+@@ -230,11 +237,6 @@ smp_done:
+ 	Dprintk("Boot done.\n");
+ }
+ 
+-static void __init smp_tune_scheduling(void)
+-{
+-	/* Nothing to do. */
+-}
+-
+ /*
+  * init_ipi_lock : Initialize IPI locks.
+  */
+@@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(i
+ 	physid_2_cpu[phys_id] = -1;
+ 	cpu_2_physid[cpu_id] = -1;
+ }
+-
+diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile
+index e632d10..d16b4e4 100644
+--- a/arch/m32r/lib/Makefile
++++ b/arch/m32r/lib/Makefile
+@@ -2,6 +2,6 @@
+ # Makefile for M32R-specific library files..
+ #
+ 
+-lib-y  := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \
+-	  putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o
++lib-y  := checksum.o ashxdi3.o memset.o memcpy.o \
++	  delay.o strlen.o usercopy.o csum_partial_copy.o
+ 
+diff --git a/arch/m32r/lib/getuser.S b/arch/m32r/lib/getuser.S
+deleted file mode 100644
+index 58a0db0..0000000
+--- a/arch/m32r/lib/getuser.S
++++ /dev/null
+@@ -1,88 +0,0 @@
+-/*
+- * __get_user functions.
+- *
+- * (C) Copyright 2001 Hirokazu Takata
+- *
+- * These functions have a non-standard call interface
+- * to make them more efficient, especially as they
+- * return an error value in addition to the "real"
+- * return value.
+- */
+-
+-#include <linux/config.h>
+-
+-/*
+- * __get_user_X
+- *
+- * Inputs:	r0 contains the address
+- *
+- * Outputs:	r0 is error code (0 or -EFAULT)
+- *		r1 contains zero-extended value
+- *
+- * These functions should not modify any other registers,
+- * as they get called from within inline assembly.
+- */
+-
+-#ifdef CONFIG_ISA_DUAL_ISSUE
+-
+-	.text
+-	.balign 4
+-	.globl __get_user_1
+-__get_user_1:
+-1:	ldub	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __get_user_2
+-__get_user_2:
+-2:	lduh	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __get_user_4
+-__get_user_4:
+-3:	ld	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-bad_get_user:
+-	ldi	r1, #0		    ||	ldi	r0, #-14
+-	jmp	r14
+-
+-#else /* not CONFIG_ISA_DUAL_ISSUE */
+-
+-	.text
+-	.balign 4
+-	.globl __get_user_1
+-__get_user_1:
+-1:	ldub	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __get_user_2
+-__get_user_2:
+-2:	lduh	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __get_user_4
+-__get_user_4:
+-3:	ld	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-bad_get_user:
+-	ldi	r1, #0
+-	ldi	r0, #-14
+-	jmp	r14
+-
+-#endif /* not CONFIG_ISA_DUAL_ISSUE */
+-
+-.section __ex_table,"a"
+-	.long 1b,bad_get_user
+-	.long 2b,bad_get_user
+-	.long 3b,bad_get_user
+-.previous
+-
+-	.end
+diff --git a/arch/m32r/lib/putuser.S b/arch/m32r/lib/putuser.S
+deleted file mode 100644
+index 218154c..0000000
+--- a/arch/m32r/lib/putuser.S
++++ /dev/null
+@@ -1,84 +0,0 @@
+-/*
+- * __put_user functions.
+- *
+- * (C) Copyright 1998 Linus Torvalds
+- * (C) Copyright 2001 Hirokazu Takata
+- *
+- * These functions have a non-standard call interface
+- * to make them more efficient.
+- */
+-
+-#include <linux/config.h>
+-
+-/*
+- * __put_user_X
+- *
+- * Inputs:	r0 contains the address
+- *		r1 contains the value
+- *
+- * Outputs:	r0 is error code (0 or -EFAULT)
+- *		r1 is corrupted (will contain "current_task").
+- *
+- * These functions should not modify any other registers,
+- * as they get called from within inline assembly.
+- */
+-
+-#ifdef CONFIG_ISA_DUAL_ISSUE
+-
+-	.text
+-	.balign 4
+-	.globl __put_user_1
+-__put_user_1:
+-1:	stb	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __put_user_2
+-__put_user_2:
+-2:	sth	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __put_user_4
+-__put_user_4:
+-3:	st	r1, @r0		    ||	ldi	r0, #0
+-	jmp	r14
+-
+-bad_put_user:
+-	ldi	r0, #-14	    ||	jmp	r14
+-
+-#else /* not CONFIG_ISA_DUAL_ISSUE */
+-
+-	.text
+-	.balign 4
+-	.globl __put_user_1
+-__put_user_1:
+-1:	stb	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __put_user_2
+-__put_user_2:
+-2:	sth	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-	.balign 4
+-	.globl __put_user_4
+-__put_user_4:
+-3:	st	r1, @r0
+-	ldi	r0, #0
+-	jmp	r14
+-
+-bad_put_user:
+-	ldi	r0, #-14
+-	jmp	r14
+-
+-#endif /* not CONFIG_ISA_DUAL_ISSUE */
+-
+-.section __ex_table,"a"
+-	.long 1b,bad_put_user
+-	.long 2b,bad_put_user
+-	.long 3b,bad_put_user
+-.previous
+diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
+index f96c49b..abd758f 100644
+--- a/arch/powerpc/kernel/setup_64.c
++++ b/arch/powerpc/kernel/setup_64.c
+@@ -256,12 +256,10 @@ void __init early_setup(unsigned long dt
+ 	/*
+ 	 * Initialize stab / SLB management except on iSeries
+ 	 */
+-	if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
+-		if (cpu_has_feature(CPU_FTR_SLB))
+-			slb_initialize();
+-		else
+-			stab_initialize(lpaca->stab_real);
+-	}
++	if (cpu_has_feature(CPU_FTR_SLB))
++		slb_initialize();
++	else if (!firmware_has_feature(FW_FEATURE_ISERIES))
++		stab_initialize(lpaca->stab_real);
+ 
+ 	DBG(" <- early_setup()\n");
+ }
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
+index 4324f8a..096dfdc 100644
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -213,7 +213,7 @@ static inline void __user * get_sigframe
+         /* Default to using normal stack */
+         newsp = regs->gpr[1];
+ 
+-	if (ka->sa.sa_flags & SA_ONSTACK) {
++	if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) {
+ 		if (! on_sig_stack(regs->gpr[1]))
+ 			newsp = (current->sas_ss_sp + current->sas_ss_size);
+ 	}
+diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
+index c149d57..71552e1 100644
+--- a/drivers/block/cciss.c
++++ b/drivers/block/cciss.c
+@@ -1181,6 +1181,53 @@ static int revalidate_allvol(ctlr_info_t
+         return 0;
+ }
+ 
++static inline void complete_buffers(struct bio *bio, int status)
++{
++	while (bio) {
++		struct bio *xbh = bio->bi_next;
++		int nr_sectors = bio_sectors(bio);
++
++		bio->bi_next = NULL;
++		blk_finished_io(len);
++		bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
++		bio = xbh;
++	}
++
++}
++
++static void cciss_softirq_done(struct request *rq)
++{
++	CommandList_struct *cmd = rq->completion_data;
++	ctlr_info_t *h = hba[cmd->ctlr];
++	unsigned long flags;
++	u64bit temp64;
++	int i, ddir;
++
++	if (cmd->Request.Type.Direction == XFER_READ)
++		ddir = PCI_DMA_FROMDEVICE;
++	else
++		ddir = PCI_DMA_TODEVICE;
++
++	/* command did not need to be retried */
++	/* unmap the DMA mapping for all the scatter gather elements */
++	for(i=0; i<cmd->Header.SGList; i++) {
++		temp64.val32.lower = cmd->SG[i].Addr.lower;
++		temp64.val32.upper = cmd->SG[i].Addr.upper;
++		pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
++	}
++
++	complete_buffers(rq->bio, rq->errors);
++
++#ifdef CCISS_DEBUG
++	printk("Done with %p\n", rq);
++#endif /* CCISS_DEBUG */
++
++	spin_lock_irqsave(&h->lock, flags);
++	end_that_request_last(rq, rq->errors);
++	cmd_free(h, cmd,1);
++	spin_unlock_irqrestore(&h->lock, flags);
++}
++
+ /* This function will check the usage_count of the drive to be updated/added.
+  * If the usage_count is zero then the drive information will be updated and
+  * the disk will be re-registered with the kernel.  If not then it will be
+@@ -1249,6 +1296,8 @@ static void cciss_update_drive_info(int 
+ 
+ 		blk_queue_max_sectors(disk->queue, 512);
+ 
++		blk_queue_softirq_done(disk->queue, cciss_softirq_done);
++
+ 		disk->queue->queuedata = hba[ctlr];
+ 
+ 		blk_queue_hardsect_size(disk->queue,
+@@ -2148,20 +2197,6 @@ static void start_io( ctlr_info_t *h)
+ 		addQ (&(h->cmpQ), c); 
+ 	}
+ }
+-
+-static inline void complete_buffers(struct bio *bio, int status)
+-{
+-	while (bio) {
+-		struct bio *xbh = bio->bi_next; 
+-		int nr_sectors = bio_sectors(bio);
+-
+-		bio->bi_next = NULL; 
+-		blk_finished_io(len);
+-		bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
+-		bio = xbh;
+-	}
+-
+-} 
+ /* Assumes that CCISS_LOCK(h->ctlr) is held. */
+ /* Zeros out the error record and then resends the command back */
+ /* to the controller */
+@@ -2179,39 +2214,6 @@ static inline void resend_cciss_cmd( ctl
+ 	start_io(h);
+ }
+ 
+-static void cciss_softirq_done(struct request *rq)
+-{
+-	CommandList_struct *cmd = rq->completion_data;
+-	ctlr_info_t *h = hba[cmd->ctlr];
+-	unsigned long flags;
+-	u64bit temp64;
+-	int i, ddir;
+-
+-	if (cmd->Request.Type.Direction == XFER_READ)
+-		ddir = PCI_DMA_FROMDEVICE;
+-	else
+-		ddir = PCI_DMA_TODEVICE;
+-
+-	/* command did not need to be retried */
+-	/* unmap the DMA mapping for all the scatter gather elements */
+-	for(i=0; i<cmd->Header.SGList; i++) {
+-		temp64.val32.lower = cmd->SG[i].Addr.lower;
+-		temp64.val32.upper = cmd->SG[i].Addr.upper;
+-		pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
+-	}
+-
+-	complete_buffers(rq->bio, rq->errors);
+-
+-#ifdef CCISS_DEBUG
+-	printk("Done with %p\n", rq);
+-#endif /* CCISS_DEBUG */ 
+-
+-	spin_lock_irqsave(&h->lock, flags);
+-	end_that_request_last(rq, rq->errors);
+-	cmd_free(h, cmd,1);
+-	spin_unlock_irqrestore(&h->lock, flags);
+-}
+-
+ /* checks the status of the job and calls complete buffers to mark all 
+  * buffers for the completed job. Note that this function does not need
+  * to hold the hba/queue lock.
+diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c
+index 2546637..f58ad7f 100644
+--- a/drivers/char/tlclk.c
++++ b/drivers/char/tlclk.c
+@@ -327,7 +327,7 @@ static ssize_t store_received_ref_clk3a(
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(received_ref_clk3a, S_IWUGO, NULL,
++static DEVICE_ATTR(received_ref_clk3a, (S_IWUSR|S_IWGRP), NULL,
+ 		store_received_ref_clk3a);
+ 
+ 
+@@ -349,7 +349,7 @@ static ssize_t store_received_ref_clk3b(
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(received_ref_clk3b, S_IWUGO, NULL,
++static DEVICE_ATTR(received_ref_clk3b, (S_IWUSR|S_IWGRP), NULL,
+ 		store_received_ref_clk3b);
+ 
+ 
+@@ -371,7 +371,7 @@ static ssize_t store_enable_clk3b_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clk3b_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clk3b_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clk3b_output);
+ 
+ static ssize_t store_enable_clk3a_output(struct device *d,
+@@ -392,7 +392,7 @@ static ssize_t store_enable_clk3a_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clk3a_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clk3a_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clk3a_output);
+ 
+ static ssize_t store_enable_clkb1_output(struct device *d,
+@@ -413,7 +413,7 @@ static ssize_t store_enable_clkb1_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clkb1_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clkb1_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clkb1_output);
+ 
+ 
+@@ -435,7 +435,7 @@ static ssize_t store_enable_clka1_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clka1_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clka1_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clka1_output);
+ 
+ static ssize_t store_enable_clkb0_output(struct device *d,
+@@ -456,7 +456,7 @@ static ssize_t store_enable_clkb0_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clkb0_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clkb0_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clkb0_output);
+ 
+ static ssize_t store_enable_clka0_output(struct device *d,
+@@ -477,7 +477,7 @@ static ssize_t store_enable_clka0_output
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(enable_clka0_output, S_IWUGO, NULL,
++static DEVICE_ATTR(enable_clka0_output, (S_IWUSR|S_IWGRP), NULL,
+ 		store_enable_clka0_output);
+ 
+ static ssize_t store_select_amcb2_transmit_clock(struct device *d,
+@@ -519,7 +519,7 @@ static ssize_t store_select_amcb2_transm
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(select_amcb2_transmit_clock, S_IWUGO, NULL,
++static DEVICE_ATTR(select_amcb2_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
+ 	store_select_amcb2_transmit_clock);
+ 
+ static ssize_t store_select_amcb1_transmit_clock(struct device *d,
+@@ -560,7 +560,7 @@ static ssize_t store_select_amcb1_transm
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(select_amcb1_transmit_clock, S_IWUGO, NULL,
++static DEVICE_ATTR(select_amcb1_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
+ 		store_select_amcb1_transmit_clock);
+ 
+ static ssize_t store_select_redundant_clock(struct device *d,
+@@ -581,7 +581,7 @@ static ssize_t store_select_redundant_cl
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(select_redundant_clock, S_IWUGO, NULL,
++static DEVICE_ATTR(select_redundant_clock, (S_IWUSR|S_IWGRP), NULL,
+ 		store_select_redundant_clock);
+ 
+ static ssize_t store_select_ref_frequency(struct device *d,
+@@ -602,7 +602,7 @@ static ssize_t store_select_ref_frequenc
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(select_ref_frequency, S_IWUGO, NULL,
++static DEVICE_ATTR(select_ref_frequency, (S_IWUSR|S_IWGRP), NULL,
+ 		store_select_ref_frequency);
+ 
+ static ssize_t store_filter_select(struct device *d,
+@@ -623,7 +623,7 @@ static ssize_t store_filter_select(struc
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(filter_select, S_IWUGO, NULL, store_filter_select);
++static DEVICE_ATTR(filter_select, (S_IWUSR|S_IWGRP), NULL, store_filter_select);
+ 
+ static ssize_t store_hardware_switching_mode(struct device *d,
+ 		 struct device_attribute *attr, const char *buf, size_t count)
+@@ -643,7 +643,7 @@ static ssize_t store_hardware_switching_
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(hardware_switching_mode, S_IWUGO, NULL,
++static DEVICE_ATTR(hardware_switching_mode, (S_IWUSR|S_IWGRP), NULL,
+ 		store_hardware_switching_mode);
+ 
+ static ssize_t store_hardware_switching(struct device *d,
+@@ -664,7 +664,7 @@ static ssize_t store_hardware_switching(
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(hardware_switching, S_IWUGO, NULL,
++static DEVICE_ATTR(hardware_switching, (S_IWUSR|S_IWGRP), NULL,
+ 		store_hardware_switching);
+ 
+ static ssize_t store_refalign (struct device *d,
+@@ -684,7 +684,7 @@ static ssize_t store_refalign (struct de
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(refalign, S_IWUGO, NULL, store_refalign);
++static DEVICE_ATTR(refalign, (S_IWUSR|S_IWGRP), NULL, store_refalign);
+ 
+ static ssize_t store_mode_select (struct device *d,
+ 		 struct device_attribute *attr, const char *buf, size_t count)
+@@ -704,7 +704,7 @@ static ssize_t store_mode_select (struct
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(mode_select, S_IWUGO, NULL, store_mode_select);
++static DEVICE_ATTR(mode_select, (S_IWUSR|S_IWGRP), NULL, store_mode_select);
+ 
+ static ssize_t store_reset (struct device *d,
+ 		 struct device_attribute *attr, const char *buf, size_t count)
+@@ -724,7 +724,7 @@ static ssize_t store_reset (struct devic
+ 	return strnlen(buf, count);
+ }
+ 
+-static DEVICE_ATTR(reset, S_IWUGO, NULL, store_reset);
++static DEVICE_ATTR(reset, (S_IWUSR|S_IWGRP), NULL, store_reset);
+ 
+ static struct attribute *tlclk_sysfs_entries[] = {
+ 	&dev_attr_current_ref.attr,
+diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
+index 52f3eb4..7ecdb1e 100644
+--- a/drivers/edac/Kconfig
++++ b/drivers/edac/Kconfig
+@@ -71,7 +71,7 @@ config EDAC_E7XXX
+ 
+ config EDAC_E752X
+ 	tristate "Intel e752x (e7520, e7525, e7320)"
+-	depends on EDAC_MM_EDAC && PCI
++	depends on EDAC_MM_EDAC && PCI && HOTPLUG
+ 	help
+ 	  Support for error detection and correction on the Intel
+ 	  E7520, E7525, E7320 server chipsets.
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index 7326036..0618cd5 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -579,8 +579,8 @@ static void sky2_mac_init(struct sky2_hw
+ 	reg = gma_read16(hw, port, GM_PHY_ADDR);
+ 	gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
+ 
+-	for (i = 0; i < GM_MIB_CNT_SIZE; i++)
+-		gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i);
++	for (i = GM_MIB_CNT_BASE; i <= GM_MIB_CNT_END; i += 4)
++		gma_read16(hw, port, i);
+ 	gma_write16(hw, port, GM_PHY_ADDR, reg);
+ 
+ 	/* transmit control */
+diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
+index dce955c..c91e0a4 100644
+--- a/drivers/net/sky2.h
++++ b/drivers/net/sky2.h
+@@ -1380,6 +1380,7 @@ enum {
+ /* MIB Counters */
+ #define GM_MIB_CNT_BASE	0x0100		/* Base Address of MIB Counters */
+ #define GM_MIB_CNT_SIZE	44		/* Number of MIB Counters */
++#define GM_MIB_CNT_END	0x025C		/* Last MIB counter */
+ 
+ /*
+  * MIB Counters base address definitions (low word) -
+diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
+index 167f8ec..8023bb7 100644
+--- a/drivers/usb/serial/console.c
++++ b/drivers/usb/serial/console.c
+@@ -54,7 +54,7 @@ static struct console usbcons;
+  * serial.c code, except that the specifier is "ttyUSB" instead
+  * of "ttyS".
+  */
+-static int __init usb_console_setup(struct console *co, char *options)
++static int usb_console_setup(struct console *co, char *options)
+ {
+ 	struct usbcons_info *info = &usbcons_info;
+ 	int baud = 9600;
+diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
+index 92be101..be9eec2 100644
+--- a/drivers/usb/storage/Kconfig
++++ b/drivers/usb/storage/Kconfig
+@@ -48,7 +48,8 @@ config USB_STORAGE_FREECOM
+ 
+ config USB_STORAGE_ISD200
+ 	bool "ISD-200 USB/ATA Bridge support"
+-	depends on USB_STORAGE && BLK_DEV_IDE
++	depends on USB_STORAGE
++	depends on BLK_DEV_IDE=y || BLK_DEV_IDE=USB_STORAGE
+ 	---help---
+ 	  Say Y here if you want to use USB Mass Store devices based
+ 	  on the In-Systems Design ISD-200 USB/ATA bridge.
+diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
+index a2c2485..3f5e38c 100644
+--- a/fs/cifs/cifsencrypt.c
++++ b/fs/cifs/cifsencrypt.c
+@@ -56,9 +56,6 @@ int cifs_sign_smb(struct smb_hdr * cifs_
+ 	int rc = 0;
+ 	char smb_signature[20];
+ 
+-	/* BB remember to initialize sequence number elsewhere and initialize mac_signing key elsewhere BB */
+-	/* BB remember to add code to save expected sequence number in midQ entry BB */
+-
+ 	if((cifs_pdu == NULL) || (server == NULL))
+ 		return -EINVAL;
+ 
+@@ -85,20 +82,33 @@ int cifs_sign_smb(struct smb_hdr * cifs_
+ static int cifs_calc_signature2(const struct kvec * iov, int n_vec,
+ 				const char * key, char * signature)
+ {
+-        struct  MD5Context context;
+-
+-        if((iov == NULL) || (signature == NULL))
+-                return -EINVAL;
++	struct  MD5Context context;
++	int i;
+ 
+-        MD5Init(&context);
+-        MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
++	if((iov == NULL) || (signature == NULL))
++		return -EINVAL;
+ 
+-/*        MD5Update(&context,cifs_pdu->Protocol,cifs_pdu->smb_buf_length); */ /* BB FIXME BB */
++	MD5Init(&context);
++	MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
++	for(i=0;i<n_vec;i++) {
++		if(iov[i].iov_base == NULL) {
++			cERROR(1,("null iovec entry"));
++			return -EIO;
++		} else if(iov[i].iov_len == 0)
++			break; /* bail out if we are sent nothing to sign */
++		/* The first entry includes a length field (which does not get
++		   signed that occupies the first 4 bytes before the header */
++		if(i==0) {
++			if (iov[0].iov_len <= 8 ) /* cmd field at offset 9 */
++				break; /* nothing to sign or corrupt header */
++			MD5Update(&context,iov[0].iov_base+4, iov[0].iov_len-4);
++		} else
++			MD5Update(&context,iov[i].iov_base, iov[i].iov_len);
++	}
+ 
+-        MD5Final(signature,&context);
++	MD5Final(signature,&context);
+ 
+-	return -EOPNOTSUPP;
+-/*        return 0; */
++	return 0;
+ }
+ 
+ 
+diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
+index 1041dab..14f5f6e 100644
+--- a/fs/ext3/resize.c
++++ b/fs/ext3/resize.c
+@@ -974,6 +974,7 @@ int ext3_group_extend(struct super_block
+ 	if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) {
+ 		ext3_warning(sb, __FUNCTION__,
+ 			     "multiple resizers run on filesystem!");
++		unlock_super(sb);
+ 		err = -EBUSY;
+ 		goto exit_put;
+ 	}
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index 6f05379..ce93cf9 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -397,8 +397,12 @@ static int fuse_readpages(struct file *f
+ 		return -EINTR;
+ 
+ 	err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
+-	if (!err)
+-		fuse_send_readpages(data.req, file, inode);
++	if (!err) {
++		if (data.req->num_pages)
++			fuse_send_readpages(data.req, file, inode);
++		else
++			fuse_put_request(fc, data.req);
++	}
+ 	return err;
+ }
+ 
+diff --git a/fs/partitions/check.c b/fs/partitions/check.c
+index f924f45..2ef03aa 100644
+--- a/fs/partitions/check.c
++++ b/fs/partitions/check.c
+@@ -345,6 +345,7 @@ static char *make_block_name(struct gend
+ 	char *name;
+ 	static char *block_str = "block:";
+ 	int size;
++	char *s;
+ 
+ 	size = strlen(block_str) + strlen(disk->disk_name) + 1;
+ 	name = kmalloc(size, GFP_KERNEL);
+@@ -352,6 +353,10 @@ static char *make_block_name(struct gend
+ 		return NULL;
+ 	strcpy(name, block_str);
+ 	strcat(name, disk->disk_name);
++	/* ewww... some of these buggers have / in name... */
++	s = strchr(name, '/');
++	if (s)
++		*s = '!';
+ 	return name;
+ }
+ 
+diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
+index d7f6f2d..43808e2 100644
+--- a/fs/xfs/linux-2.6/xfs_iops.c
++++ b/fs/xfs/linux-2.6/xfs_iops.c
+@@ -673,8 +673,7 @@ linvfs_setattr(
+ 	if (ia_valid & ATTR_ATIME) {
+ 		vattr.va_mask |= XFS_AT_ATIME;
+ 		vattr.va_atime = attr->ia_atime;
+-		if (ia_valid & ATTR_ATIME_SET)
+-			inode->i_atime = attr->ia_atime;
++		inode->i_atime = attr->ia_atime;
+ 	}
+ 	if (ia_valid & ATTR_MTIME) {
+ 		vattr.va_mask |= XFS_AT_MTIME;
+diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h
+index 7885b7d..1184293 100644
+--- a/include/asm-m32r/smp.h
++++ b/include/asm-m32r/smp.h
+@@ -67,7 +67,8 @@ extern volatile int cpu_2_physid[NR_CPUS
+ #define raw_smp_processor_id()	(current_thread_info()->cpu)
+ 
+ extern cpumask_t cpu_callout_map;
+-#define cpu_possible_map cpu_callout_map
++extern cpumask_t cpu_possible_map;
++extern cpumask_t cpu_present_map;
+ 
+ static __inline__ int hard_smp_processor_id(void)
+ {
+diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h
+index e8ae619..819cc28 100644
+--- a/include/asm-m32r/uaccess.h
++++ b/include/asm-m32r/uaccess.h
+@@ -5,17 +5,9 @@
+  *  linux/include/asm-m32r/uaccess.h
+  *
+  *  M32R version.
+- *    Copyright (C) 2004  Hirokazu Takata <takata at linux-m32r.org>
++ *    Copyright (C) 2004, 2006  Hirokazu Takata <takata at linux-m32r.org>
+  */
+ 
+-#undef UACCESS_DEBUG
+-
+-#ifdef UACCESS_DEBUG
+-#define UAPRINTK(args...) printk(args)
+-#else
+-#define UAPRINTK(args...)
+-#endif /* UACCESS_DEBUG */
+-
+ /*
+  * User space memory access functions
+  */
+@@ -38,27 +30,29 @@
+ #define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
+ 
+ #ifdef CONFIG_MMU
++
+ #define KERNEL_DS	MAKE_MM_SEG(0xFFFFFFFF)
+ #define USER_DS		MAKE_MM_SEG(PAGE_OFFSET)
+-#else
+-#define KERNEL_DS	MAKE_MM_SEG(0xFFFFFFFF)
+-#define USER_DS		MAKE_MM_SEG(0xFFFFFFFF)
+-#endif /* CONFIG_MMU */
+-
+ #define get_ds()	(KERNEL_DS)
+-#ifdef CONFIG_MMU
+ #define get_fs()	(current_thread_info()->addr_limit)
+ #define set_fs(x)	(current_thread_info()->addr_limit = (x))
+-#else
++
++#else /* not CONFIG_MMU */
++
++#define KERNEL_DS	MAKE_MM_SEG(0xFFFFFFFF)
++#define USER_DS		MAKE_MM_SEG(0xFFFFFFFF)
++#define get_ds()	(KERNEL_DS)
++
+ static inline mm_segment_t get_fs(void)
+ {
+-  return USER_DS;
++	return USER_DS;
+ }
+ 
+ static inline void set_fs(mm_segment_t s)
+ {
+ }
+-#endif /* CONFIG_MMU */
++
++#endif /* not CONFIG_MMU */
+ 
+ #define segment_eq(a,b)	((a).seg == (b).seg)
+ 
+@@ -83,9 +77,9 @@ static inline void set_fs(mm_segment_t s
+ 		"	subx	%0, %0\n"				\
+ 		"	cmpu	%4, %1\n"				\
+ 		"	subx	%0, %5\n"				\
+-		: "=&r"(flag), "=r"(sum)				\
+-		: "1"(addr), "r"((int)(size)), 				\
+-		  "r"(current_thread_info()->addr_limit.seg), "r"(0)	\
++		: "=&r" (flag), "=r" (sum)				\
++		: "1" (addr), "r" ((int)(size)), 			\
++		  "r" (current_thread_info()->addr_limit.seg), "r" (0)	\
+ 		: "cbit" );						\
+ 	flag; })
+ 
+@@ -113,10 +107,10 @@ static inline void set_fs(mm_segment_t s
+ #else
+ static inline int access_ok(int type, const void *addr, unsigned long size)
+ {
+-  extern unsigned long memory_start, memory_end;
+-  unsigned long val = (unsigned long)addr;
++	extern unsigned long memory_start, memory_end;
++	unsigned long val = (unsigned long)addr;
+ 
+-  return ((val >= memory_start) && ((val + size) < memory_end));
++	return ((val >= memory_start) && ((val + size) < memory_end));
+ }
+ #endif /* CONFIG_MMU */
+ 
+@@ -155,39 +149,6 @@ extern int fixup_exception(struct pt_reg
+  * accesses to the same area of user memory).
+  */
+ 
+-extern void __get_user_1(void);
+-extern void __get_user_2(void);
+-extern void __get_user_4(void);
+-
+-#ifndef MODULE
+-#define __get_user_x(size,ret,x,ptr) 					\
+-	__asm__ __volatile__(						\
+-		"	mv	r0, %0\n"				\
+-		"	mv	r1, %1\n" 				\
+-		"	bl __get_user_" #size "\n"			\
+-		"	mv	%0, r0\n"				\
+-		"	mv	%1, r1\n" 				\
+-		: "=r"(ret), "=r"(x) 					\
+-		: "0"(ptr)						\
+-		: "r0", "r1", "r14" )
+-#else /* MODULE */
+-/*
+- * Use "jl" instead of "bl" for MODULE
+- */
+-#define __get_user_x(size,ret,x,ptr) 					\
+-	__asm__ __volatile__(						\
+-		"	mv	r0, %0\n"				\
+-		"	mv	r1, %1\n" 				\
+-		"	seth	lr, #high(__get_user_" #size ")\n"	\
+-		"	or3	lr, lr, #low(__get_user_" #size ")\n"	\
+-		"	jl 	lr\n"					\
+-		"	mv	%0, r0\n"				\
+-		"	mv	%1, r1\n" 				\
+-		: "=r"(ret), "=r"(x) 					\
+-		: "0"(ptr)						\
+-		: "r0", "r1", "r14" )
+-#endif
+-
+ /* Careful: we have to cast the result to the type of the pointer for sign
+    reasons */
+ /**
+@@ -208,20 +169,7 @@ extern void __get_user_4(void);
+  * On error, the variable @x is set to zero.
+  */
+ #define get_user(x,ptr)							\
+-({	int __ret_gu;							\
+-	unsigned long __val_gu;						\
+-	__chk_user_ptr(ptr);						\
+-	switch(sizeof (*(ptr))) {					\
+-	case 1:  __get_user_x(1,__ret_gu,__val_gu,ptr); break;		\
+-	case 2:  __get_user_x(2,__ret_gu,__val_gu,ptr); break;		\
+-	case 4:  __get_user_x(4,__ret_gu,__val_gu,ptr); break;		\
+-	default: __get_user_x(X,__ret_gu,__val_gu,ptr); break;		\
+-	}								\
+-	(x) = (__typeof__(*(ptr)))__val_gu;				\
+-	__ret_gu;							\
+-})
+-
+-extern void __put_user_bad(void);
++	__get_user_check((x),(ptr),sizeof(*(ptr)))
+ 
+ /**
+  * put_user: - Write a simple value into user space.
+@@ -240,8 +188,7 @@ extern void __put_user_bad(void);
+  * Returns zero on success, or -EFAULT on error.
+  */
+ #define put_user(x,ptr)							\
+-  __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
+-
++	__put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
+ 
+ /**
+  * __get_user: - Get a simple variable from user space, with less checking.
+@@ -264,8 +211,64 @@ extern void __put_user_bad(void);
+  * On error, the variable @x is set to zero.
+  */
+ #define __get_user(x,ptr) \
+-  __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
++	__get_user_nocheck((x),(ptr),sizeof(*(ptr)))
+ 
++#define __get_user_nocheck(x,ptr,size)					\
++({									\
++	long __gu_err = 0;						\
++	unsigned long __gu_val;						\
++	might_sleep();							\
++	__get_user_size(__gu_val,(ptr),(size),__gu_err);		\
++	(x) = (__typeof__(*(ptr)))__gu_val;				\
++	__gu_err;							\
++})
++
++#define __get_user_check(x,ptr,size)					\
++({									\
++	long __gu_err = -EFAULT;					\
++	unsigned long __gu_val = 0;					\
++	const __typeof__(*(ptr)) __user *__gu_addr = (ptr);		\
++	might_sleep();							\
++	if (access_ok(VERIFY_READ,__gu_addr,size))			\
++		__get_user_size(__gu_val,__gu_addr,(size),__gu_err);	\
++	(x) = (__typeof__(*(ptr)))__gu_val;				\
++	__gu_err;							\
++})
++
++extern long __get_user_bad(void);
++
++#define __get_user_size(x,ptr,size,retval)				\
++do {									\
++	retval = 0;							\
++	__chk_user_ptr(ptr);						\
++	switch (size) {							\
++	  case 1: __get_user_asm(x,ptr,retval,"ub"); break;		\
++	  case 2: __get_user_asm(x,ptr,retval,"uh"); break;		\
++	  case 4: __get_user_asm(x,ptr,retval,""); break;		\
++	  default: (x) = __get_user_bad();				\
++	}								\
++} while (0)
++
++#define __get_user_asm(x, addr, err, itype)				\
++	__asm__ __volatile__(						\
++		"	.fillinsn\n"					\
++		"1:	ld"itype" %1,@%2\n"				\
++		"	.fillinsn\n"					\
++		"2:\n"							\
++		".section .fixup,\"ax\"\n"				\
++		"	.balign 4\n"					\
++		"3:	ldi %0,%3\n"					\
++		"	seth r14,#high(2b)\n"				\
++		"	or3 r14,r14,#low(2b)\n"				\
++		"	jmp r14\n"					\
++		".previous\n"						\
++		".section __ex_table,\"a\"\n"				\
++		"	.balign 4\n"					\
++		"	.long 1b,3b\n"					\
++		".previous"						\
++		: "=&r" (err), "=&r" (x)				\
++		: "r" (addr), "i" (-EFAULT), "0" (err)			\
++		: "r14", "memory")
+ 
+ /**
+  * __put_user: - Write a simple value into user space, with less checking.
+@@ -287,11 +290,13 @@ extern void __put_user_bad(void);
+  * Returns zero on success, or -EFAULT on error.
+  */
+ #define __put_user(x,ptr) \
+-  __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
++	__put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
++
+ 
+ #define __put_user_nocheck(x,ptr,size)					\
+ ({									\
+ 	long __pu_err;							\
++	might_sleep();							\
+ 	__put_user_size((x),(ptr),(size),__pu_err);			\
+ 	__pu_err;							\
+ })
+@@ -308,28 +313,28 @@ extern void __put_user_bad(void);
+ })
+ 
+ #if defined(__LITTLE_ENDIAN__)
+-#define __put_user_u64(x, addr, err)                                    \
+-        __asm__ __volatile__(                                           \
+-                "       .fillinsn\n"                                    \
+-                "1:     st %L1,@%2\n"                                    \
+-                "       .fillinsn\n"                                    \
+-                "2:     st %H1,@(4,%2)\n"                                \
+-                "       .fillinsn\n"                                    \
+-                "3:\n"                                                  \
+-                ".section .fixup,\"ax\"\n"                              \
+-                "       .balign 4\n"                                    \
+-                "4:     ldi %0,%3\n"                                    \
+-                "       seth r14,#high(3b)\n"                           \
+-                "       or3 r14,r14,#low(3b)\n"                         \
+-                "       jmp r14\n"                                      \
+-                ".previous\n"                                           \
+-                ".section __ex_table,\"a\"\n"                           \
+-                "       .balign 4\n"                                    \
+-                "       .long 1b,4b\n"                                  \
+-                "       .long 2b,4b\n"                                  \
+-                ".previous"                                             \
+-                : "=&r"(err)                                             \
+-                : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)		\
++#define __put_user_u64(x, addr, err)					\
++        __asm__ __volatile__(						\
++                "       .fillinsn\n"					\
++                "1:     st %L1,@%2\n"					\
++                "       .fillinsn\n"					\
++                "2:     st %H1,@(4,%2)\n"				\
++                "       .fillinsn\n"					\
++                "3:\n"							\
++                ".section .fixup,\"ax\"\n"				\
++                "       .balign 4\n"					\
++                "4:     ldi %0,%3\n"					\
++                "       seth r14,#high(3b)\n"				\
++                "       or3 r14,r14,#low(3b)\n"				\
++                "       jmp r14\n"					\
++                ".previous\n"						\
++                ".section __ex_table,\"a\"\n"				\
++                "       .balign 4\n"					\
++                "       .long 1b,4b\n"					\
++                "       .long 2b,4b\n"					\
++                ".previous"						\
++                : "=&r" (err)						\
++                : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)		\
+                 : "r14", "memory")
+ 
+ #elif defined(__BIG_ENDIAN__)
+@@ -353,13 +358,15 @@ extern void __put_user_bad(void);
+ 		"	.long 1b,4b\n"					\
+ 		"	.long 2b,4b\n"					\
+ 		".previous"						\
+-		: "=&r"(err)						\
+-		: "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)		\
++		: "=&r" (err)						\
++		: "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)		\
+ 		: "r14", "memory")
+ #else
+ #error no endian defined
+ #endif
+ 
++extern void __put_user_bad(void);
++
+ #define __put_user_size(x,ptr,size,retval)				\
+ do {									\
+ 	retval = 0;							\
+@@ -398,52 +405,8 @@ struct __large_struct { unsigned long bu
+ 		"	.balign 4\n"					\
+ 		"	.long 1b,3b\n"					\
+ 		".previous"						\
+-		: "=&r"(err)						\
+-		: "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)		\
+-		: "r14", "memory")
+-
+-#define __get_user_nocheck(x,ptr,size)					\
+-({									\
+-	long __gu_err;							\
+-	unsigned long __gu_val;						\
+-	__get_user_size(__gu_val,(ptr),(size),__gu_err);		\
+-	(x) = (__typeof__(*(ptr)))__gu_val;				\
+-	__gu_err;							\
+-})
+-
+-extern long __get_user_bad(void);
+-
+-#define __get_user_size(x,ptr,size,retval)				\
+-do {									\
+-	retval = 0;							\
+-	__chk_user_ptr(ptr);						\
+-	switch (size) {							\
+-	  case 1: __get_user_asm(x,ptr,retval,"ub"); break;		\
+-	  case 2: __get_user_asm(x,ptr,retval,"uh"); break;		\
+-	  case 4: __get_user_asm(x,ptr,retval,""); break;		\
+-	  default: (x) = __get_user_bad();				\
+-	}								\
+-} while (0)
+-
+-#define __get_user_asm(x, addr, err, itype)				\
+-	__asm__ __volatile__(						\
+-		"	.fillinsn\n"					\
+-		"1:	ld"itype" %1,@%2\n"				\
+-		"	.fillinsn\n"					\
+-		"2:\n"							\
+-		".section .fixup,\"ax\"\n"				\
+-		"	.balign 4\n"					\
+-		"3:	ldi %0,%3\n"					\
+-		"	seth r14,#high(2b)\n"				\
+-		"	or3 r14,r14,#low(2b)\n"				\
+-		"	jmp r14\n"					\
+-		".previous\n"						\
+-		".section __ex_table,\"a\"\n"				\
+-		"	.balign 4\n"					\
+-		"	.long 1b,3b\n"					\
+-		".previous"						\
+-		: "=&r"(err), "=&r"(x)					\
+-		: "r"(addr), "i"(-EFAULT), "0"(err)			\
++		: "=&r" (err)						\
++		: "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)		\
+ 		: "r14", "memory")
+ 
+ /*
+@@ -453,7 +416,6 @@ do {									\
+  * anything, so this is accurate.
+  */
+ 
+-
+ /*
+  * Copy To/From Userspace
+  */
+@@ -511,8 +473,9 @@ do {									\
+ 		"	.long 2b,9b\n"					\
+ 		"	.long 3b,9b\n"					\
+ 		".previous\n"						\
+-		: "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c)	\
+-		: "0"(to), "1"(from), "2"(size), "3"(size / 4)		\
++		: "=&r" (__dst), "=&r" (__src), "=&r" (size),		\
++		  "=&r" (__c)						\
++		: "0" (to), "1" (from), "2" (size), "3" (size / 4)	\
+ 		: "r14", "memory");					\
+ } while (0)
+ 
+@@ -573,8 +536,9 @@ do {									\
+ 		"	.long 2b,7b\n"					\
+ 		"	.long 3b,7b\n"					\
+ 		".previous\n"						\
+-		: "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c)	\
+-		: "0"(to), "1"(from), "2"(size), "3"(size / 4)		\
++		: "=&r" (__dst), "=&r" (__src), "=&r" (size),		\
++		  "=&r" (__c)						\
++		: "0" (to), "1" (from), "2" (size), "3" (size / 4)	\
+ 		: "r14", "memory");					\
+ } while (0)
+ 
+@@ -676,7 +640,7 @@ unsigned long __generic_copy_from_user(v
+ #define copy_from_user(to,from,n)			\
+ ({							\
+ 	might_sleep();					\
+-__generic_copy_from_user((to),(from),(n));	\
++	__generic_copy_from_user((to),(from),(n));	\
+ })
+ 
+ long __must_check strncpy_from_user(char *dst, const char __user *src,
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 498ff87..279446e 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -229,10 +229,9 @@ struct page {
+ 		unsigned long private;		/* Mapping-private opaque data:
+ 					 	 * usually used for buffer_heads
+ 						 * if PagePrivate set; used for
+-						 * swp_entry_t if PageSwapCache.
+-						 * When page is free, this
++						 * swp_entry_t if PageSwapCache;
+ 						 * indicates order in the buddy
+-						 * system.
++						 * system if PG_buddy is set.
+ 						 */
+ 		struct address_space *mapping;	/* If low bit clear, points to
+ 						 * inode address_space, or NULL.
+diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
+index d52999c..d7ce72e 100644
+--- a/include/linux/page-flags.h
++++ b/include/linux/page-flags.h
+@@ -74,7 +74,9 @@
+ #define PG_mappedtodisk		16	/* Has blocks allocated on-disk */
+ #define PG_reclaim		17	/* To be reclaimed asap */
+ #define PG_nosave_free		18	/* Free, should not be written */
+-#define PG_uncached		19	/* Page has been mapped as uncached */
++#define PG_buddy		19	/* Page is free, on buddy lists */
++
++#define PG_uncached		20	/* Page has been mapped as uncached */
+ 
+ /*
+  * Global page accounting.  One instance per CPU.  Only unsigned longs are
+@@ -319,6 +321,10 @@ extern void __mod_page_state_offset(unsi
+ #define SetPageNosaveFree(page)	set_bit(PG_nosave_free, &(page)->flags)
+ #define ClearPageNosaveFree(page)		clear_bit(PG_nosave_free, &(page)->flags)
+ 
++#define PageBuddy(page)		test_bit(PG_buddy, &(page)->flags)
++#define __SetPageBuddy(page)	__set_bit(PG_buddy, &(page)->flags)
++#define __ClearPageBuddy(page)	__clear_bit(PG_buddy, &(page)->flags)
++
+ #define PageMappedToDisk(page)	test_bit(PG_mappedtodisk, &(page)->flags)
+ #define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
+ #define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
+diff --git a/include/net/ip.h b/include/net/ip.h
+index fab3d5b..ed84d04 100644
+--- a/include/net/ip.h
++++ b/include/net/ip.h
+@@ -95,6 +95,7 @@ extern int		ip_local_deliver(struct sk_b
+ extern int		ip_mr_input(struct sk_buff *skb);
+ extern int		ip_output(struct sk_buff *skb);
+ extern int		ip_mc_output(struct sk_buff *skb);
++extern int		ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
+ extern int		ip_do_nat(struct sk_buff *skb);
+ extern void		ip_send_check(struct iphdr *ip);
+ extern int		ip_queue_xmit(struct sk_buff *skb, int ipfragok);
+diff --git a/ipc/shm.c b/ipc/shm.c
+index 9162123..f409726 100644
+--- a/ipc/shm.c
++++ b/ipc/shm.c
+@@ -161,6 +161,8 @@ static int shm_mmap(struct file * file, 
+ 	ret = shmem_mmap(file, vma);
+ 	if (ret == 0) {
+ 		vma->vm_ops = &shm_vm_ops;
++		if (!(vma->vm_flags & VM_WRITE))
++			vma->vm_flags &= ~VM_MAYWRITE;
+ 		shm_inc(file->f_dentry->d_inode->i_ino);
+ 	}
+ 
+diff --git a/kernel/power/process.c b/kernel/power/process.c
+index 28de118..67b2cdd 100644
+--- a/kernel/power/process.c
++++ b/kernel/power/process.c
+@@ -25,8 +25,7 @@ static inline int freezeable(struct task
+ 	    (p->flags & PF_NOFREEZE) ||
+ 	    (p->exit_state == EXIT_ZOMBIE) ||
+ 	    (p->exit_state == EXIT_DEAD) ||
+-	    (p->state == TASK_STOPPED) ||
+-	    (p->state == TASK_TRACED))
++	    (p->state == TASK_STOPPED))
+ 		return 0;
+ 	return 1;
+ }
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index d95a72c..b5eaeb9 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -57,10 +57,6 @@ void ptrace_untrace(task_t *child)
+ 			signal_wake_up(child, 1);
+ 		}
+ 	}
+-	if (child->signal->flags & SIGNAL_GROUP_EXIT) {
+-		sigaddset(&child->pending.signal, SIGKILL);
+-		signal_wake_up(child, 1);
+-	}
+ 	spin_unlock(&child->sighand->siglock);
+ }
+ 
+@@ -82,7 +78,8 @@ void __ptrace_unlink(task_t *child)
+ 		SET_LINKS(child);
+ 	}
+ 
+-	ptrace_untrace(child);
++	if (child->state == TASK_TRACED)
++		ptrace_untrace(child);
+ }
+ 
+ /*
+diff --git a/kernel/signal.c b/kernel/signal.c
+index bc8f80b..acbccf7 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1688,6 +1688,7 @@ static void ptrace_stop(int exit_code, i
+ 	/* Let the debugger run.  */
+ 	set_current_state(TASK_TRACED);
+ 	spin_unlock_irq(&current->sighand->siglock);
++	try_to_freeze();
+ 	read_lock(&tasklist_lock);
+ 	if (likely(current->ptrace & PT_PTRACED) &&
+ 	    likely(current->parent != current->real_parent ||
+@@ -1941,9 +1942,9 @@ relock:
+ 			/* Let the debugger run.  */
+ 			ptrace_stop(signr, signr, info);
+ 
+-			/* We're back.  Did the debugger cancel the sig or group_exit? */
++			/* We're back.  Did the debugger cancel the sig?  */
+ 			signr = current->exit_code;
+-			if (signr == 0 || current->signal->flags & SIGNAL_GROUP_EXIT)
++			if (signr == 0)
+ 				continue;
+ 
+ 			current->exit_code = 0;
+diff --git a/kernel/sys.c b/kernel/sys.c
+index f91218a..105e102 100644
+--- a/kernel/sys.c
++++ b/kernel/sys.c
+@@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned i
+ 	    (cputime_eq(current->signal->it_prof_expires, cputime_zero) ||
+ 	     new_rlim.rlim_cur <= cputime_to_secs(
+ 		     current->signal->it_prof_expires))) {
+-		cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur);
++		unsigned long rlim_cur = new_rlim.rlim_cur;
++		cputime_t cputime;
++
++		if (rlim_cur == 0) {
++			/*
++			 * The caller is asking for an immediate RLIMIT_CPU
++			 * expiry.  But we use the zero value to mean "it was
++			 * never set".  So let's cheat and make it one second
++			 * instead
++			 */
++			rlim_cur = 1;
++		}
++		cputime = secs_to_cputime(rlim_cur);
+ 		read_lock(&tasklist_lock);
+ 		spin_lock_irq(&current->sighand->siglock);
+ 		set_process_cpu_timer(current, CPUCLOCK_PROF,
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 234bd48..61de222 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -153,7 +153,8 @@ static void bad_page(struct page *page)
+ 			1 << PG_reclaim |
+ 			1 << PG_slab    |
+ 			1 << PG_swapcache |
+-			1 << PG_writeback );
++			1 << PG_writeback |
++			1 << PG_buddy );
+ 	set_page_count(page, 0);
+ 	reset_page_mapcount(page);
+ 	page->mapping = NULL;
+@@ -224,12 +225,12 @@ static inline unsigned long page_order(s
+ 
+ static inline void set_page_order(struct page *page, int order) {
+ 	set_page_private(page, order);
+-	__SetPagePrivate(page);
++	__SetPageBuddy(page);
+ }
+ 
+ static inline void rmv_page_order(struct page *page)
+ {
+-	__ClearPagePrivate(page);
++	__ClearPageBuddy(page);
+ 	set_page_private(page, 0);
+ }
+ 
+@@ -268,11 +269,13 @@ __find_combined_index(unsigned long page
+  * This function checks whether a page is free && is the buddy
+  * we can do coalesce a page and its buddy if
+  * (a) the buddy is not in a hole &&
+- * (b) the buddy is free &&
+- * (c) the buddy is on the buddy system &&
+- * (d) a page and its buddy have the same order.
+- * for recording page's order, we use page_private(page) and PG_private.
++ * (b) the buddy is in the buddy system &&
++ * (c) a page and its buddy have the same order.
++ *
++ * For recording whether a page is in the buddy system, we use PG_buddy.
++ * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
+  *
++ * For recording page's order, we use page_private(page).
+  */
+ static inline int page_is_buddy(struct page *page, int order)
+ {
+@@ -281,10 +284,10 @@ static inline int page_is_buddy(struct p
+ 		return 0;
+ #endif
+ 
+-       if (PagePrivate(page)           &&
+-           (page_order(page) == order) &&
+-            page_count(page) == 0)
++	if (PageBuddy(page) && page_order(page) == order) {
++		BUG_ON(page_count(page) != 0);
+                return 1;
++	}
+        return 0;
+ }
+ 
+@@ -301,7 +304,7 @@ static inline int page_is_buddy(struct p
+  * as necessary, plus some accounting needed to play nicely with other
+  * parts of the VM system.
+  * At each level, we keep a list of pages, which are heads of continuous
+- * free pages of length of (1 << order) and marked with PG_Private.Page's
++ * free pages of length of (1 << order) and marked with PG_buddy. Page's
+  * order is recorded in page_private(page) field.
+  * So when we are allocating or freeing one, we can derive the state of the
+  * other.  That is, if we allocate a small block, and both were   
+@@ -364,7 +367,8 @@ static inline int free_pages_check(struc
+ 			1 << PG_slab	|
+ 			1 << PG_swapcache |
+ 			1 << PG_writeback |
+-			1 << PG_reserved ))))
++			1 << PG_reserved |
++			1 << PG_buddy ))))
+ 		bad_page(page);
+ 	if (PageDirty(page))
+ 		__ClearPageDirty(page);
+@@ -522,7 +526,8 @@ static int prep_new_page(struct page *pa
+ 			1 << PG_slab    |
+ 			1 << PG_swapcache |
+ 			1 << PG_writeback |
+-			1 << PG_reserved ))))
++			1 << PG_reserved |
++			1 << PG_buddy ))))
+ 		bad_page(page);
+ 
+ 	/*
+diff --git a/net/atm/clip.c b/net/atm/clip.c
+index 73370de..1842a4e 100644
+--- a/net/atm/clip.c
++++ b/net/atm/clip.c
+@@ -613,12 +613,19 @@ static int clip_create(int number)
+ 
+ 
+ static int clip_device_event(struct notifier_block *this,unsigned long event,
+-    void *dev)
++			     void *arg)
+ {
++	struct net_device *dev = arg;
++
++	if (event == NETDEV_UNREGISTER) {
++		neigh_ifdown(&clip_tbl, dev);
++		return NOTIFY_DONE;
++	}
++
+ 	/* ignore non-CLIP devices */
+-	if (((struct net_device *) dev)->type != ARPHRD_ATM ||
+-	    ((struct net_device *) dev)->hard_start_xmit != clip_start_xmit)
++	if (dev->type != ARPHRD_ATM || dev->hard_start_xmit != clip_start_xmit)
+ 		return NOTIFY_DONE;
++
+ 	switch (event) {
+ 		case NETDEV_UP:
+ 			DPRINTK("clip_device_event NETDEV_UP\n");
+@@ -686,14 +693,12 @@ static struct notifier_block clip_inet_n
+ static void atmarpd_close(struct atm_vcc *vcc)
+ {
+ 	DPRINTK("atmarpd_close\n");
+-	atmarpd = NULL; /* assumed to be atomic */
+-	barrier();
+-	unregister_inetaddr_notifier(&clip_inet_notifier);
+-	unregister_netdevice_notifier(&clip_dev_notifier);
+-	if (skb_peek(&sk_atm(vcc)->sk_receive_queue))
+-		printk(KERN_ERR "atmarpd_close: closing with requests "
+-		    "pending\n");
++
++	rtnl_lock();
++	atmarpd = NULL;
+ 	skb_queue_purge(&sk_atm(vcc)->sk_receive_queue);
++	rtnl_unlock();
++
+ 	DPRINTK("(done)\n");
+ 	module_put(THIS_MODULE);
+ }
+@@ -714,7 +719,12 @@ static struct atm_dev atmarpd_dev = {
+ 
+ static int atm_init_atmarp(struct atm_vcc *vcc)
+ {
+-	if (atmarpd) return -EADDRINUSE;
++	rtnl_lock();
++	if (atmarpd) {
++		rtnl_unlock();
++		return -EADDRINUSE;
++	}
++
+ 	if (start_timer) {
+ 		start_timer = 0;
+ 		init_timer(&idle_timer);
+@@ -731,10 +741,7 @@ static int atm_init_atmarp(struct atm_vc
+ 	vcc->push = NULL;
+ 	vcc->pop = NULL; /* crash */
+ 	vcc->push_oam = NULL; /* crash */
+-	if (register_netdevice_notifier(&clip_dev_notifier))
+-		printk(KERN_ERR "register_netdevice_notifier failed\n");
+-	if (register_inetaddr_notifier(&clip_inet_notifier))
+-		printk(KERN_ERR "register_inetaddr_notifier failed\n");
++	rtnl_unlock();
+ 	return 0;
+ }
+ 
+@@ -992,6 +999,8 @@ static int __init atm_clip_init(void)
+ 
+ 	clip_tbl_hook = &clip_tbl;
+ 	register_atm_ioctl(&clip_ioctl_ops);
++	register_netdevice_notifier(&clip_dev_notifier);
++	register_inetaddr_notifier(&clip_inet_notifier);
+ 
+ #ifdef CONFIG_PROC_FS
+ {
+@@ -1012,6 +1021,9 @@ static void __exit atm_clip_exit(void)
+ 
+ 	remove_proc_entry("arp", atm_proc_root);
+ 
++	unregister_inetaddr_notifier(&clip_inet_notifier);
++	unregister_netdevice_notifier(&clip_dev_notifier);
++
+ 	deregister_atm_ioctl(&clip_ioctl_ops);
+ 
+ 	/* First, stop the idle timer, so it stops banging
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index e060aad..9e27373 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -739,6 +739,15 @@ out:
+ 	return NF_STOLEN;
+ }
+ 
++static int br_nf_dev_queue_xmit(struct sk_buff *skb)
++{
++	if (skb->protocol == htons(ETH_P_IP) &&
++	    skb->len > skb->dev->mtu &&
++	    !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size))
++		return ip_fragment(skb, br_dev_queue_push_xmit);
++	else
++		return br_dev_queue_push_xmit(skb);
++}
+ 
+ /* PF_BRIDGE/POST_ROUTING ********************************************/
+ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb,
+@@ -798,7 +807,7 @@ static unsigned int br_nf_post_routing(u
+ 		realoutdev = nf_bridge->netoutdev;
+ #endif
+ 	NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev,
+-	        br_dev_queue_push_xmit);
++	        br_nf_dev_queue_xmit);
+ 
+ 	return NF_STOLEN;
+ 
+@@ -843,7 +852,7 @@ static unsigned int ip_sabotage_out(unsi
+ 	if ((out->hard_start_xmit == br_dev_xmit &&
+ 	    okfn != br_nf_forward_finish &&
+ 	    okfn != br_nf_local_out_finish &&
+-	    okfn != br_dev_queue_push_xmit)
++	    okfn != br_nf_dev_queue_xmit)
+ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
+ 	    || ((out->priv_flags & IFF_802_1Q_VLAN) &&
+ 	    VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit)
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index f75ff1d..8dcba38 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -86,8 +86,6 @@
+ 
+ int sysctl_ip_default_ttl = IPDEFTTL;
+ 
+-static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*));
+-
+ /* Generate a checksum for an outgoing IP datagram. */
+ __inline__ void ip_send_check(struct iphdr *iph)
+ {
+@@ -421,7 +419,7 @@ static void ip_copy_metadata(struct sk_b
+  *	single device frame, and queue such a frame for sending.
+  */
+ 
+-static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
++int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
+ {
+ 	struct iphdr *iph;
+ 	int raw = 0;
+@@ -673,6 +671,8 @@ fail:
+ 	return err;
+ }
+ 
++EXPORT_SYMBOL(ip_fragment);
++
+ int
+ ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
+ {
+-
+To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
+Please read the FAQ at  http://www.tux.org/lkml/
+

Modified: dists/sid/linux-2.6/debian/patches/series/8
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/8	(original)
+++ dists/sid/linux-2.6/debian/patches/series/8	Mon Apr 17 21:58:35 2006
@@ -1 +1,2 @@
 + include-linux-seccomp-abifix.patch
++ 2.6.16.6



More information about the Kernel-svn-changes mailing list