Browse Source

Merge upstream into 'upstream' branch of netdev-2.6.git.

Hand fix merge conflict in drivers/net/tokenring/Kconfig.
Jeff Garzik 20 years ago
parent
commit
75a95178da
100 changed files with 570 additions and 567 deletions
  1. 1 1
      Makefile
  2. 1 1
      arch/alpha/Kconfig
  3. 3 3
      arch/alpha/kernel/smp.c
  4. 3 3
      arch/alpha/oprofile/common.c
  5. 1 1
      arch/arm/Kconfig
  6. 1 1
      arch/arm/kernel/traps.c
  7. 3 3
      arch/arm/nwfpe/fpopcode.h
  8. 2 2
      arch/i386/kernel/nmi.c
  9. 6 4
      arch/i386/kernel/traps.c
  10. 1 1
      arch/ia64/hp/sim/boot/boot_head.S
  11. 10 8
      arch/ia64/sn/kernel/io_init.c
  12. 2 1
      arch/m32r/Kconfig
  13. 1 1
      arch/m32r/Kconfig.debug
  14. 3 1
      arch/m32r/kernel/setup_m32700ut.c
  15. 3 1
      arch/m32r/kernel/setup_opsput.c
  16. 1 0
      arch/m32r/kernel/smpboot.c
  17. 1 0
      arch/m32r/lib/csum_partial_copy.c
  18. 2 0
      arch/m32r/mm/discontig.c
  19. 4 1
      arch/ppc/Kconfig
  20. 10 4
      arch/ppc/platforms/4xx/Kconfig
  21. 4 4
      arch/s390/kernel/cpcmd.c
  22. 3 2
      arch/sparc/kernel/sparc_ksyms.c
  23. 1 1
      arch/sparc64/kernel/Makefile
  24. 3 0
      arch/sparc64/kernel/traps.c
  25. 153 0
      arch/sparc64/kernel/una_asm.S
  26. 59 202
      arch/sparc64/kernel/unaligned.c
  27. 8 7
      arch/x86_64/kernel/smpboot.c
  28. 1 3
      arch/x86_64/mm/fault.c
  29. 11 2
      arch/x86_64/pci/k8-bus.c
  30. 4 4
      drivers/char/Kconfig
  31. 1 0
      drivers/infiniband/Kconfig
  32. 1 0
      drivers/isdn/hisax/Kconfig
  33. 1 1
      drivers/macintosh/Kconfig
  34. 3 4
      drivers/md/md.c
  35. 1 1
      drivers/media/video/Kconfig
  36. 2 2
      drivers/net/Kconfig
  37. 1 2
      drivers/net/ibm_emac/ibm_emac_core.c
  38. 4 2
      drivers/net/tg3.c
  39. 1 1
      drivers/net/tokenring/Kconfig
  40. 1 1
      drivers/net/wireless/Kconfig
  41. 1 1
      drivers/parport/Kconfig
  42. 1 0
      drivers/pcmcia/pcmcia_resource.c
  43. 1 1
      drivers/s390/cio/qdio.c
  44. 0 9
      drivers/s390/crypto/z90crypt.h
  45. 3 3
      drivers/scsi/Kconfig
  46. 1 0
      drivers/scsi/ahci.c
  47. 1 1
      drivers/scsi/arm/Kconfig
  48. 1 1
      drivers/scsi/ata_piix.c
  49. 0 25
      drivers/scsi/libata-core.c
  50. 1 1
      drivers/scsi/libata.h
  51. 1 1
      drivers/scsi/sata_promise.c
  52. 2 2
      drivers/serial/Kconfig
  53. 1 1
      drivers/serial/m32r_sio.c
  54. 1 1
      drivers/usb/net/usbnet.c
  55. 1 2
      drivers/usb/net/zd1201.c
  56. 1 1
      drivers/video/console/Kconfig
  57. 4 4
      fs/afs/mntpt.c
  58. 3 2
      fs/autofs/symlink.c
  59. 2 2
      fs/autofs4/symlink.c
  60. 5 5
      fs/befs/linuxvfs.c
  61. 2 2
      fs/cifs/cifsfs.h
  62. 3 3
      fs/cifs/link.c
  63. 2 2
      fs/devfs/base.c
  64. 2 2
      fs/ext2/symlink.c
  65. 2 2
      fs/ext3/symlink.c
  66. 3 3
      fs/freevxfs/vxfs_immed.c
  67. 2 0
      fs/ioprio.c
  68. 9 7
      fs/jffs2/symlink.c
  69. 2 2
      fs/jfs/symlink.c
  70. 21 19
      fs/namei.c
  71. 1 0
      fs/nfs/dir.c
  72. 8 29
      fs/nfs/symlink.c
  73. 4 4
      fs/proc/base.c
  74. 2 2
      fs/proc/generic.c
  75. 3 3
      fs/smbfs/symlink.c
  76. 3 3
      fs/sysfs/symlink.c
  77. 2 2
      fs/sysv/symlink.c
  78. 2 2
      fs/ufs/symlink.c
  79. 5 5
      fs/xfs/linux-2.6/xfs_iops.c
  80. 13 16
      include/asm-alpha/system.h
  81. 4 2
      include/asm-arm/arch-ixp4xx/timex.h
  82. 1 1
      include/asm-arm/bug.h
  83. 1 1
      include/asm-arm/cpu-multi32.h
  84. 1 1
      include/asm-arm/cpu-single.h
  85. 0 8
      include/asm-ia64/io.h
  86. 0 2
      include/asm-m32r/smp.h
  87. 1 1
      include/asm-ppc/time.h
  88. 2 19
      include/asm-s390/uaccess.h
  89. 5 0
      include/asm-sparc64/thread_info.h
  90. 4 4
      include/linux/fs.h
  91. 16 2
      include/net/ax25.h
  92. 5 0
      include/net/sock.h
  93. 2 0
      include/sound/core.h
  94. 17 0
      kernel/cpuset.c
  95. 1 1
      kernel/timer.c
  96. 4 1
      lib/vsprintf.c
  97. 6 11
      mm/shmem.c
  98. 13 14
      net/ax25/af_ax25.c
  99. 7 5
      net/ax25/ax25_route.c
  100. 36 47
      net/ax25/ax25_uid.c

+ 1 - 1
Makefile

@@ -1,7 +1,7 @@
 VERSION = 2
 VERSION = 2
 PATCHLEVEL = 6
 PATCHLEVEL = 6
 SUBLEVEL = 13
 SUBLEVEL = 13
-EXTRAVERSION =-rc6
+EXTRAVERSION =-rc7
 NAME=Woozy Numbat
 NAME=Woozy Numbat
 
 
 # *DOCUMENTATION*
 # *DOCUMENTATION*

+ 1 - 1
arch/alpha/Kconfig

@@ -522,7 +522,7 @@ source "mm/Kconfig"
 
 
 config NUMA
 config NUMA
 	bool "NUMA Support (EXPERIMENTAL)"
 	bool "NUMA Support (EXPERIMENTAL)"
-	depends on DISCONTIGMEM
+	depends on DISCONTIGMEM && BROKEN
 	help
 	help
 	  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
 	  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
 	  Access).  This option is for configuring high-end multiprocessor
 	  Access).  This option is for configuring high-end multiprocessor

+ 3 - 3
arch/alpha/kernel/smp.c

@@ -1036,7 +1036,7 @@ debug_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
 	"	br	1b\n"
 	"	br	1b\n"
 	".previous"
 	".previous"
 	: "=r" (tmp), "=m" (lock->lock), "=r" (stuck)
 	: "=r" (tmp), "=m" (lock->lock), "=r" (stuck)
-	: "1" (lock->lock), "2" (stuck) : "memory");
+	: "m" (lock->lock), "2" (stuck) : "memory");
 
 
 	if (stuck < 0) {
 	if (stuck < 0) {
 		printk(KERN_WARNING
 		printk(KERN_WARNING
@@ -1115,7 +1115,7 @@ void _raw_write_lock(rwlock_t * lock)
 	".previous"
 	".previous"
 	: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy),
 	: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy),
 	  "=&r" (stuck_lock), "=&r" (stuck_reader)
 	  "=&r" (stuck_lock), "=&r" (stuck_reader)
-	: "0" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
+	: "m" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
 
 
 	if (stuck_lock < 0) {
 	if (stuck_lock < 0) {
 		printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc);
 		printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc);
@@ -1153,7 +1153,7 @@ void _raw_read_lock(rwlock_t * lock)
 	"	br	1b\n"
 	"	br	1b\n"
 	".previous"
 	".previous"
 	: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock)
 	: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock)
-	: "0" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
+	: "m" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
 
 
 	if (stuck_lock < 0) {
 	if (stuck_lock < 0) {
 		printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc);
 		printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc);

+ 3 - 3
arch/alpha/oprofile/common.c

@@ -65,7 +65,7 @@ op_axp_setup(void)
 	model->reg_setup(&reg, ctr, &sys);
 	model->reg_setup(&reg, ctr, &sys);
 
 
 	/* Configure the registers on all cpus.  */
 	/* Configure the registers on all cpus.  */
-	smp_call_function(model->cpu_setup, &reg, 0, 1);
+	(void)smp_call_function(model->cpu_setup, &reg, 0, 1);
 	model->cpu_setup(&reg);
 	model->cpu_setup(&reg);
 	return 0;
 	return 0;
 }
 }
@@ -86,7 +86,7 @@ op_axp_cpu_start(void *dummy)
 static int
 static int
 op_axp_start(void)
 op_axp_start(void)
 {
 {
-	smp_call_function(op_axp_cpu_start, NULL, 0, 1);
+	(void)smp_call_function(op_axp_cpu_start, NULL, 0, 1);
 	op_axp_cpu_start(NULL);
 	op_axp_cpu_start(NULL);
 	return 0;
 	return 0;
 }
 }
@@ -101,7 +101,7 @@ op_axp_cpu_stop(void *dummy)
 static void
 static void
 op_axp_stop(void)
 op_axp_stop(void)
 {
 {
-	smp_call_function(op_axp_cpu_stop, NULL, 0, 1);
+	(void)smp_call_function(op_axp_cpu_stop, NULL, 0, 1);
 	op_axp_cpu_stop(NULL);
 	op_axp_cpu_stop(NULL);
 }
 }
 
 

+ 1 - 1
arch/arm/Kconfig

@@ -310,7 +310,7 @@ menu "Kernel Features"
 
 
 config SMP
 config SMP
 	bool "Symmetric Multi-Processing (EXPERIMENTAL)"
 	bool "Symmetric Multi-Processing (EXPERIMENTAL)"
-	depends on EXPERIMENTAL #&& n
+	depends on EXPERIMENTAL && BROKEN #&& n
 	help
 	help
 	  This enables support for systems with more than one CPU. If you have
 	  This enables support for systems with more than one CPU. If you have
 	  a system with only one CPU, like most personal computers, say N. If
 	  a system with only one CPU, like most personal computers, say N. If

+ 1 - 1
arch/arm/kernel/traps.c

@@ -617,7 +617,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
 	notify_die("unknown data abort code", regs, &info, instr, 0);
 	notify_die("unknown data abort code", regs, &info, instr, 0);
 }
 }
 
 
