diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-11-21 02:57:04 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-11-21 02:57:04 -0500 |
| commit | fc02e90c34bacd5d7bc77b832c65a8f06e1bd60e (patch) | |
| tree | d870acafa2290779aa7c0594172bf1c691d3e6c0 | |
| parent | ec4e0e2fe018992d980910db901637c814575914 (diff) | |
| parent | 13d428afc007fcfcd6deeb215618f54cf9c0cae6 (diff) | |
Merge commit 'v2.6.28-rc6' into sched/core
121 files changed, 770 insertions, 686 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 9fa6508892c2..e0f346d201ed 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -294,7 +294,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 294 | Possible values are: | 294 | Possible values are: |
| 295 | isolate - enable device isolation (each device, as far | 295 | isolate - enable device isolation (each device, as far |
| 296 | as possible, will get its own protection | 296 | as possible, will get its own protection |
| 297 | domain) | 297 | domain) [default] |
| 298 | share - put every device behind one IOMMU into the | ||
| 299 | same protection domain | ||
| 298 | fullflush - enable flushing of IO/TLB entries when | 300 | fullflush - enable flushing of IO/TLB entries when |
| 299 | they are unmapped. Otherwise they are | 301 | they are unmapped. Otherwise they are |
| 300 | flushed before they will be reused, which | 302 | flushed before they will be reused, which |
| @@ -1193,8 +1195,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1193 | it is equivalent to "nosmp", which also disables | 1195 | it is equivalent to "nosmp", which also disables |
| 1194 | the IO APIC. | 1196 | the IO APIC. |
| 1195 | 1197 | ||
| 1196 | max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or | 1198 | max_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory greater than |
| 1197 | equal to this physical address is ignored. | 1199 | or equal to this physical address is ignored. |
| 1198 | 1200 | ||
| 1199 | max_luns= [SCSI] Maximum number of LUNs to probe. | 1201 | max_luns= [SCSI] Maximum number of LUNs to probe. |
| 1200 | Should be between 1 and 2^32-1. | 1202 | Should be between 1 and 2^32-1. |
| @@ -1294,6 +1296,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1294 | 1296 | ||
| 1295 | mga= [HW,DRM] | 1297 | mga= [HW,DRM] |
| 1296 | 1298 | ||
| 1299 | min_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory below this | ||
| 1300 | physical address is ignored. | ||
| 1301 | |||
| 1297 | mminit_loglevel= | 1302 | mminit_loglevel= |
| 1298 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this | 1303 | [KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this |
| 1299 | parameter allows control of the logging verbosity for | 1304 | parameter allows control of the logging verbosity for |
diff --git a/Documentation/networking/phy.txt b/Documentation/networking/phy.txt index 8df6a7b0e66c..88bb71b46da4 100644 --- a/Documentation/networking/phy.txt +++ b/Documentation/networking/phy.txt | |||
| @@ -96,7 +96,7 @@ Letting the PHY Abstraction Layer do Everything | |||
| 96 | static void adjust_link(struct net_device *dev); | 96 | static void adjust_link(struct net_device *dev); |
| 97 | 97 | ||
| 98 | Next, you need to know the device name of the PHY connected to this device. | 98 | Next, you need to know the device name of the PHY connected to this device. |
| 99 | The name will look something like, "phy0:0", where the first number is the | 99 | The name will look something like, "0:00", where the first number is the |
| 100 | bus id, and the second is the PHY's address on that bus. Typically, | 100 | bus id, and the second is the PHY's address on that bus. Typically, |
| 101 | the bus is responsible for making its ID unique. | 101 | the bus is responsible for making its ID unique. |
| 102 | 102 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 627e4c89328e..618c1ef4a397 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1809,7 +1809,7 @@ S: Maintained | |||
| 1809 | 1809 | ||
| 1810 | FTRACE | 1810 | FTRACE |
| 1811 | P: Steven Rostedt | 1811 | P: Steven Rostedt |
| 1812 | M: srostedt@redhat.com | 1812 | M: rostedt@goodmis.org |
| 1813 | S: Maintained | 1813 | S: Maintained |
| 1814 | 1814 | ||
| 1815 | FUJITSU FR-V (FRV) PORT | 1815 | FUJITSU FR-V (FRV) PORT |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 28 | 3 | SUBLEVEL = 28 |
| 4 | EXTRAVERSION = -rc5 | 4 | EXTRAVERSION = -rc6 |
| 5 | NAME = Killer Bat of Doom | 5 | NAME = Killer Bat of Doom |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index 47d686dba1eb..a3e44a5ed497 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h | |||
| @@ -226,7 +226,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer (void); | |||
| 226 | /************************************************/ | 226 | /************************************************/ |
| 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) | 227 | #define ia64_ssm IA64_INTRINSIC_MACRO(ssm) |
| 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) | 228 | #define ia64_rsm IA64_INTRINSIC_MACRO(rsm) |
| 229 | #define ia64_getreg IA64_INTRINSIC_API(getreg) | 229 | #define ia64_getreg IA64_INTRINSIC_MACRO(getreg) |
| 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) | 230 | #define ia64_setreg IA64_INTRINSIC_API(setreg) |
| 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) | 231 | #define ia64_set_rr IA64_INTRINSIC_API(set_rr) |
| 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) | 232 | #define ia64_get_rr IA64_INTRINSIC_API(get_rr) |
diff --git a/arch/ia64/include/asm/paravirt_privop.h b/arch/ia64/include/asm/paravirt_privop.h index d577aac11835..0b597424fcfc 100644 --- a/arch/ia64/include/asm/paravirt_privop.h +++ b/arch/ia64/include/asm/paravirt_privop.h | |||
| @@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum); | |||
| 78 | ia64_native_rsm(mask); \ | 78 | ia64_native_rsm(mask); \ |
| 79 | } while (0) | 79 | } while (0) |
| 80 | 80 | ||
| 81 | /* returned ip value should be the one in the caller, | ||
| 82 | * not in __paravirt_getreg() */ | ||
| 83 | #define paravirt_getreg(reg) \ | ||
| 84 | ({ \ | ||
| 85 | unsigned long res; \ | ||
| 86 | BUILD_BUG_ON(!__builtin_constant_p(reg)); \ | ||
| 87 | if ((reg) == _IA64_REG_IP) \ | ||
| 88 | res = ia64_native_getreg(_IA64_REG_IP); \ | ||
| 89 | else \ | ||
| 90 | res = pv_cpu_ops.getreg(reg); \ | ||
| 91 | res; \ | ||
| 92 | }) | ||
| 93 | |||
| 81 | /****************************************************************************** | 94 | /****************************************************************************** |
| 82 | * replacement of hand written assembly codes. | 95 | * replacement of hand written assembly codes. |
| 83 | */ | 96 | */ |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 7ef0c594f5ed..d435f4a7a96c 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
| @@ -499,6 +499,7 @@ GLOBAL_ENTRY(prefetch_stack) | |||
| 499 | END(prefetch_stack) | 499 | END(prefetch_stack) |
| 500 | 500 | ||
| 501 | GLOBAL_ENTRY(kernel_execve) | 501 | GLOBAL_ENTRY(kernel_execve) |
| 502 | rum psr.ac | ||
| 502 | mov r15=__NR_execve // put syscall number in place | 503 | mov r15=__NR_execve // put syscall number in place |
| 503 | break __BREAK_SYSCALL | 504 | break __BREAK_SYSCALL |
| 504 | br.ret.sptk.many rp | 505 | br.ret.sptk.many rp |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 66e491d8baac..59301c472800 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
| @@ -260,7 +260,7 @@ start_ap: | |||
| 260 | * Switch into virtual mode: | 260 | * Switch into virtual mode: |
| 261 | */ | 261 | */ |
| 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ | 262 | movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ |
| 263 | |IA64_PSR_DI) | 263 | |IA64_PSR_DI|IA64_PSR_AC) |
| 264 | ;; | 264 | ;; |
| 265 | mov cr.ipsr=r16 | 265 | mov cr.ipsr=r16 |
| 266 | movl r17=1f | 266 | movl r17=1f |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 7dd96c127177..bab1de2d2f6a 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
| @@ -1139,7 +1139,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, | |||
| 1139 | return previous_current; | 1139 | return previous_current; |
| 1140 | 1140 | ||
| 1141 | no_mod: | 1141 | no_mod: |
| 1142 | printk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", | 1142 | mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n", |
| 1143 | smp_processor_id(), type, msg); | 1143 | smp_processor_id(), type, msg); |
| 1144 | return previous_current; | 1144 | return previous_current; |
| 1145 | } | 1145 | } |
diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index de35d8e8b7d2..9f14c16f6369 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c | |||
| @@ -130,7 +130,7 @@ ia64_native_getreg_func(int regnum) | |||
| 130 | unsigned long res = -1; | 130 | unsigned long res = -1; |
| 131 | switch (regnum) { | 131 | switch (regnum) { |
| 132 | CASE_GET_REG(GP); | 132 | CASE_GET_REG(GP); |
| 133 | CASE_GET_REG(IP); | 133 | /*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */ |
| 134 | CASE_GET_REG(PSR); | 134 | CASE_GET_REG(PSR); |
| 135 | CASE_GET_REG(TP); | 135 | CASE_GET_REG(TP); |
| 136 | CASE_GET_REG(SP); | 136 | CASE_GET_REG(SP); |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index dbdb778efa05..2a92f637431d 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | 20 | ||
| 21 | #include <asm/page.h> | 21 | #include <asm/page.h> |
| 22 | #include <asm/iommu.h> | ||
| 23 | 22 | ||
| 24 | dma_addr_t bad_dma_address __read_mostly; | 23 | dma_addr_t bad_dma_address __read_mostly; |
| 25 | EXPORT_SYMBOL(bad_dma_address); | 24 | EXPORT_SYMBOL(bad_dma_address); |
diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S index d4ff0b9e79f1..45e02bb64a92 100644 --- a/arch/ia64/xen/hypercall.S +++ b/arch/ia64/xen/hypercall.S | |||
| @@ -58,7 +58,7 @@ __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR) | |||
| 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) | 58 | __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR) |
| 59 | 59 | ||
| 60 | #ifdef CONFIG_IA32_SUPPORT | 60 | #ifdef CONFIG_IA32_SUPPORT |
| 61 | __HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) | 61 | __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG) |
| 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 | 62 | __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8 |
| 63 | #endif /* CONFIG_IA32_SUPPORT */ | 63 | #endif /* CONFIG_IA32_SUPPORT */ |
| 64 | 64 | ||
diff --git a/arch/mips/include/asm/mach-rc32434/gpio.h b/arch/mips/include/asm/mach-rc32434/gpio.h index c8e554eafce3..b5cf6457305a 100644 --- a/arch/mips/include/asm/mach-rc32434/gpio.h +++ b/arch/mips/include/asm/mach-rc32434/gpio.h | |||
| @@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned | |||
| 84 | extern unsigned get_434_reg(unsigned reg_offs); | 84 | extern unsigned get_434_reg(unsigned reg_offs); |
| 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); | 85 | extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask); |
| 86 | extern unsigned char get_latch_u5(void); | 86 | extern unsigned char get_latch_u5(void); |
| 87 | extern void rb532_gpio_set_ilevel(int bit, unsigned gpio); | ||
| 88 | extern void rb532_gpio_set_istat(int bit, unsigned gpio); | ||
| 87 | 89 | ||
| 88 | #endif /* _RC32434_GPIO_H_ */ | 90 | #endif /* _RC32434_GPIO_H_ */ |
diff --git a/arch/mips/include/asm/mach-rc32434/rb.h b/arch/mips/include/asm/mach-rc32434/rb.h index 79e8ef67d0d3..f25a84916703 100644 --- a/arch/mips/include/asm/mach-rc32434/rb.h +++ b/arch/mips/include/asm/mach-rc32434/rb.h | |||
| @@ -40,12 +40,14 @@ | |||
| 40 | #define BTCS 0x010040 | 40 | #define BTCS 0x010040 |
| 41 | #define BTCOMPARE 0x010044 | 41 | #define BTCOMPARE 0x010044 |
| 42 | #define GPIOBASE 0x050000 | 42 | #define GPIOBASE 0x050000 |
| 43 | #define GPIOCFG 0x050004 | 43 | /* Offsets relative to GPIOBASE */ |
| 44 | #define GPIOD 0x050008 | 44 | #define GPIOFUNC 0x00 |
| 45 | #define GPIOILEVEL 0x05000C | 45 | #define GPIOCFG 0x04 |
| 46 | #define GPIOISTAT 0x050010 | 46 | #define GPIOD 0x08 |
| 47 | #define GPIONMIEN 0x050014 | 47 | #define GPIOILEVEL 0x0C |
| 48 | #define IMASK6 0x038038 | 48 | #define GPIOISTAT 0x10 |
| 49 | #define GPIONMIEN 0x14 | ||
| 50 | #define IMASK6 0x38 | ||
| 49 | #define LO_WPX (1 << 0) | 51 | #define LO_WPX (1 << 0) |
| 50 | #define LO_ALE (1 << 1) | 52 | #define LO_ALE (1 << 1) |
| 51 | #define LO_CLE (1 << 2) | 53 | #define LO_CLE (1 << 2) |
diff --git a/arch/mips/include/asm/time.h b/arch/mips/include/asm/time.h index d3bd5c5aa2ec..9601ea950542 100644 --- a/arch/mips/include/asm/time.h +++ b/arch/mips/include/asm/time.h | |||
| @@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void) | |||
| 63 | /* | 63 | /* |
| 64 | * Initialize the count register as a clocksource | 64 | * Initialize the count register as a clocksource |
| 65 | */ | 65 | */ |
| 66 | #ifdef CONFIG_CEVT_R4K | 66 | #ifdef CONFIG_CSRC_R4K |
| 67 | extern int init_mips_clocksource(void); | 67 | extern int init_mips_clocksource(void); |
| 68 | #else | 68 | #else |
| 69 | static inline int init_mips_clocksource(void) | 69 | static inline int init_mips_clocksource(void) |
diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c index 86e026f067bc..74fb74583b4e 100644 --- a/arch/mips/kernel/csrc-r4k.c +++ b/arch/mips/kernel/csrc-r4k.c | |||
| @@ -27,7 +27,7 @@ int __init init_mips_clocksource(void) | |||
| 27 | if (!cpu_has_counter || !mips_hpt_frequency) | 27 | if (!cpu_has_counter || !mips_hpt_frequency) |
| 28 | return -ENXIO; | 28 | return -ENXIO; |
| 29 | 29 | ||
| 30 | /* Calclate a somewhat reasonable rating value */ | 30 | /* Calculate a somewhat reasonable rating value */ |
| 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; |
| 32 | 32 | ||
| 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); | 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); |
diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c index 1f602a110e10..13adb5782110 100644 --- a/arch/mips/mm/sc-ip22.c +++ b/arch/mips/mm/sc-ip22.c | |||
| @@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void) | |||
| 161 | 161 | ||
| 162 | /* XXX Check with wje if the Indy caches can differenciate between | 162 | /* XXX Check with wje if the Indy caches can differenciate between |
| 163 | writeback + invalidate and just invalidate. */ | 163 | writeback + invalidate and just invalidate. */ |
| 164 | struct bcache_ops indy_sc_ops = { | 164 | static struct bcache_ops indy_sc_ops = { |
| 165 | .bc_enable = indy_sc_enable, | 165 | .bc_enable = indy_sc_enable, |
| 166 | .bc_disable = indy_sc_disable, | 166 | .bc_disable = indy_sc_disable, |
| 167 | .bc_wback_inv = indy_sc_wback_invalidate, | 167 | .bc_wback_inv = indy_sc_wback_invalidate, |
diff --git a/arch/mips/mti-malta/malta-amon.c b/arch/mips/mti-malta/malta-amon.c index 96236bf33838..df9e526312a2 100644 --- a/arch/mips/mti-malta/malta-amon.c +++ b/arch/mips/mti-malta/malta-amon.c | |||
| @@ -22,9 +22,9 @@ | |||
| 22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 23 | #include <linux/smp.h> | 23 | #include <linux/smp.h> |
| 24 | 24 | ||
| 25 | #include <asm-mips/addrspace.h> | 25 | #include <asm/addrspace.h> |
| 26 | #include <asm-mips/mips-boards/launch.h> | 26 | #include <asm/mips-boards/launch.h> |
| 27 | #include <asm-mips/mipsmtregs.h> | 27 | #include <asm/mipsmtregs.h> |
| 28 | 28 | ||
| 29 | int amon_cpu_avail(int cpu) | 29 | int amon_cpu_avail(int cpu) |
| 30 | { | 30 | { |
diff --git a/arch/mips/rb532/devices.c b/arch/mips/rb532/devices.c index 2f22d714d5b0..c1c29181bd46 100644 --- a/arch/mips/rb532/devices.c +++ b/arch/mips/rb532/devices.c | |||
| @@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = { | |||
| 118 | /* Resources and device for NAND */ | 118 | /* Resources and device for NAND */ |
| 119 | static int rb532_dev_ready(struct mtd_info *mtd) | 119 | static int rb532_dev_ready(struct mtd_info *mtd) |
| 120 | { | 120 | { |
| 121 | return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY; | 121 | return gpio_get_value(GPIO_RDY); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) | 124 | static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) |
diff --git a/arch/mips/rb532/gpio.c b/arch/mips/rb532/gpio.c index 70c4a6726377..0e84c8ab6a39 100644 --- a/arch/mips/rb532/gpio.c +++ b/arch/mips/rb532/gpio.c | |||
| @@ -39,10 +39,6 @@ | |||
| 39 | struct rb532_gpio_chip { | 39 | struct rb532_gpio_chip { |
| 40 | struct gpio_chip chip; | 40 | struct gpio_chip chip; |
| 41 | void __iomem *regbase; | 41 | void __iomem *regbase; |
| 42 | void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value); | ||
| 43 | int (*get_int_level)(struct gpio_chip *chip, unsigned offset); | ||
| 44 | void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value); | ||
| 45 | int (*get_int_status)(struct gpio_chip *chip, unsigned offset); | ||
| 46 | }; | 42 | }; |
| 47 | 43 | ||
| 48 | struct mpmc_device dev3; | 44 | struct mpmc_device dev3; |
| @@ -111,15 +107,47 @@ unsigned char get_latch_u5(void) | |||
| 111 | } | 107 | } |
| 112 | EXPORT_SYMBOL(get_latch_u5); | 108 | EXPORT_SYMBOL(get_latch_u5); |
| 113 | 109 | ||
| 110 | /* rb532_set_bit - sanely set a bit | ||
| 111 | * | ||
| 112 | * bitval: new value for the bit | ||
| 113 | * offset: bit index in the 4 byte address range | ||
| 114 | * ioaddr: 4 byte aligned address being altered | ||
| 115 | */ | ||
| 116 | static inline void rb532_set_bit(unsigned bitval, | ||
| 117 | unsigned offset, void __iomem *ioaddr) | ||
| 118 | { | ||
| 119 | unsigned long flags; | ||
| 120 | u32 val; | ||
| 121 | |||
| 122 | bitval = !!bitval; /* map parameter to {0,1} */ | ||
| 123 | |||
| 124 | local_irq_save(flags); | ||
| 125 | |||
| 126 | val = readl(ioaddr); | ||
| 127 | val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */ | ||
| 128 | val |= ( bitval << offset ); /* set bit if bitval == 1 */ | ||
| 129 | writel(val, ioaddr); | ||
| 130 | |||
| 131 | local_irq_restore(flags); | ||
| 132 | } | ||
| 133 | |||
| 134 | /* rb532_get_bit - read a bit | ||
| 135 | * | ||
| 136 | * returns the boolean state of the bit, which may be > 1 | ||
| 137 | */ | ||
| 138 | static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr) | ||
| 139 | { | ||
| 140 | return (readl(ioaddr) & (1 << offset)); | ||
| 141 | } | ||
| 142 | |||
| 114 | /* | 143 | /* |
| 115 | * Return GPIO level */ | 144 | * Return GPIO level */ |
| 116 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | 145 | static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) |
| 117 | { | 146 | { |
| 118 | u32 mask = 1 << offset; | ||
| 119 | struct rb532_gpio_chip *gpch; | 147 | struct rb532_gpio_chip *gpch; |
| 120 | 148 | ||
| 121 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 149 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 122 | return readl(gpch->regbase + GPIOD) & mask; | 150 | return rb532_get_bit(offset, gpch->regbase + GPIOD); |
| 123 | } | 151 | } |
| 124 | 152 | ||
| 125 | /* | 153 | /* |
| @@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset) | |||
| 128 | static void rb532_gpio_set(struct gpio_chip *chip, | 156 | static void rb532_gpio_set(struct gpio_chip *chip, |
| 129 | unsigned offset, int value) | 157 | unsigned offset, int value) |
| 130 | { | 158 | { |
| 131 | unsigned long flags; | ||
| 132 | u32 mask = 1 << offset; | ||
| 133 | u32 tmp; | ||
| 134 | struct rb532_gpio_chip *gpch; | 159 | struct rb532_gpio_chip *gpch; |
| 135 | void __iomem *gpvr; | ||
| 136 | 160 | ||
| 137 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 138 | gpvr = gpch->regbase + GPIOD; | 162 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); |
| 139 | |||
| 140 | local_irq_save(flags); | ||
| 141 | tmp = readl(gpvr); | ||
| 142 | if (value) | ||
| 143 | tmp |= mask; | ||
| 144 | else | ||
| 145 | tmp &= ~mask; | ||
| 146 | writel(tmp, gpvr); | ||
| 147 | local_irq_restore(flags); | ||
| 148 | } | 163 | } |
| 149 | 164 | ||
| 150 | /* | 165 | /* |
| @@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip, | |||
| 152 | */ | 167 | */ |
| 153 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | 168 | static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) |
| 154 | { | 169 | { |
| 155 | unsigned long flags; | ||
| 156 | u32 mask = 1 << offset; | ||
| 157 | u32 value; | ||
| 158 | struct rb532_gpio_chip *gpch; | 170 | struct rb532_gpio_chip *gpch; |
| 159 | void __iomem *gpdr; | ||
| 160 | 171 | ||
| 161 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 172 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 162 | gpdr = gpch->regbase + GPIOCFG; | ||
| 163 | 173 | ||
| 164 | local_irq_save(flags); | 174 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
| 165 | value = readl(gpdr); | 175 | return 1; /* alternate function, GPIOCFG is ignored */ |
| 166 | value &= ~mask; | ||
| 167 | writel(value, gpdr); | ||
| 168 | local_irq_restore(flags); | ||
| 169 | 176 | ||
| 177 | rb532_set_bit(0, offset, gpch->regbase + GPIOCFG); | ||
| 170 | return 0; | 178 | return 0; |
| 171 | } | 179 | } |
| 172 | 180 | ||
| @@ -176,117 +184,60 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | |||
| 176 | static int rb532_gpio_direction_output(struct gpio_chip *chip, | 184 | static int rb532_gpio_direction_output(struct gpio_chip *chip, |
| 177 | unsigned offset, int value) | 185 | unsigned offset, int value) |
| 178 | { | 186 | { |
| 179 | unsigned long flags; | ||
| 180 | u32 mask = 1 << offset; | ||
| 181 | u32 tmp; | ||
| 182 | struct rb532_gpio_chip *gpch; | 187 | struct rb532_gpio_chip *gpch; |
| 183 | void __iomem *gpdr; | ||
| 184 | 188 | ||
| 185 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 189 | gpch = container_of(chip, struct rb532_gpio_chip, chip); |
| 186 | writel(mask, gpch->regbase + GPIOD); | ||
| 187 | gpdr = gpch->regbase + GPIOCFG; | ||
| 188 | 190 | ||
| 189 | local_irq_save(flags); | 191 | if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC)) |
| 190 | tmp = readl(gpdr); | 192 | return 1; /* alternate function, GPIOCFG is ignored */ |
| 191 | tmp |= mask; | ||
| 192 | writel(tmp, gpdr); | ||
| 193 | local_irq_restore(flags); | ||
| 194 | 193 | ||
| 194 | /* set the initial output value */ | ||
| 195 | rb532_set_bit(value, offset, gpch->regbase + GPIOD); | ||
| 196 | |||
| 197 | rb532_set_bit(1, offset, gpch->regbase + GPIOCFG); | ||
| 195 | return 0; | 198 | return 0; |
| 196 | } | 199 | } |
| 197 | 200 | ||
| 198 | /* | 201 | static struct rb532_gpio_chip rb532_gpio_chip[] = { |
| 199 | * Set the GPIO interrupt level | 202 | [0] = { |
| 200 | */ | 203 | .chip = { |
| 201 | static void rb532_gpio_set_int_level(struct gpio_chip *chip, | 204 | .label = "gpio0", |
| 202 | unsigned offset, int value) | 205 | .direction_input = rb532_gpio_direction_input, |
| 203 | { | 206 | .direction_output = rb532_gpio_direction_output, |
| 204 | unsigned long flags; | 207 | .get = rb532_gpio_get, |
| 205 | u32 mask = 1 << offset; | 208 | .set = rb532_gpio_set, |
| 206 | u32 tmp; | 209 | .base = 0, |
| 207 | struct rb532_gpio_chip *gpch; | 210 | .ngpio = 32, |
| 208 | void __iomem *gpil; | 211 | }, |
| 209 | 212 | }, | |
| 210 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | 213 | }; |
| 211 | gpil = gpch->regbase + GPIOILEVEL; | ||
| 212 | |||
| 213 | local_irq_save(flags); | ||
| 214 | tmp = readl(gpil); | ||
| 215 | if (value) | ||
| 216 | tmp |= mask; | ||
| 217 | else | ||
| 218 | tmp &= ~mask; | ||
| 219 | writel(tmp, gpil); | ||
| 220 | local_irq_restore(flags); | ||
| 221 | } | ||
| 222 | 214 | ||
| 223 | /* | 215 | /* |
| 224 | * Get the GPIO interrupt level | 216 | * Set GPIO interrupt level |
| 225 | */ | 217 | */ |
| 226 | static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset) | 218 | void rb532_gpio_set_ilevel(int bit, unsigned gpio) |
| 227 | { | 219 | { |
| 228 | u32 mask = 1 << offset; | 220 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL); |
| 229 | struct rb532_gpio_chip *gpch; | ||
| 230 | |||
| 231 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 232 | return readl(gpch->regbase + GPIOILEVEL) & mask; | ||
| 233 | } | 221 | } |
| 222 | EXPORT_SYMBOL(rb532_gpio_set_ilevel); | ||
| 234 | 223 | ||
| 235 | /* | 224 | /* |
| 236 | * Set the GPIO interrupt status | 225 | * Set GPIO interrupt status |
| 237 | */ | 226 | */ |
| 238 | static void rb532_gpio_set_int_status(struct gpio_chip *chip, | 227 | void rb532_gpio_set_istat(int bit, unsigned gpio) |
| 239 | unsigned offset, int value) | ||
| 240 | { | 228 | { |
| 241 | unsigned long flags; | 229 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT); |
| 242 | u32 mask = 1 << offset; | ||
| 243 | u32 tmp; | ||
| 244 | struct rb532_gpio_chip *gpch; | ||
| 245 | void __iomem *gpis; | ||
| 246 | |||
| 247 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 248 | gpis = gpch->regbase + GPIOISTAT; | ||
| 249 | |||
| 250 | local_irq_save(flags); | ||
| 251 | tmp = readl(gpis); | ||
| 252 | if (value) | ||
| 253 | tmp |= mask; | ||
| 254 | else | ||
| 255 | tmp &= ~mask; | ||
| 256 | writel(tmp, gpis); | ||
| 257 | local_irq_restore(flags); | ||
| 258 | } | 230 | } |
| 231 | EXPORT_SYMBOL(rb532_gpio_set_istat); | ||
| 259 | 232 | ||
| 260 | /* | 233 | /* |
| 261 | * Get the GPIO interrupt status | 234 | * Configure GPIO alternate function |
| 262 | */ | 235 | */ |
| 263 | static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset) | 236 | static void rb532_gpio_set_func(int bit, unsigned gpio) |
| 264 | { | 237 | { |
| 265 | u32 mask = 1 << offset; | 238 | rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC); |
| 266 | struct rb532_gpio_chip *gpch; | ||
| 267 | |||
| 268 | gpch = container_of(chip, struct rb532_gpio_chip, chip); | ||
| 269 | return readl(gpch->regbase + GPIOISTAT) & mask; | ||
| 270 | } | 239 | } |
| 271 | 240 | ||
| 272 | static struct rb532_gpio_chip rb532_gpio_chip[] = { | ||
| 273 | [0] = { | ||
| 274 | .chip = { | ||
| 275 | .label = "gpio0", | ||
| 276 | .direction_input = rb532_gpio_direction_input, | ||
| 277 | .direction_output = rb532_gpio_direction_output, | ||
| 278 | .get = rb532_gpio_get, | ||
| 279 | .set = rb532_gpio_set, | ||
| 280 | .base = 0, | ||
| 281 | .ngpio = 32, | ||
| 282 | }, | ||
| 283 | .get_int_level = rb532_gpio_get_int_level, | ||
| 284 | .set_int_level = rb532_gpio_set_int_level, | ||
| 285 | .get_int_status = rb532_gpio_get_int_status, | ||
| 286 | .set_int_status = rb532_gpio_set_int_status, | ||
| 287 | }, | ||
| 288 | }; | ||
| 289 | |||
| 290 | int __init rb532_gpio_init(void) | 241 | int __init rb532_gpio_init(void) |
| 291 | { | 242 | { |
| 292 | struct resource *r; | 243 | struct resource *r; |
| @@ -310,9 +261,11 @@ int __init rb532_gpio_init(void) | |||
| 310 | return -ENXIO; | 261 | return -ENXIO; |
| 311 | } | 262 | } |
| 312 | 263 | ||
| 313 | /* Set the interrupt status and level for the CF pin */ | 264 | /* configure CF_GPIO_NUM as CFRDY IRQ source */ |
| 314 | rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1); | 265 | rb532_gpio_set_func(0, CF_GPIO_NUM); |
| 315 | rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0); | 266 | rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM); |
| 267 | rb532_gpio_set_ilevel(1, CF_GPIO_NUM); | ||
| 268 | rb532_gpio_set_istat(0, CF_GPIO_NUM); | ||
| 316 | 269 | ||
| 317 | return 0; | 270 | return 0; |
| 318 | } | 271 | } |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 90904f9dfc50..927db3668b6f 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
| @@ -183,10 +183,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 183 | * being 64 bit in both cases. | 183 | * being 64 bit in both cases. |
| 184 | */ | 184 | */ |
| 185 | 185 | ||
| 186 | static long translate_usr_offset(long offset) | 186 | static compat_ulong_t translate_usr_offset(compat_ulong_t offset) |
| 187 | { | 187 | { |
| 188 | if (offset < 0) | 188 | if (offset < 0) |
| 189 | return -1; | 189 | return sizeof(struct pt_regs); |
| 190 | else if (offset <= 32*4) /* gr[0..31] */ | 190 | else if (offset <= 32*4) /* gr[0..31] */ |
| 191 | return offset * 2 + 4; | 191 | return offset * 2 + 4; |
| 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ | 192 | else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ |
| @@ -194,7 +194,7 @@ static long translate_usr_offset(long offset) | |||
| 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) | 194 | else if (offset < sizeof(struct pt_regs)/2 + 32*4) |
| 195 | return offset * 2 + 4 - 32*8; | 195 | return offset * 2 + 4 - 32*8; |
| 196 | else | 196 | else |
| 197 | return -1; | 197 | return sizeof(struct pt_regs); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | 200 | long compat_arch_ptrace(struct task_struct *child, compat_long_t request, |
| @@ -209,7 +209,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 209 | if (addr & (sizeof(compat_uint_t)-1)) | 209 | if (addr & (sizeof(compat_uint_t)-1)) |
| 210 | break; | 210 | break; |
| 211 | addr = translate_usr_offset(addr); | 211 | addr = translate_usr_offset(addr); |
| 212 | if (addr < 0) | 212 | if (addr >= sizeof(struct pt_regs)) |
| 213 | break; | 213 | break; |
| 214 | 214 | ||
| 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); | 215 | tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr); |
| @@ -236,7 +236,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
| 236 | if (addr & (sizeof(compat_uint_t)-1)) | 236 | if (addr & (sizeof(compat_uint_t)-1)) |
| 237 | break; | 237 | break; |
| 238 | addr = translate_usr_offset(addr); | 238 | addr = translate_usr_offset(addr); |
| 239 | if (addr < 0) | 239 | if (addr >= sizeof(struct pt_regs)) |
| 240 | break; | 240 | break; |
| 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { | 241 | if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { |
| 242 | /* Special case, fp regs are 64 bits anyway */ | 242 | /* Special case, fp regs are 64 bits anyway */ |
diff --git a/arch/sparc/include/asm/unistd_32.h b/arch/sparc/include/asm/unistd_32.h index 648643a9f139..0d13d2a4c76f 100644 --- a/arch/sparc/include/asm/unistd_32.h +++ b/arch/sparc/include/asm/unistd_32.h | |||
| @@ -338,8 +338,9 @@ | |||
| 338 | #define __NR_dup3 320 | 338 | #define __NR_dup3 320 |
| 339 | #define __NR_pipe2 321 | 339 | #define __NR_pipe2 321 |
| 340 | #define __NR_inotify_init1 322 | 340 | #define __NR_inotify_init1 322 |
| 341 | #define __NR_accept4 323 | ||
| 341 | 342 | ||
| 342 | #define NR_SYSCALLS 323 | 343 | #define NR_SYSCALLS 324 |
| 343 | 344 | ||
| 344 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 345 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
| 345 | * it never had the plain ones and there is no value to adding those | 346 | * it never had the plain ones and there is no value to adding those |
diff --git a/arch/sparc/include/asm/unistd_64.h b/arch/sparc/include/asm/unistd_64.h index c5cc0e052321..fa5d3c0343c7 100644 --- a/arch/sparc/include/asm/unistd_64.h +++ b/arch/sparc/include/asm/unistd_64.h | |||
| @@ -340,8 +340,9 @@ | |||
| 340 | #define __NR_dup3 320 | 340 | #define __NR_dup3 320 |
| 341 | #define __NR_pipe2 321 | 341 | #define __NR_pipe2 321 |
| 342 | #define __NR_inotify_init1 322 | 342 | #define __NR_inotify_init1 322 |
| 343 | #define __NR_accept4 323 | ||
| 343 | 344 | ||
| 344 | #define NR_SYSCALLS 323 | 345 | #define NR_SYSCALLS 324 |
| 345 | 346 | ||
| 346 | #ifdef __KERNEL__ | 347 | #ifdef __KERNEL__ |
| 347 | #define __ARCH_WANT_IPC_PARSE_VERSION | 348 | #define __ARCH_WANT_IPC_PARSE_VERSION |
diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S index e1b9233b90ab..7d0807586442 100644 --- a/arch/sparc/kernel/systbls.S +++ b/arch/sparc/kernel/systbls.S | |||
| @@ -81,4 +81,4 @@ sys_call_table: | |||
| 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
| 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
| 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1 | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/sparc64/kernel/sys32.S b/arch/sparc64/kernel/sys32.S index ade18ba0c686..f061c4dda9ef 100644 --- a/arch/sparc64/kernel/sys32.S +++ b/arch/sparc64/kernel/sys32.S | |||
| @@ -150,7 +150,7 @@ sys32_mmap2: | |||
| 150 | sys32_socketcall: /* %o0=call, %o1=args */ | 150 | sys32_socketcall: /* %o0=call, %o1=args */ |
| 151 | cmp %o0, 1 | 151 | cmp %o0, 1 |
| 152 | bl,pn %xcc, do_einval | 152 | bl,pn %xcc, do_einval |
| 153 | cmp %o0, 17 | 153 | cmp %o0, 18 |
| 154 | bg,pn %xcc, do_einval | 154 | bg,pn %xcc, do_einval |
| 155 | sub %o0, 1, %o0 | 155 | sub %o0, 1, %o0 |
| 156 | sllx %o0, 5, %o0 | 156 | sllx %o0, 5, %o0 |
| @@ -319,6 +319,15 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
| 319 | nop | 319 | nop |
| 320 | nop | 320 | nop |
| 321 | nop | 321 | nop |
| 322 | do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */ | ||
| 323 | 63: ldswa [%o1 + 0x0] %asi, %o0 | ||
| 324 | sethi %hi(sys_accept4), %g1 | ||
| 325 | 64: lduwa [%o1 + 0x8] %asi, %o2 | ||
| 326 | 65: ldswa [%o1 + 0xc] %asi, %o3 | ||
| 327 | jmpl %g1 + %lo(sys_accept4), %g0 | ||
| 328 | 66: lduwa [%o1 + 0x4] %asi, %o1 | ||
| 329 | nop | ||
| 330 | nop | ||
| 322 | 331 | ||
| 323 | .section __ex_table,"a" | 332 | .section __ex_table,"a" |
| 324 | .align 4 | 333 | .align 4 |
| @@ -353,4 +362,6 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) | |||
| 353 | .word 57b, __retl_efault, 58b, __retl_efault | 362 | .word 57b, __retl_efault, 58b, __retl_efault |
| 354 | .word 59b, __retl_efault, 60b, __retl_efault | 363 | .word 59b, __retl_efault, 60b, __retl_efault |
| 355 | .word 61b, __retl_efault, 62b, __retl_efault | 364 | .word 61b, __retl_efault, 62b, __retl_efault |
| 365 | .word 63b, __retl_efault, 64b, __retl_efault | ||
| 366 | .word 65b, __retl_efault, 66b, __retl_efault | ||
| 356 | .previous | 367 | .previous |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index b2fa4c163638..9fc78cf354bd 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
| @@ -82,7 +82,7 @@ sys_call_table32: | |||
| 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
| 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
| 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
| 86 | 86 | ||
| 87 | #endif /* CONFIG_COMPAT */ | 87 | #endif /* CONFIG_COMPAT */ |
| 88 | 88 | ||
| @@ -156,4 +156,4 @@ sys_call_table: | |||
| 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
| 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
| 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
| 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1 | 159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4 |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index f232d5a98491..7b7d2764a215 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -167,9 +167,12 @@ config GENERIC_PENDING_IRQ | |||
| 167 | config X86_SMP | 167 | config X86_SMP |
| 168 | bool | 168 | bool |
| 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | 169 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) |
| 170 | select USE_GENERIC_SMP_HELPERS | ||
| 171 | default y | 170 | default y |
| 172 | 171 | ||
| 172 | config USE_GENERIC_SMP_HELPERS | ||
| 173 | def_bool y | ||
| 174 | depends on SMP | ||
| 175 | |||
| 173 | config X86_32_SMP | 176 | config X86_32_SMP |
| 174 | def_bool y | 177 | def_bool y |
| 175 | depends on X86_32 && SMP | 178 | depends on X86_32 && SMP |
| @@ -957,7 +960,7 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
| 957 | config NUMA | 960 | config NUMA |
| 958 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" | 961 | bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" |
| 959 | depends on SMP | 962 | depends on SMP |
| 960 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) | 963 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) |
| 961 | default n if X86_PC | 964 | default n if X86_PC |
| 962 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) | 965 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) |
| 963 | help | 966 | help |
diff --git a/include/asm-x86/iomap.h b/arch/x86/include/asm/iomap.h index c1f06289b14b..c1f06289b14b 100644 --- a/include/asm-x86/iomap.h +++ b/arch/x86/include/asm/iomap.h | |||
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h index 485bdf059ffb..07f1af494ca5 100644 --- a/arch/x86/include/asm/mmzone_32.h +++ b/arch/x86/include/asm/mmzone_32.h | |||
| @@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) | |||
| 34 | 34 | ||
| 35 | extern int early_pfn_to_nid(unsigned long pfn); | 35 | extern int early_pfn_to_nid(unsigned long pfn); |
| 36 | 36 | ||
| 37 | extern void resume_map_numa_kva(pgd_t *pgd); | ||
| 38 | |||
| 37 | #else /* !CONFIG_NUMA */ | 39 | #else /* !CONFIG_NUMA */ |
| 38 | 40 | ||
| 39 | #define get_memcfg_numa get_memcfg_numa_flat | 41 | #define get_memcfg_numa get_memcfg_numa_flat |
| 40 | 42 | ||
| 43 | static inline void resume_map_numa_kva(pgd_t *pgd) {} | ||
| 44 | |||
| 41 | #endif /* CONFIG_NUMA */ | 45 | #endif /* CONFIG_NUMA */ |
| 42 | 46 | ||
| 43 | #ifdef CONFIG_DISCONTIGMEM | 47 | #ifdef CONFIG_DISCONTIGMEM |
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h index 664f15280f14..f8cfd00db450 100644 --- a/arch/x86/include/asm/uaccess_64.h +++ b/arch/x86/include/asm/uaccess_64.h | |||
| @@ -46,7 +46,7 @@ int __copy_from_user(void *dst, const void __user *src, unsigned size) | |||
| 46 | return ret; | 46 | return ret; |
| 47 | case 10: | 47 | case 10: |
| 48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, | 48 | __get_user_asm(*(u64 *)dst, (u64 __user *)src, |
| 49 | ret, "q", "", "=r", 16); | 49 | ret, "q", "", "=r", 10); |
| 50 | if (unlikely(ret)) | 50 | if (unlikely(ret)) |
| 51 | return ret; | 51 | return ret; |
| 52 | __get_user_asm(*(u16 *)(8 + (char *)dst), | 52 | __get_user_asm(*(u16 *)(8 + (char *)dst), |
diff --git a/arch/x86/include/asm/unistd_64.h b/arch/x86/include/asm/unistd_64.h index 834b2c1d89fb..d2e415e6666f 100644 --- a/arch/x86/include/asm/unistd_64.h +++ b/arch/x86/include/asm/unistd_64.h | |||
| @@ -639,8 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate) | |||
| 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) | 639 | __SYSCALL(__NR_timerfd_settime, sys_timerfd_settime) |
| 640 | #define __NR_timerfd_gettime 287 | 640 | #define __NR_timerfd_gettime 287 |
| 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) | 641 | __SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime) |
| 642 | #define __NR_paccept 288 | 642 | #define __NR_accept4 288 |
| 643 | __SYSCALL(__NR_paccept, sys_paccept) | 643 | __SYSCALL(__NR_accept4, sys_accept4) |
| 644 | #define __NR_signalfd4 289 | 644 | #define __NR_signalfd4 289 |
| 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) | 645 | __SYSCALL(__NR_signalfd4, sys_signalfd4) |
| 646 | #define __NR_eventfd2 290 | 646 | #define __NR_eventfd2 290 |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 331b318304eb..e4899e0e8787 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -537,7 +537,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom, | |||
| 537 | address >>= PAGE_SHIFT; | 537 | address >>= PAGE_SHIFT; |
| 538 | iommu_area_free(dom->bitmap, address, pages); | 538 | iommu_area_free(dom->bitmap, address, pages); |
| 539 | 539 | ||
| 540 | if (address + pages >= dom->next_bit) | 540 | if (address >= dom->next_bit) |
| 541 | dom->need_flush = true; | 541 | dom->need_flush = true; |
| 542 | } | 542 | } |
| 543 | 543 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 0cdcda35a05f..30ae2701b3df 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -121,7 +121,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
| 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 121 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
| 122 | we find in ACPI */ | 122 | we find in ACPI */ |
| 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ | 123 | unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ |
| 124 | int amd_iommu_isolate; /* if 1, device isolation is enabled */ | 124 | int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ |
| 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 125 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
| 126 | 126 | ||
| 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 127 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
| @@ -1213,7 +1213,9 @@ static int __init parse_amd_iommu_options(char *str) | |||
| 1213 | for (; *str; ++str) { | 1213 | for (; *str; ++str) { |
| 1214 | if (strncmp(str, "isolate", 7) == 0) | 1214 | if (strncmp(str, "isolate", 7) == 0) |
| 1215 | amd_iommu_isolate = 1; | 1215 | amd_iommu_isolate = 1; |
| 1216 | if (strncmp(str, "fullflush", 11) == 0) | 1216 | if (strncmp(str, "share", 5) == 0) |
| 1217 | amd_iommu_isolate = 0; | ||
| 1218 | if (strncmp(str, "fullflush", 9) == 0) | ||
| 1217 | amd_iommu_unmap_flush = true; | 1219 | amd_iommu_unmap_flush = true; |
| 1218 | } | 1220 | } |
| 1219 | 1221 | ||
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 2b69994fd3a8..d1a121443bde 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
| @@ -236,17 +236,33 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) | |||
| 236 | struct ds_context *context = *p_context; | 236 | struct ds_context *context = *p_context; |
| 237 | 237 | ||
| 238 | if (!context) { | 238 | if (!context) { |
| 239 | spin_unlock(&ds_lock); | ||
| 240 | |||
| 239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | 241 | context = kzalloc(sizeof(*context), GFP_KERNEL); |
| 240 | 242 | ||
| 241 | if (!context) | 243 | if (!context) { |
| 244 | spin_lock(&ds_lock); | ||
| 242 | return NULL; | 245 | return NULL; |
| 246 | } | ||
| 243 | 247 | ||
| 244 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | 248 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); |
| 245 | if (!context->ds) { | 249 | if (!context->ds) { |
| 246 | kfree(context); | 250 | kfree(context); |
| 251 | spin_lock(&ds_lock); | ||
| 247 | return NULL; | 252 | return NULL; |
| 248 | } | 253 | } |
| 249 | 254 | ||
| 255 | spin_lock(&ds_lock); | ||
| 256 | /* | ||
| 257 | * Check for race - another CPU could have allocated | ||
| 258 | * it meanwhile: | ||
| 259 | */ | ||
| 260 | if (*p_context) { | ||
| 261 | kfree(context->ds); | ||
| 262 | kfree(context); | ||
| 263 | return *p_context; | ||
| 264 | } | ||
| 265 | |||
| 250 | *p_context = context; | 266 | *p_context = context; |
| 251 | 267 | ||
| 252 | context->this = p_context; | 268 | context->this = p_context; |
| @@ -384,14 +400,15 @@ static int ds_request(struct task_struct *task, void *base, size_t size, | |||
| 384 | 400 | ||
| 385 | spin_lock(&ds_lock); | 401 | spin_lock(&ds_lock); |
| 386 | 402 | ||
| 387 | if (!check_tracer(task)) | ||
| 388 | return -EPERM; | ||
| 389 | |||
| 390 | error = -ENOMEM; | 403 | error = -ENOMEM; |
| 391 | context = ds_alloc_context(task); | 404 | context = ds_alloc_context(task); |
| 392 | if (!context) | 405 | if (!context) |
| 393 | goto out_unlock; | 406 | goto out_unlock; |
| 394 | 407 | ||
| 408 | error = -EPERM; | ||
| 409 | if (!check_tracer(task)) | ||
| 410 | goto out_unlock; | ||
| 411 | |||
| 395 | error = -EALREADY; | 412 | error = -EALREADY; |
| 396 | if (context->owner[qual] == current) | 413 | if (context->owner[qual] == current) |
| 397 | goto out_unlock; | 414 | goto out_unlock; |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c index f454c78fcef6..0aa2c443d600 100644 --- a/arch/x86/kernel/es7000_32.c +++ b/arch/x86/kernel/es7000_32.c | |||
| @@ -250,31 +250,24 @@ int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | |||
| 250 | { | 250 | { |
| 251 | struct acpi_table_header *header = NULL; | 251 | struct acpi_table_header *header = NULL; |
| 252 | int i = 0; | 252 | int i = 0; |
| 253 | acpi_size tbl_size; | ||
| 254 | 253 | ||
| 255 | while (ACPI_SUCCESS(acpi_get_table_with_size("OEM1", i++, &header, &tbl_size))) { | 254 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { |
| 256 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | 255 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { |
| 257 | struct oem_table *t = (struct oem_table *)header; | 256 | struct oem_table *t = (struct oem_table *)header; |
| 258 | 257 | ||
| 259 | oem_addrX = t->OEMTableAddr; | 258 | oem_addrX = t->OEMTableAddr; |
| 260 | oem_size = t->OEMTableSize; | 259 | oem_size = t->OEMTableSize; |
| 261 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 262 | 260 | ||
| 263 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | 261 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, |
| 264 | oem_size); | 262 | oem_size); |
| 265 | return 0; | 263 | return 0; |
| 266 | } | 264 | } |
| 267 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 268 | } | 265 | } |
| 269 | return -1; | 266 | return -1; |
| 270 | } | 267 | } |
| 271 | 268 | ||
| 272 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | 269 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) |
| 273 | { | 270 | { |
| 274 | if (!oem_addr) | ||
| 275 | return; | ||
| 276 | |||
| 277 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
| 278 | } | 271 | } |
| 279 | #endif | 272 | #endif |
| 280 | 273 | ||
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/io_apic.c index 7a3f2028e2eb..c9513e1ff28d 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/io_apic.c | |||
| @@ -1140,6 +1140,20 @@ static void __clear_irq_vector(int irq) | |||
| 1140 | 1140 | ||
| 1141 | cfg->vector = 0; | 1141 | cfg->vector = 0; |
| 1142 | cpus_clear(cfg->domain); | 1142 | cpus_clear(cfg->domain); |
| 1143 | |||
| 1144 | if (likely(!cfg->move_in_progress)) | ||
| 1145 | return; | ||
| 1146 | cpus_and(mask, cfg->old_domain, cpu_online_map); | ||
| 1147 | for_each_cpu_mask_nr(cpu, mask) { | ||
| 1148 | for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; | ||
| 1149 | vector++) { | ||
| 1150 | if (per_cpu(vector_irq, cpu)[vector] != irq) | ||
| 1151 | continue; | ||
| 1152 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
| 1153 | break; | ||
| 1154 | } | ||
| 1155 | } | ||
| 1156 | cfg->move_in_progress = 0; | ||
| 1143 | } | 1157 | } |
| 1144 | 1158 | ||
| 1145 | void __setup_vector_irq(int cpu) | 1159 | void __setup_vector_irq(int cpu) |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 724adfc63cb9..cc5a2545dd41 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -169,6 +169,15 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
| 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), | 169 | DMI_MATCH(DMI_BOARD_NAME, "0KW626"), |
| 170 | }, | 170 | }, |
| 171 | }, | 171 | }, |
| 172 | { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */ | ||
| 173 | .callback = set_bios_reboot, | ||
| 174 | .ident = "Dell OptiPlex 330", | ||
| 175 | .matches = { | ||
| 176 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
| 177 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"), | ||
| 178 | DMI_MATCH(DMI_BOARD_NAME, "0KP561"), | ||
| 179 | }, | ||
| 180 | }, | ||
| 172 | { /* Handle problems with rebooting on Dell 2400's */ | 181 | { /* Handle problems with rebooting on Dell 2400's */ |
| 173 | .callback = set_bios_reboot, | 182 | .callback = set_bios_reboot, |
| 174 | .ident = "Dell PowerEdge 2400", | 183 | .ident = "Dell PowerEdge 2400", |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 0fa6790c1dd3..9d5674f7b6cc 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -764,7 +764,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 764 | .callback = dmi_low_memory_corruption, | 764 | .callback = dmi_low_memory_corruption, |
| 765 | .ident = "Phoenix BIOS", | 765 | .ident = "Phoenix BIOS", |
| 766 | .matches = { | 766 | .matches = { |
| 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), | 767 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), |
| 768 | }, | 768 | }, |
| 769 | }, | 769 | }, |
| 770 | #endif | 770 | #endif |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 9ffb01c31c40..1c0dfbca87c1 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
| @@ -46,7 +46,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 46 | cycles_t start, now, prev, end; | 46 | cycles_t start, now, prev, end; |
| 47 | int i; | 47 | int i; |
| 48 | 48 | ||
| 49 | rdtsc_barrier(); | ||
| 49 | start = get_cycles(); | 50 | start = get_cycles(); |
| 51 | rdtsc_barrier(); | ||
| 50 | /* | 52 | /* |
| 51 | * The measurement runs for 20 msecs: | 53 | * The measurement runs for 20 msecs: |
| 52 | */ | 54 | */ |
| @@ -61,7 +63,9 @@ static __cpuinit void check_tsc_warp(void) | |||
| 61 | */ | 63 | */ |
| 62 | __raw_spin_lock(&sync_lock); | 64 | __raw_spin_lock(&sync_lock); |
| 63 | prev = last_tsc; | 65 | prev = last_tsc; |
| 66 | rdtsc_barrier(); | ||
| 64 | now = get_cycles(); | 67 | now = get_cycles(); |
| 68 | rdtsc_barrier(); | ||
| 65 | last_tsc = now; | 69 | last_tsc = now; |
| 66 | __raw_spin_unlock(&sync_lock); | 70 | __raw_spin_unlock(&sync_lock); |
| 67 | 71 | ||
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 0e331652681e..52145007bd7e 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | * This file provides all the same external entries as smp.c but uses | 7 | * This file provides all the same external entries as smp.c but uses |
| 8 | * the voyager hal to provide the functionality | 8 | * the voyager hal to provide the functionality |
| 9 | */ | 9 | */ |
| 10 | #include <linux/cpu.h> | ||
| 10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
| 11 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 12 | #include <linux/kernel_stat.h> | 13 | #include <linux/kernel_stat.h> |
| @@ -1790,6 +1791,17 @@ void __init smp_setup_processor_id(void) | |||
| 1790 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | 1791 | x86_write_percpu(cpu_number, hard_smp_processor_id()); |
| 1791 | } | 1792 | } |
| 1792 | 1793 | ||
| 1794 | static void voyager_send_call_func(cpumask_t callmask) | ||
| 1795 | { | ||
| 1796 | __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); | ||
| 1797 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); | ||
| 1798 | } | ||
| 1799 | |||
| 1800 | static void voyager_send_call_func_single(int cpu) | ||
| 1801 | { | ||
| 1802 | send_CPI(1 << cpu, VIC_CALL_FUNCTION_SINGLE_CPI); | ||
| 1803 | } | ||
| 1804 | |||
| 1793 | struct smp_ops smp_ops = { | 1805 | struct smp_ops smp_ops = { |
| 1794 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, | 1806 | .smp_prepare_boot_cpu = voyager_smp_prepare_boot_cpu, |
| 1795 | .smp_prepare_cpus = voyager_smp_prepare_cpus, | 1807 | .smp_prepare_cpus = voyager_smp_prepare_cpus, |
| @@ -1799,6 +1811,6 @@ struct smp_ops smp_ops = { | |||
| 1799 | .smp_send_stop = voyager_smp_send_stop, | 1811 | .smp_send_stop = voyager_smp_send_stop, |
| 1800 | .smp_send_reschedule = voyager_smp_send_reschedule, | 1812 | .smp_send_reschedule = voyager_smp_send_reschedule, |
| 1801 | 1813 | ||
| 1802 | .send_call_func_ipi = native_send_call_func_ipi, | 1814 | .send_call_func_ipi = voyager_send_call_func, |
| 1803 | .send_call_func_single_ipi = native_send_call_func_single_ipi, | 1815 | .send_call_func_single_ipi = voyager_send_call_func_single, |
| 1804 | }; | 1816 | }; |
diff --git a/arch/x86/mm/numa_32.c b/arch/x86/mm/numa_32.c index 847c164725f4..8518c678d83f 100644 --- a/arch/x86/mm/numa_32.c +++ b/arch/x86/mm/numa_32.c | |||
| @@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) | |||
| 222 | } | 222 | } |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | #ifdef CONFIG_HIBERNATION | ||
| 226 | /** | ||
| 227 | * resume_map_numa_kva - add KVA mapping to the temporary page tables created | ||
| 228 | * during resume from hibernation | ||
| 229 | * @pgd_base - temporary resume page directory | ||
| 230 | */ | ||
| 231 | void resume_map_numa_kva(pgd_t *pgd_base) | ||
| 232 | { | ||
| 233 | int node; | ||
| 234 | |||
| 235 | for_each_online_node(node) { | ||
| 236 | unsigned long start_va, start_pfn, size, pfn; | ||
| 237 | |||
| 238 | start_va = (unsigned long)node_remap_start_vaddr[node]; | ||
| 239 | start_pfn = node_remap_start_pfn[node]; | ||
| 240 | size = node_remap_size[node]; | ||
| 241 | |||
| 242 | printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); | ||
| 243 | |||
| 244 | for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { | ||
| 245 | unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); | ||
| 246 | pgd_t *pgd = pgd_base + pgd_index(vaddr); | ||
| 247 | pud_t *pud = pud_offset(pgd, vaddr); | ||
| 248 | pmd_t *pmd = pmd_offset(pud, vaddr); | ||
| 249 | |||
| 250 | set_pmd(pmd, pfn_pmd(start_pfn + pfn, | ||
| 251 | PAGE_KERNEL_LARGE_EXEC)); | ||
| 252 | |||
| 253 | printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", | ||
| 254 | __FUNCTION__, vaddr, start_pfn + pfn); | ||
| 255 | } | ||
| 256 | } | ||
| 257 | } | ||
| 258 | #endif | ||
| 259 | |||
| 225 | static unsigned long calculate_numa_remap_pages(void) | 260 | static unsigned long calculate_numa_remap_pages(void) |
| 226 | { | 261 | { |
| 227 | int nid; | 262 | int nid; |
diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c index f2b6e3f11bfc..81197c62d5b3 100644 --- a/arch/x86/power/hibernate_32.c +++ b/arch/x86/power/hibernate_32.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <asm/system.h> | 12 | #include <asm/system.h> |
| 13 | #include <asm/page.h> | 13 | #include <asm/page.h> |
| 14 | #include <asm/pgtable.h> | 14 | #include <asm/pgtable.h> |
| 15 | #include <asm/mmzone.h> | ||
| 15 | 16 | ||
| 16 | /* Defined in hibernate_asm_32.S */ | 17 | /* Defined in hibernate_asm_32.S */ |
| 17 | extern int restore_image(void); | 18 | extern int restore_image(void); |
| @@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) | |||
| 127 | } | 128 | } |
| 128 | } | 129 | } |
| 129 | } | 130 | } |
| 131 | |||
| 132 | resume_map_numa_kva(pgd_base); | ||
| 133 | |||
| 130 | return 0; | 134 | return 0; |
| 131 | } | 135 | } |
| 132 | 136 | ||
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 12de1fdaa6c6..9364dc554257 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -2847,7 +2847,7 @@ static void do_cciss_request(struct request_queue *q) | |||
| 2847 | h->maxSG = seg; | 2847 | h->maxSG = seg; |
| 2848 | 2848 | ||
| 2849 | #ifdef CCISS_DEBUG | 2849 | #ifdef CCISS_DEBUG |
| 2850 | printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", | 2850 | printk(KERN_DEBUG "cciss: Submitting %lu sectors in %d segments\n", |
| 2851 | creq->nr_sectors, seg); | 2851 | creq->nr_sectors, seg); |
| 2852 | #endif /* CCISS_DEBUG */ | 2852 | #endif /* CCISS_DEBUG */ |
| 2853 | 2853 | ||
| @@ -3197,7 +3197,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3197 | 3197 | ||
| 3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ | 3198 | c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ |
| 3199 | #ifdef CCISS_DEBUG | 3199 | #ifdef CCISS_DEBUG |
| 3200 | printk("address 0 = %x\n", c->paddr); | 3200 | printk("address 0 = %lx\n", c->paddr); |
| 3201 | #endif /* CCISS_DEBUG */ | 3201 | #endif /* CCISS_DEBUG */ |
| 3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); | 3202 | c->vaddr = remap_pci_mem(c->paddr, 0x250); |
| 3203 | 3203 | ||
| @@ -3224,7 +3224,8 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3224 | #endif /* CCISS_DEBUG */ | 3224 | #endif /* CCISS_DEBUG */ |
| 3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); | 3225 | cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); |
| 3226 | #ifdef CCISS_DEBUG | 3226 | #ifdef CCISS_DEBUG |
| 3227 | printk("cfg base address index = %x\n", cfg_base_addr_index); | 3227 | printk("cfg base address index = %llx\n", |
| 3228 | (unsigned long long)cfg_base_addr_index); | ||
| 3228 | #endif /* CCISS_DEBUG */ | 3229 | #endif /* CCISS_DEBUG */ |
| 3229 | if (cfg_base_addr_index == -1) { | 3230 | if (cfg_base_addr_index == -1) { |
| 3230 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); | 3231 | printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); |
| @@ -3234,7 +3235,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
| 3234 | 3235 | ||
| 3235 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); | 3236 | cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); |
| 3236 | #ifdef CCISS_DEBUG | 3237 | #ifdef CCISS_DEBUG |
| 3237 | printk("cfg offset = %x\n", cfg_offset); | 3238 | printk("cfg offset = %llx\n", (unsigned long long)cfg_offset); |
| 3238 | #endif /* CCISS_DEBUG */ | 3239 | #endif /* CCISS_DEBUG */ |
| 3239 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, | 3240 | c->cfgtable = remap_pci_mem(pci_resource_start(pdev, |
| 3240 | cfg_base_addr_index) + | 3241 | cfg_base_addr_index) + |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index faa1cc66e9cf..82020abc329e 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
| @@ -1134,7 +1134,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) | |||
| 1134 | continue; | 1134 | continue; |
| 1135 | 1135 | ||
| 1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); | 1136 | is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); |
| 1137 | seq_printf(s, " gpio-%-3d (%-12s) %s %s", | 1137 | seq_printf(s, " gpio-%-3d (%-20.20s) %s %s", |
| 1138 | gpio, gdesc->label, | 1138 | gpio, gdesc->label, |
| 1139 | is_out ? "out" : "in ", | 1139 | is_out ? "out" : "in ", |
| 1140 | chip->get | 1140 | chip->get |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 488e45cd43d7..f7dce8b9f64b 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -128,6 +128,9 @@ static const char* temperature_sensors_sets[][36] = { | |||
| 128 | /* Set 13: iMac 8,1 */ | 128 | /* Set 13: iMac 8,1 */ |
| 129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | 129 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", |
| 130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, | 130 | "TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL }, |
| 131 | /* Set 14: iMac 6,1 */ | ||
| 132 | { "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P", | ||
| 133 | "TO0P", "Tp0P", NULL }, | ||
| 131 | }; | 134 | }; |
| 132 | 135 | ||
| 133 | /* List of keys used to read/write fan speeds */ | 136 | /* List of keys used to read/write fan speeds */ |
| @@ -1296,6 +1299,8 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
| 1296 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, | 1299 | { .accelerometer = 1, .light = 1, .temperature_set = 12 }, |
| 1297 | /* iMac 8: light sensor only, temperature set 13 */ | 1300 | /* iMac 8: light sensor only, temperature set 13 */ |
| 1298 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, | 1301 | { .accelerometer = 0, .light = 0, .temperature_set = 13 }, |
| 1302 | /* iMac 6: light sensor only, temperature set 14 */ | ||
| 1303 | { .accelerometer = 0, .light = 0, .temperature_set = 14 }, | ||
| 1299 | }; | 1304 | }; |
| 1300 | 1305 | ||
| 1301 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1306 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
| @@ -1349,10 +1354,18 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
| 1349 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1354 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
| 1350 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1355 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
| 1351 | &applesmc_dmi_data[4]}, | 1356 | &applesmc_dmi_data[4]}, |
| 1357 | { applesmc_dmi_match, "Apple MacPro", { | ||
| 1358 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
| 1359 | DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") }, | ||
| 1360 | &applesmc_dmi_data[4]}, | ||
| 1352 | { applesmc_dmi_match, "Apple iMac 8", { | 1361 | { applesmc_dmi_match, "Apple iMac 8", { |
| 1353 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1362 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
| 1354 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, | 1363 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") }, |
| 1355 | &applesmc_dmi_data[13]}, | 1364 | &applesmc_dmi_data[13]}, |
| 1365 | { applesmc_dmi_match, "Apple iMac 6", { | ||
| 1366 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
| 1367 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") }, | ||
| 1368 | &applesmc_dmi_data[14]}, | ||
| 1356 | { applesmc_dmi_match, "Apple iMac 5", { | 1369 | { applesmc_dmi_match, "Apple iMac 5", { |
| 1357 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1370 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
| 1358 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, | 1371 | DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") }, |
diff --git a/drivers/misc/sgi-gru/Makefile b/drivers/misc/sgi-gru/Makefile index d03597a521b0..9e9170b3599a 100644 --- a/drivers/misc/sgi-gru/Makefile +++ b/drivers/misc/sgi-gru/Makefile | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | ifdef CONFIG_SGI_GRU_DEBUG | ||
| 2 | EXTRA_CFLAGS += -DDEBUG | ||
| 3 | endif | ||
| 4 | |||
| 1 | obj-$(CONFIG_SGI_GRU) := gru.o | 5 | obj-$(CONFIG_SGI_GRU) := gru.o |
| 2 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o | 6 | gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o |
| 3 | 7 | ||
diff --git a/drivers/net/atlx/atl2.c b/drivers/net/atlx/atl2.c index f5bdc92c1a65..8571e8c0bc67 100644 --- a/drivers/net/atlx/atl2.c +++ b/drivers/net/atlx/atl2.c | |||
| @@ -1690,9 +1690,11 @@ static int atl2_resume(struct pci_dev *pdev) | |||
| 1690 | 1690 | ||
| 1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); | 1691 | ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0); |
| 1692 | 1692 | ||
| 1693 | err = atl2_request_irq(adapter); | 1693 | if (netif_running(netdev)) { |
| 1694 | if (netif_running(netdev) && err) | 1694 | err = atl2_request_irq(adapter); |
| 1695 | return err; | 1695 | if (err) |
| 1696 | return err; | ||
| 1697 | } | ||
| 1696 | 1698 | ||
| 1697 | atl2_reset_hw(&adapter->hw); | 1699 | atl2_reset_hw(&adapter->hw); |
| 1698 | 1700 | ||
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 7373dafbb3f7..059369885be1 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
| @@ -1112,7 +1112,7 @@ static void ipg_nic_rx_free_skb(struct net_device *dev) | |||
| 1112 | struct ipg_rx *rxfd = sp->rxd + entry; | 1112 | struct ipg_rx *rxfd = sp->rxd + entry; |
| 1113 | 1113 | ||
| 1114 | pci_unmap_single(sp->pdev, | 1114 | pci_unmap_single(sp->pdev, |
| 1115 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1115 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1116 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1117 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
| 1118 | sp->rx_buff[entry] = NULL; | 1118 | sp->rx_buff[entry] = NULL; |
| @@ -1179,7 +1179,7 @@ static int ipg_nic_rx_check_error(struct net_device *dev) | |||
| 1179 | */ | 1179 | */ |
| 1180 | if (sp->rx_buff[entry]) { | 1180 | if (sp->rx_buff[entry]) { |
| 1181 | pci_unmap_single(sp->pdev, | 1181 | pci_unmap_single(sp->pdev, |
| 1182 | le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1182 | le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1183 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1184 | 1184 | ||
| 1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); | 1185 | dev_kfree_skb_irq(sp->rx_buff[entry]); |
| @@ -1246,7 +1246,7 @@ static void ipg_nic_rx_with_start(struct net_device *dev, | |||
| 1246 | if (jumbo->found_start) | 1246 | if (jumbo->found_start) |
| 1247 | dev_kfree_skb_irq(jumbo->skb); | 1247 | dev_kfree_skb_irq(jumbo->skb); |
| 1248 | 1248 | ||
| 1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN), | 1249 | pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN, |
| 1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1250 | sp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1251 | 1251 | ||
| 1252 | skb_put(skb, sp->rxfrag_size); | 1252 | skb_put(skb, sp->rxfrag_size); |
| @@ -1349,7 +1349,7 @@ static int ipg_nic_rx_jumbo(struct net_device *dev) | |||
| 1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; | 1349 | unsigned int entry = curr % IPG_RFDLIST_LENGTH; |
| 1350 | struct ipg_rx *rxfd = sp->rxd + entry; | 1350 | struct ipg_rx *rxfd = sp->rxd + entry; |
| 1351 | 1351 | ||
| 1352 | if (!(rxfd->rfs & le64_to_cpu(IPG_RFS_RFDDONE))) | 1352 | if (!(rxfd->rfs & cpu_to_le64(IPG_RFS_RFDDONE))) |
| 1353 | break; | 1353 | break; |
| 1354 | 1354 | ||
| 1355 | switch (ipg_nic_rx_check_frame_type(dev)) { | 1355 | switch (ipg_nic_rx_check_frame_type(dev)) { |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7548fb7360d9..36f2bb666bf7 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -1287,7 +1287,34 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter) | |||
| 1287 | return; | 1287 | return; |
| 1288 | } | 1288 | } |
| 1289 | 1289 | ||
| 1290 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter); | 1290 | /** |
| 1291 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
| 1292 | * @adapter: board private structure | ||
| 1293 | **/ | ||
| 1294 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
| 1295 | { | ||
| 1296 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
| 1297 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1298 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
| 1299 | int i; | ||
| 1300 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
| 1301 | synchronize_irq(adapter->msix_entries[i].vector); | ||
| 1302 | } else { | ||
| 1303 | synchronize_irq(adapter->pdev->irq); | ||
| 1304 | } | ||
| 1305 | } | ||
| 1306 | |||
| 1307 | /** | ||
| 1308 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
| 1309 | * @adapter: board private structure | ||
| 1310 | **/ | ||
| 1311 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
| 1312 | { | ||
| 1313 | u32 mask; | ||
| 1314 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
| 1315 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
| 1316 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1317 | } | ||
| 1291 | 1318 | ||
| 1292 | /** | 1319 | /** |
| 1293 | * ixgbe_intr - legacy mode Interrupt Handler | 1320 | * ixgbe_intr - legacy mode Interrupt Handler |
| @@ -1394,35 +1421,6 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter) | |||
| 1394 | } | 1421 | } |
| 1395 | 1422 | ||
| 1396 | /** | 1423 | /** |
| 1397 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
| 1398 | * @adapter: board private structure | ||
| 1399 | **/ | ||
| 1400 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
| 1401 | { | ||
| 1402 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
| 1403 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1404 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
| 1405 | int i; | ||
| 1406 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
| 1407 | synchronize_irq(adapter->msix_entries[i].vector); | ||
| 1408 | } else { | ||
| 1409 | synchronize_irq(adapter->pdev->irq); | ||
| 1410 | } | ||
| 1411 | } | ||
| 1412 | |||
| 1413 | /** | ||
| 1414 | * ixgbe_irq_enable - Enable default interrupt generation settings | ||
| 1415 | * @adapter: board private structure | ||
| 1416 | **/ | ||
| 1417 | static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter) | ||
| 1418 | { | ||
| 1419 | u32 mask; | ||
| 1420 | mask = IXGBE_EIMS_ENABLE_MASK; | ||
| 1421 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
| 1422 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
| 1423 | } | ||
| 1424 | |||
| 1425 | /** | ||
| 1426 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts | 1424 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts |
| 1427 | * | 1425 | * |
| 1428 | **/ | 1426 | **/ |
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 81c6cdc3851f..665e70d620fc 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c | |||
| @@ -912,23 +912,23 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx) | |||
| 912 | skb_put(skb, framesize); | 912 | skb_put(skb, framesize); |
| 913 | skb->protocol = eth_type_trans(skb, jme->dev); | 913 | skb->protocol = eth_type_trans(skb, jme->dev); |
| 914 | 914 | ||
| 915 | if (jme_rxsum_ok(jme, rxdesc->descwb.flags)) | 915 | if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags))) |
| 916 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 916 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 917 | else | 917 | else |
| 918 | skb->ip_summed = CHECKSUM_NONE; | 918 | skb->ip_summed = CHECKSUM_NONE; |
| 919 | 919 | ||
| 920 | if (rxdesc->descwb.flags & RXWBFLAG_TAGON) { | 920 | if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) { |
| 921 | if (jme->vlgrp) { | 921 | if (jme->vlgrp) { |
| 922 | jme->jme_vlan_rx(skb, jme->vlgrp, | 922 | jme->jme_vlan_rx(skb, jme->vlgrp, |
| 923 | le32_to_cpu(rxdesc->descwb.vlan)); | 923 | le16_to_cpu(rxdesc->descwb.vlan)); |
| 924 | NET_STAT(jme).rx_bytes += 4; | 924 | NET_STAT(jme).rx_bytes += 4; |
| 925 | } | 925 | } |
| 926 | } else { | 926 | } else { |
| 927 | jme->jme_rx(skb); | 927 | jme->jme_rx(skb); |
| 928 | } | 928 | } |
| 929 | 929 | ||
| 930 | if ((le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST) == | 930 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) == |
| 931 | RXWBFLAG_DEST_MUL) | 931 | cpu_to_le16(RXWBFLAG_DEST_MUL)) |
| 932 | ++(NET_STAT(jme).multicast); | 932 | ++(NET_STAT(jme).multicast); |
| 933 | 933 | ||
| 934 | jme->dev->last_rx = jiffies; | 934 | jme->dev->last_rx = jiffies; |
| @@ -961,7 +961,7 @@ jme_process_receive(struct jme_adapter *jme, int limit) | |||
| 961 | rxdesc = rxring->desc; | 961 | rxdesc = rxring->desc; |
| 962 | rxdesc += i; | 962 | rxdesc += i; |
| 963 | 963 | ||
| 964 | if ((rxdesc->descwb.flags & RXWBFLAG_OWN) || | 964 | if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) || |
| 965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) | 965 | !(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL)) |
| 966 | goto out; | 966 | goto out; |
| 967 | 967 | ||
| @@ -1763,10 +1763,9 @@ jme_expand_header(struct jme_adapter *jme, struct sk_buff *skb) | |||
| 1763 | } | 1763 | } |
| 1764 | 1764 | ||
| 1765 | static int | 1765 | static int |
| 1766 | jme_tx_tso(struct sk_buff *skb, | 1766 | jme_tx_tso(struct sk_buff *skb, __le16 *mss, u8 *flags) |
| 1767 | u16 *mss, u8 *flags) | ||
| 1768 | { | 1767 | { |
| 1769 | *mss = skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT; | 1768 | *mss = cpu_to_le16(skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT); |
| 1770 | if (*mss) { | 1769 | if (*mss) { |
| 1771 | *flags |= TXFLAG_LSEN; | 1770 | *flags |= TXFLAG_LSEN; |
| 1772 | 1771 | ||
| @@ -1826,11 +1825,11 @@ jme_tx_csum(struct jme_adapter *jme, struct sk_buff *skb, u8 *flags) | |||
| 1826 | } | 1825 | } |
| 1827 | 1826 | ||
| 1828 | static inline void | 1827 | static inline void |
| 1829 | jme_tx_vlan(struct sk_buff *skb, u16 *vlan, u8 *flags) | 1828 | jme_tx_vlan(struct sk_buff *skb, __le16 *vlan, u8 *flags) |
| 1830 | { | 1829 | { |
| 1831 | if (vlan_tx_tag_present(skb)) { | 1830 | if (vlan_tx_tag_present(skb)) { |
| 1832 | *flags |= TXFLAG_TAGON; | 1831 | *flags |= TXFLAG_TAGON; |
| 1833 | *vlan = vlan_tx_tag_get(skb); | 1832 | *vlan = cpu_to_le16(vlan_tx_tag_get(skb)); |
| 1834 | } | 1833 | } |
| 1835 | } | 1834 | } |
| 1836 | 1835 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b9dcdbd369f8..e513f76f2a9f 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
| @@ -899,7 +899,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force) | |||
| 899 | if (skb != NULL) { | 899 | if (skb != NULL) { |
| 900 | if (skb_queue_len(&mp->rx_recycle) < | 900 | if (skb_queue_len(&mp->rx_recycle) < |
| 901 | mp->default_rx_ring_size && | 901 | mp->default_rx_ring_size && |
| 902 | skb_recycle_check(skb, mp->skb_size)) | 902 | skb_recycle_check(skb, mp->skb_size + |
| 903 | dma_get_cache_alignment() - 1)) | ||
| 903 | __skb_queue_head(&mp->rx_recycle, skb); | 904 | __skb_queue_head(&mp->rx_recycle, skb); |
| 904 | else | 905 | else |
| 905 | dev_kfree_skb(skb); | 906 | dev_kfree_skb(skb); |
| @@ -2435,8 +2436,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev) | |||
| 2435 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; | 2436 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; |
| 2436 | 2437 | ||
| 2437 | if (pd == NULL || pd->shared_smi == NULL) { | 2438 | if (pd == NULL || pd->shared_smi == NULL) { |
| 2438 | mdiobus_free(msp->smi_bus); | ||
| 2439 | mdiobus_unregister(msp->smi_bus); | 2439 | mdiobus_unregister(msp->smi_bus); |
| 2440 | mdiobus_free(msp->smi_bus); | ||
| 2440 | } | 2441 | } |
| 2441 | if (msp->err_interrupt != NO_IRQ) | 2442 | if (msp->err_interrupt != NO_IRQ) |
| 2442 | free_irq(msp->err_interrupt, msp); | 2443 | free_irq(msp->err_interrupt, msp); |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 8fb1faca883a..55bc24b234e3 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -564,20 +564,32 @@ EXPORT_SYMBOL(genphy_restart_aneg); | |||
| 564 | */ | 564 | */ |
| 565 | int genphy_config_aneg(struct phy_device *phydev) | 565 | int genphy_config_aneg(struct phy_device *phydev) |
| 566 | { | 566 | { |
| 567 | int result = 0; | 567 | int result; |
| 568 | 568 | ||
| 569 | if (AUTONEG_ENABLE == phydev->autoneg) { | 569 | if (AUTONEG_ENABLE != phydev->autoneg) |
| 570 | int result = genphy_config_advert(phydev); | 570 | return genphy_setup_forced(phydev); |
| 571 | |||
| 572 | result = genphy_config_advert(phydev); | ||
| 573 | |||
| 574 | if (result < 0) /* error */ | ||
| 575 | return result; | ||
| 571 | 576 | ||
| 572 | if (result < 0) /* error */ | 577 | if (result == 0) { |
| 573 | return result; | 578 | /* Advertisment hasn't changed, but maybe aneg was never on to |
| 579 | * begin with? Or maybe phy was isolated? */ | ||
| 580 | int ctl = phy_read(phydev, MII_BMCR); | ||
| 581 | |||
| 582 | if (ctl < 0) | ||
| 583 | return ctl; | ||
| 584 | |||
| 585 | if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE)) | ||
| 586 | result = 1; /* do restart aneg */ | ||
| 587 | } | ||
| 574 | 588 | ||
| 575 | /* Only restart aneg if we are advertising something different | 589 | /* Only restart aneg if we are advertising something different |
| 576 | * than we were before. */ | 590 | * than we were before. */ |
| 577 | if (result > 0) | 591 | if (result > 0) |
| 578 | result = genphy_restart_aneg(phydev); | 592 | result = genphy_restart_aneg(phydev); |
| 579 | } else | ||
| 580 | result = genphy_setup_forced(phydev); | ||
| 581 | 593 | ||
| 582 | return result; | 594 | return result; |
| 583 | } | 595 | } |
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index a24bb68887ab..59f242a67714 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c | |||
| @@ -927,7 +927,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 927 | struct sh_eth_private *mdp = netdev_priv(ndev); | 927 | struct sh_eth_private *mdp = netdev_priv(ndev); |
| 928 | struct sh_eth_txdesc *txdesc; | 928 | struct sh_eth_txdesc *txdesc; |
| 929 | u32 entry; | 929 | u32 entry; |
| 930 | int flags; | 930 | unsigned long flags; |
| 931 | 931 | ||
| 932 | spin_lock_irqsave(&mdp->lock, flags); | 932 | spin_lock_irqsave(&mdp->lock, flags); |
| 933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { | 933 | if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) { |
| @@ -1141,7 +1141,7 @@ static int sh_mdio_init(struct net_device *ndev, int id) | |||
| 1141 | /* Hook up MII support for ethtool */ | 1141 | /* Hook up MII support for ethtool */ |
| 1142 | mdp->mii_bus->name = "sh_mii"; | 1142 | mdp->mii_bus->name = "sh_mii"; |
| 1143 | mdp->mii_bus->parent = &ndev->dev; | 1143 | mdp->mii_bus->parent = &ndev->dev; |
| 1144 | mdp->mii_bus->id[0] = id; | 1144 | snprintf(mdp->mii_bus->id, MII_BUS_ID_SIZE, "%x", id); |
| 1145 | 1145 | ||
| 1146 | /* PHY IRQ */ | 1146 | /* PHY IRQ */ |
| 1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); | 1147 | mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 1f26ab0e7986..b185cd12269c 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
| @@ -1813,7 +1813,7 @@ static int __init smc911x_probe(struct net_device *dev) | |||
| 1813 | val = SMC_GET_BYTE_TEST(lp); | 1813 | val = SMC_GET_BYTE_TEST(lp); |
| 1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); | 1814 | DBG(SMC_DEBUG_MISC, "%s: endian probe returned 0x%04x\n", CARDNAME, val); |
| 1815 | if (val != 0x87654321) { | 1815 | if (val != 0x87654321) { |
| 1816 | printk(KERN_ERR "Invalid chip endian 0x08%x\n",val); | 1816 | printk(KERN_ERR "Invalid chip endian 0x%08x\n",val); |
| 1817 | retval = -ENODEV; | 1817 | retval = -ENODEV; |
| 1818 | goto err_out; | 1818 | goto err_out; |
| 1819 | } | 1819 | } |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index e12cdb4543b4..de57490103fc 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
| @@ -1102,12 +1102,14 @@ static int ax88178_link_reset(struct usbnet *dev) | |||
| 1102 | mode = AX88178_MEDIUM_DEFAULT; | 1102 | mode = AX88178_MEDIUM_DEFAULT; |
| 1103 | 1103 | ||
| 1104 | if (ecmd.speed == SPEED_1000) | 1104 | if (ecmd.speed == SPEED_1000) |
| 1105 | mode |= AX_MEDIUM_GM | AX_MEDIUM_ENCK; | 1105 | mode |= AX_MEDIUM_GM; |
| 1106 | else if (ecmd.speed == SPEED_100) | 1106 | else if (ecmd.speed == SPEED_100) |
| 1107 | mode |= AX_MEDIUM_PS; | 1107 | mode |= AX_MEDIUM_PS; |
| 1108 | else | 1108 | else |
| 1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); | 1109 | mode &= ~(AX_MEDIUM_PS | AX_MEDIUM_GM); |
| 1110 | 1110 | ||
| 1111 | mode |= AX_MEDIUM_ENCK; | ||
| 1112 | |||
| 1111 | if (ecmd.duplex == DUPLEX_FULL) | 1113 | if (ecmd.duplex == DUPLEX_FULL) |
| 1112 | mode |= AX_MEDIUM_FD; | 1114 | mode |= AX_MEDIUM_FD; |
| 1113 | else | 1115 | else |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 8d690a0eb1a9..444c5cc05f03 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
| 1384 | 1384 | ||
| 1385 | rxq->queue[i] = NULL; | 1385 | rxq->queue[i] = NULL; |
| 1386 | 1386 | ||
| 1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, | 1387 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, |
| 1388 | priv->hw_params.rx_buf_size, | 1388 | priv->hw_params.rx_buf_size, |
| 1389 | PCI_DMA_FROMDEVICE); | 1389 | PCI_DMA_FROMDEVICE); |
| 1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1390 | pkt = (struct iwl_rx_packet *)rxb->skb->data; |
| @@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
| 1436 | rxb->skb = NULL; | 1436 | rxb->skb = NULL; |
| 1437 | } | 1437 | } |
| 1438 | 1438 | ||
| 1439 | pci_unmap_single(priv->pci_dev, rxb->dma_addr, | 1439 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, |
| 1440 | priv->hw_params.rx_buf_size, | 1440 | priv->hw_params.rx_buf_size + 256, |
| 1441 | PCI_DMA_FROMDEVICE); | 1441 | PCI_DMA_FROMDEVICE); |
| 1442 | spin_lock_irqsave(&rxq->lock, flags); | 1442 | spin_lock_irqsave(&rxq->lock, flags); |
| 1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | 1443 | list_add_tail(&rxb->list, &priv->rxq.rx_used); |
| @@ -2341,7 +2341,6 @@ static void iwl_bg_alive_start(struct work_struct *data) | |||
| 2341 | mutex_lock(&priv->mutex); | 2341 | mutex_lock(&priv->mutex); |
| 2342 | iwl_alive_start(priv); | 2342 | iwl_alive_start(priv); |
| 2343 | mutex_unlock(&priv->mutex); | 2343 | mutex_unlock(&priv->mutex); |
| 2344 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
| 2345 | } | 2344 | } |
| 2346 | 2345 | ||
| 2347 | static void iwl4965_bg_rf_kill(struct work_struct *work) | 2346 | static void iwl4965_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index c018121085e9..9966d4e384ce 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; | |||
| 89 | #define DEFAULT_LONG_RETRY_LIMIT 4U | 89 | #define DEFAULT_LONG_RETRY_LIMIT 4U |
| 90 | 90 | ||
| 91 | struct iwl_rx_mem_buffer { | 91 | struct iwl_rx_mem_buffer { |
| 92 | dma_addr_t dma_addr; | 92 | dma_addr_t real_dma_addr; |
| 93 | dma_addr_t aligned_dma_addr; | ||
| 93 | struct sk_buff *skb; | 94 | struct sk_buff *skb; |
| 94 | struct list_head list; | 95 | struct list_head list; |
| 95 | }; | 96 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 7cde9d76ff5d..0509c16dbe75 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
| @@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) | |||
| 204 | list_del(element); | 204 | list_del(element); |
| 205 | 205 | ||
| 206 | /* Point to Rx buffer via next RBD in circular buffer */ | 206 | /* Point to Rx buffer via next RBD in circular buffer */ |
| 207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); | 207 | rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); |
| 208 | rxq->queue[rxq->write] = rxb; | 208 | rxq->queue[rxq->write] = rxb; |
| 209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; | 209 | rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; |
| 210 | rxq->free_count--; | 210 | rxq->free_count--; |
| @@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
| 251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | 251 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); |
| 252 | 252 | ||
| 253 | /* Alloc a new receive buffer */ | 253 | /* Alloc a new receive buffer */ |
| 254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, | 254 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, |
| 255 | __GFP_NOWARN | GFP_ATOMIC); | 255 | __GFP_NOWARN | GFP_ATOMIC); |
| 256 | if (!rxb->skb) { | 256 | if (!rxb->skb) { |
| 257 | if (net_ratelimit()) | 257 | if (net_ratelimit()) |
| @@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) | |||
| 266 | list_del(element); | 266 | list_del(element); |
| 267 | 267 | ||
| 268 | /* Get physical address of RB/SKB */ | 268 | /* Get physical address of RB/SKB */ |
| 269 | rxb->dma_addr = | 269 | rxb->real_dma_addr = pci_map_single( |
| 270 | pci_map_single(priv->pci_dev, rxb->skb->data, | 270 | priv->pci_dev, |
| 271 | priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); | 271 | rxb->skb->data, |
| 272 | priv->hw_params.rx_buf_size + 256, | ||
| 273 | PCI_DMA_FROMDEVICE); | ||
| 274 | /* dma address must be no more than 36 bits */ | ||
| 275 | BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); | ||
| 276 | /* and also 256 byte aligned! */ | ||
| 277 | rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); | ||
| 278 | skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); | ||
| 279 | |||
| 272 | list_add_tail(&rxb->list, &rxq->rx_free); | 280 | list_add_tail(&rxb->list, &rxq->rx_free); |
| 273 | rxq->free_count++; | 281 | rxq->free_count++; |
| 274 | } | 282 | } |
| @@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 300 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { | 308 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { |
| 301 | if (rxq->pool[i].skb != NULL) { | 309 | if (rxq->pool[i].skb != NULL) { |
| 302 | pci_unmap_single(priv->pci_dev, | 310 | pci_unmap_single(priv->pci_dev, |
| 303 | rxq->pool[i].dma_addr, | 311 | rxq->pool[i].real_dma_addr, |
| 304 | priv->hw_params.rx_buf_size, | 312 | priv->hw_params.rx_buf_size + 256, |
| 305 | PCI_DMA_FROMDEVICE); | 313 | PCI_DMA_FROMDEVICE); |
| 306 | dev_kfree_skb(rxq->pool[i].skb); | 314 | dev_kfree_skb(rxq->pool[i].skb); |
| 307 | } | 315 | } |
| @@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 354 | * to an SKB, so we need to unmap and free potential storage */ | 362 | * to an SKB, so we need to unmap and free potential storage */ |
| 355 | if (rxq->pool[i].skb != NULL) { | 363 | if (rxq->pool[i].skb != NULL) { |
| 356 | pci_unmap_single(priv->pci_dev, | 364 | pci_unmap_single(priv->pci_dev, |
| 357 | rxq->pool[i].dma_addr, | 365 | rxq->pool[i].real_dma_addr, |
| 358 | priv->hw_params.rx_buf_size, | 366 | priv->hw_params.rx_buf_size + 256, |
| 359 | PCI_DMA_FROMDEVICE); | 367 | PCI_DMA_FROMDEVICE); |
| 360 | priv->alloc_rxb_skb--; | 368 | priv->alloc_rxb_skb--; |
| 361 | dev_kfree_skb(rxq->pool[i].skb); | 369 | dev_kfree_skb(rxq->pool[i].skb); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 285b53e7e261..45a6b0c35695 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -6012,7 +6012,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data) | |||
| 6012 | mutex_lock(&priv->mutex); | 6012 | mutex_lock(&priv->mutex); |
| 6013 | iwl3945_alive_start(priv); | 6013 | iwl3945_alive_start(priv); |
| 6014 | mutex_unlock(&priv->mutex); | 6014 | mutex_unlock(&priv->mutex); |
| 6015 | ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); | ||
| 6016 | } | 6015 | } |
| 6017 | 6016 | ||
| 6018 | static void iwl3945_bg_rf_kill(struct work_struct *work) | 6017 | static void iwl3945_bg_rf_kill(struct work_struct *work) |
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c index 1cc03a8dd67a..59634c33b1f9 100644 --- a/drivers/net/wireless/libertas_tf/if_usb.c +++ b/drivers/net/wireless/libertas_tf/if_usb.c | |||
| @@ -331,7 +331,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, | |||
| 331 | /* Fill the receive configuration URB and initialise the Rx call back */ | 331 | /* Fill the receive configuration URB and initialise the Rx call back */ |
| 332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, | 332 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, |
| 333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), | 333 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), |
| 334 | (void *) (skb->tail), | 334 | skb_tail_pointer(skb), |
| 335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); | 335 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); |
| 336 | 336 | ||
| 337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; | 337 | cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; |
diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 209b4a464bcf..855f389eea40 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig | |||
| @@ -36,7 +36,7 @@ if PARPORT | |||
| 36 | config PARPORT_PC | 36 | config PARPORT_PC |
| 37 | tristate "PC-style hardware" | 37 | tristate "PC-style hardware" |
| 38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ | 38 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && \ |
| 39 | (!M68K || ISA) && !MN10300 && !AVR32 | 39 | (!M68K || ISA) && !MN10300 && !AVR32 && !BLACKFIN |
| 40 | ---help--- | 40 | ---help--- |
| 41 | You should say Y here if you have a PC-style parallel port. All | 41 | You should say Y here if you have a PC-style parallel port. All |
| 42 | IBM PC compatible computers and some Alphas have PC-style | 42 | IBM PC compatible computers and some Alphas have PC-style |
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index a2692724b68f..5c8baa43ac9c 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
| @@ -1655,12 +1655,14 @@ int __init init_dmars(void) | |||
| 1655 | iommu->flush.flush_context = __iommu_flush_context; | 1655 | iommu->flush.flush_context = __iommu_flush_context; |
| 1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; | 1656 | iommu->flush.flush_iotlb = __iommu_flush_iotlb; |
| 1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " | 1657 | printk(KERN_INFO "IOMMU 0x%Lx: using Register based " |
| 1658 | "invalidation\n", drhd->reg_base_addr); | 1658 | "invalidation\n", |
| 1659 | (unsigned long long)drhd->reg_base_addr); | ||
| 1659 | } else { | 1660 | } else { |
| 1660 | iommu->flush.flush_context = qi_flush_context; | 1661 | iommu->flush.flush_context = qi_flush_context; |
| 1661 | iommu->flush.flush_iotlb = qi_flush_iotlb; | 1662 | iommu->flush.flush_iotlb = qi_flush_iotlb; |
| 1662 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " | 1663 | printk(KERN_INFO "IOMMU 0x%Lx: using Queued " |
| 1663 | "invalidation\n", drhd->reg_base_addr); | 1664 | "invalidation\n", |
| 1665 | (unsigned long long)drhd->reg_base_addr); | ||
| 1664 | } | 1666 | } |
| 1665 | } | 1667 | } |
| 1666 | 1668 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 21f2ac639cab..28af496b441e 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1832,7 +1832,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
| 1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) | 1832 | if (!(cap & PCI_EXP_DEVCAP_FLR)) |
| 1833 | return -ENOTTY; | 1833 | return -ENOTTY; |
| 1834 | 1834 | ||
| 1835 | if (!dev->msi_enabled && !dev->msix_enabled) | 1835 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
| 1836 | disable_irq(dev->irq); | 1836 | disable_irq(dev->irq); |
| 1837 | pci_save_state(dev); | 1837 | pci_save_state(dev); |
| 1838 | 1838 | ||
| @@ -1841,7 +1841,7 @@ int pci_reset_function(struct pci_dev *dev) | |||
| 1841 | r = pci_execute_reset_function(dev); | 1841 | r = pci_execute_reset_function(dev); |
| 1842 | 1842 | ||
| 1843 | pci_restore_state(dev); | 1843 | pci_restore_state(dev); |
| 1844 | if (!dev->msi_enabled && !dev->msix_enabled) | 1844 | if (!dev->msi_enabled && !dev->msix_enabled && dev->irq != 0) |
| 1845 | enable_irq(dev->irq); | 1845 | enable_irq(dev->irq); |
| 1846 | 1846 | ||
| 1847 | return r; | 1847 | return r; |
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index dae87b1a4c6e..cf12f2d84be2 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
| @@ -352,21 +352,21 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 352 | } else | 352 | } else |
| 353 | drv_data->tx_map_len = drv_data->len; | 353 | drv_data->tx_map_len = drv_data->len; |
| 354 | 354 | ||
| 355 | /* Stream map the rx buffer */ | 355 | /* Stream map the tx buffer. Always do DMA_TO_DEVICE first |
| 356 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, | 356 | * so we flush the cache *before* invalidating it, in case |
| 357 | drv_data->rx_map_len, | 357 | * the tx and rx buffers overlap. |
| 358 | DMA_FROM_DEVICE); | 358 | */ |
| 359 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
| 360 | return 0; | ||
| 361 | |||
| 362 | /* Stream map the tx buffer */ | ||
| 363 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, | 359 | drv_data->tx_dma = dma_map_single(dev, drv_data->tx, |
| 364 | drv_data->tx_map_len, | 360 | drv_data->tx_map_len, DMA_TO_DEVICE); |
| 365 | DMA_TO_DEVICE); | 361 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
| 362 | return 0; | ||
| 366 | 363 | ||
| 367 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 364 | /* Stream map the rx buffer */ |
| 368 | dma_unmap_single(dev, drv_data->rx_dma, | 365 | drv_data->rx_dma = dma_map_single(dev, drv_data->rx, |
| 369 | drv_data->rx_map_len, DMA_FROM_DEVICE); | 366 | drv_data->rx_map_len, DMA_FROM_DEVICE); |
| 367 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
| 368 | dma_unmap_single(dev, drv_data->tx_dma, | ||
| 369 | drv_data->tx_map_len, DMA_TO_DEVICE); | ||
| 370 | return 0; | 370 | return 0; |
| 371 | } | 371 | } |
| 372 | 372 | ||
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 61ba147e384d..0b4db0ce78d6 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
| @@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) | 506 | if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx)) |
| 507 | return -1; | 507 | return -1; |
| 508 | 508 | ||
| 509 | /* NULL rx means write-only transfer and no map needed | ||
| 510 | since rx DMA will not be used */ | ||
| 511 | if (drv_data->rx) { | ||
| 512 | buf = drv_data->rx; | ||
| 513 | drv_data->rx_dma = dma_map_single( | ||
| 514 | dev, | ||
| 515 | buf, | ||
| 516 | drv_data->len, | ||
| 517 | DMA_FROM_DEVICE); | ||
| 518 | if (dma_mapping_error(dev, drv_data->rx_dma)) | ||
| 519 | return -1; | ||
| 520 | drv_data->rx_dma_needs_unmap = 1; | ||
| 521 | } | ||
| 522 | |||
| 523 | if (drv_data->tx == NULL) { | 509 | if (drv_data->tx == NULL) { |
| 524 | /* Read only message --> use drv_data->dummy_dma_buf for dummy | 510 | /* Read only message --> use drv_data->dummy_dma_buf for dummy |
| 525 | writes to achive reads */ | 511 | writes to achive reads */ |
| @@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver_data *drv_data) | |||
| 533 | buf, | 519 | buf, |
| 534 | drv_data->tx_map_len, | 520 | drv_data->tx_map_len, |
| 535 | DMA_TO_DEVICE); | 521 | DMA_TO_DEVICE); |
| 536 | if (dma_mapping_error(dev, drv_data->tx_dma)) { | 522 | if (dma_mapping_error(dev, drv_data->tx_dma)) |
| 537 | if (drv_data->rx_dma) { | ||
| 538 | dma_unmap_single(dev, | ||
| 539 | drv_data->rx_dma, | ||
| 540 | drv_data->len, | ||
| 541 | DMA_FROM_DEVICE); | ||
| 542 | drv_data->rx_dma_needs_unmap = 0; | ||
| 543 | } | ||
| 544 | return -1; | 523 | return -1; |
| 545 | } | ||
| 546 | drv_data->tx_dma_needs_unmap = 1; | 524 | drv_data->tx_dma_needs_unmap = 1; |
| 547 | 525 | ||
| 526 | /* NULL rx means write-only transfer and no map needed | ||
| 527 | * since rx DMA will not be used */ | ||
| 528 | if (drv_data->rx) { | ||
| 529 | buf = drv_data->rx; | ||
| 530 | drv_data->rx_dma = dma_map_single(dev, | ||
| 531 | buf, | ||
| 532 | drv_data->len, | ||
| 533 | DMA_FROM_DEVICE); | ||
| 534 | if (dma_mapping_error(dev, drv_data->rx_dma)) { | ||
| 535 | if (drv_data->tx_dma) { | ||
| 536 | dma_unmap_single(dev, | ||
| 537 | drv_data->tx_dma, | ||
| 538 | drv_data->tx_map_len, | ||
| 539 | DMA_TO_DEVICE); | ||
| 540 | drv_data->tx_dma_needs_unmap = 0; | ||
| 541 | } | ||
| 542 | return -1; | ||
| 543 | } | ||
| 544 | drv_data->rx_dma_needs_unmap = 1; | ||
| 545 | } | ||
| 546 | |||
| 548 | return 0; | 547 | return 0; |
| 549 | } | 548 | } |
| 550 | 549 | ||
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 659b3d9671c4..428b5993575a 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -172,7 +172,6 @@ static struct usb_interface_descriptor rndis_data_intf __initdata = { | |||
| 172 | .bDescriptorType = USB_DT_INTERFACE, | 172 | .bDescriptorType = USB_DT_INTERFACE, |
| 173 | 173 | ||
| 174 | /* .bInterfaceNumber = DYNAMIC */ | 174 | /* .bInterfaceNumber = DYNAMIC */ |
| 175 | .bAlternateSetting = 1, | ||
| 176 | .bNumEndpoints = 2, | 175 | .bNumEndpoints = 2, |
| 177 | .bInterfaceClass = USB_CLASS_CDC_DATA, | 176 | .bInterfaceClass = USB_CLASS_CDC_DATA, |
| 178 | .bInterfaceSubClass = 0, | 177 | .bInterfaceSubClass = 0, |
| @@ -303,7 +302,7 @@ static void rndis_response_available(void *_rndis) | |||
| 303 | __le32 *data = req->buf; | 302 | __le32 *data = req->buf; |
| 304 | int status; | 303 | int status; |
| 305 | 304 | ||
| 306 | if (atomic_inc_return(&rndis->notify_count)) | 305 | if (atomic_inc_return(&rndis->notify_count) != 1) |
| 307 | return; | 306 | return; |
| 308 | 307 | ||
| 309 | /* Send RNDIS RESPONSE_AVAILABLE notification; a | 308 | /* Send RNDIS RESPONSE_AVAILABLE notification; a |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index c46a58f9181d..9d0ea573aef6 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
| @@ -66,6 +66,8 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 66 | { | 66 | { |
| 67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 67 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 68 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
| 69 | struct pci_dev *p_smbus; | ||
| 70 | u8 rev; | ||
| 69 | u32 temp; | 71 | u32 temp; |
| 70 | int retval; | 72 | int retval; |
| 71 | 73 | ||
| @@ -166,6 +168,25 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
| 166 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); | 168 | pci_write_config_byte(pdev, 0x4b, tmp | 0x20); |
| 167 | } | 169 | } |
| 168 | break; | 170 | break; |
| 171 | case PCI_VENDOR_ID_ATI: | ||
| 172 | /* SB700 old version has a bug in EHCI controller, | ||
| 173 | * which causes usb devices lose response in some cases. | ||
| 174 | */ | ||
| 175 | if (pdev->device == 0x4396) { | ||
| 176 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | ||
| 177 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | ||
| 178 | NULL); | ||
| 179 | if (!p_smbus) | ||
| 180 | break; | ||
| 181 | rev = p_smbus->revision; | ||
| 182 | if ((rev == 0x3a) || (rev == 0x3b)) { | ||
| 183 | u8 tmp; | ||
| 184 | pci_read_config_byte(pdev, 0x53, &tmp); | ||
| 185 | pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); | ||
| 186 | } | ||
| 187 | pci_dev_put(p_smbus); | ||
| 188 | } | ||
| 189 | break; | ||
| 169 | } | 190 | } |
| 170 | 191 | ||
| 171 | ehci_reset(ehci); | 192 | ehci_reset(ehci); |
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index c9de3f027aab..e06810aef2df 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c | |||
| @@ -687,7 +687,10 @@ static ssize_t mon_bin_read(struct file *file, char __user *buf, | |||
| 687 | } | 687 | } |
| 688 | 688 | ||
| 689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { | 689 | if (rp->b_read >= sizeof(struct mon_bin_hdr)) { |
| 690 | step_len = min(nbytes, (size_t)ep->len_cap); | 690 | step_len = ep->len_cap; |
| 691 | step_len -= rp->b_read - sizeof(struct mon_bin_hdr); | ||
| 692 | if (step_len > nbytes) | ||
| 693 | step_len = nbytes; | ||
| 691 | offset = rp->b_out + PKT_SIZE; | 694 | offset = rp->b_out + PKT_SIZE; |
| 692 | offset += rp->b_read - sizeof(struct mon_bin_hdr); | 695 | offset += rp->b_read - sizeof(struct mon_bin_hdr); |
| 693 | if (offset >= rp->b_size) | 696 | if (offset >= rp->b_size) |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index e45e70bcc5e2..cc64462d4c4e 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1757,7 +1757,7 @@ static int musb_schedule( | |||
| 1757 | } | 1757 | } |
| 1758 | } | 1758 | } |
| 1759 | /* use bulk reserved ep1 if no other ep is free */ | 1759 | /* use bulk reserved ep1 if no other ep is free */ |
| 1760 | if (best_end > 0 && qh->type == USB_ENDPOINT_XFER_BULK) { | 1760 | if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { |
| 1761 | hw_ep = musb->bulk_ep; | 1761 | hw_ep = musb->bulk_ep; |
| 1762 | if (is_in) | 1762 | if (is_in) |
| 1763 | head = &musb->in_bulk; | 1763 | head = &musb->in_bulk; |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 9035d7256b03..cfaf1f085535 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
| @@ -56,6 +56,7 @@ static void cp2101_shutdown(struct usb_serial *); | |||
| 56 | static int debug; | 56 | static int debug; |
| 57 | 57 | ||
| 58 | static struct usb_device_id id_table [] = { | 58 | static struct usb_device_id id_table [] = { |
| 59 | { USB_DEVICE(0x0471, 0x066A) }, /* AKTAKOM ACE-1001 cable */ | ||
| 59 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ | 60 | { USB_DEVICE(0x0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ |
| 60 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ | 61 | { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ |
| 61 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | 62 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index d4e5fc86e43c..6da9a7a962a8 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -167,6 +167,13 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600, | |||
| 167 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 167 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 168 | US_FL_FIX_CAPACITY ), | 168 | US_FL_FIX_CAPACITY ), |
| 169 | 169 | ||
| 170 | /* Patch for Nokia 5310 capacity */ | ||
| 171 | UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, | ||
| 172 | "Nokia", | ||
| 173 | "5310", | ||
| 174 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 175 | US_FL_FIX_CAPACITY ), | ||
| 176 | |||
| 170 | /* Reported by Mario Rettig <mariorettig@web.de> */ | 177 | /* Reported by Mario Rettig <mariorettig@web.de> */ |
| 171 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, | 178 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, |
| 172 | "Nokia", | 179 | "Nokia", |
| @@ -233,14 +240,14 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, | |||
| 233 | US_FL_MAX_SECTORS_64 ), | 240 | US_FL_MAX_SECTORS_64 ), |
| 234 | 241 | ||
| 235 | /* Reported by Cedric Godin <cedric@belbone.be> */ | 242 | /* Reported by Cedric Godin <cedric@belbone.be> */ |
| 236 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0551, 0x0551, | 243 | UNUSUAL_DEV( 0x0421, 0x04b9, 0x0500, 0x0551, |
| 237 | "Nokia", | 244 | "Nokia", |
| 238 | "5300", | 245 | "5300", |
| 239 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 246 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 240 | US_FL_FIX_CAPACITY ), | 247 | US_FL_FIX_CAPACITY ), |
| 241 | 248 | ||
| 242 | /* Reported by Richard Nauber <RichardNauber@web.de> */ | 249 | /* Reported by Richard Nauber <RichardNauber@web.de> */ |
| 243 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0601, 0x0601, | 250 | UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660, |
| 244 | "Nokia", | 251 | "Nokia", |
| 245 | "6300", | 252 | "6300", |
| 246 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 253 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index f8d0a57a07cb..9a577a800db5 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
| @@ -132,7 +132,7 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) | |||
| 132 | 132 | ||
| 133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, | 133 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, |
| 134 | sinfo, &atmel_lcdc_bl_ops); | 134 | sinfo, &atmel_lcdc_bl_ops); |
| 135 | if (IS_ERR(sinfo->backlight)) { | 135 | if (IS_ERR(bl)) { |
| 136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", | 136 | dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", |
| 137 | PTR_ERR(bl)); | 137 | PTR_ERR(bl)); |
| 138 | return; | 138 | return; |
diff --git a/drivers/video/backlight/da903x.c b/drivers/video/backlight/da903x.c index 242c38250166..93bb4340cc64 100644 --- a/drivers/video/backlight/da903x.c +++ b/drivers/video/backlight/da903x.c | |||
| @@ -119,6 +119,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
| 119 | default: | 119 | default: |
| 120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", | 120 | dev_err(&pdev->dev, "invalid backlight device ID(%d)\n", |
| 121 | pdev->id); | 121 | pdev->id); |
| 122 | kfree(data); | ||
| 122 | return -EINVAL; | 123 | return -EINVAL; |
| 123 | } | 124 | } |
| 124 | 125 | ||
| @@ -130,6 +131,7 @@ static int da903x_backlight_probe(struct platform_device *pdev) | |||
| 130 | data, &da903x_backlight_ops); | 131 | data, &da903x_backlight_ops); |
| 131 | if (IS_ERR(bl)) { | 132 | if (IS_ERR(bl)) { |
| 132 | dev_err(&pdev->dev, "failed to register backlight\n"); | 133 | dev_err(&pdev->dev, "failed to register backlight\n"); |
| 134 | kfree(data); | ||
| 133 | return PTR_ERR(bl); | 135 | return PTR_ERR(bl); |
| 134 | } | 136 | } |
| 135 | 137 | ||
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c index 8e1731d3b228..680e57b616cd 100644 --- a/drivers/video/backlight/lcd.c +++ b/drivers/video/backlight/lcd.c | |||
| @@ -42,10 +42,13 @@ static int fb_notifier_callback(struct notifier_block *self, | |||
| 42 | 42 | ||
| 43 | mutex_lock(&ld->ops_lock); | 43 | mutex_lock(&ld->ops_lock); |
| 44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { | 44 | if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) { |
| 45 | if (event == FB_EVENT_BLANK) | 45 | if (event == FB_EVENT_BLANK) { |
| 46 | ld->ops->set_power(ld, *(int *)evdata->data); | 46 | if (ld->ops->set_power) |
| 47 | else | 47 | ld->ops->set_power(ld, *(int *)evdata->data); |
| 48 | ld->ops->set_mode(ld, evdata->data); | 48 | } else { |
| 49 | if (ld->ops->set_mode) | ||
| 50 | ld->ops->set_mode(ld, evdata->data); | ||
| 51 | } | ||
| 49 | } | 52 | } |
| 50 | mutex_unlock(&ld->ops_lock); | 53 | mutex_unlock(&ld->ops_lock); |
| 51 | return 0; | 54 | return 0; |
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 8a8760230bc7..a2aa6ddffbe2 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -2462,8 +2462,7 @@ static int __init cirrusfb_init(void) | |||
| 2462 | 2462 | ||
| 2463 | #ifndef MODULE | 2463 | #ifndef MODULE |
| 2464 | static int __init cirrusfb_setup(char *options) { | 2464 | static int __init cirrusfb_setup(char *options) { |
| 2465 | char *this_opt, s[32]; | 2465 | char *this_opt; |
| 2466 | int i; | ||
| 2467 | 2466 | ||
| 2468 | DPRINTK("ENTER\n"); | 2467 | DPRINTK("ENTER\n"); |
| 2469 | 2468 | ||
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 1d5ae39cb271..3c65b0d67617 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
| @@ -230,7 +230,7 @@ static void fb_set_logo_directpalette(struct fb_info *info, | |||
| 230 | greenshift = info->var.green.offset; | 230 | greenshift = info->var.green.offset; |
| 231 | blueshift = info->var.blue.offset; | 231 | blueshift = info->var.blue.offset; |
| 232 | 232 | ||
| 233 | for (i = 32; i < logo->clutsize; i++) | 233 | for (i = 32; i < 32 + logo->clutsize; i++) |
| 234 | palette[i] = i << redshift | i << greenshift | i << blueshift; | 234 | palette[i] = i << redshift | i << greenshift | i << blueshift; |
| 235 | } | 235 | } |
| 236 | 236 | ||
diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c index 2a380011e9ba..7baf2dd12d50 100644 --- a/drivers/video/tmiofb.c +++ b/drivers/video/tmiofb.c | |||
| @@ -222,6 +222,9 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
| 222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); | 222 | unsigned int bbisc = tmio_ioread16(par->lcr + LCR_BBISC); |
| 223 | 223 | ||
| 224 | 224 | ||
| 225 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
| 226 | |||
| 227 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 225 | /* | 228 | /* |
| 226 | * We were in polling mode and now we got correct irq. | 229 | * We were in polling mode and now we got correct irq. |
| 227 | * Switch back to IRQ-based sync of command FIFO | 230 | * Switch back to IRQ-based sync of command FIFO |
| @@ -231,9 +234,6 @@ static irqreturn_t tmiofb_irq(int irq, void *__info) | |||
| 231 | par->use_polling = false; | 234 | par->use_polling = false; |
| 232 | } | 235 | } |
| 233 | 236 | ||
| 234 | tmio_iowrite16(bbisc, par->lcr + LCR_BBISC); | ||
| 235 | |||
| 236 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 237 | if (bbisc & 1) | 237 | if (bbisc & 1) |
| 238 | wake_up(&par->wait_acc); | 238 | wake_up(&par->wait_acc); |
| 239 | #endif | 239 | #endif |
| @@ -938,7 +938,9 @@ static void tmiofb_dump_regs(struct platform_device *dev) | |||
| 938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | 938 | static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) |
| 939 | { | 939 | { |
| 940 | struct fb_info *info = platform_get_drvdata(dev); | 940 | struct fb_info *info = platform_get_drvdata(dev); |
| 941 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 941 | struct tmiofb_par *par = info->par; | 942 | struct tmiofb_par *par = info->par; |
| 943 | #endif | ||
| 942 | struct mfd_cell *cell = dev->dev.platform_data; | 944 | struct mfd_cell *cell = dev->dev.platform_data; |
| 943 | int retval = 0; | 945 | int retval = 0; |
| 944 | 946 | ||
| @@ -950,12 +952,14 @@ static int tmiofb_suspend(struct platform_device *dev, pm_message_t state) | |||
| 950 | info->fbops->fb_sync(info); | 952 | info->fbops->fb_sync(info); |
| 951 | 953 | ||
| 952 | 954 | ||
| 955 | #ifdef CONFIG_FB_TMIO_ACCELL | ||
| 953 | /* | 956 | /* |
| 954 | * The fb should be usable even if interrupts are disabled (and they are | 957 | * The fb should be usable even if interrupts are disabled (and they are |
| 955 | * during suspend/resume). Switch temporary to forced polling. | 958 | * during suspend/resume). Switch temporary to forced polling. |
| 956 | */ | 959 | */ |
| 957 | printk(KERN_INFO "tmiofb: switching to polling\n"); | 960 | printk(KERN_INFO "tmiofb: switching to polling\n"); |
| 958 | par->use_polling = true; | 961 | par->use_polling = true; |
| 962 | #endif | ||
| 959 | tmiofb_hw_stop(dev); | 963 | tmiofb_hw_stop(dev); |
| 960 | 964 | ||
| 961 | if (cell->suspend) | 965 | if (cell->suspend) |
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index 0132eae06f55..73ac754ad801 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
| @@ -2036,30 +2036,30 @@ static int viafb_vt1636_proc_write(struct file *file, | |||
| 2036 | return count; | 2036 | return count; |
| 2037 | } | 2037 | } |
| 2038 | 2038 | ||
| 2039 | static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | 2039 | static void viafb_init_proc(struct proc_dir_entry **viafb_entry) |
| 2040 | { | 2040 | { |
| 2041 | struct proc_dir_entry *entry; | 2041 | struct proc_dir_entry *entry; |
| 2042 | viafb_entry = proc_mkdir("viafb", NULL); | 2042 | *viafb_entry = proc_mkdir("viafb", NULL); |
| 2043 | if (viafb_entry) { | 2043 | if (viafb_entry) { |
| 2044 | entry = create_proc_entry("dvp0", 0, viafb_entry); | 2044 | entry = create_proc_entry("dvp0", 0, *viafb_entry); |
| 2045 | if (entry) { | 2045 | if (entry) { |
| 2046 | entry->owner = THIS_MODULE; | 2046 | entry->owner = THIS_MODULE; |
| 2047 | entry->read_proc = viafb_dvp0_proc_read; | 2047 | entry->read_proc = viafb_dvp0_proc_read; |
| 2048 | entry->write_proc = viafb_dvp0_proc_write; | 2048 | entry->write_proc = viafb_dvp0_proc_write; |
| 2049 | } | 2049 | } |
| 2050 | entry = create_proc_entry("dvp1", 0, viafb_entry); | 2050 | entry = create_proc_entry("dvp1", 0, *viafb_entry); |
| 2051 | if (entry) { | 2051 | if (entry) { |
| 2052 | entry->owner = THIS_MODULE; | 2052 | entry->owner = THIS_MODULE; |
| 2053 | entry->read_proc = viafb_dvp1_proc_read; | 2053 | entry->read_proc = viafb_dvp1_proc_read; |
| 2054 | entry->write_proc = viafb_dvp1_proc_write; | 2054 | entry->write_proc = viafb_dvp1_proc_write; |
| 2055 | } | 2055 | } |
| 2056 | entry = create_proc_entry("dfph", 0, viafb_entry); | 2056 | entry = create_proc_entry("dfph", 0, *viafb_entry); |
| 2057 | if (entry) { | 2057 | if (entry) { |
| 2058 | entry->owner = THIS_MODULE; | 2058 | entry->owner = THIS_MODULE; |
| 2059 | entry->read_proc = viafb_dfph_proc_read; | 2059 | entry->read_proc = viafb_dfph_proc_read; |
| 2060 | entry->write_proc = viafb_dfph_proc_write; | 2060 | entry->write_proc = viafb_dfph_proc_write; |
| 2061 | } | 2061 | } |
| 2062 | entry = create_proc_entry("dfpl", 0, viafb_entry); | 2062 | entry = create_proc_entry("dfpl", 0, *viafb_entry); |
| 2063 | if (entry) { | 2063 | if (entry) { |
| 2064 | entry->owner = THIS_MODULE; | 2064 | entry->owner = THIS_MODULE; |
| 2065 | entry->read_proc = viafb_dfpl_proc_read; | 2065 | entry->read_proc = viafb_dfpl_proc_read; |
| @@ -2068,7 +2068,7 @@ static void viafb_init_proc(struct proc_dir_entry *viafb_entry) | |||
| 2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. | 2068 | if (VT1636_LVDS == viaparinfo->chip_info->lvds_chip_info. |
| 2069 | lvds_chip_name || VT1636_LVDS == | 2069 | lvds_chip_name || VT1636_LVDS == |
| 2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { | 2070 | viaparinfo->chip_info->lvds_chip_info2.lvds_chip_name) { |
| 2071 | entry = create_proc_entry("vt1636", 0, viafb_entry); | 2071 | entry = create_proc_entry("vt1636", 0, *viafb_entry); |
| 2072 | if (entry) { | 2072 | if (entry) { |
| 2073 | entry->owner = THIS_MODULE; | 2073 | entry->owner = THIS_MODULE; |
| 2074 | entry->read_proc = viafb_vt1636_proc_read; | 2074 | entry->read_proc = viafb_vt1636_proc_read; |
| @@ -2087,6 +2087,7 @@ static void viafb_remove_proc(struct proc_dir_entry *viafb_entry) | |||
| 2087 | remove_proc_entry("dfpl", viafb_entry); | 2087 | remove_proc_entry("dfpl", viafb_entry); |
| 2088 | remove_proc_entry("vt1636", viafb_entry); | 2088 | remove_proc_entry("vt1636", viafb_entry); |
| 2089 | remove_proc_entry("vt1625", viafb_entry); | 2089 | remove_proc_entry("vt1625", viafb_entry); |
| 2090 | remove_proc_entry("viafb", NULL); | ||
| 2090 | } | 2091 | } |
| 2091 | 2092 | ||
| 2092 | static int __devinit via_pci_probe(void) | 2093 | static int __devinit via_pci_probe(void) |
| @@ -2348,7 +2349,7 @@ static int __devinit via_pci_probe(void) | |||
| 2348 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, | 2349 | viafbinfo->node, viafbinfo->fix.id, default_var.xres, |
| 2349 | default_var.yres, default_var.bits_per_pixel); | 2350 | default_var.yres, default_var.bits_per_pixel); |
| 2350 | 2351 | ||
| 2351 | viafb_init_proc(viaparinfo->proc_entry); | 2352 | viafb_init_proc(&viaparinfo->proc_entry); |
| 2352 | viafb_init_dac(IGA2); | 2353 | viafb_init_dac(IGA2); |
| 2353 | return 0; | 2354 | return 0; |
| 2354 | } | 2355 | } |
diff --git a/drivers/w1/masters/omap_hdq.c b/drivers/w1/masters/omap_hdq.c index 1295625c4825..c973889110c8 100644 --- a/drivers/w1/masters/omap_hdq.c +++ b/drivers/w1/masters/omap_hdq.c | |||
| @@ -86,8 +86,8 @@ static struct platform_driver omap_hdq_driver = { | |||
| 86 | static u8 omap_w1_read_byte(void *_hdq); | 86 | static u8 omap_w1_read_byte(void *_hdq); |
| 87 | static void omap_w1_write_byte(void *_hdq, u8 byte); | 87 | static void omap_w1_write_byte(void *_hdq, u8 byte); |
| 88 | static u8 omap_w1_reset_bus(void *_hdq); | 88 | static u8 omap_w1_reset_bus(void *_hdq); |
| 89 | static void omap_w1_search_bus(void *_hdq, u8 search_type, | 89 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, |
| 90 | w1_slave_found_callback slave_found); | 90 | u8 search_type, w1_slave_found_callback slave_found); |
| 91 | 91 | ||
| 92 | 92 | ||
| 93 | static struct w1_bus_master omap_w1_master = { | 93 | static struct w1_bus_master omap_w1_master = { |
| @@ -231,8 +231,8 @@ static u8 omap_w1_reset_bus(void *_hdq) | |||
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | /* W1 search callback function */ | 233 | /* W1 search callback function */ |
| 234 | static void omap_w1_search_bus(void *_hdq, u8 search_type, | 234 | static void omap_w1_search_bus(void *_hdq, struct w1_master *master_dev, |
| 235 | w1_slave_found_callback slave_found) | 235 | u8 search_type, w1_slave_found_callback slave_found) |
| 236 | { | 236 | { |
| 237 | u64 module_id, rn_le, cs, id; | 237 | u64 module_id, rn_le, cs, id; |
| 238 | 238 | ||
| @@ -249,7 +249,7 @@ static void omap_w1_search_bus(void *_hdq, u8 search_type, | |||
| 249 | cs = w1_calc_crc8((u8 *)&rn_le, 7); | 249 | cs = w1_calc_crc8((u8 *)&rn_le, 7); |
| 250 | id = (cs << 56) | module_id; | 250 | id = (cs << 56) | module_id; |
| 251 | 251 | ||
| 252 | slave_found(_hdq, id); | 252 | slave_found(master_dev, id); |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | static int _omap_hdq_reset(struct hdq_data *hdq_data) | 255 | static int _omap_hdq_reset(struct hdq_data *hdq_data) |
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index a0fb5eac407c..526c191e84ea 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -122,14 +122,7 @@ static struct timer_list balloon_timer; | |||
| 122 | static void scrub_page(struct page *page) | 122 | static void scrub_page(struct page *page) |
| 123 | { | 123 | { |
| 124 | #ifdef CONFIG_XEN_SCRUB_PAGES | 124 | #ifdef CONFIG_XEN_SCRUB_PAGES |
| 125 | if (PageHighMem(page)) { | 125 | clear_highpage(page); |
| 126 | void *v = kmap(page); | ||
| 127 | clear_page(v); | ||
| 128 | kunmap(v); | ||
| 129 | } else { | ||
| 130 | void *v = page_address(page); | ||
| 131 | clear_page(v); | ||
| 132 | } | ||
| 133 | #endif | 126 | #endif |
| 134 | } | 127 | } |
| 135 | 128 | ||
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 8855331b2fba..e078b7aea143 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
| @@ -8,7 +8,11 @@ handling fcntl(F_SETLEASE). Convert cifs to using blocking tcp | |||
| 8 | sends, and also let tcp autotune the socket send and receive buffers. | 8 | sends, and also let tcp autotune the socket send and receive buffers. |
| 9 | This reduces the number of EAGAIN errors returned by TCP/IP in | 9 | This reduces the number of EAGAIN errors returned by TCP/IP in |
| 10 | high stress workloads (and the number of retries on socket writes | 10 | high stress workloads (and the number of retries on socket writes |
| 11 | when sending large SMBWriteX requests). | 11 | when sending large SMBWriteX requests). Fix case in which a portion of |
| 12 | data can in some cases not get written to the file on the server before the | ||
| 13 | file is closed. Fix DFS parsing to properly handle path consumed field, | ||
| 14 | and to handle certain codepage conversions better. Fix mount and | ||
| 15 | umount race that can cause oops in mount or umount or reconnect. | ||
| 12 | 16 | ||
| 13 | Version 1.54 | 17 | Version 1.54 |
| 14 | ------------ | 18 | ------------ |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index f1ae1f57c30d..c57c0565547f 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
| @@ -606,7 +606,15 @@ GLOBAL_EXTERN struct list_head cifs_tcp_ses_list; | |||
| 606 | * changes to the tcon->tidStatus should be done while holding this lock. | 606 | * changes to the tcon->tidStatus should be done while holding this lock. |
| 607 | */ | 607 | */ |
| 608 | GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock; | 608 | GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock; |
| 609 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; /* protects list inserts on 3 above */ | 609 | |
| 610 | /* | ||
| 611 | * This lock protects the cifs_file->llist and cifs_file->flist | ||
| 612 | * list operations, and updates to some flags (cifs_file->invalidHandle) | ||
| 613 | * It will be moved to either use the tcon->stat_lock or equivalent later. | ||
| 614 | * If cifs_tcp_ses_lock and the lock below are both needed to be held, then | ||
| 615 | * the cifs_tcp_ses_lock must be grabbed first and released last. | ||
| 616 | */ | ||
| 617 | GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; | ||
| 610 | 618 | ||
| 611 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; | 619 | GLOBAL_EXTERN struct list_head GlobalOplock_Q; |
| 612 | 620 | ||
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index bdda46dd435a..2af8626ced43 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -295,7 +295,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |||
| 295 | check for tcp and smb session status done differently | 295 | check for tcp and smb session status done differently |
| 296 | for those three - in the calling routine */ | 296 | for those three - in the calling routine */ |
| 297 | if (tcon) { | 297 | if (tcon) { |
| 298 | if (tcon->need_reconnect) { | 298 | if (tcon->tidStatus == CifsExiting) { |
| 299 | /* only tree disconnect, open, and write, | 299 | /* only tree disconnect, open, and write, |
| 300 | (and ulogoff which does not have tcon) | 300 | (and ulogoff which does not have tcon) |
| 301 | are allowed as we start force umount */ | 301 | are allowed as we start force umount */ |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 6449e1aae621..b691b893a848 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -488,12 +488,13 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 488 | pTcon = cifs_sb->tcon; | 488 | pTcon = cifs_sb->tcon; |
| 489 | if (pSMBFile) { | 489 | if (pSMBFile) { |
| 490 | struct cifsLockInfo *li, *tmp; | 490 | struct cifsLockInfo *li, *tmp; |
| 491 | 491 | write_lock(&GlobalSMBSeslock); | |
| 492 | pSMBFile->closePend = true; | 492 | pSMBFile->closePend = true; |
| 493 | if (pTcon) { | 493 | if (pTcon) { |
| 494 | /* no sense reconnecting to close a file that is | 494 | /* no sense reconnecting to close a file that is |
| 495 | already closed */ | 495 | already closed */ |
| 496 | if (!pTcon->need_reconnect) { | 496 | if (!pTcon->need_reconnect) { |
| 497 | write_unlock(&GlobalSMBSeslock); | ||
| 497 | timeout = 2; | 498 | timeout = 2; |
| 498 | while ((atomic_read(&pSMBFile->wrtPending) != 0) | 499 | while ((atomic_read(&pSMBFile->wrtPending) != 0) |
| 499 | && (timeout <= 2048)) { | 500 | && (timeout <= 2048)) { |
| @@ -510,12 +511,15 @@ int cifs_close(struct inode *inode, struct file *file) | |||
| 510 | timeout *= 4; | 511 | timeout *= 4; |
| 511 | } | 512 | } |
| 512 | if (atomic_read(&pSMBFile->wrtPending)) | 513 | if (atomic_read(&pSMBFile->wrtPending)) |
| 513 | cERROR(1, | 514 | cERROR(1, ("close with pending write")); |
| 514 | ("close with pending writes")); | 515 | if (!pTcon->need_reconnect && |
| 515 | rc = CIFSSMBClose(xid, pTcon, | 516 | !pSMBFile->invalidHandle) |
| 517 | rc = CIFSSMBClose(xid, pTcon, | ||
| 516 | pSMBFile->netfid); | 518 | pSMBFile->netfid); |
| 517 | } | 519 | } else |
| 518 | } | 520 | write_unlock(&GlobalSMBSeslock); |
| 521 | } else | ||
| 522 | write_unlock(&GlobalSMBSeslock); | ||
| 519 | 523 | ||
| 520 | /* Delete any outstanding lock records. | 524 | /* Delete any outstanding lock records. |
| 521 | We'll lose them when the file is closed anyway. */ | 525 | We'll lose them when the file is closed anyway. */ |
| @@ -587,15 +591,18 @@ int cifs_closedir(struct inode *inode, struct file *file) | |||
| 587 | pTcon = cifs_sb->tcon; | 591 | pTcon = cifs_sb->tcon; |
| 588 | 592 | ||
| 589 | cFYI(1, ("Freeing private data in close dir")); | 593 | cFYI(1, ("Freeing private data in close dir")); |
| 594 | write_lock(&GlobalSMBSeslock); | ||
| 590 | if (!pCFileStruct->srch_inf.endOfSearch && | 595 | if (!pCFileStruct->srch_inf.endOfSearch && |
| 591 | !pCFileStruct->invalidHandle) { | 596 | !pCFileStruct->invalidHandle) { |
| 592 | pCFileStruct->invalidHandle = true; | 597 | pCFileStruct->invalidHandle = true; |
| 598 | write_unlock(&GlobalSMBSeslock); | ||
| 593 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); | 599 | rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid); |
| 594 | cFYI(1, ("Closing uncompleted readdir with rc %d", | 600 | cFYI(1, ("Closing uncompleted readdir with rc %d", |
| 595 | rc)); | 601 | rc)); |
| 596 | /* not much we can do if it fails anyway, ignore rc */ | 602 | /* not much we can do if it fails anyway, ignore rc */ |
| 597 | rc = 0; | 603 | rc = 0; |
| 598 | } | 604 | } else |
| 605 | write_unlock(&GlobalSMBSeslock); | ||
| 599 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; | 606 | ptmp = pCFileStruct->srch_inf.ntwrk_buf_start; |
| 600 | if (ptmp) { | 607 | if (ptmp) { |
| 601 | cFYI(1, ("closedir free smb buf in srch struct")); | 608 | cFYI(1, ("closedir free smb buf in srch struct")); |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index addd1dcc2d79..9ee3f689c2b0 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
| @@ -555,12 +555,14 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 555 | continue; | 555 | continue; |
| 556 | 556 | ||
| 557 | cifs_stats_inc(&tcon->num_oplock_brks); | 557 | cifs_stats_inc(&tcon->num_oplock_brks); |
| 558 | write_lock(&GlobalSMBSeslock); | ||
| 558 | list_for_each(tmp2, &tcon->openFileList) { | 559 | list_for_each(tmp2, &tcon->openFileList) { |
| 559 | netfile = list_entry(tmp2, struct cifsFileInfo, | 560 | netfile = list_entry(tmp2, struct cifsFileInfo, |
| 560 | tlist); | 561 | tlist); |
| 561 | if (pSMB->Fid != netfile->netfid) | 562 | if (pSMB->Fid != netfile->netfid) |
| 562 | continue; | 563 | continue; |
| 563 | 564 | ||
| 565 | write_unlock(&GlobalSMBSeslock); | ||
| 564 | read_unlock(&cifs_tcp_ses_lock); | 566 | read_unlock(&cifs_tcp_ses_lock); |
| 565 | cFYI(1, ("file id match, oplock break")); | 567 | cFYI(1, ("file id match, oplock break")); |
| 566 | pCifsInode = CIFS_I(netfile->pInode); | 568 | pCifsInode = CIFS_I(netfile->pInode); |
| @@ -576,6 +578,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 576 | 578 | ||
| 577 | return true; | 579 | return true; |
| 578 | } | 580 | } |
| 581 | write_unlock(&GlobalSMBSeslock); | ||
| 579 | read_unlock(&cifs_tcp_ses_lock); | 582 | read_unlock(&cifs_tcp_ses_lock); |
| 580 | cFYI(1, ("No matching file for oplock break")); | 583 | cFYI(1, ("No matching file for oplock break")); |
| 581 | return true; | 584 | return true; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 58d57299f2a0..9f51f9bf0292 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -741,11 +741,14 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
| 741 | (index_to_find < first_entry_in_buffer)) { | 741 | (index_to_find < first_entry_in_buffer)) { |
| 742 | /* close and restart search */ | 742 | /* close and restart search */ |
| 743 | cFYI(1, ("search backing up - close and restart search")); | 743 | cFYI(1, ("search backing up - close and restart search")); |
| 744 | write_lock(&GlobalSMBSeslock); | ||
| 744 | if (!cifsFile->srch_inf.endOfSearch && | 745 | if (!cifsFile->srch_inf.endOfSearch && |
| 745 | !cifsFile->invalidHandle) { | 746 | !cifsFile->invalidHandle) { |
| 746 | cifsFile->invalidHandle = true; | 747 | cifsFile->invalidHandle = true; |
| 748 | write_unlock(&GlobalSMBSeslock); | ||
| 747 | CIFSFindClose(xid, pTcon, cifsFile->netfid); | 749 | CIFSFindClose(xid, pTcon, cifsFile->netfid); |
| 748 | } | 750 | } else |
| 751 | write_unlock(&GlobalSMBSeslock); | ||
| 749 | if (cifsFile->srch_inf.ntwrk_buf_start) { | 752 | if (cifsFile->srch_inf.ntwrk_buf_start) { |
| 750 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); | 753 | cFYI(1, ("freeing SMB ff cache buf on search rewind")); |
| 751 | if (cifsFile->srch_inf.smallBuf) | 754 | if (cifsFile->srch_inf.smallBuf) |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index e22bc3961345..0d713b691941 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
| @@ -1037,17 +1037,14 @@ static int | |||
| 1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | 1037 | decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, |
| 1038 | struct ecryptfs_crypt_stat *crypt_stat) | 1038 | struct ecryptfs_crypt_stat *crypt_stat) |
| 1039 | { | 1039 | { |
| 1040 | struct scatterlist dst_sg; | 1040 | struct scatterlist dst_sg[2]; |
| 1041 | struct scatterlist src_sg; | 1041 | struct scatterlist src_sg[2]; |
| 1042 | struct mutex *tfm_mutex; | 1042 | struct mutex *tfm_mutex; |
| 1043 | struct blkcipher_desc desc = { | 1043 | struct blkcipher_desc desc = { |
| 1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP | 1044 | .flags = CRYPTO_TFM_REQ_MAY_SLEEP |
| 1045 | }; | 1045 | }; |
| 1046 | int rc = 0; | 1046 | int rc = 0; |
| 1047 | 1047 | ||
| 1048 | sg_init_table(&dst_sg, 1); | ||
| 1049 | sg_init_table(&src_sg, 1); | ||
| 1050 | |||
| 1051 | if (unlikely(ecryptfs_verbosity > 0)) { | 1048 | if (unlikely(ecryptfs_verbosity > 0)) { |
| 1052 | ecryptfs_printk( | 1049 | ecryptfs_printk( |
| 1053 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", | 1050 | KERN_DEBUG, "Session key encryption key (size [%d]):\n", |
| @@ -1066,8 +1063,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1066 | } | 1063 | } |
| 1067 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, | 1064 | rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key, |
| 1068 | auth_tok->session_key.encrypted_key_size, | 1065 | auth_tok->session_key.encrypted_key_size, |
| 1069 | &src_sg, 1); | 1066 | src_sg, 2); |
| 1070 | if (rc != 1) { | 1067 | if (rc < 1 || rc > 2) { |
| 1071 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1068 | printk(KERN_ERR "Internal error whilst attempting to convert " |
| 1072 | "auth_tok->session_key.encrypted_key to scatterlist; " | 1069 | "auth_tok->session_key.encrypted_key to scatterlist; " |
| 1073 | "expected rc = 1; got rc = [%d]. " | 1070 | "expected rc = 1; got rc = [%d]. " |
| @@ -1079,8 +1076,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1079 | auth_tok->session_key.encrypted_key_size; | 1076 | auth_tok->session_key.encrypted_key_size; |
| 1080 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, | 1077 | rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key, |
| 1081 | auth_tok->session_key.decrypted_key_size, | 1078 | auth_tok->session_key.decrypted_key_size, |
| 1082 | &dst_sg, 1); | 1079 | dst_sg, 2); |
| 1083 | if (rc != 1) { | 1080 | if (rc < 1 || rc > 2) { |
| 1084 | printk(KERN_ERR "Internal error whilst attempting to convert " | 1081 | printk(KERN_ERR "Internal error whilst attempting to convert " |
| 1085 | "auth_tok->session_key.decrypted_key to scatterlist; " | 1082 | "auth_tok->session_key.decrypted_key to scatterlist; " |
| 1086 | "expected rc = 1; got rc = [%d]\n", rc); | 1083 | "expected rc = 1; got rc = [%d]\n", rc); |
| @@ -1096,7 +1093,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, | |||
| 1096 | rc = -EINVAL; | 1093 | rc = -EINVAL; |
| 1097 | goto out; | 1094 | goto out; |
| 1098 | } | 1095 | } |
| 1099 | rc = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg, | 1096 | rc = crypto_blkcipher_decrypt(&desc, dst_sg, src_sg, |
| 1100 | auth_tok->session_key.encrypted_key_size); | 1097 | auth_tok->session_key.encrypted_key_size); |
| 1101 | mutex_unlock(tfm_mutex); | 1098 | mutex_unlock(tfm_mutex); |
| 1102 | if (unlikely(rc)) { | 1099 | if (unlikely(rc)) { |
| @@ -1539,8 +1536,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1539 | size_t i; | 1536 | size_t i; |
| 1540 | size_t encrypted_session_key_valid = 0; | 1537 | size_t encrypted_session_key_valid = 0; |
| 1541 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; | 1538 | char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES]; |
| 1542 | struct scatterlist dst_sg; | 1539 | struct scatterlist dst_sg[2]; |
| 1543 | struct scatterlist src_sg; | 1540 | struct scatterlist src_sg[2]; |
| 1544 | struct mutex *tfm_mutex = NULL; | 1541 | struct mutex *tfm_mutex = NULL; |
| 1545 | u8 cipher_code; | 1542 | u8 cipher_code; |
| 1546 | size_t packet_size_length; | 1543 | size_t packet_size_length; |
| @@ -1619,8 +1616,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1619 | ecryptfs_dump_hex(session_key_encryption_key, 16); | 1616 | ecryptfs_dump_hex(session_key_encryption_key, 16); |
| 1620 | } | 1617 | } |
| 1621 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, | 1618 | rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size, |
| 1622 | &src_sg, 1); | 1619 | src_sg, 2); |
| 1623 | if (rc != 1) { | 1620 | if (rc < 1 || rc > 2) { |
| 1624 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1621 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
| 1625 | "for crypt_stat session key; expected rc = 1; " | 1622 | "for crypt_stat session key; expected rc = 1; " |
| 1626 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", | 1623 | "got rc = [%d]. key_rec->enc_key_size = [%d]\n", |
| @@ -1629,8 +1626,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1629 | goto out; | 1626 | goto out; |
| 1630 | } | 1627 | } |
| 1631 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, | 1628 | rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size, |
| 1632 | &dst_sg, 1); | 1629 | dst_sg, 2); |
| 1633 | if (rc != 1) { | 1630 | if (rc < 1 || rc > 2) { |
| 1634 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " | 1631 | ecryptfs_printk(KERN_ERR, "Error generating scatterlist " |
| 1635 | "for crypt_stat encrypted session key; " | 1632 | "for crypt_stat encrypted session key; " |
| 1636 | "expected rc = 1; got rc = [%d]. " | 1633 | "expected rc = 1; got rc = [%d]. " |
| @@ -1651,7 +1648,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, | |||
| 1651 | rc = 0; | 1648 | rc = 0; |
| 1652 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", | 1649 | ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n", |
| 1653 | crypt_stat->key_size); | 1650 | crypt_stat->key_size); |
| 1654 | rc = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg, | 1651 | rc = crypto_blkcipher_encrypt(&desc, dst_sg, src_sg, |
| 1655 | (*key_rec).enc_key_size); | 1652 | (*key_rec).enc_key_size); |
| 1656 | mutex_unlock(tfm_mutex); | 1653 | mutex_unlock(tfm_mutex); |
| 1657 | if (rc) { | 1654 | if (rc) { |
diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h index 6ae9011b95eb..2f34f8f2134b 100644 --- a/fs/hostfs/hostfs.h +++ b/fs/hostfs/hostfs.h | |||
| @@ -81,7 +81,7 @@ extern int do_rmdir(const char *file); | |||
| 81 | extern int do_mknod(const char *file, int mode, unsigned int major, | 81 | extern int do_mknod(const char *file, int mode, unsigned int major, |
| 82 | unsigned int minor); | 82 | unsigned int minor); |
| 83 | extern int link_file(const char *from, const char *to); | 83 | extern int link_file(const char *from, const char *to); |
| 84 | extern int do_readlink(char *file, char *buf, int size); | 84 | extern int hostfs_do_readlink(char *file, char *buf, int size); |
| 85 | extern int rename_file(char *from, char *to); | 85 | extern int rename_file(char *from, char *to); |
| 86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, | 86 | extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, |
| 87 | long long *bfree_out, long long *bavail_out, | 87 | long long *bfree_out, long long *bavail_out, |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 7f34f4385de0..3a31451ac170 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -168,7 +168,7 @@ static char *follow_link(char *link) | |||
| 168 | if (name == NULL) | 168 | if (name == NULL) |
| 169 | goto out; | 169 | goto out; |
| 170 | 170 | ||
| 171 | n = do_readlink(link, name, len); | 171 | n = hostfs_do_readlink(link, name, len); |
| 172 | if (n < len) | 172 | if (n < len) |
| 173 | break; | 173 | break; |
| 174 | len *= 2; | 174 | len *= 2; |
| @@ -943,7 +943,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) | |||
| 943 | name = inode_name(page->mapping->host, 0); | 943 | name = inode_name(page->mapping->host, 0); |
| 944 | if (name == NULL) | 944 | if (name == NULL) |
| 945 | return -ENOMEM; | 945 | return -ENOMEM; |
| 946 | err = do_readlink(name, buffer, PAGE_CACHE_SIZE); | 946 | err = hostfs_do_readlink(name, buffer, PAGE_CACHE_SIZE); |
| 947 | kfree(name); | 947 | kfree(name); |
| 948 | if (err == PAGE_CACHE_SIZE) | 948 | if (err == PAGE_CACHE_SIZE) |
| 949 | err = -E2BIG; | 949 | err = -E2BIG; |
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c index 53fd0a67c11a..b79424f93282 100644 --- a/fs/hostfs/hostfs_user.c +++ b/fs/hostfs/hostfs_user.c | |||
| @@ -377,7 +377,7 @@ int link_file(const char *to, const char *from) | |||
| 377 | return 0; | 377 | return 0; |
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | int do_readlink(char *file, char *buf, int size) | 380 | int hostfs_do_readlink(char *file, char *buf, int size) |
| 381 | { | 381 | { |
| 382 | int n; | 382 | int n; |
| 383 | 383 | ||
diff --git a/fs/namei.c b/fs/namei.c index 09ce58e49e72..d34e0f9681c6 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1378,7 +1378,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) | |||
| 1378 | if (IS_APPEND(dir)) | 1378 | if (IS_APPEND(dir)) |
| 1379 | return -EPERM; | 1379 | return -EPERM; |
| 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| | 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| |
| 1381 | IS_IMMUTABLE(victim->d_inode)) | 1381 | IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode)) |
| 1382 | return -EPERM; | 1382 | return -EPERM; |
| 1383 | if (isdir) { | 1383 | if (isdir) { |
| 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) | 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) |
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h index 2691926fb506..8e540d32c9fe 100644 --- a/include/linux/cpuset.h +++ b/include/linux/cpuset.h | |||
| @@ -74,8 +74,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
| 74 | return current->flags & PF_SPREAD_SLAB; | 74 | return current->flags & PF_SPREAD_SLAB; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | extern void cpuset_track_online_nodes(void); | ||
| 78 | |||
| 79 | extern int current_cpuset_is_being_rebound(void); | 77 | extern int current_cpuset_is_being_rebound(void); |
| 80 | 78 | ||
| 81 | extern void rebuild_sched_domains(void); | 79 | extern void rebuild_sched_domains(void); |
| @@ -151,8 +149,6 @@ static inline int cpuset_do_slab_mem_spread(void) | |||
| 151 | return 0; | 149 | return 0; |
| 152 | } | 150 | } |
| 153 | 151 | ||
| 154 | static inline void cpuset_track_online_nodes(void) {} | ||
| 155 | |||
| 156 | static inline int current_cpuset_is_being_rebound(void) | 152 | static inline int current_cpuset_is_being_rebound(void) |
| 157 | { | 153 | { |
| 158 | return 0; | 154 | return 0; |
diff --git a/include/linux/net.h b/include/linux/net.h index 6dc14a240042..4515efae4c39 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ | 40 | #define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ |
| 41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ | 41 | #define SYS_SENDMSG 16 /* sys_sendmsg(2) */ |
| 42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ | 42 | #define SYS_RECVMSG 17 /* sys_recvmsg(2) */ |
| 43 | #define SYS_PACCEPT 18 /* sys_paccept(2) */ | 43 | #define SYS_ACCEPT4 18 /* sys_accept4(2) */ |
| 44 | 44 | ||
| 45 | typedef enum { | 45 | typedef enum { |
| 46 | SS_FREE = 0, /* not allocated */ | 46 | SS_FREE = 0, /* not allocated */ |
| @@ -100,7 +100,7 @@ enum sock_type { | |||
| 100 | * remaining bits are used as flags. */ | 100 | * remaining bits are used as flags. */ |
| 101 | #define SOCK_TYPE_MASK 0xf | 101 | #define SOCK_TYPE_MASK 0xf |
| 102 | 102 | ||
| 103 | /* Flags for socket, socketpair, paccept */ | 103 | /* Flags for socket, socketpair, accept4 */ |
| 104 | #define SOCK_CLOEXEC O_CLOEXEC | 104 | #define SOCK_CLOEXEC O_CLOEXEC |
| 105 | #ifndef SOCK_NONBLOCK | 105 | #ifndef SOCK_NONBLOCK |
| 106 | #define SOCK_NONBLOCK O_NONBLOCK | 106 | #define SOCK_NONBLOCK O_NONBLOCK |
| @@ -223,8 +223,6 @@ extern int sock_map_fd(struct socket *sock, int flags); | |||
| 223 | extern struct socket *sockfd_lookup(int fd, int *err); | 223 | extern struct socket *sockfd_lookup(int fd, int *err); |
| 224 | #define sockfd_put(sock) fput(sock->file) | 224 | #define sockfd_put(sock) fput(sock->file) |
| 225 | extern int net_ratelimit(void); | 225 | extern int net_ratelimit(void); |
| 226 | extern long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 227 | int __user *upeer_addrlen, int flags); | ||
| 228 | 226 | ||
| 229 | #define net_random() random32() | 227 | #define net_random() random32() |
| 230 | #define net_srandom(seed) srandom32((__force u32)seed) | 228 | #define net_srandom(seed) srandom32((__force u32)seed) |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index d6ff145919ca..04fb47bfb920 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -410,8 +410,7 @@ asmlinkage long sys_getsockopt(int fd, int level, int optname, | |||
| 410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); | 410 | asmlinkage long sys_bind(int, struct sockaddr __user *, int); |
| 411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); | 411 | asmlinkage long sys_connect(int, struct sockaddr __user *, int); |
| 412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); | 412 | asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *); |
| 413 | asmlinkage long sys_paccept(int, struct sockaddr __user *, int __user *, | 413 | asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int); |
| 414 | const __user sigset_t *, size_t, int); | ||
| 415 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); | 414 | asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *); |
| 416 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); | 415 | asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *); |
| 417 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); | 416 | asmlinkage long sys_send(int, void __user *, size_t, unsigned); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 8856e2d60e9f..73d81bc6aa75 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -74,14 +74,6 @@ | |||
| 74 | */ | 74 | */ |
| 75 | 75 | ||
| 76 | /** | 76 | /** |
| 77 | * enum ieee80211_notification_type - Low level driver notification | ||
| 78 | * @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence | ||
| 79 | */ | ||
| 80 | enum ieee80211_notification_types { | ||
| 81 | IEEE80211_NOTIFY_RE_ASSOC, | ||
| 82 | }; | ||
| 83 | |||
| 84 | /** | ||
| 85 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics | 77 | * struct ieee80211_ht_bss_info - describing BSS's HT characteristics |
| 86 | * | 78 | * |
| 87 | * This structure describes most essential parameters needed | 79 | * This structure describes most essential parameters needed |
| @@ -1798,18 +1790,6 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | |||
| 1798 | u16 tid); | 1790 | u16 tid); |
| 1799 | 1791 | ||
| 1800 | /** | 1792 | /** |
| 1801 | * ieee80211_notify_mac - low level driver notification | ||
| 1802 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | ||
| 1803 | * @notif_type: enum ieee80211_notification_types | ||
| 1804 | * | ||
| 1805 | * This function must be called by low level driver to inform mac80211 of | ||
| 1806 | * low level driver status change or force mac80211 to re-assoc for low | ||
| 1807 | * level driver internal error that require re-assoc. | ||
| 1808 | */ | ||
| 1809 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
| 1810 | enum ieee80211_notification_types notif_type); | ||
| 1811 | |||
| 1812 | /** | ||
| 1813 | * ieee80211_find_sta - find a station | 1793 | * ieee80211_find_sta - find a station |
| 1814 | * | 1794 | * |
| 1815 | * @hw: pointer as obtained from ieee80211_alloc_hw() | 1795 | * @hw: pointer as obtained from ieee80211_alloc_hw() |
diff --git a/ipc/util.c b/ipc/util.c index 49b3ea615dc5..361fd1c96fcf 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
| @@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 266 | if (ids->in_use >= size) | 266 | if (ids->in_use >= size) |
| 267 | return -ENOSPC; | 267 | return -ENOSPC; |
| 268 | 268 | ||
| 269 | spin_lock_init(&new->lock); | ||
| 270 | new->deleted = 0; | ||
| 271 | rcu_read_lock(); | ||
| 272 | spin_lock(&new->lock); | ||
| 273 | |||
| 269 | err = idr_get_new(&ids->ipcs_idr, new, &id); | 274 | err = idr_get_new(&ids->ipcs_idr, new, &id); |
| 270 | if (err) | 275 | if (err) { |
| 276 | spin_unlock(&new->lock); | ||
| 277 | rcu_read_unlock(); | ||
| 271 | return err; | 278 | return err; |
| 279 | } | ||
| 272 | 280 | ||
| 273 | ids->in_use++; | 281 | ids->in_use++; |
| 274 | 282 | ||
| @@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 280 | ids->seq = 0; | 288 | ids->seq = 0; |
| 281 | 289 | ||
| 282 | new->id = ipc_buildid(id, new->seq); | 290 | new->id = ipc_buildid(id, new->seq); |
| 283 | spin_lock_init(&new->lock); | ||
| 284 | new->deleted = 0; | ||
| 285 | rcu_read_lock(); | ||
| 286 | spin_lock(&new->lock); | ||
| 287 | return id; | 291 | return id; |
| 288 | } | 292 | } |
| 289 | 293 | ||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 358e77564e6f..fe00b3b983a8 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -2039,10 +2039,13 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry) | |||
| 2039 | struct cgroup *cgrp; | 2039 | struct cgroup *cgrp; |
| 2040 | struct cgroup_iter it; | 2040 | struct cgroup_iter it; |
| 2041 | struct task_struct *tsk; | 2041 | struct task_struct *tsk; |
| 2042 | |||
| 2042 | /* | 2043 | /* |
| 2043 | * Validate dentry by checking the superblock operations | 2044 | * Validate dentry by checking the superblock operations, |
| 2045 | * and make sure it's a directory. | ||
| 2044 | */ | 2046 | */ |
| 2045 | if (dentry->d_sb->s_op != &cgroup_ops) | 2047 | if (dentry->d_sb->s_op != &cgroup_ops || |
| 2048 | !S_ISDIR(dentry->d_inode->i_mode)) | ||
| 2046 | goto err; | 2049 | goto err; |
| 2047 | 2050 | ||
| 2048 | ret = 0; | 2051 | ret = 0; |
| @@ -2472,10 +2475,7 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
| 2472 | mutex_unlock(&cgroup_mutex); | 2475 | mutex_unlock(&cgroup_mutex); |
| 2473 | return -EBUSY; | 2476 | return -EBUSY; |
| 2474 | } | 2477 | } |
| 2475 | 2478 | mutex_unlock(&cgroup_mutex); | |
| 2476 | parent = cgrp->parent; | ||
| 2477 | root = cgrp->root; | ||
| 2478 | sb = root->sb; | ||
| 2479 | 2479 | ||
| 2480 | /* | 2480 | /* |
| 2481 | * Call pre_destroy handlers of subsys. Notify subsystems | 2481 | * Call pre_destroy handlers of subsys. Notify subsystems |
| @@ -2483,7 +2483,14 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
| 2483 | */ | 2483 | */ |
| 2484 | cgroup_call_pre_destroy(cgrp); | 2484 | cgroup_call_pre_destroy(cgrp); |
| 2485 | 2485 | ||
| 2486 | if (cgroup_has_css_refs(cgrp)) { | 2486 | mutex_lock(&cgroup_mutex); |
| 2487 | parent = cgrp->parent; | ||
| 2488 | root = cgrp->root; | ||
| 2489 | sb = root->sb; | ||
| 2490 | |||
| 2491 | if (atomic_read(&cgrp->count) | ||
| 2492 | || !list_empty(&cgrp->children) | ||
| 2493 | || cgroup_has_css_refs(cgrp)) { | ||
| 2487 | mutex_unlock(&cgroup_mutex); | 2494 | mutex_unlock(&cgroup_mutex); |
| 2488 | return -EBUSY; | 2495 | return -EBUSY; |
| 2489 | } | 2496 | } |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 81fc6791a296..da7ff6137f37 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/list.h> | 36 | #include <linux/list.h> |
| 37 | #include <linux/mempolicy.h> | 37 | #include <linux/mempolicy.h> |
| 38 | #include <linux/mm.h> | 38 | #include <linux/mm.h> |
| 39 | #include <linux/memory.h> | ||
| 39 | #include <linux/module.h> | 40 | #include <linux/module.h> |
| 40 | #include <linux/mount.h> | 41 | #include <linux/mount.h> |
| 41 | #include <linux/namei.h> | 42 | #include <linux/namei.h> |
| @@ -2015,12 +2016,23 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
| 2015 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. | 2016 | * Call this routine anytime after node_states[N_HIGH_MEMORY] changes. |
| 2016 | * See also the previous routine cpuset_track_online_cpus(). | 2017 | * See also the previous routine cpuset_track_online_cpus(). |
| 2017 | */ | 2018 | */ |
| 2018 | void cpuset_track_online_nodes(void) | 2019 | static int cpuset_track_online_nodes(struct notifier_block *self, |
| 2020 | unsigned long action, void *arg) | ||
| 2019 | { | 2021 | { |
| 2020 | cgroup_lock(); | 2022 | cgroup_lock(); |
| 2021 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2023 | switch (action) { |
| 2022 | scan_for_empty_cpusets(&top_cpuset); | 2024 | case MEM_ONLINE: |
| 2025 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
| 2026 | break; | ||
| 2027 | case MEM_OFFLINE: | ||
| 2028 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | ||
| 2029 | scan_for_empty_cpusets(&top_cpuset); | ||
| 2030 | break; | ||
| 2031 | default: | ||
| 2032 | break; | ||
| 2033 | } | ||
| 2023 | cgroup_unlock(); | 2034 | cgroup_unlock(); |
| 2035 | return NOTIFY_OK; | ||
| 2024 | } | 2036 | } |
| 2025 | #endif | 2037 | #endif |
| 2026 | 2038 | ||
| @@ -2036,6 +2048,7 @@ void __init cpuset_init_smp(void) | |||
| 2036 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2048 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
| 2037 | 2049 | ||
| 2038 | hotcpu_notifier(cpuset_track_online_cpus, 0); | 2050 | hotcpu_notifier(cpuset_track_online_cpus, 0); |
| 2051 | hotplug_memory_notifier(cpuset_track_online_nodes, 10); | ||
| 2039 | } | 2052 | } |
| 2040 | 2053 | ||
| 2041 | /** | 2054 | /** |
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 5072cf1685a2..7b8b0f21a5b1 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c | |||
| @@ -304,17 +304,24 @@ int sprint_symbol(char *buffer, unsigned long address) | |||
| 304 | char *modname; | 304 | char *modname; |
| 305 | const char *name; | 305 | const char *name; |
| 306 | unsigned long offset, size; | 306 | unsigned long offset, size; |
| 307 | char namebuf[KSYM_NAME_LEN]; | 307 | int len; |
| 308 | 308 | ||
| 309 | name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); | 309 | name = kallsyms_lookup(address, &size, &offset, &modname, buffer); |
| 310 | if (!name) | 310 | if (!name) |
| 311 | return sprintf(buffer, "0x%lx", address); | 311 | return sprintf(buffer, "0x%lx", address); |
| 312 | 312 | ||
| 313 | if (name != buffer) | ||
| 314 | strcpy(buffer, name); | ||
| 315 | len = strlen(buffer); | ||
| 316 | buffer += len; | ||
| 317 | |||
| 313 | if (modname) | 318 | if (modname) |
| 314 | return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, | 319 | len += sprintf(buffer, "+%#lx/%#lx [%s]", |
| 315 | size, modname); | 320 | offset, size, modname); |
| 316 | else | 321 | else |
| 317 | return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); | 322 | len += sprintf(buffer, "+%#lx/%#lx", offset, size); |
| 323 | |||
| 324 | return len; | ||
| 318 | } | 325 | } |
| 319 | 326 | ||
| 320 | /* Look up a kernel symbol and print it to the kernel messages. */ | 327 | /* Look up a kernel symbol and print it to the kernel messages. */ |
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index a77b27b11b04..e14a23281707 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c | |||
| @@ -31,7 +31,7 @@ cond_syscall(sys_socketpair); | |||
| 31 | cond_syscall(sys_bind); | 31 | cond_syscall(sys_bind); |
| 32 | cond_syscall(sys_listen); | 32 | cond_syscall(sys_listen); |
| 33 | cond_syscall(sys_accept); | 33 | cond_syscall(sys_accept); |
| 34 | cond_syscall(sys_paccept); | 34 | cond_syscall(sys_accept4); |
| 35 | cond_syscall(sys_connect); | 35 | cond_syscall(sys_connect); |
| 36 | cond_syscall(sys_getsockname); | 36 | cond_syscall(sys_getsockname); |
| 37 | cond_syscall(sys_getpeername); | 37 | cond_syscall(sys_getpeername); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index e60205722d0c..78db083390f0 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -326,96 +326,89 @@ ftrace_record_ip(unsigned long ip) | |||
| 326 | 326 | ||
| 327 | static int | 327 | static int |
| 328 | __ftrace_replace_code(struct dyn_ftrace *rec, | 328 | __ftrace_replace_code(struct dyn_ftrace *rec, |
| 329 | unsigned char *old, unsigned char *new, int enable) | 329 | unsigned char *nop, int enable) |
| 330 | { | 330 | { |
| 331 | unsigned long ip, fl; | 331 | unsigned long ip, fl; |
| 332 | unsigned char *call, *old, *new; | ||
| 332 | 333 | ||
| 333 | ip = rec->ip; | 334 | ip = rec->ip; |
| 334 | 335 | ||
| 335 | if (ftrace_filtered && enable) { | 336 | /* |
| 337 | * If this record is not to be traced and | ||
| 338 | * it is not enabled then do nothing. | ||
| 339 | * | ||
| 340 | * If this record is not to be traced and | ||
| 341 | * it is enabled then disabled it. | ||
| 342 | * | ||
| 343 | */ | ||
| 344 | if (rec->flags & FTRACE_FL_NOTRACE) { | ||
| 345 | if (rec->flags & FTRACE_FL_ENABLED) | ||
| 346 | rec->flags &= ~FTRACE_FL_ENABLED; | ||
| 347 | else | ||
| 348 | return 0; | ||
| 349 | |||
| 350 | } else if (ftrace_filtered && enable) { | ||
| 336 | /* | 351 | /* |
| 337 | * If filtering is on: | 352 | * Filtering is on: |
| 338 | * | ||
| 339 | * If this record is set to be filtered and | ||
| 340 | * is enabled then do nothing. | ||
| 341 | * | ||
| 342 | * If this record is set to be filtered and | ||
| 343 | * it is not enabled, enable it. | ||
| 344 | * | ||
| 345 | * If this record is not set to be filtered | ||
| 346 | * and it is not enabled do nothing. | ||
| 347 | * | ||
| 348 | * If this record is set not to trace then | ||
| 349 | * do nothing. | ||
| 350 | * | ||
| 351 | * If this record is set not to trace and | ||
| 352 | * it is enabled then disable it. | ||
| 353 | * | ||
| 354 | * If this record is not set to be filtered and | ||
| 355 | * it is enabled, disable it. | ||
| 356 | */ | 353 | */ |
| 357 | 354 | ||
| 358 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE | | 355 | fl = rec->flags & (FTRACE_FL_FILTER | FTRACE_FL_ENABLED); |
| 359 | FTRACE_FL_ENABLED); | ||
| 360 | 356 | ||
| 361 | if ((fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) || | 357 | /* Record is filtered and enabled, do nothing */ |
| 362 | (fl == (FTRACE_FL_FILTER | FTRACE_FL_NOTRACE)) || | 358 | if (fl == (FTRACE_FL_FILTER | FTRACE_FL_ENABLED)) |
| 363 | !fl || (fl == FTRACE_FL_NOTRACE)) | ||
| 364 | return 0; | 359 | return 0; |
| 365 | 360 | ||
| 366 | /* | 361 | /* Record is not filtered and is not enabled do nothing */ |
| 367 | * If it is enabled disable it, | 362 | if (!fl) |
| 368 | * otherwise enable it! | 363 | return 0; |
| 369 | */ | 364 | |
| 370 | if (fl & FTRACE_FL_ENABLED) { | 365 | /* Record is not filtered but enabled, disable it */ |
| 371 | /* swap new and old */ | 366 | if (fl == FTRACE_FL_ENABLED) |
| 372 | new = old; | ||
| 373 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 374 | rec->flags &= ~FTRACE_FL_ENABLED; | 367 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 375 | } else { | 368 | else |
| 376 | new = ftrace_call_replace(ip, FTRACE_ADDR); | 369 | /* Otherwise record is filtered but not enabled, enable it */ |
| 377 | rec->flags |= FTRACE_FL_ENABLED; | 370 | rec->flags |= FTRACE_FL_ENABLED; |
| 378 | } | ||
| 379 | } else { | 371 | } else { |
| 372 | /* Disable or not filtered */ | ||
| 380 | 373 | ||
| 381 | if (enable) { | 374 | if (enable) { |
| 382 | /* | 375 | /* if record is enabled, do nothing */ |
| 383 | * If this record is set not to trace and is | ||
| 384 | * not enabled, do nothing. | ||
| 385 | */ | ||
| 386 | fl = rec->flags & (FTRACE_FL_NOTRACE | FTRACE_FL_ENABLED); | ||
| 387 | if (fl == FTRACE_FL_NOTRACE) | ||
| 388 | return 0; | ||
| 389 | |||
| 390 | new = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 391 | } else | ||
| 392 | old = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 393 | |||
| 394 | if (enable) { | ||
| 395 | if (rec->flags & FTRACE_FL_ENABLED) | 376 | if (rec->flags & FTRACE_FL_ENABLED) |
| 396 | return 0; | 377 | return 0; |
| 378 | |||
| 397 | rec->flags |= FTRACE_FL_ENABLED; | 379 | rec->flags |= FTRACE_FL_ENABLED; |
| 380 | |||
| 398 | } else { | 381 | } else { |
| 382 | |||
| 383 | /* if record is not enabled do nothing */ | ||
| 399 | if (!(rec->flags & FTRACE_FL_ENABLED)) | 384 | if (!(rec->flags & FTRACE_FL_ENABLED)) |
| 400 | return 0; | 385 | return 0; |
| 386 | |||
| 401 | rec->flags &= ~FTRACE_FL_ENABLED; | 387 | rec->flags &= ~FTRACE_FL_ENABLED; |
| 402 | } | 388 | } |
| 403 | } | 389 | } |
| 404 | 390 | ||
| 391 | call = ftrace_call_replace(ip, FTRACE_ADDR); | ||
| 392 | |||
| 393 | if (rec->flags & FTRACE_FL_ENABLED) { | ||
| 394 | old = nop; | ||
| 395 | new = call; | ||
| 396 | } else { | ||
| 397 | old = call; | ||
| 398 | new = nop; | ||
| 399 | } | ||
| 400 | |||
| 405 | return ftrace_modify_code(ip, old, new); | 401 | return ftrace_modify_code(ip, old, new); |
| 406 | } | 402 | } |
| 407 | 403 | ||
| 408 | static void ftrace_replace_code(int enable) | 404 | static void ftrace_replace_code(int enable) |
| 409 | { | 405 | { |
| 410 | int i, failed; | 406 | int i, failed; |
| 411 | unsigned char *new = NULL, *old = NULL; | 407 | unsigned char *nop = NULL; |
| 412 | struct dyn_ftrace *rec; | 408 | struct dyn_ftrace *rec; |
| 413 | struct ftrace_page *pg; | 409 | struct ftrace_page *pg; |
| 414 | 410 | ||
| 415 | if (enable) | 411 | nop = ftrace_nop_replace(); |
| 416 | old = ftrace_nop_replace(); | ||
| 417 | else | ||
| 418 | new = ftrace_nop_replace(); | ||
| 419 | 412 | ||
| 420 | for (pg = ftrace_pages_start; pg; pg = pg->next) { | 413 | for (pg = ftrace_pages_start; pg; pg = pg->next) { |
| 421 | for (i = 0; i < pg->index; i++) { | 414 | for (i = 0; i < pg->index; i++) { |
| @@ -433,7 +426,7 @@ static void ftrace_replace_code(int enable) | |||
| 433 | unfreeze_record(rec); | 426 | unfreeze_record(rec); |
| 434 | } | 427 | } |
| 435 | 428 | ||
| 436 | failed = __ftrace_replace_code(rec, old, new, enable); | 429 | failed = __ftrace_replace_code(rec, nop, enable); |
| 437 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { | 430 | if (failed && (rec->flags & FTRACE_FL_CONVERTED)) { |
| 438 | rec->flags |= FTRACE_FL_FAILED; | 431 | rec->flags |= FTRACE_FL_FAILED; |
| 439 | if ((system_state == SYSTEM_BOOTING) || | 432 | if ((system_state == SYSTEM_BOOTING) || |
| @@ -534,8 +527,7 @@ static void ftrace_startup(void) | |||
| 534 | 527 | ||
| 535 | mutex_lock(&ftrace_start_lock); | 528 | mutex_lock(&ftrace_start_lock); |
| 536 | ftrace_start++; | 529 | ftrace_start++; |
| 537 | if (ftrace_start == 1) | 530 | command |= FTRACE_ENABLE_CALLS; |
| 538 | command |= FTRACE_ENABLE_CALLS; | ||
| 539 | 531 | ||
| 540 | if (saved_ftrace_func != ftrace_trace_function) { | 532 | if (saved_ftrace_func != ftrace_trace_function) { |
| 541 | saved_ftrace_func = ftrace_trace_function; | 533 | saved_ftrace_func = ftrace_trace_function; |
| @@ -734,6 +726,9 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 734 | ((iter->flags & FTRACE_ITER_FAILURES) && | 726 | ((iter->flags & FTRACE_ITER_FAILURES) && |
| 735 | !(rec->flags & FTRACE_FL_FAILED)) || | 727 | !(rec->flags & FTRACE_FL_FAILED)) || |
| 736 | 728 | ||
| 729 | ((iter->flags & FTRACE_ITER_FILTER) && | ||
| 730 | !(rec->flags & FTRACE_FL_FILTER)) || | ||
| 731 | |||
| 737 | ((iter->flags & FTRACE_ITER_NOTRACE) && | 732 | ((iter->flags & FTRACE_ITER_NOTRACE) && |
| 738 | !(rec->flags & FTRACE_FL_NOTRACE))) { | 733 | !(rec->flags & FTRACE_FL_NOTRACE))) { |
| 739 | rec = NULL; | 734 | rec = NULL; |
| @@ -1186,7 +1181,7 @@ ftrace_regex_release(struct inode *inode, struct file *file, int enable) | |||
| 1186 | 1181 | ||
| 1187 | mutex_lock(&ftrace_sysctl_lock); | 1182 | mutex_lock(&ftrace_sysctl_lock); |
| 1188 | mutex_lock(&ftrace_start_lock); | 1183 | mutex_lock(&ftrace_start_lock); |
| 1189 | if (iter->filtered && ftrace_start && ftrace_enabled) | 1184 | if (ftrace_start && ftrace_enabled) |
| 1190 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); | 1185 | ftrace_run_update_code(FTRACE_ENABLE_CALLS); |
| 1191 | mutex_unlock(&ftrace_start_lock); | 1186 | mutex_unlock(&ftrace_start_lock); |
| 1192 | mutex_unlock(&ftrace_sysctl_lock); | 1187 | mutex_unlock(&ftrace_sysctl_lock); |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 036456cbb4f7..f780e9552f91 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -617,6 +617,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
| 617 | list_del_init(&page->list); | 617 | list_del_init(&page->list); |
| 618 | free_buffer_page(page); | 618 | free_buffer_page(page); |
| 619 | } | 619 | } |
| 620 | mutex_unlock(&buffer->mutex); | ||
| 620 | return -ENOMEM; | 621 | return -ENOMEM; |
| 621 | } | 622 | } |
| 622 | 623 | ||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 697eda36b86a..d86e3252f300 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -1936,6 +1936,7 @@ __tracing_open(struct inode *inode, struct file *file, int *ret) | |||
| 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); | 1936 | ring_buffer_read_finish(iter->buffer_iter[cpu]); |
| 1937 | } | 1937 | } |
| 1938 | mutex_unlock(&trace_types_lock); | 1938 | mutex_unlock(&trace_types_lock); |
| 1939 | kfree(iter); | ||
| 1939 | 1940 | ||
| 1940 | return ERR_PTR(-ENOMEM); | 1941 | return ERR_PTR(-ENOMEM); |
| 1941 | } | 1942 | } |
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 8d2688ff1352..b7b449dafbe5 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
| @@ -395,7 +395,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) | |||
| 395 | WARN_ON(!irqs_disabled()); | 395 | WARN_ON(!irqs_disabled()); |
| 396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); | 396 | kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ); |
| 397 | } else | 397 | } else |
| 398 | kunmap(miter->addr); | 398 | kunmap(miter->page); |
| 399 | 399 | ||
| 400 | miter->page = NULL; | 400 | miter->page = NULL; |
| 401 | miter->addr = NULL; | 401 | miter->addr = NULL; |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 6837a1014372..b5b2b15085a8 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/highmem.h> | 22 | #include <linux/highmem.h> |
| 23 | #include <linux/vmalloc.h> | 23 | #include <linux/vmalloc.h> |
| 24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
| 25 | #include <linux/cpuset.h> | ||
| 26 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 27 | #include <linux/migrate.h> | 26 | #include <linux/migrate.h> |
| 28 | #include <linux/page-isolation.h> | 27 | #include <linux/page-isolation.h> |
| @@ -498,8 +497,6 @@ int add_memory(int nid, u64 start, u64 size) | |||
| 498 | /* we online node here. we can't roll back from here. */ | 497 | /* we online node here. we can't roll back from here. */ |
| 499 | node_set_online(nid); | 498 | node_set_online(nid); |
| 500 | 499 | ||
| 501 | cpuset_track_online_nodes(); | ||
| 502 | |||
| 503 | if (new_pgdat) { | 500 | if (new_pgdat) { |
| 504 | ret = register_one_node(nid); | 501 | ret = register_one_node(nid); |
| 505 | /* | 502 | /* |
diff --git a/mm/migrate.c b/mm/migrate.c index 385db89f0c33..1e0d6b237f44 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -522,15 +522,12 @@ static int writeout(struct address_space *mapping, struct page *page) | |||
| 522 | remove_migration_ptes(page, page); | 522 | remove_migration_ptes(page, page); |
| 523 | 523 | ||
| 524 | rc = mapping->a_ops->writepage(page, &wbc); | 524 | rc = mapping->a_ops->writepage(page, &wbc); |
| 525 | if (rc < 0) | ||
| 526 | /* I/O Error writing */ | ||
| 527 | return -EIO; | ||
| 528 | 525 | ||
| 529 | if (rc != AOP_WRITEPAGE_ACTIVATE) | 526 | if (rc != AOP_WRITEPAGE_ACTIVATE) |
| 530 | /* unlocked. Relock */ | 527 | /* unlocked. Relock */ |
| 531 | lock_page(page); | 528 | lock_page(page); |
| 532 | 529 | ||
| 533 | return -EAGAIN; | 530 | return (rc < 0) ? -EIO : -EAGAIN; |
| 534 | } | 531 | } |
| 535 | 532 | ||
| 536 | /* | 533 | /* |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index ba6b0f5f7fac..30f826d484f0 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
| @@ -324,14 +324,14 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, | |||
| 324 | 324 | ||
| 325 | BUG_ON(size & ~PAGE_MASK); | 325 | BUG_ON(size & ~PAGE_MASK); |
| 326 | 326 | ||
| 327 | addr = ALIGN(vstart, align); | ||
| 328 | |||
| 329 | va = kmalloc_node(sizeof(struct vmap_area), | 327 | va = kmalloc_node(sizeof(struct vmap_area), |
| 330 | gfp_mask & GFP_RECLAIM_MASK, node); | 328 | gfp_mask & GFP_RECLAIM_MASK, node); |
| 331 | if (unlikely(!va)) | 329 | if (unlikely(!va)) |
| 332 | return ERR_PTR(-ENOMEM); | 330 | return ERR_PTR(-ENOMEM); |
| 333 | 331 | ||
| 334 | retry: | 332 | retry: |
| 333 | addr = ALIGN(vstart, align); | ||
| 334 | |||
| 335 | spin_lock(&vmap_area_lock); | 335 | spin_lock(&vmap_area_lock); |
| 336 | /* XXX: could have a last_hole cache */ | 336 | /* XXX: could have a last_hole cache */ |
| 337 | n = vmap_area_root.rb_node; | 337 | n = vmap_area_root.rb_node; |
| @@ -362,7 +362,7 @@ retry: | |||
| 362 | goto found; | 362 | goto found; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | while (addr + size >= first->va_start && addr + size <= vend) { | 365 | while (addr + size > first->va_start && addr + size <= vend) { |
| 366 | addr = ALIGN(first->va_end + PAGE_SIZE, align); | 366 | addr = ALIGN(first->va_end + PAGE_SIZE, align); |
| 367 | 367 | ||
| 368 | n = rb_next(&first->rb_node); | 368 | n = rb_next(&first->rb_node); |
| @@ -522,13 +522,24 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end, | |||
| 522 | } | 522 | } |
| 523 | 523 | ||
| 524 | /* | 524 | /* |
| 525 | * Kick off a purge of the outstanding lazy areas. Don't bother if somebody | ||
| 526 | * is already purging. | ||
| 527 | */ | ||
| 528 | static void try_purge_vmap_area_lazy(void) | ||
| 529 | { | ||
| 530 | unsigned long start = ULONG_MAX, end = 0; | ||
| 531 | |||
| 532 | __purge_vmap_area_lazy(&start, &end, 0, 0); | ||
| 533 | } | ||
| 534 | |||
| 535 | /* | ||
| 525 | * Kick off a purge of the outstanding lazy areas. | 536 | * Kick off a purge of the outstanding lazy areas. |
| 526 | */ | 537 | */ |
| 527 | static void purge_vmap_area_lazy(void) | 538 | static void purge_vmap_area_lazy(void) |
| 528 | { | 539 | { |
| 529 | unsigned long start = ULONG_MAX, end = 0; | 540 | unsigned long start = ULONG_MAX, end = 0; |
| 530 | 541 | ||
| 531 | __purge_vmap_area_lazy(&start, &end, 0, 0); | 542 | __purge_vmap_area_lazy(&start, &end, 1, 0); |
| 532 | } | 543 | } |
| 533 | 544 | ||
| 534 | /* | 545 | /* |
| @@ -539,7 +550,7 @@ static void free_unmap_vmap_area(struct vmap_area *va) | |||
| 539 | va->flags |= VM_LAZY_FREE; | 550 | va->flags |= VM_LAZY_FREE; |
| 540 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); | 551 | atomic_add((va->va_end - va->va_start) >> PAGE_SHIFT, &vmap_lazy_nr); |
| 541 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) | 552 | if (unlikely(atomic_read(&vmap_lazy_nr) > lazy_max_pages())) |
| 542 | purge_vmap_area_lazy(); | 553 | try_purge_vmap_area_lazy(); |
| 543 | } | 554 | } |
| 544 | 555 | ||
| 545 | static struct vmap_area *find_vmap_area(unsigned long addr) | 556 | static struct vmap_area *find_vmap_area(unsigned long addr) |
diff --git a/mm/vmscan.c b/mm/vmscan.c index c141b3e78071..7ea1440b53db 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -623,6 +623,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
| 623 | * Try to allocate it some swap space here. | 623 | * Try to allocate it some swap space here. |
| 624 | */ | 624 | */ |
| 625 | if (PageAnon(page) && !PageSwapCache(page)) { | 625 | if (PageAnon(page) && !PageSwapCache(page)) { |
| 626 | if (!(sc->gfp_mask & __GFP_IO)) | ||
| 627 | goto keep_locked; | ||
| 626 | switch (try_to_munlock(page)) { | 628 | switch (try_to_munlock(page)) { |
| 627 | case SWAP_FAIL: /* shouldn't happen */ | 629 | case SWAP_FAIL: /* shouldn't happen */ |
| 628 | case SWAP_AGAIN: | 630 | case SWAP_AGAIN: |
| @@ -634,6 +636,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, | |||
| 634 | } | 636 | } |
| 635 | if (!add_to_swap(page, GFP_ATOMIC)) | 637 | if (!add_to_swap(page, GFP_ATOMIC)) |
| 636 | goto activate_locked; | 638 | goto activate_locked; |
| 639 | may_enter_fs = 1; | ||
| 637 | } | 640 | } |
| 638 | #endif /* CONFIG_SWAP */ | 641 | #endif /* CONFIG_SWAP */ |
| 639 | 642 | ||
| @@ -1386,9 +1389,9 @@ static void get_scan_ratio(struct zone *zone, struct scan_control *sc, | |||
| 1386 | file_prio = 200 - sc->swappiness; | 1389 | file_prio = 200 - sc->swappiness; |
| 1387 | 1390 | ||
| 1388 | /* | 1391 | /* |
| 1389 | * anon recent_rotated[0] | 1392 | * The amount of pressure on anon vs file pages is inversely |
| 1390 | * %anon = 100 * ----------- / ----------------- * IO cost | 1393 | * proportional to the fraction of recently scanned pages on |
| 1391 | * anon + file rotate_sum | 1394 | * each list that were recently referenced and in active use. |
| 1392 | */ | 1395 | */ |
| 1393 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); | 1396 | ap = (anon_prio + 1) * (zone->recent_scanned[0] + 1); |
| 1394 | ap /= zone->recent_rotated[0] + 1; | 1397 | ap /= zone->recent_rotated[0] + 1; |
diff --git a/net/compat.c b/net/compat.c index 6ce1a1cadcc0..a3a2ba0fac08 100644 --- a/net/compat.c +++ b/net/compat.c | |||
| @@ -725,7 +725,7 @@ EXPORT_SYMBOL(compat_mc_getsockopt); | |||
| 725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 725 | static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
| 726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 726 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
| 727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 727 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
| 728 | AL(6)}; | 728 | AL(4)}; |
| 729 | #undef AL | 729 | #undef AL |
| 730 | 730 | ||
| 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) | 731 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) |
| @@ -738,52 +738,13 @@ asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, uns | |||
| 738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 738 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); |
| 739 | } | 739 | } |
| 740 | 740 | ||
| 741 | asmlinkage long compat_sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 742 | int __user *upeer_addrlen, | ||
| 743 | const compat_sigset_t __user *sigmask, | ||
| 744 | compat_size_t sigsetsize, int flags) | ||
| 745 | { | ||
| 746 | compat_sigset_t ss32; | ||
| 747 | sigset_t ksigmask, sigsaved; | ||
| 748 | int ret; | ||
| 749 | |||
| 750 | if (sigmask) { | ||
| 751 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 752 | return -EINVAL; | ||
| 753 | if (copy_from_user(&ss32, sigmask, sizeof(ss32))) | ||
| 754 | return -EFAULT; | ||
| 755 | sigset_from_compat(&ksigmask, &ss32); | ||
| 756 | |||
| 757 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 758 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
| 759 | } | ||
| 760 | |||
| 761 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 762 | |||
| 763 | if (ret == -ERESTARTNOHAND) { | ||
| 764 | /* | ||
| 765 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
| 766 | * the signal on the way back to userspace, before the signal | ||
| 767 | * mask is restored. | ||
| 768 | */ | ||
| 769 | if (sigmask) { | ||
| 770 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
| 771 | sizeof(sigsaved)); | ||
| 772 | set_restore_sigmask(); | ||
| 773 | } | ||
| 774 | } else if (sigmask) | ||
| 775 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
| 776 | |||
| 777 | return ret; | ||
| 778 | } | ||
| 779 | |||
| 780 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | 741 | asmlinkage long compat_sys_socketcall(int call, u32 __user *args) |
| 781 | { | 742 | { |
| 782 | int ret; | 743 | int ret; |
| 783 | u32 a[6]; | 744 | u32 a[6]; |
| 784 | u32 a0, a1; | 745 | u32 a0, a1; |
| 785 | 746 | ||
| 786 | if (call < SYS_SOCKET || call > SYS_PACCEPT) | 747 | if (call < SYS_SOCKET || call > SYS_ACCEPT4) |
| 787 | return -EINVAL; | 748 | return -EINVAL; |
| 788 | if (copy_from_user(a, args, nas[call])) | 749 | if (copy_from_user(a, args, nas[call])) |
| 789 | return -EFAULT; | 750 | return -EFAULT; |
| @@ -804,7 +765,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 804 | ret = sys_listen(a0, a1); | 765 | ret = sys_listen(a0, a1); |
| 805 | break; | 766 | break; |
| 806 | case SYS_ACCEPT: | 767 | case SYS_ACCEPT: |
| 807 | ret = do_accept(a0, compat_ptr(a1), compat_ptr(a[2]), 0); | 768 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0); |
| 808 | break; | 769 | break; |
| 809 | case SYS_GETSOCKNAME: | 770 | case SYS_GETSOCKNAME: |
| 810 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); | 771 | ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2])); |
| @@ -844,9 +805,8 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args) | |||
| 844 | case SYS_RECVMSG: | 805 | case SYS_RECVMSG: |
| 845 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); | 806 | ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]); |
| 846 | break; | 807 | break; |
| 847 | case SYS_PACCEPT: | 808 | case SYS_ACCEPT4: |
| 848 | ret = compat_sys_paccept(a0, compat_ptr(a1), compat_ptr(a[2]), | 809 | ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]); |
| 849 | compat_ptr(a[3]), a[4], a[5]); | ||
| 850 | break; | 810 | break; |
| 851 | default: | 811 | default: |
| 852 | ret = -EINVAL; | 812 | ret = -EINVAL; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index a47f5bad110d..8997e912aaaf 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -1973,13 +1973,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 1973 | 1973 | ||
| 1974 | /* make sure that we don't pick a non-existing transmit queue */ | 1974 | /* make sure that we don't pick a non-existing transmit queue */ |
| 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; | 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; |
| 1976 | if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) { | 1976 | |
| 1977 | printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU " | ||
| 1978 | "disabled because CPU count (%d) exceeds number " | ||
| 1979 | "of tx queues (%d) on %s\n", num_online_cpus(), ntxq, | ||
| 1980 | pkt_dev->odev->name); | ||
| 1981 | pkt_dev->flags &= ~F_QUEUE_MAP_CPU; | ||
| 1982 | } | ||
| 1983 | if (ntxq <= pkt_dev->queue_map_min) { | 1977 | if (ntxq <= pkt_dev->queue_map_min) { |
| 1984 | printk(KERN_WARNING "pktgen: WARNING: Requested " | 1978 | printk(KERN_WARNING "pktgen: WARNING: Requested " |
| 1985 | "queue_map_min (zero-based) (%d) exceeds valid range " | 1979 | "queue_map_min (zero-based) (%d) exceeds valid range " |
| @@ -2202,6 +2196,7 @@ static void set_cur_queue_map(struct pktgen_dev *pkt_dev) | |||
| 2202 | } | 2196 | } |
| 2203 | pkt_dev->cur_queue_map = t; | 2197 | pkt_dev->cur_queue_map = t; |
| 2204 | } | 2198 | } |
| 2199 | pkt_dev->cur_queue_map = pkt_dev->cur_queue_map % pkt_dev->odev->real_num_tx_queues; | ||
| 2205 | } | 2200 | } |
| 2206 | 2201 | ||
| 2207 | /* Increment/randomize headers according to flags and current values | 2202 | /* Increment/randomize headers according to flags and current values |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 1fbff5fa4241..1aa2dc9e380e 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
| @@ -1117,6 +1117,7 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
| 1117 | }, | 1117 | }, |
| 1118 | }, | 1118 | }, |
| 1119 | .proto = sk->sk_protocol, | 1119 | .proto = sk->sk_protocol, |
| 1120 | .flags = inet_sk_flowi_flags(sk), | ||
| 1120 | .uli_u = { | 1121 | .uli_u = { |
| 1121 | .ports = { | 1122 | .ports = { |
| 1122 | .sport = inet->sport, | 1123 | .sport = inet->sport, |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index b42e082cc170..25924b1eb2ef 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -1945,13 +1945,14 @@ int __init ip_mr_init(void) | |||
| 1945 | goto proc_cache_fail; | 1945 | goto proc_cache_fail; |
| 1946 | #endif | 1946 | #endif |
| 1947 | return 0; | 1947 | return 0; |
| 1948 | reg_notif_fail: | ||
| 1949 | kmem_cache_destroy(mrt_cachep); | ||
| 1950 | #ifdef CONFIG_PROC_FS | 1948 | #ifdef CONFIG_PROC_FS |
| 1951 | proc_vif_fail: | ||
| 1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
| 1953 | proc_cache_fail: | 1949 | proc_cache_fail: |
| 1954 | proc_net_remove(&init_net, "ip_mr_vif"); | 1950 | proc_net_remove(&init_net, "ip_mr_vif"); |
| 1951 | proc_vif_fail: | ||
| 1952 | unregister_netdevice_notifier(&ip_mr_notifier); | ||
| 1955 | #endif | 1953 | #endif |
| 1954 | reg_notif_fail: | ||
| 1955 | del_timer(&ipmr_expire_timer); | ||
| 1956 | kmem_cache_destroy(mrt_cachep); | ||
| 1956 | return err; | 1957 | return err; |
| 1957 | } | 1958 | } |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index cf02701ced48..98c1fd09be88 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -633,6 +633,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 633 | .saddr = saddr, | 633 | .saddr = saddr, |
| 634 | .tos = tos } }, | 634 | .tos = tos } }, |
| 635 | .proto = sk->sk_protocol, | 635 | .proto = sk->sk_protocol, |
| 636 | .flags = inet_sk_flowi_flags(sk), | ||
| 636 | .uli_u = { .ports = | 637 | .uli_u = { .ports = |
| 637 | { .sport = inet->sport, | 638 | { .sport = inet->sport, |
| 638 | .dport = dport } } }; | 639 | .dport = dport } } }; |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 52a7eb0e2c2c..0524769632e7 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -224,7 +224,7 @@ static struct file_operations ip6mr_vif_fops = { | |||
| 224 | .open = ip6mr_vif_open, | 224 | .open = ip6mr_vif_open, |
| 225 | .read = seq_read, | 225 | .read = seq_read, |
| 226 | .llseek = seq_lseek, | 226 | .llseek = seq_lseek, |
| 227 | .release = seq_release, | 227 | .release = seq_release_private, |
| 228 | }; | 228 | }; |
| 229 | 229 | ||
| 230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) | 230 | static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos) |
| @@ -338,7 +338,7 @@ static struct file_operations ip6mr_mfc_fops = { | |||
| 338 | .open = ipmr_mfc_open, | 338 | .open = ipmr_mfc_open, |
| 339 | .read = seq_read, | 339 | .read = seq_read, |
| 340 | .llseek = seq_lseek, | 340 | .llseek = seq_lseek, |
| 341 | .release = seq_release, | 341 | .release = seq_release_private, |
| 342 | }; | 342 | }; |
| 343 | #endif | 343 | #endif |
| 344 | 344 | ||
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 07f0b76e7427..97c17fdd6f75 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
| @@ -132,7 +132,7 @@ static struct snmp_mib snmp6_udplite6_list[] = { | |||
| 132 | 132 | ||
| 133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | 133 | static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) |
| 134 | { | 134 | { |
| 135 | static char name[32]; | 135 | char name[32]; |
| 136 | int i; | 136 | int i; |
| 137 | 137 | ||
| 138 | /* print by name -- deprecated items */ | 138 | /* print by name -- deprecated items */ |
| @@ -144,7 +144,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
| 144 | p = icmp6type2name[icmptype]; | 144 | p = icmp6type2name[icmptype]; |
| 145 | if (!p) /* don't print un-named types here */ | 145 | if (!p) /* don't print un-named types here */ |
| 146 | continue; | 146 | continue; |
| 147 | (void) snprintf(name, sizeof(name)-1, "Icmp6%s%s", | 147 | snprintf(name, sizeof(name), "Icmp6%s%s", |
| 148 | i & 0x100 ? "Out" : "In", p); | 148 | i & 0x100 ? "Out" : "In", p); |
| 149 | seq_printf(seq, "%-32s\t%lu\n", name, | 149 | seq_printf(seq, "%-32s\t%lu\n", name, |
| 150 | snmp_fold_field(mib, i)); | 150 | snmp_fold_field(mib, i)); |
| @@ -157,7 +157,7 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void **mib) | |||
| 157 | val = snmp_fold_field(mib, i); | 157 | val = snmp_fold_field(mib, i); |
| 158 | if (!val) | 158 | if (!val) |
| 159 | continue; | 159 | continue; |
| 160 | (void) snprintf(name, sizeof(name)-1, "Icmp6%sType%u", | 160 | snprintf(name, sizeof(name), "Icmp6%sType%u", |
| 161 | i & 0x100 ? "Out" : "In", i & 0xff); | 161 | i & 0x100 ? "Out" : "In", i & 0xff); |
| 162 | seq_printf(seq, "%-32s\t%lu\n", name, val); | 162 | seq_printf(seq, "%-32s\t%lu\n", name, val); |
| 163 | } | 163 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 14d165f0df75..409bb7716236 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) | |||
| 2560 | ieee80211_restart_sta_timer(sdata); | 2560 | ieee80211_restart_sta_timer(sdata); |
| 2561 | rcu_read_unlock(); | 2561 | rcu_read_unlock(); |
| 2562 | } | 2562 | } |
| 2563 | |||
| 2564 | /* driver notification call */ | ||
| 2565 | void ieee80211_notify_mac(struct ieee80211_hw *hw, | ||
| 2566 | enum ieee80211_notification_types notif_type) | ||
| 2567 | { | ||
| 2568 | struct ieee80211_local *local = hw_to_local(hw); | ||
| 2569 | struct ieee80211_sub_if_data *sdata; | ||
| 2570 | |||
| 2571 | switch (notif_type) { | ||
| 2572 | case IEEE80211_NOTIFY_RE_ASSOC: | ||
| 2573 | rtnl_lock(); | ||
| 2574 | list_for_each_entry(sdata, &local->interfaces, list) { | ||
| 2575 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
| 2576 | continue; | ||
| 2577 | |||
| 2578 | ieee80211_sta_req_auth(sdata, &sdata->u.sta); | ||
| 2579 | } | ||
| 2580 | rtnl_unlock(); | ||
| 2581 | break; | ||
| 2582 | } | ||
| 2583 | } | ||
| 2584 | EXPORT_SYMBOL(ieee80211_notify_mac); | ||
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index 7ab30f668b5a..9d211f12582b 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
| @@ -33,9 +33,30 @@ | |||
| 33 | #include <net/phonet/phonet.h> | 33 | #include <net/phonet/phonet.h> |
| 34 | #include <net/phonet/pn_dev.h> | 34 | #include <net/phonet/pn_dev.h> |
| 35 | 35 | ||
| 36 | static struct net_proto_family phonet_proto_family; | 36 | /* Transport protocol registration */ |
| 37 | static struct phonet_protocol *phonet_proto_get(int protocol); | 37 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; |
| 38 | static inline void phonet_proto_put(struct phonet_protocol *pp); | 38 | static DEFINE_SPINLOCK(proto_tab_lock); |
| 39 | |||
| 40 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
| 41 | { | ||
| 42 | struct phonet_protocol *pp; | ||
| 43 | |||
| 44 | if (protocol >= PHONET_NPROTO) | ||
| 45 | return NULL; | ||
| 46 | |||
| 47 | spin_lock(&proto_tab_lock); | ||
| 48 | pp = proto_tab[protocol]; | ||
| 49 | if (pp && !try_module_get(pp->prot->owner)) | ||
| 50 | pp = NULL; | ||
| 51 | spin_unlock(&proto_tab_lock); | ||
| 52 | |||
| 53 | return pp; | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
| 57 | { | ||
| 58 | module_put(pp->prot->owner); | ||
| 59 | } | ||
| 39 | 60 | ||
| 40 | /* protocol family functions */ | 61 | /* protocol family functions */ |
| 41 | 62 | ||
| @@ -375,10 +396,6 @@ static struct packet_type phonet_packet_type = { | |||
| 375 | .func = phonet_rcv, | 396 | .func = phonet_rcv, |
| 376 | }; | 397 | }; |
| 377 | 398 | ||
| 378 | /* Transport protocol registration */ | ||
| 379 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; | ||
| 380 | static DEFINE_SPINLOCK(proto_tab_lock); | ||
| 381 | |||
| 382 | int __init_or_module phonet_proto_register(int protocol, | 399 | int __init_or_module phonet_proto_register(int protocol, |
| 383 | struct phonet_protocol *pp) | 400 | struct phonet_protocol *pp) |
| 384 | { | 401 | { |
| @@ -412,27 +429,6 @@ void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) | |||
| 412 | } | 429 | } |
| 413 | EXPORT_SYMBOL(phonet_proto_unregister); | 430 | EXPORT_SYMBOL(phonet_proto_unregister); |
| 414 | 431 | ||
| 415 | static struct phonet_protocol *phonet_proto_get(int protocol) | ||
| 416 | { | ||
| 417 | struct phonet_protocol *pp; | ||
| 418 | |||
| 419 | if (protocol >= PHONET_NPROTO) | ||
| 420 | return NULL; | ||
| 421 | |||
| 422 | spin_lock(&proto_tab_lock); | ||
| 423 | pp = proto_tab[protocol]; | ||
| 424 | if (pp && !try_module_get(pp->prot->owner)) | ||
| 425 | pp = NULL; | ||
| 426 | spin_unlock(&proto_tab_lock); | ||
| 427 | |||
| 428 | return pp; | ||
| 429 | } | ||
| 430 | |||
| 431 | static inline void phonet_proto_put(struct phonet_protocol *pp) | ||
| 432 | { | ||
| 433 | module_put(pp->prot->owner); | ||
| 434 | } | ||
| 435 | |||
| 436 | /* Module registration */ | 432 | /* Module registration */ |
| 437 | static int __init phonet_init(void) | 433 | static int __init phonet_init(void) |
| 438 | { | 434 | { |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index b16ad2972c6b..6ab4a2f92ca0 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
| @@ -417,6 +417,8 @@ static int qdisc_dump_stab(struct sk_buff *skb, struct qdisc_size_table *stab) | |||
| 417 | struct nlattr *nest; | 417 | struct nlattr *nest; |
| 418 | 418 | ||
| 419 | nest = nla_nest_start(skb, TCA_STAB); | 419 | nest = nla_nest_start(skb, TCA_STAB); |
| 420 | if (nest == NULL) | ||
| 421 | goto nla_put_failure; | ||
| 420 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); | 422 | NLA_PUT(skb, TCA_STAB_BASE, sizeof(stab->szopts), &stab->szopts); |
| 421 | nla_nest_end(skb, nest); | 423 | nla_nest_end(skb, nest); |
| 422 | 424 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 93cd30ce6501..cdcd16fcfeda 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -270,6 +270,8 @@ static void dev_watchdog_down(struct net_device *dev) | |||
| 270 | void netif_carrier_on(struct net_device *dev) | 270 | void netif_carrier_on(struct net_device *dev) |
| 271 | { | 271 | { |
| 272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { | 272 | if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
| 273 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
| 274 | return; | ||
| 273 | linkwatch_fire_event(dev); | 275 | linkwatch_fire_event(dev); |
| 274 | if (netif_running(dev)) | 276 | if (netif_running(dev)) |
| 275 | __netdev_watchdog_up(dev); | 277 | __netdev_watchdog_up(dev); |
| @@ -285,8 +287,11 @@ EXPORT_SYMBOL(netif_carrier_on); | |||
| 285 | */ | 287 | */ |
| 286 | void netif_carrier_off(struct net_device *dev) | 288 | void netif_carrier_off(struct net_device *dev) |
| 287 | { | 289 | { |
| 288 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) | 290 | if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state)) { |
| 291 | if (dev->reg_state == NETREG_UNINITIALIZED) | ||
| 292 | return; | ||
| 289 | linkwatch_fire_event(dev); | 293 | linkwatch_fire_event(dev); |
| 294 | } | ||
| 290 | } | 295 | } |
| 291 | EXPORT_SYMBOL(netif_carrier_off); | 296 | EXPORT_SYMBOL(netif_carrier_off); |
| 292 | 297 | ||
diff --git a/net/socket.c b/net/socket.c index 57550c3bcabe..92764d836891 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -1426,8 +1426,8 @@ asmlinkage long sys_listen(int fd, int backlog) | |||
| 1426 | * clean when we restucture accept also. | 1426 | * clean when we restucture accept also. |
| 1427 | */ | 1427 | */ |
| 1428 | 1428 | ||
| 1429 | long do_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1429 | asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, |
| 1430 | int __user *upeer_addrlen, int flags) | 1430 | int __user *upeer_addrlen, int flags) |
| 1431 | { | 1431 | { |
| 1432 | struct socket *sock, *newsock; | 1432 | struct socket *sock, *newsock; |
| 1433 | struct file *newfile; | 1433 | struct file *newfile; |
| @@ -1510,66 +1510,10 @@ out_fd: | |||
| 1510 | goto out_put; | 1510 | goto out_put; |
| 1511 | } | 1511 | } |
| 1512 | 1512 | ||
| 1513 | #if 0 | ||
| 1514 | #ifdef HAVE_SET_RESTORE_SIGMASK | ||
| 1515 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 1516 | int __user *upeer_addrlen, | ||
| 1517 | const sigset_t __user *sigmask, | ||
| 1518 | size_t sigsetsize, int flags) | ||
| 1519 | { | ||
| 1520 | sigset_t ksigmask, sigsaved; | ||
| 1521 | int ret; | ||
| 1522 | |||
| 1523 | if (sigmask) { | ||
| 1524 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 1525 | if (sigsetsize != sizeof(sigset_t)) | ||
| 1526 | return -EINVAL; | ||
| 1527 | if (copy_from_user(&ksigmask, sigmask, sizeof(ksigmask))) | ||
| 1528 | return -EFAULT; | ||
| 1529 | |||
| 1530 | sigdelsetmask(&ksigmask, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 1531 | sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved); | ||
| 1532 | } | ||
| 1533 | |||
| 1534 | ret = do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 1535 | |||
| 1536 | if (ret < 0 && signal_pending(current)) { | ||
| 1537 | /* | ||
| 1538 | * Don't restore the signal mask yet. Let do_signal() deliver | ||
| 1539 | * the signal on the way back to userspace, before the signal | ||
| 1540 | * mask is restored. | ||
| 1541 | */ | ||
| 1542 | if (sigmask) { | ||
| 1543 | memcpy(¤t->saved_sigmask, &sigsaved, | ||
| 1544 | sizeof(sigsaved)); | ||
| 1545 | set_restore_sigmask(); | ||
| 1546 | } | ||
| 1547 | } else if (sigmask) | ||
| 1548 | sigprocmask(SIG_SETMASK, &sigsaved, NULL); | ||
| 1549 | |||
| 1550 | return ret; | ||
| 1551 | } | ||
| 1552 | #else | ||
| 1553 | asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr, | ||
| 1554 | int __user *upeer_addrlen, | ||
| 1555 | const sigset_t __user *sigmask, | ||
| 1556 | size_t sigsetsize, int flags) | ||
| 1557 | { | ||
| 1558 | /* The platform does not support restoring the signal mask in the | ||
| 1559 | * return path. So we do not allow using paccept() with a signal | ||
| 1560 | * mask. */ | ||
| 1561 | if (sigmask) | ||
| 1562 | return -EINVAL; | ||
| 1563 | |||
| 1564 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, flags); | ||
| 1565 | } | ||
| 1566 | #endif | ||
| 1567 | #endif | ||
| 1568 | |||
| 1569 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, | 1513 | asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, |
| 1570 | int __user *upeer_addrlen) | 1514 | int __user *upeer_addrlen) |
| 1571 | { | 1515 | { |
| 1572 | return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0); | 1516 | return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); |
| 1573 | } | 1517 | } |
| 1574 | 1518 | ||
| 1575 | /* | 1519 | /* |
| @@ -2096,7 +2040,7 @@ static const unsigned char nargs[19]={ | |||
| 2096 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 2040 | AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
| 2097 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), | 2041 | AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), |
| 2098 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), | 2042 | AL(6),AL(2),AL(5),AL(5),AL(3),AL(3), |
| 2099 | AL(6) | 2043 | AL(4) |
| 2100 | }; | 2044 | }; |
| 2101 | 2045 | ||
| 2102 | #undef AL | 2046 | #undef AL |
| @@ -2115,7 +2059,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2115 | unsigned long a0, a1; | 2059 | unsigned long a0, a1; |
| 2116 | int err; | 2060 | int err; |
| 2117 | 2061 | ||
| 2118 | if (call < 1 || call > SYS_PACCEPT) | 2062 | if (call < 1 || call > SYS_ACCEPT4) |
| 2119 | return -EINVAL; | 2063 | return -EINVAL; |
| 2120 | 2064 | ||
| 2121 | /* copy_from_user should be SMP safe. */ | 2065 | /* copy_from_user should be SMP safe. */ |
| @@ -2143,9 +2087,8 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2143 | err = sys_listen(a0, a1); | 2087 | err = sys_listen(a0, a1); |
| 2144 | break; | 2088 | break; |
| 2145 | case SYS_ACCEPT: | 2089 | case SYS_ACCEPT: |
| 2146 | err = | 2090 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
| 2147 | do_accept(a0, (struct sockaddr __user *)a1, | 2091 | (int __user *)a[2], 0); |
| 2148 | (int __user *)a[2], 0); | ||
| 2149 | break; | 2092 | break; |
| 2150 | case SYS_GETSOCKNAME: | 2093 | case SYS_GETSOCKNAME: |
| 2151 | err = | 2094 | err = |
| @@ -2192,12 +2135,9 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args) | |||
| 2192 | case SYS_RECVMSG: | 2135 | case SYS_RECVMSG: |
| 2193 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); | 2136 | err = sys_recvmsg(a0, (struct msghdr __user *)a1, a[2]); |
| 2194 | break; | 2137 | break; |
| 2195 | case SYS_PACCEPT: | 2138 | case SYS_ACCEPT4: |
| 2196 | err = | 2139 | err = sys_accept4(a0, (struct sockaddr __user *)a1, |
| 2197 | sys_paccept(a0, (struct sockaddr __user *)a1, | 2140 | (int __user *)a[2], a[3]); |
| 2198 | (int __user *)a[2], | ||
| 2199 | (const sigset_t __user *) a[3], | ||
| 2200 | a[4], a[5]); | ||
| 2201 | break; | 2141 | break; |
| 2202 | default: | 2142 | default: |
| 2203 | err = -EINVAL; | 2143 | err = -EINVAL; |
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index 744b79fdcb19..4028502f0528 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c | |||
| @@ -133,13 +133,29 @@ static int | |||
| 133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | 133 | generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) |
| 134 | { | 134 | { |
| 135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | 135 | struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); |
| 136 | int i; | ||
| 136 | 137 | ||
| 137 | if (gcred->acred.uid != acred->uid || | 138 | if (gcred->acred.uid != acred->uid || |
| 138 | gcred->acred.gid != acred->gid || | 139 | gcred->acred.gid != acred->gid || |
| 139 | gcred->acred.group_info != acred->group_info || | ||
| 140 | gcred->acred.machine_cred != acred->machine_cred) | 140 | gcred->acred.machine_cred != acred->machine_cred) |
| 141 | return 0; | 141 | goto out_nomatch; |
| 142 | |||
| 143 | /* Optimisation in the case where pointers are identical... */ | ||
| 144 | if (gcred->acred.group_info == acred->group_info) | ||
| 145 | goto out_match; | ||
| 146 | |||
| 147 | /* Slow path... */ | ||
| 148 | if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) | ||
| 149 | goto out_nomatch; | ||
| 150 | for (i = 0; i < gcred->acred.group_info->ngroups; i++) { | ||
| 151 | if (GROUP_AT(gcred->acred.group_info, i) != | ||
| 152 | GROUP_AT(acred->group_info, i)) | ||
| 153 | goto out_nomatch; | ||
| 154 | } | ||
| 155 | out_match: | ||
| 142 | return 1; | 156 | return 1; |
| 157 | out_nomatch: | ||
| 158 | return 0; | ||
| 143 | } | 159 | } |
| 144 | 160 | ||
| 145 | void __init rpc_init_generic_auth(void) | 161 | void __init rpc_init_generic_auth(void) |