-volatile void __bug(const char *file, int line, void *data)
+void __attribute__((noreturn)) __bug(const char *file, int line, void *data)
 {
 {
 	printk(KERN_CRIT"kernel BUG at %s:%d!", file, line);
 	printk(KERN_CRIT"kernel BUG at %s:%d!", file, line);
 	if (data)
 	if (data)

+ 3 - 3
arch/arm/nwfpe/fpopcode.h

@@ -370,20 +370,20 @@ TABLE 5
 #define getRoundingMode(opcode)		((opcode & MASK_ROUNDING_MODE) >> 5)
 #define getRoundingMode(opcode)		((opcode & MASK_ROUNDING_MODE) >> 5)
 
 
 #ifdef CONFIG_FPE_NWFPE_XP
 #ifdef CONFIG_FPE_NWFPE_XP
-static inline const floatx80 getExtendedConstant(const unsigned int nIndex)
+static inline __attribute_pure__ floatx80 getExtendedConstant(const unsigned int nIndex)
 {
 {
 	extern const floatx80 floatx80Constant[];
 	extern const floatx80 floatx80Constant[];
 	return floatx80Constant[nIndex];
 	return floatx80Constant[nIndex];
 }
 }
 #endif
 #endif
 
 
-static inline const float64 getDoubleConstant(const unsigned int nIndex)
+static inline __attribute_pure__ float64 getDoubleConstant(const unsigned int nIndex)
 {
 {
 	extern const float64 float64Constant[];
 	extern const float64 float64Constant[];
 	return float64Constant[nIndex];
 	return float64Constant[nIndex];
 }
 }
 
 
-static inline const float32 getSingleConstant(const unsigned int nIndex)
+static inline __attribute_pure__ float32 getSingleConstant(const unsigned int nIndex)
 {
 {
 	extern const float32 float32Constant[];
 	extern const float32 float32Constant[];
 	return float32Constant[nIndex];
 	return float32Constant[nIndex];

+ 2 - 2
arch/i386/kernel/nmi.c

@@ -195,7 +195,7 @@ static void disable_lapic_nmi_watchdog(void)
 			wrmsr(MSR_P6_EVNTSEL0, 0, 0);
 			wrmsr(MSR_P6_EVNTSEL0, 0, 0);
 			break;
 			break;
 		case 15:
 		case 15:
-			if (boot_cpu_data.x86_model > 0x3)
+			if (boot_cpu_data.x86_model > 0x4)
 				break;
 				break;
 
 
 			wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
 			wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
@@ -432,7 +432,7 @@ void setup_apic_nmi_watchdog (void)
 			setup_p6_watchdog();
 			setup_p6_watchdog();
 			break;
 			break;
 		case 15:
 		case 15:
-			if (boot_cpu_data.x86_model > 0x3)
+			if (boot_cpu_data.x86_model > 0x4)
 				return;
 				return;
 
 
 			if (!setup_p4_watchdog())
 			if (!setup_p4_watchdog())

+ 6 - 4
arch/i386/kernel/traps.c

@@ -803,15 +803,17 @@ void math_error(void __user *eip)
 	 */
 	 */
 	cwd = get_fpu_cwd(task);
 	cwd = get_fpu_cwd(task);
 	swd = get_fpu_swd(task);
 	swd = get_fpu_swd(task);
-	switch (((~cwd) & swd & 0x3f) | (swd & 0x240)) {
+	switch (swd & ~cwd & 0x3f) {
 		case 0x000:
 		case 0x000:
 		default:
 		default:
 			break;
 			break;
 		case 0x001: /* Invalid Op */
 		case 0x001: /* Invalid Op */
-		case 0x041: /* Stack Fault */
-		case 0x241: /* Stack Fault | Direction */
+			/*
+			 * swd & 0x240 == 0x040: Stack Underflow
+			 * swd & 0x240 == 0x240: Stack Overflow
+			 * User must clear the SF bit (0x40) if set
+			 */
 			info.si_code = FPE_FLTINV;
 			info.si_code = FPE_FLTINV;
-			/* Should we clear the SF or let user space do it ???? */
 			break;
 			break;
 		case 0x002: /* Denormalize */
 		case 0x002: /* Denormalize */
 		case 0x010: /* Underflow */
 		case 0x010: /* Underflow */

+ 1 - 1
arch/ia64/hp/sim/boot/boot_head.S

@@ -22,7 +22,7 @@ GLOBAL_ENTRY(_start)
 	.save rp, r0
 	.save rp, r0
 	.body
 	.body
 	movl gp = __gp
 	movl gp = __gp
-	movl sp = stack_mem
+	movl sp = stack_mem+16384-16
 	bsw.1
 	bsw.1
 	br.call.sptk.many rp=start_bootloader
 	br.call.sptk.many rp=start_bootloader
 END(_start)
 END(_start)

+ 10 - 8
arch/ia64/sn/kernel/io_init.c

@@ -323,7 +323,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
 	struct pci_controller *controller;
 	struct pci_controller *controller;
 	struct pcibus_bussoft *prom_bussoft_ptr;
 	struct pcibus_bussoft *prom_bussoft_ptr;
 	struct hubdev_info *hubdev_info;
 	struct hubdev_info *hubdev_info;
-	void *provider_soft;
+	void *provider_soft = NULL;
 	struct sn_pcibus_provider *provider;
 	struct sn_pcibus_provider *provider;
 
 
  	status = sal_get_pcibus_info((u64) segment, (u64) busnum,
  	status = sal_get_pcibus_info((u64) segment, (u64) busnum,
@@ -339,7 +339,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
 	if (bus == NULL) {
 	if (bus == NULL) {
  		bus = pci_scan_bus(busnum, &pci_root_ops, controller);
  		bus = pci_scan_bus(busnum, &pci_root_ops, controller);
  		if (bus == NULL)
  		if (bus == NULL)
- 			return;	/* error, or bus already scanned */
+ 			goto error_return; /* error, or bus already scanned */
  		bus->sysdata = NULL;
  		bus->sysdata = NULL;
 	}
 	}
 
 
@@ -352,28 +352,30 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
 	 */
 	 */
 
 
 	if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
 	if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
-		return;		/* unsupported asic type */
+		goto error_return; /* unsupported asic type */
 
 
 	if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
 	if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
 		goto error_return; /* no further fixup necessary */
 		goto error_return; /* no further fixup necessary */
 
 
 	provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
 	provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
 	if (provider == NULL)
 	if (provider == NULL)
-		return;		/* no provider registerd for this asic */
+		goto error_return; /* no provider registerd for this asic */
 
 
-	provider_soft = NULL;
+	bus->sysdata = controller;
 	if (provider->bus_fixup)
 	if (provider->bus_fixup)
 		provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
 		provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
 
 
-	if (provider_soft == NULL)
-		return;		/* fixup failed or not applicable */
+	if (provider_soft == NULL) {
+		/* fixup failed or not applicable */
+		bus->sysdata = NULL;
+		goto error_return;
+	}
 
 
 	/*
 	/*
 	 * Generic bus fixup goes here.  Don't reference prom_bussoft_ptr
 	 * Generic bus fixup goes here.  Don't reference prom_bussoft_ptr
 	 * after this point.
 	 * after this point.
 	 */
 	 */
 
 
-	bus->sysdata = controller;
 	PCI_CONTROLLER(bus)->platform_data = provider_soft;
 	PCI_CONTROLLER(bus)->platform_data = provider_soft;
 	nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
 	nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
 	cnode = nasid_to_cnodeid(nasid);
 	cnode = nasid_to_cnodeid(nasid);

+ 2 - 1
arch/m32r/Kconfig

@@ -269,7 +269,7 @@ config NR_CPUS
 # Common NUMA Features
 # Common NUMA Features
 config NUMA
 config NUMA
 	bool "Numa Memory Allocation Support"
 	bool "Numa Memory Allocation Support"
-	depends on SMP
+	depends on SMP && BROKEN
 	default n
 	default n
 
 
 # turning this on wastes a bunch of space.
 # turning this on wastes a bunch of space.
@@ -286,6 +286,7 @@ menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
 
 
 config PCI
 config PCI
 	bool "PCI support"
 	bool "PCI support"
+	depends on BROKEN
 	default n
 	default n
 	help
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  Find out whether you have a PCI motherboard. PCI is the name of a

+ 1 - 1
arch/m32r/Kconfig.debug

@@ -20,7 +20,7 @@ config DEBUG_STACK_USAGE
 
 
 config DEBUG_PAGEALLOC
 config DEBUG_PAGEALLOC
 	bool "Page alloc debugging"
 	bool "Page alloc debugging"
-	depends on DEBUG_KERNEL
+	depends on DEBUG_KERNEL && BROKEN
 	help
 	help
 	  Unmap pages from the kernel linear mapping after free_pages().
 	  Unmap pages from the kernel linear mapping after free_pages().
 	  This results in a large slowdown, but helps to find certain types
 	  This results in a large slowdown, but helps to find certain types

+ 3 - 1
arch/m32r/kernel/setup_m32700ut.c

@@ -30,9 +30,11 @@
 typedef struct {
 typedef struct {
 	unsigned long icucr;  /* ICU Control Register */
 	unsigned long icucr;  /* ICU Control Register */
 } icu_data_t;
 } icu_data_t;
+static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
+#else
+icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
 #endif /* CONFIG_SMP */
 #endif /* CONFIG_SMP */
 
 
-static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
 
 
 static void disable_m32700ut_irq(unsigned int irq)
 static void disable_m32700ut_irq(unsigned int irq)
 {
 {

+ 3 - 1
arch/m32r/kernel/setup_opsput.c

@@ -31,9 +31,11 @@
 typedef struct {
 typedef struct {
 	unsigned long icucr;  /* ICU Control Register */
 	unsigned long icucr;  /* ICU Control Register */
 } icu_data_t;
 } icu_data_t;
+static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
+#else
+icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
 #endif /* CONFIG_SMP */
 #endif /* CONFIG_SMP */
 
 
-static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
 
 
 static void disable_opsput_irq(unsigned int irq)
 static void disable_opsput_irq(unsigned int irq)
 {
 {

+ 1 - 0
arch/m32r/kernel/smpboot.c

@@ -91,6 +91,7 @@ extern struct {
 
 
 /* which physical physical ID maps to which logical CPU number */
 /* which physical physical ID maps to which logical CPU number */
 static volatile int physid_2_cpu[NR_CPUS];
 static volatile int physid_2_cpu[NR_CPUS];
+#define physid_to_cpu(physid)	physid_2_cpu[physid]
 
 
 /* which logical CPU number maps to which physical ID */
 /* which logical CPU number maps to which physical ID */
 volatile int cpu_2_physid[NR_CPUS];
 volatile int cpu_2_physid[NR_CPUS];

+ 1 - 0
arch/m32r/lib/csum_partial_copy.c

@@ -58,3 +58,4 @@ csum_partial_copy_from_user (const unsigned char __user *src,
 	return csum_partial(dst, len-missing, sum);
 	return csum_partial(dst, len-missing, sum);
 }
 }
 EXPORT_SYMBOL(csum_partial_copy_from_user);
 EXPORT_SYMBOL(csum_partial_copy_from_user);
+EXPORT_SYMBOL(csum_partial);

+ 2 - 0
arch/m32r/mm/discontig.c

@@ -12,12 +12,14 @@
 #include <linux/mmzone.h>
 #include <linux/mmzone.h>
 #include <linux/initrd.h>
 #include <linux/initrd.h>
 #include <linux/nodemask.h>
 #include <linux/nodemask.h>
+#include <linux/module.h>
 
 
 #include <asm/setup.h>
 #include <asm/setup.h>
 
 
 extern char _end[];
 extern char _end[];
 
 
 struct pglist_data *node_data[MAX_NUMNODES];
 struct pglist_data *node_data[MAX_NUMNODES];
+EXPORT_SYMBOL(node_data);
 static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata;
 static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata;
 
 
 pg_data_t m32r_node_data[MAX_NUMNODES];
 pg_data_t m32r_node_data[MAX_NUMNODES];

+ 4 - 1
arch/ppc/Kconfig

@@ -911,6 +911,7 @@ config PPCBUG_NVRAM
 	default y if PPC_PREP
 	default y if PPC_PREP
 
 
 config SMP
 config SMP
+	depends on PPC_STD_MMU
 	bool "Symmetric multi-processing support"
 	bool "Symmetric multi-processing support"
 	---help---
 	---help---
 	  This enables support for systems with more than one CPU. If you have
 	  This enables support for systems with more than one CPU. If you have
@@ -930,7 +931,7 @@ config SMP
 
 
 config IRQ_ALL_CPUS
 config IRQ_ALL_CPUS
 	bool "Distribute interrupts on all CPUs by default"
 	bool "Distribute interrupts on all CPUs by default"
-	depends on SMP
+	depends on SMP && !MV64360
 	help
 	help
 	  This option gives the kernel permission to distribute IRQs across
 	  This option gives the kernel permission to distribute IRQs across
 	  multiple CPUs.  Saying N here will route all IRQs to the first
 	  multiple CPUs.  Saying N here will route all IRQs to the first
@@ -1121,7 +1122,9 @@ config PROC_HARDWARE
 
 
 source "drivers/zorro/Kconfig"
 source "drivers/zorro/Kconfig"
 
 
+if !44x || BROKEN
 source kernel/power/Kconfig
 source kernel/power/Kconfig
+endif
 
 
 config SECCOMP
 config SECCOMP
 	bool "Enable seccomp to safely compute untrusted bytecode"
 	bool "Enable seccomp to safely compute untrusted bytecode"

+ 10 - 4
arch/ppc/platforms/4xx/Kconfig

@@ -3,6 +3,11 @@ config 4xx
 	depends on 40x || 44x
 	depends on 40x || 44x
 	default y
 	default y
 
 
+config WANT_EARLY_SERIAL
+	bool
+	select SERIAL_8250
+	default n
+
 menu "IBM 4xx options"
 menu "IBM 4xx options"
 	depends on 4xx
 	depends on 4xx
 
 
@@ -18,6 +23,7 @@ config ASH
 
 
 config BUBINGA
 config BUBINGA
 	bool "Bubinga"
 	bool "Bubinga"
+	select WANT_EARLY_SERIAL
 	help
 	help
 	  This option enables support for the IBM 405EP evaluation board.
 	  This option enables support for the IBM 405EP evaluation board.
 
 
@@ -70,21 +76,25 @@ choice
 
 
 config BAMBOO
 config BAMBOO
 	bool "Bamboo"
 	bool "Bamboo"
+	select WANT_EARLY_SERIAL
 	help
 	help
 	  This option enables support for the IBM PPC440EP evaluation board.
 	  This option enables support for the IBM PPC440EP evaluation board.
 
 
 config EBONY
 config EBONY
 	bool "Ebony"
 	bool "Ebony"
+	select WANT_EARLY_SERIAL
 	help
 	help
 	  This option enables support for the IBM PPC440GP evaluation board.
 	  This option enables support for the IBM PPC440GP evaluation board.
 
 
 config LUAN
 config LUAN
 	bool "Luan"
 	bool "Luan"
+	select WANT_EARLY_SERIAL
 	help
 	help
 	  This option enables support for the IBM PPC440SP evaluation board.
 	  This option enables support for the IBM PPC440SP evaluation board.
 
 
 config OCOTEA
 config OCOTEA
 	bool "Ocotea"
 	bool "Ocotea"
+	select WANT_EARLY_SERIAL
 	help
 	help
 	  This option enables support for the IBM PPC440GX evaluation board.
 	  This option enables support for the IBM PPC440GX evaluation board.
 
 
@@ -230,10 +240,6 @@ config PPC_GEN550
 	depends on 4xx
 	depends on 4xx
 	default y
 	default y
 
 
-config PM
-	bool "Power Management support (EXPERIMENTAL)"
-	depends on 4xx && EXPERIMENTAL
-
 choice
 choice
 	prompt "TTYS0 device and default console"
 	prompt "TTYS0 device and default console"
 	depends on 40x
 	depends on 40x

+ 4 - 4
arch/s390/kernel/cpcmd.c

@@ -46,9 +46,9 @@ int  __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
 				"lra	3,0(%4)\n"
 				"lra	3,0(%4)\n"
 				"lr	5,%5\n"
 				"lr	5,%5\n"
 				"diag	2,4,0x8\n"
 				"diag	2,4,0x8\n"
-				"brc	8, .Litfits\n"
+				"brc	8, 1f\n"
 				"ar	5, %5\n"
 				"ar	5, %5\n"
-				".Litfits: \n"
+				"1: \n"
 				"lr	%0,4\n"
 				"lr	%0,4\n"
 				"lr	%1,5\n"
 				"lr	%1,5\n"
 				: "=d" (return_code), "=d" (return_len)
 				: "=d" (return_code), "=d" (return_len)
@@ -64,9 +64,9 @@ int  __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
 				"sam31\n"
 				"sam31\n"
 				"diag	2,4,0x8\n"
 				"diag	2,4,0x8\n"
 				"sam64\n"
 				"sam64\n"
-				"brc	8, .Litfits\n"
+				"brc	8, 1f\n"
 				"agr	5, %5\n"
 				"agr	5, %5\n"
-				".Litfits: \n"
+				"1: \n"
 				"lgr	%0,4\n"
 				"lgr	%0,4\n"
 				"lgr	%1,5\n"
 				"lgr	%1,5\n"
 				: "=d" (return_code), "=d" (return_len)
 				: "=d" (return_code), "=d" (return_len)

+ 3 - 2
arch/sparc/kernel/sparc_ksyms.c

@@ -98,8 +98,9 @@ extern void ___rw_write_enter(void);
  * The module references will be fixed up by module_frob_arch_sections.
  * The module references will be fixed up by module_frob_arch_sections.
  */
  */
 #define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \
 #define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \
-	extern __ret __x(__arg1, __arg2) \
-	             __attribute__((weak, alias("." # __x)));
+	extern __ret __x(__arg1, __arg2); \
+	asm(".weak " #__x);\
+	asm(#__x "=." #__x);
 
 
 DOT_ALIAS2(int, div, int, int)
 DOT_ALIAS2(int, div, int, int)
 DOT_ALIAS2(int, mul, int, int)
 DOT_ALIAS2(int, mul, int, int)

+ 1 - 1
arch/sparc64/kernel/Makefile

@@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
 extra-y		:= head.o init_task.o vmlinux.lds
 extra-y		:= head.o init_task.o vmlinux.lds
 
 
 obj-y		:= process.o setup.o cpu.o idprom.o \
 obj-y		:= process.o setup.o cpu.o idprom.o \
-		   traps.o devices.o auxio.o \
+		   traps.o devices.o auxio.o una_asm.o \
 		   irq.o ptrace.o time.o sys_sparc.o signal.o \
 		   irq.o ptrace.o time.o sys_sparc.o signal.o \
 		   unaligned.o central.o pci.o starfire.o semaphore.o \
 		   unaligned.o central.o pci.o starfire.o semaphore.o \
 		   power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o
 		   power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o

+ 3 - 0
arch/sparc64/kernel/traps.c

@@ -2127,6 +2127,9 @@ void __init trap_init(void)
 	    TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) ||
 	    TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) ||
 	    TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
 	    TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
 	    TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) ||
 	    TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) ||
+	    TI_RESTART_BLOCK != offsetof(struct thread_info, restart_block) ||
+	    TI_KUNA_REGS != offsetof(struct thread_info, kern_una_regs) ||
+	    TI_KUNA_INSN != offsetof(struct thread_info, kern_una_insn) ||
 	    TI_FPREGS != offsetof(struct thread_info, fpregs) ||
 	    TI_FPREGS != offsetof(struct thread_info, fpregs) ||
 	    (TI_FPREGS & (64 - 1)))
 	    (TI_FPREGS & (64 - 1)))
 		thread_info_offsets_are_bolixed_dave();
 		thread_info_offsets_are_bolixed_dave();

+ 153 - 0
arch/sparc64/kernel/una_asm.S

@@ -0,0 +1,153 @@
+/* una_asm.S: Kernel unaligned trap assembler helpers.
+ *
+ * Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
+ * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ */
+
+	.text
+
+kernel_unaligned_trap_fault:
+	call	kernel_mna_trap_fault
+	 nop
+	retl
+	 nop
+	.size	kern_unaligned_trap_fault, .-kern_unaligned_trap_fault
+
+	.globl	__do_int_store
+__do_int_store:
+	rd	%asi, %o4
+	wr	%o3, 0, %asi
+	ldx	[%o2], %g3
+	cmp	%o1, 2
+	be,pn	%icc, 2f
+	 cmp	%o1, 4
+	be,pt	%icc, 1f
+	 srlx	%g3, 24, %g2
+	srlx	%g3, 56, %g1
+	srlx	%g3, 48, %g7
+4:	stba	%g1, [%o0] %asi
+	srlx	%g3, 40, %g1
+5:	stba	%g7, [%o0 + 1] %asi
+	srlx	%g3, 32, %g7
+6:	stba	%g1, [%o0 + 2] %asi
+7:	stba	%g7, [%o0 + 3] %asi
+	srlx	%g3, 16, %g1
+8:	stba	%g2, [%o0 + 4] %asi
+	srlx	%g3, 8, %g7
+9:	stba	%g1, [%o0 + 5] %asi
+10:	stba	%g7, [%o0 + 6] %asi
+	ba,pt	%xcc, 0f
+11:	 stba	%g3, [%o0 + 7] %asi
+1:	srl	%g3, 16, %g7
+12:	stba	%g2, [%o0] %asi
+	srl	%g3, 8, %g2
+13:	stba	%g7, [%o0 + 1] %asi
+14:	stba	%g2, [%o0 + 2] %asi
+	ba,pt	%xcc, 0f
+15:	 stba	%g3, [%o0 + 3] %asi
+2:	srl	%g3, 8, %g2
+16:	stba	%g2, [%o0] %asi
+17:	stba	%g3, [%o0 + 1] %asi
+0:
+	wr	%o4, 0x0, %asi
+	retl
+	 nop
+	.size	__do_int_store, .-__do_int_store
+
+	.section	__ex_table
+	.word		4b, kernel_unaligned_trap_fault
+	.word		5b, kernel_unaligned_trap_fault
+	.word		6b, kernel_unaligned_trap_fault
+	.word		7b, kernel_unaligned_trap_fault
+	.word		8b, kernel_unaligned_trap_fault
+	.word		9b, kernel_unaligned_trap_fault
+	.word		10b, kernel_unaligned_trap_fault
+	.word		11b, kernel_unaligned_trap_fault
+	.word		12b, kernel_unaligned_trap_fault
+	.word		13b, kernel_unaligned_trap_fault
+	.word		14b, kernel_unaligned_trap_fault
+	.word		15b, kernel_unaligned_trap_fault
+	.word		16b, kernel_unaligned_trap_fault
+	.word		17b, kernel_unaligned_trap_fault
+	.previous
+
+	.globl	do_int_load
+do_int_load:
+	rd	%asi, %o5
+	wr	%o4, 0, %asi
+	cmp	%o1, 8
+	bge,pn	%icc, 9f
+	 cmp	%o1, 4
+	be,pt	%icc, 6f
+4:	 lduba	[%o2] %asi, %g2
+5:	lduba	[%o2 + 1] %asi, %g3
+	sll	%g2, 8, %g2
+	brz,pt	%o3, 3f
+	 add	%g2, %g3, %g2
+	sllx	%g2, 48, %g2
+	srax	%g2, 48, %g2
+3:	ba,pt	%xcc, 0f
+	 stx	%g2, [%o0]
+6:	lduba	[%o2 + 1] %asi, %g3
+	sll	%g2, 24, %g2
+7:	lduba	[%o2 + 2] %asi, %g7
+	sll	%g3, 16, %g3
+8:	lduba	[%o2 + 3] %asi, %g1
+	sll	%g7, 8, %g7
+	or	%g2, %g3, %g2
+	or	%g7, %g1, %g7
+	or	%g2, %g7, %g2
+	brnz,a,pt %o3, 3f
+	 sra	%g2, 0, %g2
+3:	ba,pt	%xcc, 0f
+	 stx	%g2, [%o0]
+9:	lduba	[%o2] %asi, %g2
+10:	lduba	[%o2 + 1] %asi, %g3
+	sllx	%g2, 56, %g2
+11:	lduba	[%o2 + 2] %asi, %g7
+	sllx	%g3, 48, %g3
+12:	lduba	[%o2 + 3] %asi, %g1
+	sllx	%g7, 40, %g7
+	sllx	%g1, 32, %g1
+	or	%g2, %g3, %g2
+	or	%g7, %g1, %g7
+13:	lduba	[%o2 + 4] %asi, %g3
+	or	%g2, %g7, %g7
+14:	lduba	[%o2 + 5] %asi, %g1
+	sllx	%g3, 24, %g3
+15:	lduba	[%o2 + 6] %asi, %g2
+	sllx	%g1, 16, %g1
+	or	%g7, %g3, %g7
+16:	lduba	[%o2 + 7] %asi, %g3
+	sllx	%g2, 8, %g2
+	or	%g7, %g1, %g7
+	or	%g2, %g3, %g2
+	or	%g7, %g2, %g7
+	cmp	%o1, 8
+	be,a,pt %icc, 0f
+	 stx	%g7, [%o0]
+	srlx	%g7, 32, %g2
+	sra	%g7, 0, %g7
+	stx	%g2, [%o0]
+	stx	%g7, [%o0 + 8]
+0:
+	wr	%o5, 0x0, %asi
+	retl
+	 nop
+	.size	__do_int_load, .-__do_int_load
+
+	.section	__ex_table
+	.word		4b, kernel_unaligned_trap_fault
+	.word		5b, kernel_unaligned_trap_fault
+	.word		6b, kernel_unaligned_trap_fault
+	.word		7b, kernel_unaligned_trap_fault
+	.word		8b, kernel_unaligned_trap_fault
+	.word		9b, kernel_unaligned_trap_fault
+	.word		10b, kernel_unaligned_trap_fault
+	.word		11b, kernel_unaligned_trap_fault
+	.word		12b, kernel_unaligned_trap_fault
+	.word		13b, kernel_unaligned_trap_fault
+	.word		14b, kernel_unaligned_trap_fault
+	.word		15b, kernel_unaligned_trap_fault
+	.word		16b, kernel_unaligned_trap_fault
+	.previous

+ 59 - 202
arch/sparc64/kernel/unaligned.c

@@ -180,169 +180,28 @@ static void __attribute_used__ unaligned_panic(char *str, struct pt_regs *regs)
 	die_if_kernel(str, regs);
 	die_if_kernel(str, regs);
 }
 }
 
 
-#define do_integer_load(dest_reg, size, saddr, is_signed, asi, errh) ({		\
-__asm__ __volatile__ (								\
-	"wr	%4, 0, %%asi\n\t"						\
-	"cmp	%1, 8\n\t"							\
-	"bge,pn	%%icc, 9f\n\t"							\
-	" cmp	%1, 4\n\t"							\
-	"be,pt	%%icc, 6f\n"							\
-"4:\t"	" lduba	[%2] %%asi, %%l1\n"						\
-"5:\t"	"lduba	[%2 + 1] %%asi, %%l2\n\t"					\
-	"sll	%%l1, 8, %%l1\n\t"						\
-	"brz,pt	%3, 3f\n\t"							\
-	" add	%%l1, %%l2, %%l1\n\t"						\
-	"sllx	%%l1, 48, %%l1\n\t"						\
-	"srax	%%l1, 48, %%l1\n"						\
-"3:\t"	"ba,pt	%%xcc, 0f\n\t"							\
-	" stx	%%l1, [%0]\n"							\
-"6:\t"	"lduba	[%2 + 1] %%asi, %%l2\n\t"					\
-	"sll	%%l1, 24, %%l1\n"						\
-"7:\t"	"lduba	[%2 + 2] %%asi, %%g7\n\t"					\
-	"sll	%%l2, 16, %%l2\n"						\
-"8:\t"	"lduba	[%2 + 3] %%asi, %%g1\n\t"					\
-	"sll	%%g7, 8, %%g7\n\t"						\
-	"or	%%l1, %%l2, %%l1\n\t"						\
-	"or	%%g7, %%g1, %%g7\n\t"						\
-	"or	%%l1, %%g7, %%l1\n\t"						\
-	"brnz,a,pt %3, 3f\n\t"							\
-	" sra	%%l1, 0, %%l1\n"						\
-"3:\t"	"ba,pt	%%xcc, 0f\n\t"							\
-	" stx	%%l1, [%0]\n"							\
-"9:\t"	"lduba	[%2] %%asi, %%l1\n"						\
-"10:\t"	"lduba	[%2 + 1] %%asi, %%l2\n\t"					\
-	"sllx	%%l1, 56, %%l1\n"						\
-"11:\t"	"lduba	[%2 + 2] %%asi, %%g7\n\t"					\
-	"sllx	%%l2, 48, %%l2\n"						\
-"12:\t"	"lduba	[%2 + 3] %%asi, %%g1\n\t"					\
-	"sllx	%%g7, 40, %%g7\n\t"						\
-	"sllx	%%g1, 32, %%g1\n\t"						\
-	"or	%%l1, %%l2, %%l1\n\t"						\
-	"or	%%g7, %%g1, %%g7\n"						\
-"13:\t"	"lduba	[%2 + 4] %%asi, %%l2\n\t"					\
-	"or	%%l1, %%g7, %%g7\n"						\
-"14:\t"	"lduba	[%2 + 5] %%asi, %%g1\n\t"					\
-	"sllx	%%l2, 24, %%l2\n"						\
-"15:\t"	"lduba	[%2 + 6] %%asi, %%l1\n\t"					\
-	"sllx	%%g1, 16, %%g1\n\t"						\
-	"or	%%g7, %%l2, %%g7\n"						\
-"16:\t"	"lduba	[%2 + 7] %%asi, %%l2\n\t"					\
-	"sllx	%%l1, 8, %%l1\n\t"						\
-	"or	%%g7, %%g1, %%g7\n\t"						\
-	"or	%%l1, %%l2, %%l1\n\t"						\
-	"or	%%g7, %%l1, %%g7\n\t"						\
-	"cmp	%1, 8\n\t"							\
-	"be,a,pt %%icc, 0f\n\t"							\
-	" stx	%%g7, [%0]\n\t"							\
-	"srlx	%%g7, 32, %%l1\n\t"						\
-	"sra	%%g7, 0, %%g7\n\t"						\
-	"stx	%%l1, [%0]\n\t"							\
-	"stx	%%g7, [%0 + 8]\n"						\
-"0:\n\t"									\
-	"wr	%%g0, %5, %%asi\n\n\t"						\
-	".section __ex_table\n\t"						\
-	".word	4b, " #errh "\n\t"						\
-	".word	5b, " #errh "\n\t"						\
-	".word	6b, " #errh "\n\t"						\
-	".word	7b, " #errh "\n\t"						\
-	".word	8b, " #errh "\n\t"						\
-	".word	9b, " #errh "\n\t"						\
-	".word	10b, " #errh "\n\t"						\
-	".word	11b, " #errh "\n\t"						\
-	".word	12b, " #errh "\n\t"						\
-	".word	13b, " #errh "\n\t"						\
-	".word	14b, " #errh "\n\t"						\
-	".word	15b, " #errh "\n\t"						\
-	".word	16b, " #errh "\n\n\t"						\
-	".previous\n\t"								\
-	: : "r" (dest_reg), "r" (size), "r" (saddr), "r" (is_signed),		\
-	  "r" (asi), "i" (ASI_AIUS)						\
-	: "l1", "l2", "g7", "g1", "cc");					\
-})
+extern void do_int_load(unsigned long *dest_reg, int size,
+			unsigned long *saddr, int is_signed, int asi);
 	
 	
-#define store_common(dst_addr, size, src_val, asi, errh) ({			\
-__asm__ __volatile__ (								\
-	"wr	%3, 0, %%asi\n\t"						\
-	"ldx	[%2], %%l1\n"							\
-	"cmp	%1, 2\n\t"							\
-	"be,pn	%%icc, 2f\n\t"							\
-	" cmp	%1, 4\n\t"							\
-	"be,pt	%%icc, 1f\n\t"							\
-	" srlx	%%l1, 24, %%l2\n\t"						\
-	"srlx	%%l1, 56, %%g1\n\t"						\
-	"srlx	%%l1, 48, %%g7\n"						\
-"4:\t"	"stba	%%g1, [%0] %%asi\n\t"						\
-	"srlx	%%l1, 40, %%g1\n"						\
-"5:\t"	"stba	%%g7, [%0 + 1] %%asi\n\t"					\
-	"srlx	%%l1, 32, %%g7\n"						\
-"6:\t"	"stba	%%g1, [%0 + 2] %%asi\n"						\
-"7:\t"	"stba	%%g7, [%0 + 3] %%asi\n\t"					\
-	"srlx	%%l1, 16, %%g1\n"						\
-"8:\t"	"stba	%%l2, [%0 + 4] %%asi\n\t"					\
-	"srlx	%%l1, 8, %%g7\n"						\
-"9:\t"	"stba	%%g1, [%0 + 5] %%asi\n"						\
-"10:\t"	"stba	%%g7, [%0 + 6] %%asi\n\t"					\
-	"ba,pt	%%xcc, 0f\n"							\
-"11:\t"	" stba	%%l1, [%0 + 7] %%asi\n"						\
-"1:\t"	"srl	%%l1, 16, %%g7\n"						\
-"12:\t"	"stba	%%l2, [%0] %%asi\n\t"						\
-	"srl	%%l1, 8, %%l2\n"						\
-"13:\t"	"stba	%%g7, [%0 + 1] %%asi\n"						\
-"14:\t"	"stba	%%l2, [%0 + 2] %%asi\n\t"					\
-	"ba,pt	%%xcc, 0f\n"							\
-"15:\t"	" stba	%%l1, [%0 + 3] %%asi\n"						\
-"2:\t"	"srl	%%l1, 8, %%l2\n"						\
-"16:\t"	"stba	%%l2, [%0] %%asi\n"						\
-"17:\t"	"stba	%%l1, [%0 + 1] %%asi\n"						\
-"0:\n\t"									\
-	"wr	%%g0, %4, %%asi\n\n\t"						\
-	".section __ex_table\n\t"						\
-	".word	4b, " #errh "\n\t"						\
-	".word	5b, " #errh "\n\t"						\
-	".word	6b, " #errh "\n\t"						\
-	".word	7b, " #errh "\n\t"						\
-	".word	8b, " #errh "\n\t"						\
-	".word	9b, " #errh "\n\t"						\
-	".word	10b, " #errh "\n\t"						\
-	".word	11b, " #errh "\n\t"						\
-	".word	12b, " #errh "\n\t"						\
-	".word	13b, " #errh "\n\t"						\
-	".word	14b, " #errh "\n\t"						\
-	".word	15b, " #errh "\n\t"						\
-	".word	16b, " #errh "\n\t"						\
-	".word	17b, " #errh "\n\n\t"						\
-	".previous\n\t"								\
-	: : "r" (dst_addr), "r" (size), "r" (src_val), "r" (asi), "i" (ASI_AIUS)\
-	: "l1", "l2", "g7", "g1", "cc");					\
-})
-
-#define do_integer_store(reg_num, size, dst_addr, regs, asi, errh) ({		\
-	unsigned long zero = 0;							\
-	unsigned long *src_val = &zero;						\
-										\
-	if (size == 16) {							\
-		size = 8;							\
-		zero = (((long)(reg_num ? 					\
-		        (unsigned)fetch_reg(reg_num, regs) : 0)) << 32) |	\
-			(unsigned)fetch_reg(reg_num + 1, regs);			\
-	} else if (reg_num) src_val = fetch_reg_addr(reg_num, regs);		\
-	store_common(dst_addr, size, src_val, asi, errh);			\
-})
-
-extern void smp_capture(void);
-extern void smp_release(void);
-
-#define do_atomic(srcdest_reg, mem, errh) ({					\
-	unsigned long flags, tmp;						\
-										\
-	smp_capture();								\
-	local_irq_save(flags);							\
-	tmp = *srcdest_reg;							\
-	do_integer_load(srcdest_reg, 4, mem, 0, errh);				\
-	store_common(mem, 4, &tmp, errh);					\
-	local_irq_restore(flags);						\
-	smp_release();								\
-})
+extern void __do_int_store(unsigned long *dst_addr, int size,
+			   unsigned long *src_val, int asi);
+
+static inline void do_int_store(int reg_num, int size, unsigned long *dst_addr,
+				struct pt_regs *regs, int asi)
+{
+	unsigned long zero = 0;
+	unsigned long *src_val = &zero;
+
+	if (size == 16) {
+		size = 8;
+		zero = (((long)(reg_num ?
+		        (unsigned)fetch_reg(reg_num, regs) : 0)) << 32) |
+			(unsigned)fetch_reg(reg_num + 1, regs);
+	} else if (reg_num) {
+		src_val = fetch_reg_addr(reg_num, regs);
+	}
+	__do_int_store(dst_addr, size, src_val, asi);
+}
 
 
 static inline void advance(struct pt_regs *regs)
 static inline void advance(struct pt_regs *regs)
 {
 {
@@ -364,24 +223,29 @@ static inline int ok_for_kernel(unsigned int insn)
 	return !floating_point_load_or_store_p(insn);
 	return !floating_point_load_or_store_p(insn);
 }
 }
 
 
-void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("kernel_mna_trap_fault");
-
-void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
+void kernel_mna_trap_fault(void)
 {
 {
-	unsigned long g2 = regs->u_regs [UREG_G2];
+	struct pt_regs *regs = current_thread_info()->kern_una_regs;
+	unsigned int insn = current_thread_info()->kern_una_insn;
+	unsigned long g2 = regs->u_regs[UREG_G2];
 	unsigned long fixup = search_extables_range(regs->tpc, &g2);
 	unsigned long fixup = search_extables_range(regs->tpc, &g2);
 
 
 	if (!fixup) {
 	if (!fixup) {
-		unsigned long address = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f));
+		unsigned long address;
+
+		address = compute_effective_address(regs, insn,
+						    ((insn >> 25) & 0x1f));
         	if (address < PAGE_SIZE) {
         	if (address < PAGE_SIZE) {
-                	printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference in mna handler");
+                	printk(KERN_ALERT "Unable to handle kernel NULL "
+			       "pointer dereference in mna handler");
         	} else
         	} else
-                	printk(KERN_ALERT "Unable to handle kernel paging request in mna handler");
+                	printk(KERN_ALERT "Unable to handle kernel paging "
+			       "request in mna handler");
 	        printk(KERN_ALERT " at virtual address %016lx\n",address);
 	        printk(KERN_ALERT " at virtual address %016lx\n",address);
-		printk(KERN_ALERT "current->{mm,active_mm}->context = %016lx\n",
+		printk(KERN_ALERT "current->{active_,}mm->context = %016lx\n",
 			(current->mm ? CTX_HWBITS(current->mm->context) :
 			(current->mm ? CTX_HWBITS(current->mm->context) :
 			CTX_HWBITS(current->active_mm->context)));
 			CTX_HWBITS(current->active_mm->context)));
-		printk(KERN_ALERT "current->{mm,active_mm}->pgd = %016lx\n",
+		printk(KERN_ALERT "current->{active_,}mm->pgd = %016lx\n",
 			(current->mm ? (unsigned long) current->mm->pgd :
 			(current->mm ? (unsigned long) current->mm->pgd :
 			(unsigned long) current->active_mm->pgd));
 			(unsigned long) current->active_mm->pgd));
 	        die_if_kernel("Oops", regs);
 	        die_if_kernel("Oops", regs);
@@ -400,48 +264,41 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
 	enum direction dir = decode_direction(insn);
 	enum direction dir = decode_direction(insn);
 	int size = decode_access_size(insn);
 	int size = decode_access_size(insn);
 
 
+	current_thread_info()->kern_una_regs = regs;
+	current_thread_info()->kern_una_insn = insn;
+
 	if (!ok_for_kernel(insn) || dir == both) {
 	if (!ok_for_kernel(insn) || dir == both) {
-		printk("Unsupported unaligned load/store trap for kernel at <%016lx>.\n",
-		       regs->tpc);
-		unaligned_panic("Kernel does fpu/atomic unaligned load/store.", regs);
-
-		__asm__ __volatile__ ("\n"
-"kernel_unaligned_trap_fault:\n\t"
-		"mov	%0, %%o0\n\t"
-		"call	kernel_mna_trap_fault\n\t"
-		" mov	%1, %%o1\n\t"
-		:
-		: "r" (regs), "r" (insn)
-		: "o0", "o1", "o2", "o3", "o4", "o5", "o7",
-		  "g1", "g2", "g3", "g4", "g7", "cc");
+		printk("Unsupported unaligned load/store trap for kernel "
+		       "at <%016lx>.\n", regs->tpc);
+		unaligned_panic("Kernel does fpu/atomic "
+				"unaligned load/store.", regs);
+
+		kernel_mna_trap_fault();
 	} else {
 	} else {
-		unsigned long addr = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f));
+		unsigned long addr;
 
 
+		addr = compute_effective_address(regs, insn,
+						 ((insn >> 25) & 0x1f));
 #ifdef DEBUG_MNA
 #ifdef DEBUG_MNA
-		printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] retpc[%016lx]\n",
-		       regs->tpc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]);
+		printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] "
+		       "retpc[%016lx]\n",
+		       regs->tpc, dirstrings[dir], addr, size,
+		       regs->u_regs[UREG_RETPC]);
 #endif
 #endif
 		switch (dir) {
 		switch (dir) {
 		case load:
 		case load:
-			do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
-					size, (unsigned long *) addr,
-					decode_signedness(insn), decode_asi(insn, regs),
-					kernel_unaligned_trap_fault);
+			do_int_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
+				    size, (unsigned long *) addr,
+				    decode_signedness(insn),
+				    decode_asi(insn, regs));
 			break;
 			break;
 
 
 		case store:
 		case store:
-			do_integer_store(((insn>>25)&0x1f), size,
-					 (unsigned long *) addr, regs,
-					 decode_asi(insn, regs),
-					 kernel_unaligned_trap_fault);
-			break;
-#if 0 /* unsupported */
-		case both:
-			do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs),
-				  (unsigned long *) addr,
-				  kernel_unaligned_trap_fault);
+			do_int_store(((insn>>25)&0x1f), size,
+				     (unsigned long *) addr, regs,
+				     decode_asi(insn, regs));
 			break;
 			break;
-#endif
+
 		default:
 		default:
 			panic("Impossible kernel unaligned trap.");
 			panic("Impossible kernel unaligned trap.");
 			/* Not reached... */
 			/* Not reached... */

+ 8 - 7
arch/x86_64/kernel/smpboot.c

@@ -492,6 +492,14 @@ void __cpuinit start_secondary(void)
 	 */
 	 */
 	set_cpu_sibling_map(smp_processor_id());
 	set_cpu_sibling_map(smp_processor_id());
 
 
+	/* 
+  	 * Wait for TSC sync to not schedule things before.
+	 * We still process interrupts, which could see an inconsistent
+	 * time in that window unfortunately. 
+	 * Do this here because TSC sync has global unprotected state.
+ 	 */
+	tsc_sync_wait();
+
 	/*
 	/*
 	 * We need to hold call_lock, so there is no inconsistency
 	 * We need to hold call_lock, so there is no inconsistency
 	 * between the time smp_call_function() determines number of
 	 * between the time smp_call_function() determines number of
@@ -509,13 +517,6 @@ void __cpuinit start_secondary(void)
 	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
 	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
 	unlock_ipi_call_lock();
 	unlock_ipi_call_lock();
 
 
-	mb();
-
-	/* Wait for TSC sync to not schedule things before.
-	   We still process interrupts, which could see an inconsistent
-	   time in that window unfortunately. */
-	tsc_sync_wait();
-
 	cpu_idle();
 	cpu_idle();
 }
 }
 
 

+ 1 - 3
arch/x86_64/mm/fault.c

@@ -211,9 +211,7 @@ int unhandled_signal(struct task_struct *tsk, int sig)
 {
 {
 	if (tsk->pid == 1)
 	if (tsk->pid == 1)
 		return 1;
 		return 1;
-	/* Warn for strace, but not for gdb */
-	if (!test_ti_thread_flag(tsk->thread_info, TIF_SYSCALL_TRACE) &&
-	    (tsk->ptrace & PT_PTRACED))
+	if (tsk->ptrace & PT_PTRACED)
 		return 0;
 		return 0;
 	return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
 	return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
 		(tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);
 		(tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);

+ 11 - 2
arch/x86_64/pci/k8-bus.c

@@ -47,13 +47,22 @@ fill_mp_bus_to_cpumask(void)
 			 * if there are no busses hanging off of the current
 			 * if there are no busses hanging off of the current
 			 * ldt link then both the secondary and subordinate
 			 * ldt link then both the secondary and subordinate
 			 * bus number fields are set to 0.
 			 * bus number fields are set to 0.
+			 * 
+			 * RED-PEN
+			 * This is slightly broken because it assumes
+ 			 * HT node IDs == Linux node ids, which is not always
+			 * true. However it is probably mostly true.
 			 */
 			 */
 			if (!(SECONDARY_LDT_BUS_NUMBER(ldtbus) == 0
 			if (!(SECONDARY_LDT_BUS_NUMBER(ldtbus) == 0
 				&& SUBORDINATE_LDT_BUS_NUMBER(ldtbus) == 0)) {
 				&& SUBORDINATE_LDT_BUS_NUMBER(ldtbus) == 0)) {
 				for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
 				for (j = SECONDARY_LDT_BUS_NUMBER(ldtbus);
 				     j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
 				     j <= SUBORDINATE_LDT_BUS_NUMBER(ldtbus);
-				     j++)
-					pci_bus_to_node[j] = NODE_ID(nid);
+				     j++) { 
+					int node = NODE_ID(nid);
+					if (!node_online(node))
+						node = 0;
+					pci_bus_to_node[j] = node;
+				}		
 			}
 			}
 		}
 		}
 	}
 	}

+ 4 - 4
drivers/char/Kconfig

@@ -80,7 +80,7 @@ config SERIAL_NONSTANDARD
 
 
 config COMPUTONE
 config COMPUTONE
 	tristate "Computone IntelliPort Plus serial support"
 	tristate "Computone IntelliPort Plus serial support"
-	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
+	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32)
 	---help---
 	---help---
 	  This driver supports the entire family of Intelliport II/Plus
 	  This driver supports the entire family of Intelliport II/Plus
 	  controllers with the exception of the MicroChannel controllers and
 	  controllers with the exception of the MicroChannel controllers and
@@ -138,7 +138,7 @@ config CYZ_INTR
 
 
 config DIGIEPCA
 config DIGIEPCA
 	tristate "Digiboard Intelligent Async Support"
 	tristate "Digiboard Intelligent Async Support"
-	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
+	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (!64BIT || BROKEN)
 	---help---
 	---help---
 	  This is a driver for Digi International's Xx, Xeve, and Xem series
 	  This is a driver for Digi International's Xx, Xeve, and Xem series
 	  of cards which provide multiple serial ports. You would need
 	  of cards which provide multiple serial ports. You would need
@@ -208,7 +208,7 @@ config SYNCLINK
 
 
 config SYNCLINKMP
 config SYNCLINKMP
 	tristate "SyncLink Multiport support"
 	tristate "SyncLink Multiport support"
-	depends on SERIAL_NONSTANDARD
+	depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32)
 	help
 	help
 	  Enable support for the SyncLink Multiport (2 or 4 ports)
 	  Enable support for the SyncLink Multiport (2 or 4 ports)
 	  serial adapter, running asynchronous and HDLC communications up
 	  serial adapter, running asynchronous and HDLC communications up
@@ -735,7 +735,7 @@ config SGI_IP27_RTC
 
 
 config GEN_RTC
 config GEN_RTC
 	tristate "Generic /dev/rtc emulation"
 	tristate "Generic /dev/rtc emulation"
-	depends on RTC!=y && !IA64 && !ARM && !PPC64
+	depends on RTC!=y && !IA64 && !ARM && !PPC64 && !M32R && !SPARC32
 	---help---
 	---help---
 	  If you say Y here and create a character special file /dev/rtc with
 	  If you say Y here and create a character special file /dev/rtc with
 	  major number 10 and minor number 135 using mknod ("man mknod"), you
 	  major number 10 and minor number 135 using mknod ("man mknod"), you

+ 1 - 0
drivers/infiniband/Kconfig

@@ -1,6 +1,7 @@
 menu "InfiniBand support"
 menu "InfiniBand support"
 
 
 config INFINIBAND
 config INFINIBAND
+	depends on PCI || BROKEN
 	tristate "InfiniBand support"
 	tristate "InfiniBand support"
 	---help---
 	---help---
 	  Core support for InfiniBand (IB).  Make sure to also select
 	  Core support for InfiniBand (IB).  Make sure to also select

+ 1 - 0
drivers/isdn/hisax/Kconfig

@@ -134,6 +134,7 @@ config HISAX_AVM_A1
 
 
 config HISAX_FRITZPCI
 config HISAX_FRITZPCI
 	bool "AVM PnP/PCI (Fritz!PnP/PCI)"
 	bool "AVM PnP/PCI (Fritz!PnP/PCI)"
+	depends on BROKEN || !PPC64
 	help
 	help
 	  This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
 	  This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
 	  See <file:Documentation/isdn/README.HiSax> on how to configure it.
 	  See <file:Documentation/isdn/README.HiSax> on how to configure it.

+ 1 - 1
drivers/macintosh/Kconfig

@@ -103,7 +103,7 @@ config PMAC_MEDIABAY
 # on non-powerbook machines (but only on PMU based ones AFAIK)
 # on non-powerbook machines (but only on PMU based ones AFAIK)
 config PMAC_BACKLIGHT
 config PMAC_BACKLIGHT
 	bool "Backlight control for LCD screens"
 	bool "Backlight control for LCD screens"
-	depends on ADB_PMU
+	depends on ADB_PMU && (BROKEN || !PPC64)
 	help
 	help
 	  Say Y here to build in code to manage the LCD backlight on a
 	  Say Y here to build in code to manage the LCD backlight on a
 	  Macintosh PowerBook.  With this code, the backlight will be turned
 	  Macintosh PowerBook.  With this code, the backlight will be turned

+ 3 - 4
drivers/md/md.c

@@ -256,8 +256,7 @@ static inline void mddev_unlock(mddev_t * mddev)
 {
 {
 	up(&mddev->reconfig_sem);
 	up(&mddev->reconfig_sem);
 
 
-	if (mddev->thread)
-		md_wakeup_thread(mddev->thread);
+	md_wakeup_thread(mddev->thread);
 }
 }
 
 
 mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)
 mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)
@@ -1714,6 +1713,7 @@ static int do_md_run(mddev_t * mddev)
 	mddev->in_sync = 1;
 	mddev->in_sync = 1;
 	
 	
 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
 	set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+	md_wakeup_thread(mddev->thread);
 	
 	
 	if (mddev->sb_dirty)
 	if (mddev->sb_dirty)
 		md_update_sb(mddev);
 		md_update_sb(mddev);
@@ -2236,8 +2236,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
 			export_rdev(rdev);
 			export_rdev(rdev);
 
 
 		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
 		set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-		if (mddev->thread)
-			md_wakeup_thread(mddev->thread);
+		md_wakeup_thread(mddev->thread);
 		return err;
 		return err;
 	}
 	}
 
 

+ 1 - 1
drivers/media/video/Kconfig

@@ -356,7 +356,7 @@ config VIDEO_M32R_AR
 
 
 config VIDEO_M32R_AR_M64278
 config VIDEO_M32R_AR_M64278
 	tristate "Use Colour AR module M64278(VGA)"
 	tristate "Use Colour AR module M64278(VGA)"
-	depends on VIDEO_M32R_AR
+	depends on VIDEO_M32R_AR && PLAT_M32700UT
 	---help---
 	---help---
 	  Say Y here to use the Renesas M64278E-800 camera module,
 	  Say Y here to use the Renesas M64278E-800 camera module,
 	  which supports VGA(640x480 pixcels) size of images.
 	  which supports VGA(640x480 pixcels) size of images.

+ 2 - 2
drivers/net/Kconfig

@@ -1147,7 +1147,7 @@ config IBMVETH
 	  be called ibmveth.
 	  be called ibmveth.
 
 
 config IBM_EMAC
 config IBM_EMAC
-	tristate "IBM PPC4xx EMAC driver support"
+	bool "IBM PPC4xx EMAC driver support"
 	depends on 4xx
 	depends on 4xx
 	select CRC32
 	select CRC32
 	---help---
 	---help---
@@ -1156,7 +1156,7 @@ config IBM_EMAC
 
 
 config IBM_EMAC_ERRMSG
 config IBM_EMAC_ERRMSG
 	bool "Verbose error messages"
 	bool "Verbose error messages"
-	depends on IBM_EMAC
+	depends on IBM_EMAC && BROKEN
 
 
 config IBM_EMAC_RXB
 config IBM_EMAC_RXB
 	int "Number of receive buffers"
 	int "Number of receive buffers"

+ 1 - 2
drivers/net/ibm_emac/ibm_emac_core.c

@@ -1712,11 +1712,10 @@ struct mal_commac_ops emac_commac_ops = {
 };
 };
 
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
 #ifdef CONFIG_NET_POLL_CONTROLLER
-static int emac_netpoll(struct net_device *ndev)
+static void emac_netpoll(struct net_device *ndev)
 {
 {
 	emac_rxeob_dev((void *)ndev, 0);
 	emac_rxeob_dev((void *)ndev, 0);
 	emac_txeob_dev((void *)ndev, 0);
 	emac_txeob_dev((void *)ndev, 0);
-	return 0;
 }
 }
 #endif
 #endif
 
 

+ 4 - 2
drivers/net/tg3.c

@@ -66,8 +66,8 @@
 
 
 #define DRV_MODULE_NAME		"tg3"
 #define DRV_MODULE_NAME		"tg3"
 #define PFX DRV_MODULE_NAME	": "
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"3.35"
-#define DRV_MODULE_RELDATE	"August 6, 2005"
+#define DRV_MODULE_VERSION	"3.36"
+#define DRV_MODULE_RELDATE	"August 19, 2005"
 
 
 #define TG3_DEF_MAC_MODE	0
 #define TG3_DEF_MAC_MODE	0
 #define TG3_DEF_RX_MODE		0
 #define TG3_DEF_RX_MODE		0
@@ -8970,6 +8970,8 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
 		tp->phy_id = hw_phy_id;
 		tp->phy_id = hw_phy_id;
 		if (hw_phy_id_masked == PHY_ID_BCM8002)
 		if (hw_phy_id_masked == PHY_ID_BCM8002)
 			tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
 			tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES;
+		else
+			tp->tg3_flags2 &= ~TG3_FLG2_PHY_SERDES;
 	} else {
 	} else {
 		if (tp->phy_id != PHY_ID_INVALID) {
 		if (tp->phy_id != PHY_ID_INVALID) {
 			/* Do nothing, phy ID already set up in
 			/* Do nothing, phy ID already set up in

+ 1 - 1
drivers/net/tokenring/Kconfig

@@ -84,7 +84,7 @@ config 3C359
 
 
 config TMS380TR
 config TMS380TR
 	tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
 	tristate "Generic TMS380 Token Ring ISA/PCI adapter support"
-	depends on TR && (PCI || ISA || MCA)
+	depends on TR && (PCI || ISA && ISA_DMA_API || MCA)
 	select FW_LOADER
 	select FW_LOADER
 	---help---
 	---help---
 	  This driver provides generic support for token ring adapters
 	  This driver provides generic support for token ring adapters

+ 1 - 1
drivers/net/wireless/Kconfig

@@ -270,7 +270,7 @@ config PCMCIA_HERMES
 
 
 config AIRO_CS
 config AIRO_CS
 	tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
 	tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
-	depends on NET_RADIO && PCMCIA
+	depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
 	---help---
 	---help---
 	  This is the standard Linux driver to support Cisco/Aironet PCMCIA
 	  This is the standard Linux driver to support Cisco/Aironet PCMCIA
 	  802.11 wireless cards.  This driver is the same as the Aironet
 	  802.11 wireless cards.  This driver is the same as the Aironet

+ 1 - 1
drivers/parport/Kconfig

@@ -34,7 +34,7 @@ config PARPORT
 
 
 config PARPORT_PC
 config PARPORT_PC
 	tristate "PC-style hardware"
 	tristate "PC-style hardware"
-	depends on PARPORT && (!SPARC64 || PCI) && !SPARC32
+	depends on PARPORT && (!SPARC64 || PCI) && !SPARC32 && !M32R
 	---help---
 	---help---
 	  You should say Y here if you have a PC-style parallel port. All
 	  You should say Y here if you have a PC-style parallel port. All
 	  IBM PC compatible computers and some Alphas have PC-style
 	  IBM PC compatible computers and some Alphas have PC-style

+ 1 - 0
drivers/pcmcia/pcmcia_resource.c

@@ -41,6 +41,7 @@ module_param(io_speed, int, 0444);
 
 
 
 
 #ifdef CONFIG_PCMCIA_PROBE
 #ifdef CONFIG_PCMCIA_PROBE
+#include <asm/irq.h>
 /* mask of IRQs already reserved by other cards, we should avoid using them */
 /* mask of IRQs already reserved by other cards, we should avoid using them */
 static u8 pcmcia_used_irq[NR_IRQS];
 static u8 pcmcia_used_irq[NR_IRQS];
 #endif
 #endif

+ 1 - 1
drivers/s390/cio/qdio.c

@@ -230,7 +230,7 @@ qdio_siga_input(struct qdio_q *q)
 }
 }
 
 
 /* locked by the locks in qdio_activate and qdio_cleanup */
 /* locked by the locks in qdio_activate and qdio_cleanup */
-static __u32 * volatile 
+static __u32 volatile *
 qdio_get_indicator(void)
 qdio_get_indicator(void)
 {
 {
 	int i;
 	int i;

+ 0 - 9
drivers/s390/crypto/z90crypt.h

@@ -35,15 +35,6 @@
 #define z90crypt_RELEASE 3	// 2 = PCIXCC, 3 = rewrite for coding standards
 #define z90crypt_RELEASE 3	// 2 = PCIXCC, 3 = rewrite for coding standards
 #define z90crypt_VARIANT 2	// 2 = added PCIXCC MCL3 and CEX2C support
 #define z90crypt_VARIANT 2	// 2 = added PCIXCC MCL3 and CEX2C support
 
 
-/**
- * If we are not using the sparse checker, __user has no use.
- */
-#ifdef __CHECKER__
-# define __user		__attribute__((noderef, address_space(1)))
-#else
-# define __user
-#endif
-
 /**
 /**
  * struct ica_rsa_modexpo
  * struct ica_rsa_modexpo
  *
  *

+ 3 - 3
drivers/scsi/Kconfig

@@ -1696,7 +1696,7 @@ config TT_DMA_EMUL
 
 
 config MAC_SCSI
 config MAC_SCSI
 	bool "Macintosh NCR5380 SCSI"
 	bool "Macintosh NCR5380 SCSI"
-	depends on MAC && SCSI
+	depends on MAC && SCSI=y
 	help
 	help
 	  This is the NCR 5380 SCSI controller included on most of the 68030
 	  This is the NCR 5380 SCSI controller included on most of the 68030
 	  based Macintoshes.  If you have one of these say Y and read the
 	  based Macintoshes.  If you have one of these say Y and read the
@@ -1717,7 +1717,7 @@ config SCSI_MAC_ESP
 
 
 config MVME147_SCSI
 config MVME147_SCSI
 	bool "WD33C93 SCSI driver for MVME147"
 	bool "WD33C93 SCSI driver for MVME147"
-	depends on MVME147 && SCSI
+	depends on MVME147 && SCSI=y
 	help
 	help
 	  Support for the on-board SCSI controller on the Motorola MVME147
 	  Support for the on-board SCSI controller on the Motorola MVME147
 	  single-board computer.
 	  single-board computer.
@@ -1758,7 +1758,7 @@ config SUN3_SCSI
 
 
 config SUN3X_ESP
 config SUN3X_ESP
 	bool "Sun3x ESP SCSI"
 	bool "Sun3x ESP SCSI"
-	depends on SUN3X && SCSI
+	depends on SUN3X && SCSI=y
 	help
 	help
 	  The ESP was an on-board SCSI controller used on Sun 3/80
 	  The ESP was an on-board SCSI controller used on Sun 3/80
 	  machines.  Say Y here to compile in support for it.
 	  machines.  Say Y here to compile in support for it.

+ 1 - 0
drivers/scsi/ahci.c

@@ -1105,6 +1105,7 @@ MODULE_AUTHOR("Jeff Garzik");
 MODULE_DESCRIPTION("AHCI SATA low-level driver");
 MODULE_DESCRIPTION("AHCI SATA low-level driver");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
 MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
 MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
 
 
 module_init(ahci_init);
 module_init(ahci_init);
 module_exit(ahci_exit);
 module_exit(ahci_exit);

+ 1 - 1
drivers/scsi/arm/Kconfig

@@ -3,7 +3,7 @@
 #
 #
 config SCSI_ACORNSCSI_3
 config SCSI_ACORNSCSI_3
 	tristate "Acorn SCSI card (aka30) support"
 	tristate "Acorn SCSI card (aka30) support"
-	depends on ARCH_ACORN && SCSI
+	depends on ARCH_ACORN && SCSI && BROKEN
 	help
 	help
 	  This enables support for the Acorn SCSI card (aka30). If you have an
 	  This enables support for the Acorn SCSI card (aka30). If you have an
 	  Acorn system with one of these, say Y. If unsure, say N.
 	  Acorn system with one of these, say Y. If unsure, say N.

+ 1 - 1
drivers/scsi/ata_piix.c

@@ -32,7 +32,7 @@
 #include <linux/libata.h>
 #include <linux/libata.h>
 
 
 #define DRV_NAME	"ata_piix"
 #define DRV_NAME	"ata_piix"
-#define DRV_VERSION	"1.03"
+#define DRV_VERSION	"1.04"
 
 
 enum {
 enum {
 	PIIX_IOCFG		= 0x54, /* IDE I/O configuration register */
 	PIIX_IOCFG		= 0x54, /* IDE I/O configuration register */

+ 0 - 25
drivers/scsi/libata-core.c

@@ -2268,19 +2268,6 @@ void ata_qc_prep(struct ata_queued_cmd *qc)
  *	spin_lock_irqsave(host_set lock)
  *	spin_lock_irqsave(host_set lock)
  */
  */
 
 
-
-
-/**
- *	ata_sg_init_one - Prepare a one-entry scatter-gather list.
- *	@qc:  Queued command
- *	@buf:  transfer buffer
- *	@buflen:  length of buf
- *
- *	Builds a single-entry scatter-gather list to initiate a
- *	transfer utilizing the specified buffer.
- *
- *	LOCKING:
- */
 void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
 void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
 {
 {
 	struct scatterlist *sg;
 	struct scatterlist *sg;
@@ -2312,18 +2299,6 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
  *	spin_lock_irqsave(host_set lock)
  *	spin_lock_irqsave(host_set lock)
  */
  */
 
 
-
-/**
- *	ata_sg_init - Assign a scatter gather list to a queued command
- *	@qc:  Queued command
- *	@sg:  Scatter-gather list
- *	@n_elem:  length of sg list
- *
- *	Attaches a scatter-gather list to a queued command.
- *
- *	LOCKING:
- */
-
 void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
 void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
 		 unsigned int n_elem)
 		 unsigned int n_elem)
 {
 {

+ 1 - 1
drivers/scsi/libata.h

@@ -26,7 +26,7 @@
 #define __LIBATA_H__
 #define __LIBATA_H__
 
 
 #define DRV_NAME	"libata"
 #define DRV_NAME	"libata"
-#define DRV_VERSION	"1.11"	/* must be exactly four chars */
+#define DRV_VERSION	"1.12"	/* must be exactly four chars */
 
 
 struct ata_scsi_args {
 struct ata_scsi_args {
 	u16			*id;
 	u16			*id;

+ 1 - 1
drivers/scsi/sata_promise.c

@@ -40,7 +40,7 @@
 #include "sata_promise.h"
 #include "sata_promise.h"
 
 
 #define DRV_NAME	"sata_promise"
 #define DRV_NAME	"sata_promise"
-#define DRV_VERSION	"1.01"
+#define DRV_VERSION	"1.02"
 
 
 
 
 enum {
 enum {

+ 2 - 2
drivers/serial/Kconfig

@@ -211,7 +211,7 @@ comment "Non-8250 serial port support"
 
 
 config SERIAL_AMBA_PL010
 config SERIAL_AMBA_PL010
 	tristate "ARM AMBA PL010 serial port support"
 	tristate "ARM AMBA PL010 serial port support"
-	depends on ARM_AMBA
+	depends on ARM_AMBA && (BROKEN || !ARCH_VERSATILE)
 	select SERIAL_CORE
 	select SERIAL_CORE
 	help
 	help
 	  This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
 	  This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
@@ -819,7 +819,7 @@ config SERIAL_M32R_SIO_CONSOLE
 
 
 config SERIAL_M32R_PLDSIO
 config SERIAL_M32R_PLDSIO
 	bool "M32R SIO I/F on a PLD"
 	bool "M32R SIO I/F on a PLD"
-	depends on SERIAL_M32R_SIO=y
+	depends on SERIAL_M32R_SIO=y && (PLAT_OPSPUT || PALT_USRV || PLAT_M32700UT)
 	default n
 	default n
 	help
 	help
 	  Say Y here if you want to use the M32R serial controller
 	  Say Y here if you want to use the M32R serial controller

+ 1 - 1
drivers/serial/m32r_sio.c

@@ -1123,7 +1123,7 @@ static int __init m32r_sio_console_setup(struct console *co, char *options)
 	return uart_set_options(port, co, baud, parity, bits, flow);
 	return uart_set_options(port, co, baud, parity, bits, flow);
 }
 }
 
 
-extern struct uart_driver m32r_sio_reg;
+static struct uart_driver m32r_sio_reg;
 static struct console m32r_sio_console = {
 static struct console m32r_sio_console = {
 	.name		= "ttyS",
 	.name		= "ttyS",
 	.write		= m32r_sio_console_write,
 	.write		= m32r_sio_console_write,

+ 1 - 1
drivers/usb/net/usbnet.c

@@ -1922,7 +1922,7 @@ static int genelink_rx_fixup (struct usbnet *dev, struct sk_buff *skb)
 
 
 			// copy the packet data to the new skb
 			// copy the packet data to the new skb
 			memcpy(skb_put(gl_skb, size), packet->packet_data, size);
 			memcpy(skb_put(gl_skb, size), packet->packet_data, size);
-			skb_return (dev, skb);
+			skb_return (dev, gl_skb);
 		}
 		}
 
 
 		// advance to the next packet
 		// advance to the next packet

+ 1 - 2
drivers/usb/net/zd1201.c

@@ -346,8 +346,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
 			if (datalen<14)
 			if (datalen<14)
 				goto resubmit;
 				goto resubmit;
 			if ((seq & IEEE802_11_SCTL_FRAG) == 0) {
 			if ((seq & IEEE802_11_SCTL_FRAG) == 0) {
-				frag = kmalloc(sizeof(struct zd1201_frag*),
-				    GFP_ATOMIC);
+				frag = kmalloc(sizeof(*frag), GFP_ATOMIC);
 				if (!frag)
 				if (!frag)
 					goto resubmit;
 					goto resubmit;
 				skb = dev_alloc_skb(IEEE802_11_DATA_LEN +14+2);
 				skb = dev_alloc_skb(IEEE802_11_DATA_LEN +14+2);

+ 1 - 1
drivers/video/console/Kconfig

@@ -6,7 +6,7 @@ menu "Console display driver support"
 
 
 config VGA_CONSOLE
 config VGA_CONSOLE
 	bool "VGA text console" if EMBEDDED || !X86
 	bool "VGA text console" if EMBEDDED || !X86
-	depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC32 && !SPARC64 && !M68K && !PARISC
+	depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC32 && !SPARC64 && !M68K && !PARISC && !ARCH_VERSATILE
 	default y
 	default y
 	help
 	help
 	  Saying Y here will allow you to use Linux in text mode through a
 	  Saying Y here will allow you to use Linux in text mode through a

+ 4 - 4
fs/afs/mntpt.c

@@ -30,7 +30,7 @@ static struct dentry *afs_mntpt_lookup(struct inode *dir,
 				       struct dentry *dentry,
 				       struct dentry *dentry,
 				       struct nameidata *nd);
 				       struct nameidata *nd);
 static int afs_mntpt_open(struct inode *inode, struct file *file);
 static int afs_mntpt_open(struct inode *inode, struct file *file);
-static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd);
+static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd);
 
 
 struct file_operations afs_mntpt_file_operations = {
 struct file_operations afs_mntpt_file_operations = {
 	.open		= afs_mntpt_open,
 	.open		= afs_mntpt_open,
@@ -233,7 +233,7 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt)
 /*
 /*
  * follow a link from a mountpoint directory, thus causing it to be mounted
  * follow a link from a mountpoint directory, thus causing it to be mounted
  */
  */
-static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct vfsmount *newmnt;
 	struct vfsmount *newmnt;
 	struct dentry *old_dentry;
 	struct dentry *old_dentry;
@@ -249,7 +249,7 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
 	newmnt = afs_mntpt_do_automount(dentry);
 	newmnt = afs_mntpt_do_automount(dentry);
 	if (IS_ERR(newmnt)) {
 	if (IS_ERR(newmnt)) {
 		path_release(nd);
 		path_release(nd);
-		return PTR_ERR(newmnt);
+		return (void *)newmnt;
 	}
 	}
 
 
 	old_dentry = nd->dentry;
 	old_dentry = nd->dentry;
@@ -267,7 +267,7 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
 	}
 	}
 
 
 	kleave(" = %d", err);
 	kleave(" = %d", err);
-	return err;
+	return ERR_PTR(err);
 } /* end afs_mntpt_follow_link() */
 } /* end afs_mntpt_follow_link() */
 
 
 /*****************************************************************************/
 /*****************************************************************************/

+ 3 - 2
fs/autofs/symlink.c

@@ -12,11 +12,12 @@
 
 
 #include "autofs_i.h"
 #include "autofs_i.h"
 
 
-static int autofs_follow_link(struct dentry *dentry, struct nameidata *nd)
+/* Nothing to release.. */
+static void *autofs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	char *s=((struct autofs_symlink *)dentry->d_inode->u.generic_ip)->data;
 	char *s=((struct autofs_symlink *)dentry->d_inode->u.generic_ip)->data;
 	nd_set_link(nd, s);
 	nd_set_link(nd, s);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations autofs_symlink_inode_operations = {
 struct inode_operations autofs_symlink_inode_operations = {

+ 2 - 2
fs/autofs4/symlink.c

@@ -12,11 +12,11 @@
 
 
 #include "autofs_i.h"
 #include "autofs_i.h"
 
 
-static int autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct autofs_info *ino = autofs4_dentry_ino(dentry);
 	struct autofs_info *ino = autofs4_dentry_ino(dentry);
 	nd_set_link(nd, (char *)ino->u.symlink);
 	nd_set_link(nd, (char *)ino->u.symlink);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations autofs4_symlink_inode_operations = {
 struct inode_operations autofs4_symlink_inode_operations = {

+ 5 - 5
fs/befs/linuxvfs.c

@@ -41,8 +41,8 @@ static struct inode *befs_alloc_inode(struct super_block *sb);
 static void befs_destroy_inode(struct inode *inode);
 static void befs_destroy_inode(struct inode *inode);
 static int befs_init_inodecache(void);
 static int befs_init_inodecache(void);
 static void befs_destroy_inodecache(void);
 static void befs_destroy_inodecache(void);
-static int befs_follow_link(struct dentry *, struct nameidata *);
-static void befs_put_link(struct dentry *, struct nameidata *);
+static void *befs_follow_link(struct dentry *, struct nameidata *);
+static void befs_put_link(struct dentry *, struct nameidata *, void *);
 static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
 static int befs_utf2nls(struct super_block *sb, const char *in, int in_len,
 			char **out, int *out_len);
 			char **out, int *out_len);
 static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
 static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
@@ -461,7 +461,7 @@ befs_destroy_inodecache(void)
  * The data stream become link name. Unless the LONG_SYMLINK
  * The data stream become link name. Unless the LONG_SYMLINK
  * flag is set.
  * flag is set.
  */
  */
-static int
+static void *
 befs_follow_link(struct dentry *dentry, struct nameidata *nd)
 befs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
 	befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
@@ -487,10 +487,10 @@ befs_follow_link(struct dentry *dentry, struct nameidata *nd)
 	}
 	}
 
 
 	nd_set_link(nd, link);
 	nd_set_link(nd, link);
-	return 0;
+	return NULL;
 }
 }
 
 
-static void befs_put_link(struct dentry *dentry, struct nameidata *nd)
+static void befs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
 {
 {
 	befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
 	befs_inode_info *befs_ino = BEFS_I(dentry->d_inode);
 	if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {
 	if (befs_ino->i_flags & BEFS_LONG_SYMLINK) {

+ 2 - 2
fs/cifs/cifsfs.h

@@ -83,8 +83,8 @@ extern int cifs_dir_notify(struct file *, unsigned long arg);
 extern struct dentry_operations cifs_dentry_ops;
 extern struct dentry_operations cifs_dentry_ops;
 
 
 /* Functions related to symlinks */
 /* Functions related to symlinks */
-extern int cifs_follow_link(struct dentry *direntry, struct nameidata *nd);
-extern void cifs_put_link(struct dentry *direntry, struct nameidata *nd);
+extern void *cifs_follow_link(struct dentry *direntry, struct nameidata *nd);
+extern void cifs_put_link(struct dentry *direntry, struct nameidata *nd, void *);
 extern int cifs_readlink(struct dentry *direntry, char __user *buffer, 
 extern int cifs_readlink(struct dentry *direntry, char __user *buffer, 
 			 int buflen);
 			 int buflen);
 extern int cifs_symlink(struct inode *inode, struct dentry *direntry,
 extern int cifs_symlink(struct inode *inode, struct dentry *direntry,

+ 3 - 3
fs/cifs/link.c

@@ -92,7 +92,7 @@ cifs_hl_exit:
 	return rc;
 	return rc;
 }
 }
 
 
-int
+void *
 cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
 cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
 {
 {
 	struct inode *inode = direntry->d_inode;
 	struct inode *inode = direntry->d_inode;
@@ -148,7 +148,7 @@ out:
 out_no_free:
 out_no_free:
 	FreeXid(xid);
 	FreeXid(xid);
 	nd_set_link(nd, target_path);
 	nd_set_link(nd, target_path);
-	return 0;
+	return NULL;	/* No cookie */
 }
 }
 
 
 int
 int
@@ -330,7 +330,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
 	return rc;
 	return rc;
 }
 }
 
 
-void cifs_put_link(struct dentry *direntry, struct nameidata *nd)
+void cifs_put_link(struct dentry *direntry, struct nameidata *nd, void *cookie)
 {
 {
 	char *p = nd_get_link(nd);
 	char *p = nd_get_link(nd);
 	if (!IS_ERR(p))
 	if (!IS_ERR(p))

+ 2 - 2
fs/devfs/base.c

@@ -2491,11 +2491,11 @@ static int devfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
 	return 0;
 	return 0;
 }				/*  End Function devfs_mknod  */
 }				/*  End Function devfs_mknod  */
 
 
-static int devfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *devfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct devfs_entry *p = get_devfs_entry_from_vfs_inode(dentry->d_inode);
 	struct devfs_entry *p = get_devfs_entry_from_vfs_inode(dentry->d_inode);
 	nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV));
 	nd_set_link(nd, p ? p->u.symlink.linkname : ERR_PTR(-ENODEV));
-	return 0;
+	return NULL;
 }				/*  End Function devfs_follow_link  */
 }				/*  End Function devfs_follow_link  */
 
 
 static struct inode_operations devfs_iops = {
 static struct inode_operations devfs_iops = {

+ 2 - 2
fs/ext2/symlink.c

@@ -21,11 +21,11 @@
 #include "xattr.h"
 #include "xattr.h"
 #include <linux/namei.h>
 #include <linux/namei.h>
 
 
-static int ext2_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *ext2_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct ext2_inode_info *ei = EXT2_I(dentry->d_inode);
 	struct ext2_inode_info *ei = EXT2_I(dentry->d_inode);
 	nd_set_link(nd, (char *)ei->i_data);
 	nd_set_link(nd, (char *)ei->i_data);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations ext2_symlink_inode_operations = {
 struct inode_operations ext2_symlink_inode_operations = {

+ 2 - 2
fs/ext3/symlink.c

@@ -23,11 +23,11 @@
 #include <linux/namei.h>
 #include <linux/namei.h>
 #include "xattr.h"
 #include "xattr.h"
 
 
-static int ext3_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void * ext3_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct ext3_inode_info *ei = EXT3_I(dentry->d_inode);
 	struct ext3_inode_info *ei = EXT3_I(dentry->d_inode);
 	nd_set_link(nd, (char*)ei->i_data);
 	nd_set_link(nd, (char*)ei->i_data);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations ext3_symlink_inode_operations = {
 struct inode_operations ext3_symlink_inode_operations = {

+ 3 - 3
fs/freevxfs/vxfs_immed.c

@@ -38,7 +38,7 @@
 #include "vxfs_inode.h"
 #include "vxfs_inode.h"
 
 
 
 
-static int	vxfs_immed_follow_link(struct dentry *, struct nameidata *);
+static void *	vxfs_immed_follow_link(struct dentry *, struct nameidata *);
 
 
 static int	vxfs_immed_readpage(struct file *, struct page *);
 static int	vxfs_immed_readpage(struct file *, struct page *);
 
 
@@ -72,12 +72,12 @@ struct address_space_operations vxfs_immed_aops = {
  * Returns:
  * Returns:
  *   Zero on success, else a negative error code.
  *   Zero on success, else a negative error code.
  */
  */
-static int
+static void *
 vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
 vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
 {
 {
 	struct vxfs_inode_info		*vip = VXFS_INO(dp->d_inode);
 	struct vxfs_inode_info		*vip = VXFS_INO(dp->d_inode);
 	nd_set_link(np, vip->vii_immed.vi_immed);
 	nd_set_link(np, vip->vii_immed.vi_immed);
-	return 0;
+	return NULL;
 }
 }
 
 
 /**
 /**

+ 2 - 0
fs/ioprio.c

@@ -62,6 +62,8 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
 
 
 			break;
 			break;
 		case IOPRIO_CLASS_IDLE:
 		case IOPRIO_CLASS_IDLE:
+			if (!capable(CAP_SYS_ADMIN))
+				return -EPERM;
 			break;
 			break;
 		default:
 		default:
 			return -EINVAL;
 			return -EINVAL;

+ 9 - 7
fs/jffs2/symlink.c

@@ -18,7 +18,7 @@
 #include <linux/namei.h>
 #include <linux/namei.h>
 #include "nodelist.h"
 #include "nodelist.h"
 
 
-static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
+static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
 
 
 struct inode_operations jffs2_symlink_inode_operations =
 struct inode_operations jffs2_symlink_inode_operations =
 {	
 {	
@@ -27,9 +27,10 @@ struct inode_operations jffs2_symlink_inode_operations =
 	.setattr =	jffs2_setattr
 	.setattr =	jffs2_setattr
 };
 };
 
 
-static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
+	char *p = (char *)f->dents;
 	
 	
 	/*
 	/*
 	 * We don't acquire the f->sem mutex here since the only data we
 	 * We don't acquire the f->sem mutex here since the only data we
@@ -45,19 +46,20 @@ static int jffs2_follow_link(struct dentry *dentry, struct nameidata *nd)
 	 * nd_set_link() call.
 	 * nd_set_link() call.
 	 */
 	 */
 	
 	
-	if (!f->dents) {
+	if (!p) {
 		printk(KERN_ERR "jffs2_follow_link(): can't find symlink taerget\n");
 		printk(KERN_ERR "jffs2_follow_link(): can't find symlink taerget\n");
-		return -EIO;
+		p = ERR_PTR(-EIO);
+	} else {
+		D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->dents));
 	}
 	}
-	D1(printk(KERN_DEBUG "jffs2_follow_link(): target path is '%s'\n", (char *) f->dents));
 
 
-	nd_set_link(nd, (char *)f->dents);
+	nd_set_link(nd, p);
 	
 	
 	/*
 	/*
 	 * We unlock the f->sem mutex but VFS will use the f->dents string. This is safe
 	 * We unlock the f->sem mutex but VFS will use the f->dents string. This is safe
 	 * since the only way that may cause f->dents to be changed is iput() operation.
 	 * since the only way that may cause f->dents to be changed is iput() operation.
 	 * But VFS will not use f->dents after iput() has been called.
 	 * But VFS will not use f->dents after iput() has been called.
 	 */
 	 */
-	return 0;
+	return NULL;
 }
 }
 
 

+ 2 - 2
fs/jfs/symlink.c

@@ -22,11 +22,11 @@
 #include "jfs_inode.h"
 #include "jfs_inode.h"
 #include "jfs_xattr.h"
 #include "jfs_xattr.h"
 
 
-static int jfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *jfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	char *s = JFS_IP(dentry->d_inode)->i_inline;
 	char *s = JFS_IP(dentry->d_inode)->i_inline;
 	nd_set_link(nd, s);
 	nd_set_link(nd, s);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations jfs_symlink_inode_operations = {
 struct inode_operations jfs_symlink_inode_operations = {

+ 21 - 19
fs/namei.c

@@ -501,6 +501,7 @@ struct path {
 static inline int __do_follow_link(struct path *path, struct nameidata *nd)
 static inline int __do_follow_link(struct path *path, struct nameidata *nd)
 {
 {
 	int error;
 	int error;
+	void *cookie;
 	struct dentry *dentry = path->dentry;
 	struct dentry *dentry = path->dentry;
 
 
 	touch_atime(path->mnt, dentry);
 	touch_atime(path->mnt, dentry);
@@ -508,13 +509,15 @@ static inline int __do_follow_link(struct path *path, struct nameidata *nd)
 
 
 	if (path->mnt == nd->mnt)
 	if (path->mnt == nd->mnt)
 		mntget(path->mnt);
 		mntget(path->mnt);
-	error = dentry->d_inode->i_op->follow_link(dentry, nd);
-	if (!error) {
+	cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
+	error = PTR_ERR(cookie);
+	if (!IS_ERR(cookie)) {
 		char *s = nd_get_link(nd);
 		char *s = nd_get_link(nd);
+		error = 0;
 		if (s)
 		if (s)
 			error = __vfs_follow_link(nd, s);
 			error = __vfs_follow_link(nd, s);
 		if (dentry->d_inode->i_op->put_link)
 		if (dentry->d_inode->i_op->put_link)
-			dentry->d_inode->i_op->put_link(dentry, nd);
+			dentry->d_inode->i_op->put_link(dentry, nd, cookie);
 	}
 	}
 	dput(dentry);
 	dput(dentry);
 	mntput(path->mnt);
 	mntput(path->mnt);
@@ -2344,15 +2347,17 @@ out:
 int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 {
 {
 	struct nameidata nd;
 	struct nameidata nd;
-	int res;
+	void *cookie;
+
 	nd.depth = 0;
 	nd.depth = 0;
-	res = dentry->d_inode->i_op->follow_link(dentry, &nd);
-	if (!res) {
-		res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
+	cookie = dentry->d_inode->i_op->follow_link(dentry, &nd);
+	if (!IS_ERR(cookie)) {
+		int res = vfs_readlink(dentry, buffer, buflen, nd_get_link(&nd));
 		if (dentry->d_inode->i_op->put_link)
 		if (dentry->d_inode->i_op->put_link)
-			dentry->d_inode->i_op->put_link(dentry, &nd);
+			dentry->d_inode->i_op->put_link(dentry, &nd, cookie);
+		cookie = ERR_PTR(res);
 	}
 	}
-	return res;
+	return PTR_ERR(cookie);
 }
 }
 
 
 int vfs_follow_link(struct nameidata *nd, const char *link)
 int vfs_follow_link(struct nameidata *nd, const char *link)
@@ -2395,23 +2400,20 @@ int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 	return res;
 	return res;
 }
 }
 
 
-int page_follow_link_light(struct dentry *dentry, struct nameidata *nd)
+void *page_follow_link_light(struct dentry *dentry, struct nameidata *nd)
 {
 {
-	struct page *page;
+	struct page *page = NULL;
 	nd_set_link(nd, page_getlink(dentry, &page));
 	nd_set_link(nd, page_getlink(dentry, &page));
-	return 0;
+	return page;
 }
 }
 
 
-void page_put_link(struct dentry *dentry, struct nameidata *nd)
+void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
 {
 {
-	if (!IS_ERR(nd_get_link(nd))) {
-		struct page *page;
-		page = find_get_page(dentry->d_inode->i_mapping, 0);
-		if (!page)
-			BUG();
+	struct page *page = cookie;
+
+	if (page) {
 		kunmap(page);
 		kunmap(page);
 		page_cache_release(page);
 		page_cache_release(page);
-		page_cache_release(page);
 	}
 	}
 }
 }
 
 

+ 1 - 0
fs/nfs/dir.c

@@ -939,6 +939,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
 	error = nfs_revalidate_inode(NFS_SERVER(dir), dir);
 	error = nfs_revalidate_inode(NFS_SERVER(dir), dir);
 	if (error < 0) {
 	if (error < 0) {
 		res = ERR_PTR(error);
 		res = ERR_PTR(error);
+		unlock_kernel();
 		goto out;
 		goto out;
 	}
 	}
 
 

+ 8 - 29
fs/nfs/symlink.c

@@ -27,26 +27,14 @@
 
 
 /* Symlink caching in the page cache is even more simplistic
 /* Symlink caching in the page cache is even more simplistic
  * and straight-forward than readdir caching.
  * and straight-forward than readdir caching.
- *
- * At the beginning of the page we store pointer to struct page in question,
- * simplifying nfs_put_link() (if inode got invalidated we can't find the page
- * to be freed via pagecache lookup).
- * The NUL-terminated string follows immediately thereafter.
  */
  */
 
 
-struct nfs_symlink {
-	struct page *page;
-	char body[0];
-};
-
 static int nfs_symlink_filler(struct inode *inode, struct page *page)
 static int nfs_symlink_filler(struct inode *inode, struct page *page)
 {
 {
-	const unsigned int pgbase = offsetof(struct nfs_symlink, body);
-	const unsigned int pglen = PAGE_SIZE - pgbase;
 	int error;
 	int error;
 
 
 	lock_kernel();
 	lock_kernel();
-	error = NFS_PROTO(inode)->readlink(inode, page, pgbase, pglen);
+	error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE);
 	unlock_kernel();
 	unlock_kernel();
 	if (error < 0)
 	if (error < 0)
 		goto error;
 		goto error;
@@ -60,11 +48,10 @@ error:
 	return -EIO;
 	return -EIO;
 }
 }
 
 
-static int nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct inode *inode = dentry->d_inode;
 	struct inode *inode = dentry->d_inode;
 	struct page *page;
 	struct page *page;
-	struct nfs_symlink *p;
 	void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode));
 	void *err = ERR_PTR(nfs_revalidate_inode(NFS_SERVER(inode), inode));
 	if (err)
 	if (err)
 		goto read_failed;
 		goto read_failed;
@@ -78,28 +65,20 @@ static int nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 		err = ERR_PTR(-EIO);
 		err = ERR_PTR(-EIO);
 		goto getlink_read_error;
 		goto getlink_read_error;
 	}
 	}
-	p = kmap(page);
-	p->page = page;
-	nd_set_link(nd, p->body);
-	return 0;
+	nd_set_link(nd, kmap(page));
+	return page;
 
 
 getlink_read_error:
 getlink_read_error:
 	page_cache_release(page);
 	page_cache_release(page);
 read_failed:
 read_failed:
 	nd_set_link(nd, err);
 	nd_set_link(nd, err);
-	return 0;
+	return NULL;
 }
 }
 
 
-static void nfs_put_link(struct dentry *dentry, struct nameidata *nd)
+static void nfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
 {
 {
-	char *s = nd_get_link(nd);
-	if (!IS_ERR(s)) {
-		struct nfs_symlink *p;
-		struct page *page;
-
-		p = container_of(s, struct nfs_symlink, body[0]);
-		page = p->page;
-
+	if (cookie) {
+		struct page *page = cookie;
 		kunmap(page);
 		kunmap(page);
 		page_cache_release(page);
 		page_cache_release(page);
 	}
 	}

+ 4 - 4
fs/proc/base.c

@@ -890,7 +890,7 @@ static struct file_operations proc_seccomp_operations = {
 };
 };
 #endif /* CONFIG_SECCOMP */
 #endif /* CONFIG_SECCOMP */
 
 
-static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct inode *inode = dentry->d_inode;
 	struct inode *inode = dentry->d_inode;
 	int error = -EACCES;
 	int error = -EACCES;
@@ -907,7 +907,7 @@ static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
 	error = PROC_I(inode)->op.proc_get_link(inode, &nd->dentry, &nd->mnt);
 	error = PROC_I(inode)->op.proc_get_link(inode, &nd->dentry, &nd->mnt);
 	nd->last_type = LAST_BIND;
 	nd->last_type = LAST_BIND;
 out:
 out:
-	return error;
+	return ERR_PTR(error);
 }
 }
 
 
 static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
 static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
@@ -1692,11 +1692,11 @@ static int proc_self_readlink(struct dentry *dentry, char __user *buffer,
 	return vfs_readlink(dentry,buffer,buflen,tmp);
 	return vfs_readlink(dentry,buffer,buflen,tmp);
 }
 }
 
 
-static int proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	char tmp[30];
 	char tmp[30];
 	sprintf(tmp, "%d", current->tgid);
 	sprintf(tmp, "%d", current->tgid);
-	return vfs_follow_link(nd,tmp);
+	return ERR_PTR(vfs_follow_link(nd,tmp));
 }	
 }	
 
 
 static struct inode_operations proc_self_inode_operations = {
 static struct inode_operations proc_self_inode_operations = {

+ 2 - 2
fs/proc/generic.c

@@ -329,10 +329,10 @@ static void release_inode_number(unsigned int inum)
 	spin_unlock(&proc_inum_lock);
 	spin_unlock(&proc_inum_lock);
 }
 }
 
 
-static int proc_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	nd_set_link(nd, PDE(dentry->d_inode)->data);
 	nd_set_link(nd, PDE(dentry->d_inode)->data);
-	return 0;
+	return NULL;
 }
 }
 
 
 static struct inode_operations proc_link_inode_operations = {
 static struct inode_operations proc_link_inode_operations = {

+ 3 - 3
fs/smbfs/symlink.c

@@ -34,7 +34,7 @@ int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname)
 	return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname);
 	return smb_proc_symlink(server_from_dentry(dentry), dentry, oldname);
 }
 }
 
 
-static int smb_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *smb_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	char *link = __getname();
 	char *link = __getname();
 	DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry));
 	DEBUG1("followlink of %s/%s\n", DENTRY_PATH(dentry));
@@ -52,10 +52,10 @@ static int smb_follow_link(struct dentry *dentry, struct nameidata *nd)
 		}
 		}
 	}
 	}
 	nd_set_link(nd, link);
 	nd_set_link(nd, link);
-	return 0;
+	return NULL;
 }
 }
 
 
-static void smb_put_link(struct dentry *dentry, struct nameidata *nd)
+static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
 {
 {
 	char *s = nd_get_link(nd);
 	char *s = nd_get_link(nd);
 	if (!IS_ERR(s))
 	if (!IS_ERR(s))

+ 3 - 3
fs/sysfs/symlink.c

@@ -151,17 +151,17 @@ static int sysfs_getlink(struct dentry *dentry, char * path)
 
 
 }
 }
 
 
-static int sysfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *sysfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	int error = -ENOMEM;
 	int error = -ENOMEM;
 	unsigned long page = get_zeroed_page(GFP_KERNEL);
 	unsigned long page = get_zeroed_page(GFP_KERNEL);
 	if (page)
 	if (page)
 		error = sysfs_getlink(dentry, (char *) page); 
 		error = sysfs_getlink(dentry, (char *) page); 
 	nd_set_link(nd, error ? ERR_PTR(error) : (char *)page);
 	nd_set_link(nd, error ? ERR_PTR(error) : (char *)page);
-	return 0;
+	return NULL;
 }
 }
 
 
-static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd)
+static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
 {
 {
 	char *page = nd_get_link(nd);
 	char *page = nd_get_link(nd);
 	if (!IS_ERR(page))
 	if (!IS_ERR(page))

+ 2 - 2
fs/sysv/symlink.c

@@ -8,10 +8,10 @@
 #include "sysv.h"
 #include "sysv.h"
 #include <linux/namei.h>
 #include <linux/namei.h>
 
 
-static int sysv_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *sysv_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	nd_set_link(nd, (char *)SYSV_I(dentry->d_inode)->i_data);
 	nd_set_link(nd, (char *)SYSV_I(dentry->d_inode)->i_data);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations sysv_fast_symlink_inode_operations = {
 struct inode_operations sysv_fast_symlink_inode_operations = {

+ 2 - 2
fs/ufs/symlink.c

@@ -29,11 +29,11 @@
 #include <linux/namei.h>
 #include <linux/namei.h>
 #include <linux/ufs_fs.h>
 #include <linux/ufs_fs.h>
 
 
-static int ufs_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *ufs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct ufs_inode_info *p = UFS_I(dentry->d_inode);
 	struct ufs_inode_info *p = UFS_I(dentry->d_inode);
 	nd_set_link(nd, (char*)p->i_u1.i_symlink);
 	nd_set_link(nd, (char*)p->i_u1.i_symlink);
-	return 0;
+	return NULL;
 }
 }
 
 
 struct inode_operations ufs_fast_symlink_inode_operations = {
 struct inode_operations ufs_fast_symlink_inode_operations = {

+ 5 - 5
fs/xfs/linux-2.6/xfs_iops.c

@@ -374,7 +374,7 @@ linvfs_rename(
  * we need to be very careful about how much stack we use.
  * we need to be very careful about how much stack we use.
  * uio is kmalloced for this reason...
  * uio is kmalloced for this reason...
  */
  */
-STATIC int
+STATIC void *
 linvfs_follow_link(
 linvfs_follow_link(
 	struct dentry		*dentry,
 	struct dentry		*dentry,
 	struct nameidata	*nd)
 	struct nameidata	*nd)
@@ -391,14 +391,14 @@ linvfs_follow_link(
 	link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL);
 	link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL);
 	if (!link) {
 	if (!link) {
 		nd_set_link(nd, ERR_PTR(-ENOMEM));
 		nd_set_link(nd, ERR_PTR(-ENOMEM));
-		return 0;
+		return NULL;
 	}
 	}
 
 
 	uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL);
 	uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL);
 	if (!uio) {
 	if (!uio) {
 		kfree(link);
 		kfree(link);
 		nd_set_link(nd, ERR_PTR(-ENOMEM));
 		nd_set_link(nd, ERR_PTR(-ENOMEM));
-		return 0;
+		return NULL;
 	}
 	}
 
 
 	vp = LINVFS_GET_VP(dentry->d_inode);
 	vp = LINVFS_GET_VP(dentry->d_inode);
@@ -422,10 +422,10 @@ linvfs_follow_link(
 	kfree(uio);
 	kfree(uio);
 
 
 	nd_set_link(nd, link);
 	nd_set_link(nd, link);
-	return 0;
+	return NULL;
 }
 }
 
 
-static void linvfs_put_link(struct dentry *dentry, struct nameidata *nd)
+static void linvfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
 {
 {
 	char *s = nd_get_link(nd);
 	char *s = nd_get_link(nd);
 	if (!IS_ERR(s))
 	if (!IS_ERR(s))

+ 13 - 16
include/asm-alpha/system.h

@@ -443,22 +443,19 @@ __xchg_u64(volatile long *m, unsigned long val)
    if something tries to do an invalid xchg().  */
    if something tries to do an invalid xchg().  */
 extern void __xchg_called_with_bad_pointer(void);
 extern void __xchg_called_with_bad_pointer(void);
 
 
-static inline unsigned long
-__xchg(volatile void *ptr, unsigned long x, int size)
-{
-	switch (size) {
-		case 1:
-			return __xchg_u8(ptr, x);
-		case 2:
-			return __xchg_u16(ptr, x);
-		case 4:
-			return __xchg_u32(ptr, x);
-		case 8:
-			return __xchg_u64(ptr, x);
-	}
-	__xchg_called_with_bad_pointer();
-	return x;
-}
+#define __xchg(ptr, x, size) \
+({ \
+	unsigned long __xchg__res; \
+	volatile void *__xchg__ptr = (ptr); \
+	switch (size) { \
+		case 1: __xchg__res = __xchg_u8(__xchg__ptr, x); break; \
+		case 2: __xchg__res = __xchg_u16(__xchg__ptr, x); break; \
+		case 4: __xchg__res = __xchg_u32(__xchg__ptr, x); break; \
+		case 8: __xchg__res = __xchg_u64(__xchg__ptr, x); break; \
+		default: __xchg_called_with_bad_pointer(); __xchg__res = x; \
+	} \
+	__xchg__res; \
+})
 
 
 #define xchg(ptr,x)							     \
 #define xchg(ptr,x)							     \
   ({									     \
   ({									     \

+ 4 - 2
include/asm-arm/arch-ixp4xx/timex.h

@@ -7,7 +7,9 @@
 
 
 /*
 /*
  * We use IXP425 General purpose timer for our timer needs, it runs at 
  * We use IXP425 General purpose timer for our timer needs, it runs at 
- * 66.66... MHz
+ * 66.66... MHz. We do a convulted calculation of CLOCK_TICK_RATE b/c the
+ * timer register ignores the bottom 2 bits of the LATCH value.
  */
  */
-#define CLOCK_TICK_RATE (66666666)
+#define FREQ 66666666
+#define CLOCK_TICK_RATE (((FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
 
 

+ 1 - 1
include/asm-arm/bug.h

@@ -5,7 +5,7 @@
 
 
 #ifdef CONFIG_BUG
 #ifdef CONFIG_BUG
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 #ifdef CONFIG_DEBUG_BUGVERBOSE
-extern volatile void __bug(const char *file, int line, void *data);
+extern void __bug(const char *file, int line, void *data) __attribute__((noreturn));
 
 
 /* give file/line information */
 /* give file/line information */
 #define BUG()		__bug(__FILE__, __LINE__, NULL)
 #define BUG()		__bug(__FILE__, __LINE__, NULL)

+ 1 - 1
include/asm-arm/cpu-multi32.h

@@ -31,7 +31,7 @@ extern struct processor {
 	/*
 	/*
 	 * Special stuff for a reset
 	 * Special stuff for a reset
 	 */
 	 */
-	volatile void (*reset)(unsigned long addr);
+	void (*reset)(unsigned long addr) __attribute__((noreturn));
 	/*
 	/*
 	 * Idle the processor
 	 * Idle the processor
 	 */
 	 */

+ 1 - 1
include/asm-arm/cpu-single.h

@@ -41,4 +41,4 @@ extern int cpu_do_idle(void);
 extern void cpu_dcache_clean_area(void *, int);
 extern void cpu_dcache_clean_area(void *, int);
 extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
 extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm);
 extern void cpu_set_pte(pte_t *ptep, pte_t pte);
 extern void cpu_set_pte(pte_t *ptep, pte_t pte);
-extern volatile void cpu_reset(unsigned long addr);
+extern void cpu_reset(unsigned long addr) __attribute__((noreturn));

+ 0 - 8
include/asm-ia64/io.h

@@ -120,14 +120,6 @@ static inline void ___ia64_mmiowb(void)
 	ia64_mfa();
 	ia64_mfa();
 }
 }
 
 
-static inline const unsigned long
-__ia64_get_io_port_base (void)
-{
-	extern unsigned long ia64_iobase;
-
-	return ia64_iobase;
-}
-
 static inline void*
 static inline void*
 __ia64_mk_io_addr (unsigned long port)
 __ia64_mk_io_addr (unsigned long port)
 {
 {

+ 0 - 2
include/asm-m32r/smp.h

@@ -61,9 +61,7 @@ extern physid_mask_t phys_cpu_present_map;
  * Some lowlevel functions might want to know about
  * Some lowlevel functions might want to know about
  * the real CPU ID <-> CPU # mapping.
  * the real CPU ID <-> CPU # mapping.
  */
  */
-extern volatile int physid_2_cpu[NR_CPUS];
 extern volatile int cpu_2_physid[NR_CPUS];
 extern volatile int cpu_2_physid[NR_CPUS];
-#define physid_to_cpu(physid)	physid_2_cpu[physid]
 #define cpu_to_physid(cpu_id)	cpu_2_physid[cpu_id]
 #define cpu_to_physid(cpu_id)	cpu_2_physid[cpu_id]
 
 
 #define raw_smp_processor_id()	(current_thread_info()->cpu)
 #define raw_smp_processor_id()	(current_thread_info()->cpu)

+ 1 - 1
include/asm-ppc/time.h

@@ -58,7 +58,7 @@ static __inline__ void set_dec(unsigned int val)
 /* Accessor functions for the timebase (RTC on 601) registers. */
 /* Accessor functions for the timebase (RTC on 601) registers. */
 /* If one day CONFIG_POWER is added just define __USE_RTC as 1 */
 /* If one day CONFIG_POWER is added just define __USE_RTC as 1 */
 #ifdef CONFIG_6xx
 #ifdef CONFIG_6xx
-extern __inline__ int const __USE_RTC(void) {
+extern __inline__ int __attribute_pure__ __USE_RTC(void) {
 	return (mfspr(SPRN_PVR)>>16) == 1;
 	return (mfspr(SPRN_PVR)>>16) == 1;
 }
 }
 #else
 #else

+ 2 - 19
include/asm-s390/uaccess.h

@@ -149,11 +149,11 @@ struct exception_table_entry
 })
 })
 #endif
 #endif
 
 
-#ifndef __CHECKER__
 #define __put_user(x, ptr) \
 #define __put_user(x, ptr) \
 ({								\
 ({								\
 	__typeof__(*(ptr)) __x = (x);				\
 	__typeof__(*(ptr)) __x = (x);				\
 	int __pu_err;						\
 	int __pu_err;						\
+        __chk_user_ptr(ptr);                                    \
 	switch (sizeof (*(ptr))) {				\
 	switch (sizeof (*(ptr))) {				\
 	case 1:							\
 	case 1:							\
 	case 2:							\
 	case 2:							\
@@ -167,14 +167,6 @@ struct exception_table_entry
 	 }							\
 	 }							\
 	__pu_err;						\
 	__pu_err;						\
 })
 })
-#else
-#define __put_user(x, ptr)			\
-({						\
-	void __user *p;				\
-	p = (ptr);				\
-	0;					\
-})
-#endif
 
 
 #define put_user(x, ptr)					\
 #define put_user(x, ptr)					\
 ({								\
 ({								\
@@ -213,11 +205,11 @@ extern int __put_user_bad(void) __attribute__((noreturn));
 })
 })
 #endif
 #endif
 
 
-#ifndef __CHECKER__
 #define __get_user(x, ptr)					\
 #define __get_user(x, ptr)					\
 ({								\
 ({								\
 	__typeof__(*(ptr)) __x;					\
 	__typeof__(*(ptr)) __x;					\
 	int __gu_err;						\
 	int __gu_err;						\
+        __chk_user_ptr(ptr);                                    \
 	switch (sizeof(*(ptr))) {				\
 	switch (sizeof(*(ptr))) {				\
 	case 1:							\
 	case 1:							\
 	case 2:							\
 	case 2:							\
@@ -232,15 +224,6 @@ extern int __put_user_bad(void) __attribute__((noreturn));
 	(x) = __x;						\
 	(x) = __x;						\
 	__gu_err;						\
 	__gu_err;						\
 })
 })
-#else
-#define __get_user(x, ptr)			\
-({						\
-	void __user *p;				\
-	p = (ptr);				\
-	0;					\
-})
-#endif
-
 
 
 #define get_user(x, ptr)					\
 #define get_user(x, ptr)					\
 ({								\
 ({								\

+ 5 - 0
include/asm-sparc64/thread_info.h

@@ -68,6 +68,9 @@ struct thread_info {
 
 
 	struct restart_block	restart_block;
 	struct restart_block	restart_block;
 
 
+	struct pt_regs		*kern_una_regs;
+	unsigned int		kern_una_insn;
+
 	unsigned long		fpregs[0] __attribute__ ((aligned(64)));
 	unsigned long		fpregs[0] __attribute__ ((aligned(64)));
 };
 };
 
 
@@ -103,6 +106,8 @@ struct thread_info {
 #define TI_PCR		0x00000490
 #define TI_PCR		0x00000490
 #define TI_CEE_STUFF	0x00000498
 #define TI_CEE_STUFF	0x00000498
 #define TI_RESTART_BLOCK 0x000004a0
 #define TI_RESTART_BLOCK 0x000004a0
+#define TI_KUNA_REGS	0x000004c8
+#define TI_KUNA_INSN	0x000004d0
 #define TI_FPREGS	0x00000500
 #define TI_FPREGS	0x00000500
 
 
 /* We embed this in the uppermost byte of thread_info->flags */
 /* We embed this in the uppermost byte of thread_info->flags */

+ 4 - 4
include/linux/fs.h

@@ -993,8 +993,8 @@ struct inode_operations {
 	int (*rename) (struct inode *, struct dentry *,
 	int (*rename) (struct inode *, struct dentry *,
 			struct inode *, struct dentry *);
 			struct inode *, struct dentry *);
 	int (*readlink) (struct dentry *, char __user *,int);
 	int (*readlink) (struct dentry *, char __user *,int);
-	int (*follow_link) (struct dentry *, struct nameidata *);
-	void (*put_link) (struct dentry *, struct nameidata *);
+	void * (*follow_link) (struct dentry *, struct nameidata *);
+	void (*put_link) (struct dentry *, struct nameidata *, void *);
 	void (*truncate) (struct inode *);
 	void (*truncate) (struct inode *);
 	int (*permission) (struct inode *, int, struct nameidata *);
 	int (*permission) (struct inode *, int, struct nameidata *);
 	int (*setattr) (struct dentry *, struct iattr *);
 	int (*setattr) (struct dentry *, struct iattr *);
@@ -1602,8 +1602,8 @@ extern struct file_operations generic_ro_fops;
 extern int vfs_readlink(struct dentry *, char __user *, int, const char *);
 extern int vfs_readlink(struct dentry *, char __user *, int, const char *);
 extern int vfs_follow_link(struct nameidata *, const char *);
 extern int vfs_follow_link(struct nameidata *, const char *);
 extern int page_readlink(struct dentry *, char __user *, int);
 extern int page_readlink(struct dentry *, char __user *, int);
-extern int page_follow_link_light(struct dentry *, struct nameidata *);
-extern void page_put_link(struct dentry *, struct nameidata *);
+extern void *page_follow_link_light(struct dentry *, struct nameidata *);
+extern void page_put_link(struct dentry *, struct nameidata *, void *);
 extern int page_symlink(struct inode *inode, const char *symname, int len);
 extern int page_symlink(struct inode *inode, const char *symname, int len);
 extern struct inode_operations page_symlink_inode_operations;
 extern struct inode_operations page_symlink_inode_operations;
 extern int generic_readlink(struct dentry *, char __user *, int);
 extern int generic_readlink(struct dentry *, char __user *, int);

+ 16 - 2
include/net/ax25.h

@@ -139,11 +139,25 @@ enum {
 #define AX25_DEF_DS_TIMEOUT	(3 * 60 * HZ)		/* DAMA timeout 3 minutes */
 #define AX25_DEF_DS_TIMEOUT	(3 * 60 * HZ)		/* DAMA timeout 3 minutes */
 
 
 typedef struct ax25_uid_assoc {
 typedef struct ax25_uid_assoc {
-	struct ax25_uid_assoc	*next;
+	struct hlist_node	uid_node;
+	atomic_t		refcount;
 	uid_t			uid;
 	uid_t			uid;
 	ax25_address		call;
 	ax25_address		call;
 } ax25_uid_assoc;
 } ax25_uid_assoc;
 
 
+#define ax25_uid_for_each(__ax25, node, list) \
+	hlist_for_each_entry(__ax25, node, list, uid_node)
+
+#define ax25_uid_hold(ax25) \
+	atomic_inc(&((ax25)->refcount))
+
+static inline void ax25_uid_put(ax25_uid_assoc *assoc)
+{
+	if (atomic_dec_and_test(&assoc->refcount)) {
+		kfree(assoc);
+	}
+}
+
 typedef struct {
 typedef struct {
 	ax25_address		calls[AX25_MAX_DIGIS];
 	ax25_address		calls[AX25_MAX_DIGIS];
 	unsigned char		repeated[AX25_MAX_DIGIS];
 	unsigned char		repeated[AX25_MAX_DIGIS];
@@ -376,7 +390,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
 
 
 /* ax25_uid.c */
 /* ax25_uid.c */
 extern int  ax25_uid_policy;
 extern int  ax25_uid_policy;
-extern ax25_address *ax25_findbyuid(uid_t);
+extern ax25_uid_assoc *ax25_findbyuid(uid_t);
 extern int  ax25_uid_ioctl(int, struct sockaddr_ax25 *);
 extern int  ax25_uid_ioctl(int, struct sockaddr_ax25 *);
 extern struct file_operations ax25_uid_fops;
 extern struct file_operations ax25_uid_fops;
 extern void ax25_uid_free(void);
 extern void ax25_uid_free(void);

+ 5 - 0
include/net/sock.h

@@ -384,6 +384,11 @@ enum sock_flags {
 	SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
 	SOCK_QUEUE_SHRUNK, /* write queue has been shrunk recently */
 };
 };
 
 
+static inline void sock_copy_flags(struct sock *nsk, struct sock *osk)
+{
+	nsk->sk_flags = osk->sk_flags;
+}
+
 static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
 static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
 {
 {
 	__set_bit(flag, &sk->sk_flags);
 	__set_bit(flag, &sk->sk_flags);

+ 2 - 0
include/sound/core.h

@@ -360,11 +360,13 @@ int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd);
 
 
 /* isadma.c */
 /* isadma.c */
 
 
+#ifdef CONFIG_ISA_DMA_API
 #define DMA_MODE_NO_ENABLE	0x0100
 #define DMA_MODE_NO_ENABLE	0x0100
 
 
 void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
 void snd_dma_program(unsigned long dma, unsigned long addr, unsigned int size, unsigned short mode);
 void snd_dma_disable(unsigned long dma);
 void snd_dma_disable(unsigned long dma);
 unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
 unsigned int snd_dma_pointer(unsigned long dma, unsigned int size);
+#endif
 
 
 /* misc.c */
 /* misc.c */
 
 

+ 17 - 0
kernel/cpuset.c

@@ -635,6 +635,23 @@ static void update_cpu_domains(struct cpuset *cur)
 	if (par == NULL || cpus_empty(cur->cpus_allowed))
 	if (par == NULL || cpus_empty(cur->cpus_allowed))
 		return;
 		return;
 
 
+	/*
+	 * Hack to avoid 2.6.13 partial node dynamic sched domain bug.
+	 * Require the 'cpu_exclusive' cpuset to include all (or none)
+	 * of the CPUs on each node, or return w/o changing sched domains.
+	 * Remove this hack when dynamic sched domains fixed.
+	 */
+	{
+		int i, j;
+
+		for_each_cpu_mask(i, cur->cpus_allowed) {
+			for_each_cpu_mask(j, node_to_cpumask(cpu_to_node(i))) {
+				if (!cpu_isset(j, cur->cpus_allowed))
+					return;
+			}
+		}
+	}
+
 	/*
 	/*
 	 * Get all cpus from parent's cpus_allowed not part of exclusive
 	 * Get all cpus from parent's cpus_allowed not part of exclusive
 	 * children
 	 * children

+ 1 - 1
kernel/timer.c

@@ -1023,7 +1023,7 @@ asmlinkage long sys_getppid(void)
 	parent = me->group_leader->real_parent;
 	parent = me->group_leader->real_parent;
 	for (;;) {
 	for (;;) {
 		pid = parent->tgid;
 		pid = parent->tgid;
-#ifdef CONFIG_SMP
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)
 {
 {
 		struct task_struct *old = parent;
 		struct task_struct *old = parent;
 
 

+ 4 - 1
lib/vsprintf.c

@@ -269,6 +269,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
 	int qualifier;		/* 'h', 'l', or 'L' for integer fields */
 	int qualifier;		/* 'h', 'l', or 'L' for integer fields */
 				/* 'z' support added 23/7/1999 S.H.    */
 				/* 'z' support added 23/7/1999 S.H.    */
 				/* 'z' changed to 'Z' --davidm 1/25/99 */
 				/* 'z' changed to 'Z' --davidm 1/25/99 */
+				/* 't' added for ptrdiff_t */
 
 
 	/* Reject out-of-range values early */
 	/* Reject out-of-range values early */
 	if (unlikely((int) size < 0)) {
 	if (unlikely((int) size < 0)) {
@@ -339,7 +340,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
 		/* get the conversion qualifier */
 		/* get the conversion qualifier */
 		qualifier = -1;
 		qualifier = -1;
 		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
 		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||
-		    *fmt =='Z' || *fmt == 'z') {
+		    *fmt =='Z' || *fmt == 'z' || *fmt == 't') {
 			qualifier = *fmt;
 			qualifier = *fmt;
 			++fmt;
 			++fmt;
 			if (qualifier == 'l' && *fmt == 'l') {
 			if (qualifier == 'l' && *fmt == 'l') {
@@ -467,6 +468,8 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
 				num = (signed long) num;
 				num = (signed long) num;
 		} else if (qualifier == 'Z' || qualifier == 'z') {
 		} else if (qualifier == 'Z' || qualifier == 'z') {
 			num = va_arg(args, size_t);
 			num = va_arg(args, size_t);
+		} else if (qualifier == 't') {
+			num = va_arg(args, ptrdiff_t);
 		} else if (qualifier == 'h') {
 		} else if (qualifier == 'h') {
 			num = (unsigned short) va_arg(args, int);
 			num = (unsigned short) va_arg(args, int);
 			if (flags & SIGN)
 			if (flags & SIGN)

+ 6 - 11
mm/shmem.c

@@ -1773,32 +1773,27 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
 	return 0;
 	return 0;
 }
 }
 
 
-static int shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd)
+static void *shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode));
 	nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode));
-	return 0;
+	return NULL;
 }
 }
 
 
-static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
+static void *shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
 	struct page *page = NULL;
 	struct page *page = NULL;
 	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
 	nd_set_link(nd, res ? ERR_PTR(res) : kmap(page));
 	nd_set_link(nd, res ? ERR_PTR(res) : kmap(page));
-	return 0;
+	return page;
 }
 }
 
 
-static void shmem_put_link(struct dentry *dentry, struct nameidata *nd)
+static void shmem_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
 {
 {
 	if (!IS_ERR(nd_get_link(nd))) {
 	if (!IS_ERR(nd_get_link(nd))) {
-		struct page *page;
-
-		page = find_get_page(dentry->d_inode->i_mapping, 0);
-		if (!page)
-			BUG();
+		struct page *page = cookie;
 		kunmap(page);
 		kunmap(page);
 		mark_page_accessed(page);
 		mark_page_accessed(page);
 		page_cache_release(page);
 		page_cache_release(page);
-		page_cache_release(page);
 	}
 	}
 }
 }
 
 

+ 13 - 14
net/ax25/af_ax25.c

@@ -875,12 +875,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
 	sk->sk_sndbuf   = osk->sk_sndbuf;
 	sk->sk_sndbuf   = osk->sk_sndbuf;
 	sk->sk_state    = TCP_ESTABLISHED;
 	sk->sk_state    = TCP_ESTABLISHED;
 	sk->sk_sleep    = osk->sk_sleep;
 	sk->sk_sleep    = osk->sk_sleep;
-
-	if (sock_flag(osk, SOCK_DBG))
-		sock_set_flag(sk, SOCK_DBG);
-
-	if (sock_flag(osk, SOCK_ZAPPED))
-		sock_set_flag(sk, SOCK_ZAPPED);
+	sock_copy_flags(sk, osk);
 
 
 	oax25 = ax25_sk(osk);
 	oax25 = ax25_sk(osk);
 
 
@@ -1007,7 +1002,8 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 	struct sock *sk = sock->sk;
 	struct sock *sk = sock->sk;
 	struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
 	struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
 	ax25_dev *ax25_dev = NULL;
 	ax25_dev *ax25_dev = NULL;
-	ax25_address *call;
+	ax25_uid_assoc *user;
+	ax25_address call;
 	ax25_cb *ax25;
 	ax25_cb *ax25;
 	int err = 0;
 	int err = 0;
 
 
@@ -1026,9 +1022,15 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 	if (addr->fsa_ax25.sax25_family != AF_AX25)
 	if (addr->fsa_ax25.sax25_family != AF_AX25)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	call = ax25_findbyuid(current->euid);
-	if (call == NULL && ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
-		return -EACCES;
+	user = ax25_findbyuid(current->euid);
+	if (user) {
+		call = user->call;
+		ax25_uid_put(user);
+	} else {
+		if (ax25_uid_policy && !capable(CAP_NET_ADMIN))
+			return -EACCES;
+
+		call = addr->fsa_ax25.sax25_call;
 	}
 	}
 
 
 	lock_sock(sk);
 	lock_sock(sk);
@@ -1039,10 +1041,7 @@ static int ax25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	if (call == NULL)
-		ax25->source_addr = addr->fsa_ax25.sax25_call;
-	else
-		ax25->source_addr = *call;
+	ax25->source_addr = call;
 
 
 	/*
 	/*
 	 * User already set interface with SO_BINDTODEVICE
 	 * User already set interface with SO_BINDTODEVICE

+ 7 - 5
net/ax25/ax25_route.c

@@ -422,8 +422,8 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat)
  */
  */
 int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
 int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
 {
 {
+	ax25_uid_assoc *user;
 	ax25_route *ax25_rt;
 	ax25_route *ax25_rt;
-	ax25_address *call;
 	int err;
 	int err;
 
 
 	if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL)
 	if ((ax25_rt = ax25_get_route(addr, NULL)) == NULL)
@@ -434,16 +434,18 @@ int ax25_rt_autobind(ax25_cb *ax25, ax25_address *addr)
 		goto put;
 		goto put;
 	}
 	}
 
 
-	if ((call = ax25_findbyuid(current->euid)) == NULL) {
+	user = ax25_findbyuid(current->euid);
+	if (user) {
+		ax25->source_addr = user->call;
+		ax25_uid_put(user);
+	} else {
 		if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
 		if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
 			err = -EPERM;
 			err = -EPERM;
 			goto put;
 			goto put;
 		}
 		}
-		call = (ax25_address *)ax25->ax25_dev->dev->dev_addr;
+		ax25->source_addr = *(ax25_address *)ax25->ax25_dev->dev->dev_addr;
 	}
 	}
 
 
-	ax25->source_addr = *call;
-
 	if (ax25_rt->digipeat != NULL) {
 	if (ax25_rt->digipeat != NULL) {
 		if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
 		if ((ax25->digipeat = kmalloc(sizeof(ax25_digi), GFP_ATOMIC)) == NULL) {
 			err = -ENOMEM;
 			err = -ENOMEM;

+ 36 - 47
net/ax25/ax25_uid.c

@@ -28,6 +28,7 @@
 #include <linux/fcntl.h>
 #include <linux/fcntl.h>
 #include <linux/mm.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/interrupt.h>
+#include <linux/list.h>
 #include <linux/notifier.h>
 #include <linux/notifier.h>
 #include <linux/proc_fs.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/seq_file.h>
@@ -41,38 +42,41 @@
  *	Callsign/UID mapper. This is in kernel space for security on multi-amateur machines.
  *	Callsign/UID mapper. This is in kernel space for security on multi-amateur machines.
  */
  */
 
 
-static ax25_uid_assoc *ax25_uid_list;
+HLIST_HEAD(ax25_uid_list);
 static DEFINE_RWLOCK(ax25_uid_lock);
 static DEFINE_RWLOCK(ax25_uid_lock);
 
 
 int ax25_uid_policy = 0;
 int ax25_uid_policy = 0;
 
 
-ax25_address *ax25_findbyuid(uid_t uid)
+ax25_uid_assoc *ax25_findbyuid(uid_t uid)
 {
 {
-	ax25_uid_assoc *ax25_uid;
-	ax25_address *res = NULL;
+	ax25_uid_assoc *ax25_uid, *res = NULL;
+	struct hlist_node *node;
 
 
 	read_lock(&ax25_uid_lock);
 	read_lock(&ax25_uid_lock);
-	for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) {
+	ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
 		if (ax25_uid->uid == uid) {
 		if (ax25_uid->uid == uid) {
-			res = &ax25_uid->call;
+			ax25_uid_hold(ax25_uid);
+			res = ax25_uid;
 			break;
 			break;
 		}
 		}
 	}
 	}
 	read_unlock(&ax25_uid_lock);
 	read_unlock(&ax25_uid_lock);
 
 
-	return NULL;
+	return res;
 }
 }
 
 
 int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
 int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
 {
 {
-	ax25_uid_assoc *s, *ax25_uid;
+	ax25_uid_assoc *ax25_uid;
+	struct hlist_node *node;
+	ax25_uid_assoc *user;
 	unsigned long res;
 	unsigned long res;
 
 
 	switch (cmd) {
 	switch (cmd) {
 	case SIOCAX25GETUID:
 	case SIOCAX25GETUID:
 		res = -ENOENT;
 		res = -ENOENT;
 		read_lock(&ax25_uid_lock);
 		read_lock(&ax25_uid_lock);
-		for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) {
+		ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
 			if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) {
 			if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) {
 				res = ax25_uid->uid;
 				res = ax25_uid->uid;
 				break;
 				break;
@@ -85,19 +89,22 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
 	case SIOCAX25ADDUID:
 	case SIOCAX25ADDUID:
 		if (!capable(CAP_NET_ADMIN))
 		if (!capable(CAP_NET_ADMIN))
 			return -EPERM;
 			return -EPERM;
-		if (ax25_findbyuid(sax->sax25_uid))
+		user = ax25_findbyuid(sax->sax25_uid);
+		if (user) {
+			ax25_uid_put(user);
 			return -EEXIST;
 			return -EEXIST;
+		}
 		if (sax->sax25_uid == 0)
 		if (sax->sax25_uid == 0)
 			return -EINVAL;
 			return -EINVAL;
 		if ((ax25_uid = kmalloc(sizeof(*ax25_uid), GFP_KERNEL)) == NULL)
 		if ((ax25_uid = kmalloc(sizeof(*ax25_uid), GFP_KERNEL)) == NULL)
 			return -ENOMEM;
 			return -ENOMEM;
 
 
+		atomic_set(&ax25_uid->refcount, 1);
 		ax25_uid->uid  = sax->sax25_uid;
 		ax25_uid->uid  = sax->sax25_uid;
 		ax25_uid->call = sax->sax25_call;
 		ax25_uid->call = sax->sax25_call;
 
 
 		write_lock(&ax25_uid_lock);
 		write_lock(&ax25_uid_lock);
-		ax25_uid->next = ax25_uid_list;
-		ax25_uid_list  = ax25_uid;
+		hlist_add_head(&ax25_uid->uid_node, &ax25_uid_list);
 		write_unlock(&ax25_uid_lock);
 		write_unlock(&ax25_uid_lock);
 
 
 		return 0;
 		return 0;
@@ -106,34 +113,21 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
 		if (!capable(CAP_NET_ADMIN))
 		if (!capable(CAP_NET_ADMIN))
 			return -EPERM;
 			return -EPERM;
 
 
+		ax25_uid = NULL;
 		write_lock(&ax25_uid_lock);
 		write_lock(&ax25_uid_lock);
-		for (ax25_uid = ax25_uid_list; ax25_uid != NULL; ax25_uid = ax25_uid->next) {
-			if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0) {
+		ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
+			if (ax25cmp(&sax->sax25_call, &ax25_uid->call) == 0)
 				break;
 				break;
-			}
 		}
 		}
 		if (ax25_uid == NULL) {
 		if (ax25_uid == NULL) {
 			write_unlock(&ax25_uid_lock);
 			write_unlock(&ax25_uid_lock);
 			return -ENOENT;
 			return -ENOENT;
 		}
 		}
-		if ((s = ax25_uid_list) == ax25_uid) {
-			ax25_uid_list = s->next;
-			write_unlock(&ax25_uid_lock);
-			kfree(ax25_uid);
-			return 0;
-		}
-		while (s != NULL && s->next != NULL) {
-			if (s->next == ax25_uid) {
-				s->next = ax25_uid->next;
-				write_unlock(&ax25_uid_lock);
-				kfree(ax25_uid);
-				return 0;
-			}
-			s = s->next;
-		}
+		hlist_del_init(&ax25_uid->uid_node);
+		ax25_uid_put(ax25_uid);
 		write_unlock(&ax25_uid_lock);
 		write_unlock(&ax25_uid_lock);
 
 
-		return -ENOENT;
+		return 0;
 
 
 	default:
 	default:
 		return -EINVAL;
 		return -EINVAL;
@@ -147,13 +141,11 @@ int ax25_uid_ioctl(int cmd, struct sockaddr_ax25 *sax)
 static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
 static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
 {
 {
 	struct ax25_uid_assoc *pt;
 	struct ax25_uid_assoc *pt;
-	int i = 1;
+	struct hlist_node *node;
+	int i = 0;
 
 
 	read_lock(&ax25_uid_lock);
 	read_lock(&ax25_uid_lock);
-	if (*pos == 0)
-		return SEQ_START_TOKEN;
-
-	for (pt = ax25_uid_list; pt != NULL; pt = pt->next) {
+	ax25_uid_for_each(pt, node, &ax25_uid_list) {
 		if (i == *pos)
 		if (i == *pos)
 			return pt;
 			return pt;
 		++i;
 		++i;
@@ -164,8 +156,9 @@ static void *ax25_uid_seq_start(struct seq_file *seq, loff_t *pos)
 static void *ax25_uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 static void *ax25_uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
 {
 	++*pos;
 	++*pos;
-	return (v == SEQ_START_TOKEN) ? ax25_uid_list : 
-		((struct ax25_uid_assoc *) v)->next;
+
+	return hlist_entry(((ax25_uid_assoc *)v)->uid_node.next,
+	                   ax25_uid_assoc, uid_node);
 }
 }
 
 
 static void ax25_uid_seq_stop(struct seq_file *seq, void *v)
 static void ax25_uid_seq_stop(struct seq_file *seq, void *v)
@@ -179,7 +172,6 @@ static int ax25_uid_seq_show(struct seq_file *seq, void *v)
 		seq_printf(seq, "Policy: %d\n", ax25_uid_policy);
 		seq_printf(seq, "Policy: %d\n", ax25_uid_policy);
 	else {
 	else {
 		struct ax25_uid_assoc *pt = v;
 		struct ax25_uid_assoc *pt = v;
-		
 
 
 		seq_printf(seq, "%6d %s\n", pt->uid, ax2asc(&pt->call));
 		seq_printf(seq, "%6d %s\n", pt->uid, ax2asc(&pt->call));
 	}
 	}
@@ -213,16 +205,13 @@ struct file_operations ax25_uid_fops = {
  */
  */
 void __exit ax25_uid_free(void)
 void __exit ax25_uid_free(void)
 {
 {
-	ax25_uid_assoc *s, *ax25_uid;
+	ax25_uid_assoc *ax25_uid;
+	struct hlist_node *node;
 
 
 	write_lock(&ax25_uid_lock);
 	write_lock(&ax25_uid_lock);
-	ax25_uid = ax25_uid_list;
-	while (ax25_uid != NULL) {
-		s        = ax25_uid;
-		ax25_uid = ax25_uid->next;
-
-		kfree(s);
+	ax25_uid_for_each(ax25_uid, node, &ax25_uid_list) {
+		hlist_del_init(&ax25_uid->uid_node);
+		ax25_uid_put(ax25_uid);
 	}
 	}
-	ax25_uid_list = NULL;
 	write_unlock(&ax25_uid_lock);
 	write_unlock(&ax25_uid_lock);
 }
 }

Some files were not shown because too many files changed in this diff