diff options
81 files changed, 383 insertions, 222 deletions
diff --git a/Documentation/device-mapper/snapshot.txt b/Documentation/device-mapper/snapshot.txt index 0d5bc46dc167..ad6949bff2e3 100644 --- a/Documentation/device-mapper/snapshot.txt +++ b/Documentation/device-mapper/snapshot.txt | |||
@@ -41,9 +41,13 @@ useless and be disabled, returning errors. So it is important to monitor | |||
41 | the amount of free space and expand the <COW device> before it fills up. | 41 | the amount of free space and expand the <COW device> before it fills up. |
42 | 42 | ||
43 | <persistent?> is P (Persistent) or N (Not persistent - will not survive | 43 | <persistent?> is P (Persistent) or N (Not persistent - will not survive |
44 | after reboot). | 44 | after reboot). O (Overflow) can be added as a persistent store option |
45 | The difference is that for transient snapshots less metadata must be | 45 | to allow userspace to advertise its support for seeing "Overflow" in the |
46 | saved on disk - they can be kept in memory by the kernel. | 46 | snapshot status. So supported store types are "P", "PO" and "N". |
47 | |||
48 | The difference between persistent and transient is with transient | ||
49 | snapshots less metadata must be saved on disk - they can be kept in | ||
50 | memory by the kernel. | ||
47 | 51 | ||
48 | 52 | ||
49 | * snapshot-merge <origin> <COW device> <persistent> <chunksize> | 53 | * snapshot-merge <origin> <COW device> <persistent> <chunksize> |
diff --git a/Documentation/devicetree/bindings/spi/sh-msiof.txt b/Documentation/devicetree/bindings/spi/sh-msiof.txt index 8f771441be60..705075da2f10 100644 --- a/Documentation/devicetree/bindings/spi/sh-msiof.txt +++ b/Documentation/devicetree/bindings/spi/sh-msiof.txt | |||
@@ -51,7 +51,7 @@ Optional properties, deprecated for soctype-specific bindings: | |||
51 | - renesas,tx-fifo-size : Overrides the default tx fifo size given in words | 51 | - renesas,tx-fifo-size : Overrides the default tx fifo size given in words |
52 | (default is 64) | 52 | (default is 64) |
53 | - renesas,rx-fifo-size : Overrides the default rx fifo size given in words | 53 | - renesas,rx-fifo-size : Overrides the default rx fifo size given in words |
54 | (default is 64, or 256 on R-Car Gen2) | 54 | (default is 64) |
55 | 55 | ||
56 | Pinctrl properties might be needed, too. See | 56 | Pinctrl properties might be needed, too. See |
57 | Documentation/devicetree/bindings/pinctrl/renesas,*. | 57 | Documentation/devicetree/bindings/pinctrl/renesas,*. |
diff --git a/arch/alpha/include/asm/word-at-a-time.h b/arch/alpha/include/asm/word-at-a-time.h index 6b340d0f1521..902e6ab00a06 100644 --- a/arch/alpha/include/asm/word-at-a-time.h +++ b/arch/alpha/include/asm/word-at-a-time.h | |||
@@ -52,4 +52,6 @@ static inline unsigned long find_zero(unsigned long bits) | |||
52 | #endif | 52 | #endif |
53 | } | 53 | } |
54 | 54 | ||
55 | #define zero_bytemask(mask) ((2ul << (find_zero(mask) * 8)) - 1) | ||
56 | |||
55 | #endif /* _ASM_WORD_AT_A_TIME_H */ | 57 | #endif /* _ASM_WORD_AT_A_TIME_H */ |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 233159d2eaab..bb8fa023d574 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
@@ -578,7 +578,7 @@ dtb-$(CONFIG_MACH_SUN4I) += \ | |||
578 | sun4i-a10-hackberry.dtb \ | 578 | sun4i-a10-hackberry.dtb \ |
579 | sun4i-a10-hyundai-a7hd.dtb \ | 579 | sun4i-a10-hyundai-a7hd.dtb \ |
580 | sun4i-a10-inet97fv2.dtb \ | 580 | sun4i-a10-inet97fv2.dtb \ |
581 | sun4i-a10-itead-iteaduino-plus.dts \ | 581 | sun4i-a10-itead-iteaduino-plus.dtb \ |
582 | sun4i-a10-jesurun-q5.dtb \ | 582 | sun4i-a10-jesurun-q5.dtb \ |
583 | sun4i-a10-marsboard.dtb \ | 583 | sun4i-a10-marsboard.dtb \ |
584 | sun4i-a10-mini-xplus.dtb \ | 584 | sun4i-a10-mini-xplus.dtb \ |
diff --git a/arch/arm/boot/dts/exynos4412.dtsi b/arch/arm/boot/dts/exynos4412.dtsi index ca0e3c15977f..294cfe40388d 100644 --- a/arch/arm/boot/dts/exynos4412.dtsi +++ b/arch/arm/boot/dts/exynos4412.dtsi | |||
@@ -98,6 +98,7 @@ | |||
98 | opp-hz = /bits/ 64 <800000000>; | 98 | opp-hz = /bits/ 64 <800000000>; |
99 | opp-microvolt = <1000000>; | 99 | opp-microvolt = <1000000>; |
100 | clock-latency-ns = <200000>; | 100 | clock-latency-ns = <200000>; |
101 | opp-suspend; | ||
101 | }; | 102 | }; |
102 | opp07 { | 103 | opp07 { |
103 | opp-hz = /bits/ 64 <900000000>; | 104 | opp-hz = /bits/ 64 <900000000>; |
diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts index 15aea760c1da..c625e71217aa 100644 --- a/arch/arm/boot/dts/exynos5250-smdk5250.dts +++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts | |||
@@ -197,6 +197,7 @@ | |||
197 | regulator-name = "P1.8V_LDO_OUT10"; | 197 | regulator-name = "P1.8V_LDO_OUT10"; |
198 | regulator-min-microvolt = <1800000>; | 198 | regulator-min-microvolt = <1800000>; |
199 | regulator-max-microvolt = <1800000>; | 199 | regulator-max-microvolt = <1800000>; |
200 | regulator-always-on; | ||
200 | }; | 201 | }; |
201 | 202 | ||
202 | ldo11_reg: LDO11 { | 203 | ldo11_reg: LDO11 { |
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index df9aee92ecf4..1b3d6c769a3c 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi | |||
@@ -1117,7 +1117,7 @@ | |||
1117 | interrupt-parent = <&combiner>; | 1117 | interrupt-parent = <&combiner>; |
1118 | interrupts = <3 0>; | 1118 | interrupts = <3 0>; |
1119 | clock-names = "sysmmu", "master"; | 1119 | clock-names = "sysmmu", "master"; |
1120 | clocks = <&clock CLK_SMMU_FIMD1M0>, <&clock CLK_FIMD1>; | 1120 | clocks = <&clock CLK_SMMU_FIMD1M1>, <&clock CLK_FIMD1>; |
1121 | power-domains = <&disp_pd>; | 1121 | power-domains = <&disp_pd>; |
1122 | #iommu-cells = <0>; | 1122 | #iommu-cells = <0>; |
1123 | }; | 1123 | }; |
diff --git a/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi b/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi index 79ffdfe712aa..3b43e57845ae 100644 --- a/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi +++ b/arch/arm/boot/dts/exynos5422-odroidxu3-common.dtsi | |||
@@ -472,7 +472,6 @@ | |||
472 | */ | 472 | */ |
473 | pinctrl-0 = <&pwm0_out &pwm1_out &pwm2_out &pwm3_out>; | 473 | pinctrl-0 = <&pwm0_out &pwm1_out &pwm2_out &pwm3_out>; |
474 | pinctrl-names = "default"; | 474 | pinctrl-names = "default"; |
475 | samsung,pwm-outputs = <0>; | ||
476 | status = "okay"; | 475 | status = "okay"; |
477 | }; | 476 | }; |
478 | 477 | ||
diff --git a/arch/arm/boot/dts/imx53-qsrb.dts b/arch/arm/boot/dts/imx53-qsrb.dts index 66e47de5e826..96d7eede412e 100644 --- a/arch/arm/boot/dts/imx53-qsrb.dts +++ b/arch/arm/boot/dts/imx53-qsrb.dts | |||
@@ -36,7 +36,7 @@ | |||
36 | pinctrl-0 = <&pinctrl_pmic>; | 36 | pinctrl-0 = <&pinctrl_pmic>; |
37 | reg = <0x08>; | 37 | reg = <0x08>; |
38 | interrupt-parent = <&gpio5>; | 38 | interrupt-parent = <&gpio5>; |
39 | interrupts = <23 0x8>; | 39 | interrupts = <23 IRQ_TYPE_LEVEL_HIGH>; |
40 | regulators { | 40 | regulators { |
41 | sw1_reg: sw1a { | 41 | sw1_reg: sw1a { |
42 | regulator-name = "SW1"; | 42 | regulator-name = "SW1"; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index c3e3ca9362fb..cd170376eaca 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <dt-bindings/clock/imx5-clock.h> | 15 | #include <dt-bindings/clock/imx5-clock.h> |
16 | #include <dt-bindings/gpio/gpio.h> | 16 | #include <dt-bindings/gpio/gpio.h> |
17 | #include <dt-bindings/input/input.h> | 17 | #include <dt-bindings/input/input.h> |
18 | #include <dt-bindings/interrupt-controller/irq.h> | ||
18 | 19 | ||
19 | / { | 20 | / { |
20 | aliases { | 21 | aliases { |
diff --git a/arch/arm/boot/dts/imx6qdl-rex.dtsi b/arch/arm/boot/dts/imx6qdl-rex.dtsi index 3373fd958e95..a50356243888 100644 --- a/arch/arm/boot/dts/imx6qdl-rex.dtsi +++ b/arch/arm/boot/dts/imx6qdl-rex.dtsi | |||
@@ -35,7 +35,6 @@ | |||
35 | compatible = "regulator-fixed"; | 35 | compatible = "regulator-fixed"; |
36 | reg = <1>; | 36 | reg = <1>; |
37 | pinctrl-names = "default"; | 37 | pinctrl-names = "default"; |
38 | pinctrl-0 = <&pinctrl_usbh1>; | ||
39 | regulator-name = "usbh1_vbus"; | 38 | regulator-name = "usbh1_vbus"; |
40 | regulator-min-microvolt = <5000000>; | 39 | regulator-min-microvolt = <5000000>; |
41 | regulator-max-microvolt = <5000000>; | 40 | regulator-max-microvolt = <5000000>; |
@@ -47,7 +46,6 @@ | |||
47 | compatible = "regulator-fixed"; | 46 | compatible = "regulator-fixed"; |
48 | reg = <2>; | 47 | reg = <2>; |
49 | pinctrl-names = "default"; | 48 | pinctrl-names = "default"; |
50 | pinctrl-0 = <&pinctrl_usbotg>; | ||
51 | regulator-name = "usb_otg_vbus"; | 49 | regulator-name = "usb_otg_vbus"; |
52 | regulator-min-microvolt = <5000000>; | 50 | regulator-min-microvolt = <5000000>; |
53 | regulator-max-microvolt = <5000000>; | 51 | regulator-max-microvolt = <5000000>; |
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi index a0b2a79cbfbd..4624d0f2a754 100644 --- a/arch/arm/boot/dts/r8a7790.dtsi +++ b/arch/arm/boot/dts/r8a7790.dtsi | |||
@@ -1627,6 +1627,7 @@ | |||
1627 | "mix.0", "mix.1", | 1627 | "mix.0", "mix.1", |
1628 | "dvc.0", "dvc.1", | 1628 | "dvc.0", "dvc.1", |
1629 | "clk_a", "clk_b", "clk_c", "clk_i"; | 1629 | "clk_a", "clk_b", "clk_c", "clk_i"; |
1630 | power-domains = <&cpg_clocks>; | ||
1630 | 1631 | ||
1631 | status = "disabled"; | 1632 | status = "disabled"; |
1632 | 1633 | ||
diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi index 831525dd39a6..1666c8a6b143 100644 --- a/arch/arm/boot/dts/r8a7791.dtsi +++ b/arch/arm/boot/dts/r8a7791.dtsi | |||
@@ -1677,6 +1677,7 @@ | |||
1677 | "mix.0", "mix.1", | 1677 | "mix.0", "mix.1", |
1678 | "dvc.0", "dvc.1", | 1678 | "dvc.0", "dvc.1", |
1679 | "clk_a", "clk_b", "clk_c", "clk_i"; | 1679 | "clk_a", "clk_b", "clk_c", "clk_i"; |
1680 | power-domains = <&cpg_clocks>; | ||
1680 | 1681 | ||
1681 | status = "disabled"; | 1682 | status = "disabled"; |
1682 | 1683 | ||
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index 2bebaa286f9a..391230c3dc93 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | |||
@@ -107,7 +107,7 @@ | |||
107 | 720000 1200000 | 107 | 720000 1200000 |
108 | 528000 1100000 | 108 | 528000 1100000 |
109 | 312000 1000000 | 109 | 312000 1000000 |
110 | 144000 900000 | 110 | 144000 1000000 |
111 | >; | 111 | >; |
112 | #cooling-cells = <2>; | 112 | #cooling-cells = <2>; |
113 | cooling-min-level = <0>; | 113 | cooling-min-level = <0>; |
diff --git a/arch/arm/mach-exynos/mcpm-exynos.c b/arch/arm/mach-exynos/mcpm-exynos.c index 9bdf54795f05..56978199c479 100644 --- a/arch/arm/mach-exynos/mcpm-exynos.c +++ b/arch/arm/mach-exynos/mcpm-exynos.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/cputype.h> | 20 | #include <asm/cputype.h> |
21 | #include <asm/cp15.h> | 21 | #include <asm/cp15.h> |
22 | #include <asm/mcpm.h> | 22 | #include <asm/mcpm.h> |
23 | #include <asm/smp_plat.h> | ||
23 | 24 | ||
24 | #include "regs-pmu.h" | 25 | #include "regs-pmu.h" |
25 | #include "common.h" | 26 | #include "common.h" |
@@ -70,7 +71,31 @@ static int exynos_cpu_powerup(unsigned int cpu, unsigned int cluster) | |||
70 | cluster >= EXYNOS5420_NR_CLUSTERS) | 71 | cluster >= EXYNOS5420_NR_CLUSTERS) |
71 | return -EINVAL; | 72 | return -EINVAL; |
72 | 73 | ||
73 | exynos_cpu_power_up(cpunr); | 74 | if (!exynos_cpu_power_state(cpunr)) { |
75 | exynos_cpu_power_up(cpunr); | ||
76 | |||
77 | /* | ||
78 | * This assumes the cluster number of the big cores(Cortex A15) | ||
79 | * is 0 and the Little cores(Cortex A7) is 1. | ||
80 | * When the system was booted from the Little core, | ||
81 | * they should be reset during power up cpu. | ||
82 | */ | ||
83 | if (cluster && | ||
84 | cluster == MPIDR_AFFINITY_LEVEL(cpu_logical_map(0), 1)) { | ||
85 | /* | ||
86 | * Before we reset the Little cores, we should wait | ||
87 | * the SPARE2 register is set to 1 because the init | ||
88 | * codes of the iROM will set the register after | ||
89 | * initialization. | ||
90 | */ | ||
91 | while (!pmu_raw_readl(S5P_PMU_SPARE2)) | ||
92 | udelay(10); | ||
93 | |||
94 | pmu_raw_writel(EXYNOS5420_KFC_CORE_RESET(cpu), | ||
95 | EXYNOS_SWRESET); | ||
96 | } | ||
97 | } | ||
98 | |||
74 | return 0; | 99 | return 0; |
75 | } | 100 | } |
76 | 101 | ||
diff --git a/arch/arm/mach-exynos/regs-pmu.h b/arch/arm/mach-exynos/regs-pmu.h index b7614333d296..fba9068ed260 100644 --- a/arch/arm/mach-exynos/regs-pmu.h +++ b/arch/arm/mach-exynos/regs-pmu.h | |||
@@ -513,6 +513,12 @@ static inline unsigned int exynos_pmu_cpunr(unsigned int mpidr) | |||
513 | #define SPREAD_ENABLE 0xF | 513 | #define SPREAD_ENABLE 0xF |
514 | #define SPREAD_USE_STANDWFI 0xF | 514 | #define SPREAD_USE_STANDWFI 0xF |
515 | 515 | ||
516 | #define EXYNOS5420_KFC_CORE_RESET0 BIT(8) | ||
517 | #define EXYNOS5420_KFC_ETM_RESET0 BIT(20) | ||
518 | |||
519 | #define EXYNOS5420_KFC_CORE_RESET(_nr) \ | ||
520 | ((EXYNOS5420_KFC_CORE_RESET0 | EXYNOS5420_KFC_ETM_RESET0) << (_nr)) | ||
521 | |||
516 | #define EXYNOS5420_BB_CON1 0x0784 | 522 | #define EXYNOS5420_BB_CON1 0x0784 |
517 | #define EXYNOS5420_BB_SEL_EN BIT(31) | 523 | #define EXYNOS5420_BB_SEL_EN BIT(31) |
518 | #define EXYNOS5420_BB_PMOS_EN BIT(7) | 524 | #define EXYNOS5420_BB_PMOS_EN BIT(7) |
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index cebf78661a55..253021ef2769 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c | |||
@@ -201,7 +201,7 @@ void unregister_step_hook(struct step_hook *hook) | |||
201 | } | 201 | } |
202 | 202 | ||
203 | /* | 203 | /* |
204 | * Call registered single step handers | 204 | * Call registered single step handlers |
205 | * There is no Syndrome info to check for determining the handler. | 205 | * There is no Syndrome info to check for determining the handler. |
206 | * So we call all the registered handlers, until the right handler is | 206 | * So we call all the registered handlers, until the right handler is |
207 | * found which returns zero. | 207 | * found which returns zero. |
@@ -271,20 +271,21 @@ static int single_step_handler(unsigned long addr, unsigned int esr, | |||
271 | * Use reader/writer locks instead of plain spinlock. | 271 | * Use reader/writer locks instead of plain spinlock. |
272 | */ | 272 | */ |
273 | static LIST_HEAD(break_hook); | 273 | static LIST_HEAD(break_hook); |
274 | static DEFINE_RWLOCK(break_hook_lock); | 274 | static DEFINE_SPINLOCK(break_hook_lock); |
275 | 275 | ||
276 | void register_break_hook(struct break_hook *hook) | 276 | void register_break_hook(struct break_hook *hook) |
277 | { | 277 | { |
278 | write_lock(&break_hook_lock); | 278 | spin_lock(&break_hook_lock); |
279 | list_add(&hook->node, &break_hook); | 279 | list_add_rcu(&hook->node, &break_hook); |
280 | write_unlock(&break_hook_lock); | 280 | spin_unlock(&break_hook_lock); |
281 | } | 281 | } |
282 | 282 | ||
283 | void unregister_break_hook(struct break_hook *hook) | 283 | void unregister_break_hook(struct break_hook *hook) |
284 | { | 284 | { |
285 | write_lock(&break_hook_lock); | 285 | spin_lock(&break_hook_lock); |
286 | list_del(&hook->node); | 286 | list_del_rcu(&hook->node); |
287 | write_unlock(&break_hook_lock); | 287 | spin_unlock(&break_hook_lock); |
288 | synchronize_rcu(); | ||
288 | } | 289 | } |
289 | 290 | ||
290 | static int call_break_hook(struct pt_regs *regs, unsigned int esr) | 291 | static int call_break_hook(struct pt_regs *regs, unsigned int esr) |
@@ -292,11 +293,11 @@ static int call_break_hook(struct pt_regs *regs, unsigned int esr) | |||
292 | struct break_hook *hook; | 293 | struct break_hook *hook; |
293 | int (*fn)(struct pt_regs *regs, unsigned int esr) = NULL; | 294 | int (*fn)(struct pt_regs *regs, unsigned int esr) = NULL; |
294 | 295 | ||
295 | read_lock(&break_hook_lock); | 296 | rcu_read_lock(); |
296 | list_for_each_entry(hook, &break_hook, node) | 297 | list_for_each_entry_rcu(hook, &break_hook, node) |
297 | if ((esr & hook->esr_mask) == hook->esr_val) | 298 | if ((esr & hook->esr_mask) == hook->esr_val) |
298 | fn = hook->fn; | 299 | fn = hook->fn; |
299 | read_unlock(&break_hook_lock); | 300 | rcu_read_unlock(); |
300 | 301 | ||
301 | return fn ? fn(regs, esr) : DBG_HOOK_ERROR; | 302 | return fn ? fn(regs, esr) : DBG_HOOK_ERROR; |
302 | } | 303 | } |
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index f341866aa810..c08b9ad6f429 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c | |||
@@ -85,7 +85,7 @@ bool aarch64_insn_is_branch_imm(u32 insn) | |||
85 | aarch64_insn_is_bcond(insn)); | 85 | aarch64_insn_is_bcond(insn)); |
86 | } | 86 | } |
87 | 87 | ||
88 | static DEFINE_SPINLOCK(patch_lock); | 88 | static DEFINE_RAW_SPINLOCK(patch_lock); |
89 | 89 | ||
90 | static void __kprobes *patch_map(void *addr, int fixmap) | 90 | static void __kprobes *patch_map(void *addr, int fixmap) |
91 | { | 91 | { |
@@ -131,13 +131,13 @@ static int __kprobes __aarch64_insn_write(void *addr, u32 insn) | |||
131 | unsigned long flags = 0; | 131 | unsigned long flags = 0; |
132 | int ret; | 132 | int ret; |
133 | 133 | ||
134 | spin_lock_irqsave(&patch_lock, flags); | 134 | raw_spin_lock_irqsave(&patch_lock, flags); |
135 | waddr = patch_map(addr, FIX_TEXT_POKE0); | 135 | waddr = patch_map(addr, FIX_TEXT_POKE0); |
136 | 136 | ||
137 | ret = probe_kernel_write(waddr, &insn, AARCH64_INSN_SIZE); | 137 | ret = probe_kernel_write(waddr, &insn, AARCH64_INSN_SIZE); |
138 | 138 | ||
139 | patch_unmap(FIX_TEXT_POKE0); | 139 | patch_unmap(FIX_TEXT_POKE0); |
140 | spin_unlock_irqrestore(&patch_lock, flags); | 140 | raw_spin_unlock_irqrestore(&patch_lock, flags); |
141 | 141 | ||
142 | return ret; | 142 | return ret; |
143 | } | 143 | } |
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 6bab21f84a9f..232247945b1c 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
@@ -364,6 +364,8 @@ static void __init relocate_initrd(void) | |||
364 | to_free = ram_end - orig_start; | 364 | to_free = ram_end - orig_start; |
365 | 365 | ||
366 | size = orig_end - orig_start; | 366 | size = orig_end - orig_start; |
367 | if (!size) | ||
368 | return; | ||
367 | 369 | ||
368 | /* initrd needs to be relocated completely inside linear mapping */ | 370 | /* initrd needs to be relocated completely inside linear mapping */ |
369 | new_start = memblock_find_in_range(0, PFN_PHYS(max_pfn), | 371 | new_start = memblock_find_in_range(0, PFN_PHYS(max_pfn), |
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index aba9ead1384c..9fadf6d7039b 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c | |||
@@ -287,6 +287,7 @@ retry: | |||
287 | * starvation. | 287 | * starvation. |
288 | */ | 288 | */ |
289 | mm_flags &= ~FAULT_FLAG_ALLOW_RETRY; | 289 | mm_flags &= ~FAULT_FLAG_ALLOW_RETRY; |
290 | mm_flags |= FAULT_FLAG_TRIED; | ||
290 | goto retry; | 291 | goto retry; |
291 | } | 292 | } |
292 | } | 293 | } |
diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild index 70e6ae1e7006..373cb23301e3 100644 --- a/arch/h8300/include/asm/Kbuild +++ b/arch/h8300/include/asm/Kbuild | |||
@@ -73,4 +73,5 @@ generic-y += uaccess.h | |||
73 | generic-y += ucontext.h | 73 | generic-y += ucontext.h |
74 | generic-y += unaligned.h | 74 | generic-y += unaligned.h |
75 | generic-y += vga.h | 75 | generic-y += vga.h |
76 | generic-y += word-at-a-time.h | ||
76 | generic-y += xor.h | 77 | generic-y += xor.h |
diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild index ac1662956e0c..ab9f4e0ed4cf 100644 --- a/arch/powerpc/include/asm/Kbuild +++ b/arch/powerpc/include/asm/Kbuild | |||
@@ -7,4 +7,3 @@ generic-y += mcs_spinlock.h | |||
7 | generic-y += preempt.h | 7 | generic-y += preempt.h |
8 | generic-y += rwsem.h | 8 | generic-y += rwsem.h |
9 | generic-y += vtime.h | 9 | generic-y += vtime.h |
10 | generic-y += word-at-a-time.h | ||
diff --git a/arch/s390/boot/compressed/Makefile b/arch/s390/boot/compressed/Makefile index d4788111c161..fac6ac9790fa 100644 --- a/arch/s390/boot/compressed/Makefile +++ b/arch/s390/boot/compressed/Makefile | |||
@@ -10,7 +10,7 @@ targets += misc.o piggy.o sizes.h head.o | |||
10 | 10 | ||
11 | KBUILD_CFLAGS := -m64 -D__KERNEL__ $(LINUX_INCLUDE) -O2 | 11 | KBUILD_CFLAGS := -m64 -D__KERNEL__ $(LINUX_INCLUDE) -O2 |
12 | KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING | 12 | KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING |
13 | KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks | 13 | KBUILD_CFLAGS += $(cflags-y) -fno-delete-null-pointer-checks -msoft-float |
14 | KBUILD_CFLAGS += $(call cc-option,-mpacked-stack) | 14 | KBUILD_CFLAGS += $(call cc-option,-mpacked-stack) |
15 | KBUILD_CFLAGS += $(call cc-option,-ffreestanding) | 15 | KBUILD_CFLAGS += $(call cc-option,-ffreestanding) |
16 | 16 | ||
diff --git a/arch/s390/configs/default_defconfig b/arch/s390/configs/default_defconfig index 0c98f1508542..ed7da281df66 100644 --- a/arch/s390/configs/default_defconfig +++ b/arch/s390/configs/default_defconfig | |||
@@ -381,7 +381,7 @@ CONFIG_ISCSI_TCP=m | |||
381 | CONFIG_SCSI_DEBUG=m | 381 | CONFIG_SCSI_DEBUG=m |
382 | CONFIG_ZFCP=y | 382 | CONFIG_ZFCP=y |
383 | CONFIG_SCSI_VIRTIO=m | 383 | CONFIG_SCSI_VIRTIO=m |
384 | CONFIG_SCSI_DH=m | 384 | CONFIG_SCSI_DH=y |
385 | CONFIG_SCSI_DH_RDAC=m | 385 | CONFIG_SCSI_DH_RDAC=m |
386 | CONFIG_SCSI_DH_HP_SW=m | 386 | CONFIG_SCSI_DH_HP_SW=m |
387 | CONFIG_SCSI_DH_EMC=m | 387 | CONFIG_SCSI_DH_EMC=m |
diff --git a/arch/s390/configs/gcov_defconfig b/arch/s390/configs/gcov_defconfig index 82083e1fbdc4..9858b14cde1e 100644 --- a/arch/s390/configs/gcov_defconfig +++ b/arch/s390/configs/gcov_defconfig | |||
@@ -377,7 +377,7 @@ CONFIG_ISCSI_TCP=m | |||
377 | CONFIG_SCSI_DEBUG=m | 377 | CONFIG_SCSI_DEBUG=m |
378 | CONFIG_ZFCP=y | 378 | CONFIG_ZFCP=y |
379 | CONFIG_SCSI_VIRTIO=m | 379 | CONFIG_SCSI_VIRTIO=m |
380 | CONFIG_SCSI_DH=m | 380 | CONFIG_SCSI_DH=y |
381 | CONFIG_SCSI_DH_RDAC=m | 381 | CONFIG_SCSI_DH_RDAC=m |
382 | CONFIG_SCSI_DH_HP_SW=m | 382 | CONFIG_SCSI_DH_HP_SW=m |
383 | CONFIG_SCSI_DH_EMC=m | 383 | CONFIG_SCSI_DH_EMC=m |
diff --git a/arch/s390/configs/performance_defconfig b/arch/s390/configs/performance_defconfig index c05c9e0821e3..7f14f80717d4 100644 --- a/arch/s390/configs/performance_defconfig +++ b/arch/s390/configs/performance_defconfig | |||
@@ -377,7 +377,7 @@ CONFIG_ISCSI_TCP=m | |||
377 | CONFIG_SCSI_DEBUG=m | 377 | CONFIG_SCSI_DEBUG=m |
378 | CONFIG_ZFCP=y | 378 | CONFIG_ZFCP=y |
379 | CONFIG_SCSI_VIRTIO=m | 379 | CONFIG_SCSI_VIRTIO=m |
380 | CONFIG_SCSI_DH=m | 380 | CONFIG_SCSI_DH=y |
381 | CONFIG_SCSI_DH_RDAC=m | 381 | CONFIG_SCSI_DH_RDAC=m |
382 | CONFIG_SCSI_DH_HP_SW=m | 382 | CONFIG_SCSI_DH_HP_SW=m |
383 | CONFIG_SCSI_DH_EMC=m | 383 | CONFIG_SCSI_DH_EMC=m |
diff --git a/arch/s390/include/asm/numa.h b/arch/s390/include/asm/numa.h index 2a0efc63b9e5..dc19ee0c92aa 100644 --- a/arch/s390/include/asm/numa.h +++ b/arch/s390/include/asm/numa.h | |||
@@ -19,7 +19,7 @@ int numa_pfn_to_nid(unsigned long pfn); | |||
19 | int __node_distance(int a, int b); | 19 | int __node_distance(int a, int b); |
20 | void numa_update_cpu_topology(void); | 20 | void numa_update_cpu_topology(void); |
21 | 21 | ||
22 | extern cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; | 22 | extern cpumask_t node_to_cpumask_map[MAX_NUMNODES]; |
23 | extern int numa_debug_enabled; | 23 | extern int numa_debug_enabled; |
24 | 24 | ||
25 | #else | 25 | #else |
diff --git a/arch/s390/include/asm/topology.h b/arch/s390/include/asm/topology.h index 27ebde643933..94fc55fc72ce 100644 --- a/arch/s390/include/asm/topology.h +++ b/arch/s390/include/asm/topology.h | |||
@@ -68,7 +68,7 @@ static inline int cpu_to_node(int cpu) | |||
68 | #define cpumask_of_node cpumask_of_node | 68 | #define cpumask_of_node cpumask_of_node |
69 | static inline const struct cpumask *cpumask_of_node(int node) | 69 | static inline const struct cpumask *cpumask_of_node(int node) |
70 | { | 70 | { |
71 | return node_to_cpumask_map[node]; | 71 | return &node_to_cpumask_map[node]; |
72 | } | 72 | } |
73 | 73 | ||
74 | /* | 74 | /* |
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 48c9af7a7683..3aeeb1b562c0 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
@@ -176,6 +176,7 @@ int main(void) | |||
176 | DEFINE(__LC_PASTE, offsetof(struct _lowcore, paste)); | 176 | DEFINE(__LC_PASTE, offsetof(struct _lowcore, paste)); |
177 | DEFINE(__LC_FP_CREG_SAVE_AREA, offsetof(struct _lowcore, fpt_creg_save_area)); | 177 | DEFINE(__LC_FP_CREG_SAVE_AREA, offsetof(struct _lowcore, fpt_creg_save_area)); |
178 | DEFINE(__LC_LAST_BREAK, offsetof(struct _lowcore, breaking_event_addr)); | 178 | DEFINE(__LC_LAST_BREAK, offsetof(struct _lowcore, breaking_event_addr)); |
179 | DEFINE(__LC_PERCPU_OFFSET, offsetof(struct _lowcore, percpu_offset)); | ||
179 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); | 180 | DEFINE(__LC_VDSO_PER_CPU, offsetof(struct _lowcore, vdso_per_cpu_data)); |
180 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); | 181 | DEFINE(__LC_GMAP, offsetof(struct _lowcore, gmap)); |
181 | DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); | 182 | DEFINE(__LC_PGM_TDB, offsetof(struct _lowcore, pgm_tdb)); |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 09b039d7983d..582fe44ab07c 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -733,6 +733,14 @@ ENTRY(psw_idle) | |||
733 | stg %r3,__SF_EMPTY(%r15) | 733 | stg %r3,__SF_EMPTY(%r15) |
734 | larl %r1,.Lpsw_idle_lpsw+4 | 734 | larl %r1,.Lpsw_idle_lpsw+4 |
735 | stg %r1,__SF_EMPTY+8(%r15) | 735 | stg %r1,__SF_EMPTY+8(%r15) |
736 | #ifdef CONFIG_SMP | ||
737 | larl %r1,smp_cpu_mtid | ||
738 | llgf %r1,0(%r1) | ||
739 | ltgr %r1,%r1 | ||
740 | jz .Lpsw_idle_stcctm | ||
741 | .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+16(%r15) | ||
742 | .Lpsw_idle_stcctm: | ||
743 | #endif | ||
736 | STCK __CLOCK_IDLE_ENTER(%r2) | 744 | STCK __CLOCK_IDLE_ENTER(%r2) |
737 | stpt __TIMER_IDLE_ENTER(%r2) | 745 | stpt __TIMER_IDLE_ENTER(%r2) |
738 | .Lpsw_idle_lpsw: | 746 | .Lpsw_idle_lpsw: |
@@ -1159,7 +1167,27 @@ cleanup_critical: | |||
1159 | jhe 1f | 1167 | jhe 1f |
1160 | mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) | 1168 | mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) |
1161 | mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2) | 1169 | mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2) |
1162 | 1: # account system time going idle | 1170 | 1: # calculate idle cycles |
1171 | #ifdef CONFIG_SMP | ||
1172 | clg %r9,BASED(.Lcleanup_idle_insn) | ||
1173 | jl 3f | ||
1174 | larl %r1,smp_cpu_mtid | ||
1175 | llgf %r1,0(%r1) | ||
1176 | ltgr %r1,%r1 | ||
1177 | jz 3f | ||
1178 | .insn rsy,0xeb0000000017,%r1,5,__SF_EMPTY+80(%r15) | ||
1179 | larl %r3,mt_cycles | ||
1180 | ag %r3,__LC_PERCPU_OFFSET | ||
1181 | la %r4,__SF_EMPTY+16(%r15) | ||
1182 | 2: lg %r0,0(%r3) | ||
1183 | slg %r0,0(%r4) | ||
1184 | alg %r0,64(%r4) | ||
1185 | stg %r0,0(%r3) | ||
1186 | la %r3,8(%r3) | ||
1187 | la %r4,8(%r4) | ||
1188 | brct %r1,2b | ||
1189 | #endif | ||
1190 | 3: # account system time going idle | ||
1163 | lg %r9,__LC_STEAL_TIMER | 1191 | lg %r9,__LC_STEAL_TIMER |
1164 | alg %r9,__CLOCK_IDLE_ENTER(%r2) | 1192 | alg %r9,__CLOCK_IDLE_ENTER(%r2) |
1165 | slg %r9,__LC_LAST_UPDATE_CLOCK | 1193 | slg %r9,__LC_LAST_UPDATE_CLOCK |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index c8653435c70d..dafc44f519c3 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -25,7 +25,7 @@ static DEFINE_SPINLOCK(virt_timer_lock); | |||
25 | static atomic64_t virt_timer_current; | 25 | static atomic64_t virt_timer_current; |
26 | static atomic64_t virt_timer_elapsed; | 26 | static atomic64_t virt_timer_elapsed; |
27 | 27 | ||
28 | static DEFINE_PER_CPU(u64, mt_cycles[32]); | 28 | DEFINE_PER_CPU(u64, mt_cycles[8]); |
29 | static DEFINE_PER_CPU(u64, mt_scaling_mult) = { 1 }; | 29 | static DEFINE_PER_CPU(u64, mt_scaling_mult) = { 1 }; |
30 | static DEFINE_PER_CPU(u64, mt_scaling_div) = { 1 }; | 30 | static DEFINE_PER_CPU(u64, mt_scaling_div) = { 1 }; |
31 | static DEFINE_PER_CPU(u64, mt_scaling_jiffies); | 31 | static DEFINE_PER_CPU(u64, mt_scaling_jiffies); |
@@ -60,6 +60,34 @@ static inline int virt_timer_forward(u64 elapsed) | |||
60 | return elapsed >= atomic64_read(&virt_timer_current); | 60 | return elapsed >= atomic64_read(&virt_timer_current); |
61 | } | 61 | } |
62 | 62 | ||
63 | static void update_mt_scaling(void) | ||
64 | { | ||
65 | u64 cycles_new[8], *cycles_old; | ||
66 | u64 delta, fac, mult, div; | ||
67 | int i; | ||
68 | |||
69 | stcctm5(smp_cpu_mtid + 1, cycles_new); | ||
70 | cycles_old = this_cpu_ptr(mt_cycles); | ||
71 | fac = 1; | ||
72 | mult = div = 0; | ||
73 | for (i = 0; i <= smp_cpu_mtid; i++) { | ||
74 | delta = cycles_new[i] - cycles_old[i]; | ||
75 | div += delta; | ||
76 | mult *= i + 1; | ||
77 | mult += delta * fac; | ||
78 | fac *= i + 1; | ||
79 | } | ||
80 | div *= fac; | ||
81 | if (div > 0) { | ||
82 | /* Update scaling factor */ | ||
83 | __this_cpu_write(mt_scaling_mult, mult); | ||
84 | __this_cpu_write(mt_scaling_div, div); | ||
85 | memcpy(cycles_old, cycles_new, | ||
86 | sizeof(u64) * (smp_cpu_mtid + 1)); | ||
87 | } | ||
88 | __this_cpu_write(mt_scaling_jiffies, jiffies_64); | ||
89 | } | ||
90 | |||
63 | /* | 91 | /* |
64 | * Update process times based on virtual cpu times stored by entry.S | 92 | * Update process times based on virtual cpu times stored by entry.S |
65 | * to the lowcore fields user_timer, system_timer & steal_clock. | 93 | * to the lowcore fields user_timer, system_timer & steal_clock. |
@@ -69,7 +97,6 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | |||
69 | struct thread_info *ti = task_thread_info(tsk); | 97 | struct thread_info *ti = task_thread_info(tsk); |
70 | u64 timer, clock, user, system, steal; | 98 | u64 timer, clock, user, system, steal; |
71 | u64 user_scaled, system_scaled; | 99 | u64 user_scaled, system_scaled; |
72 | int i; | ||
73 | 100 | ||
74 | timer = S390_lowcore.last_update_timer; | 101 | timer = S390_lowcore.last_update_timer; |
75 | clock = S390_lowcore.last_update_clock; | 102 | clock = S390_lowcore.last_update_clock; |
@@ -85,34 +112,10 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | |||
85 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | 112 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; |
86 | S390_lowcore.steal_timer += S390_lowcore.last_update_clock - clock; | 113 | S390_lowcore.steal_timer += S390_lowcore.last_update_clock - clock; |
87 | 114 | ||
88 | /* Do MT utilization calculation */ | 115 | /* Update MT utilization calculation */ |
89 | if (smp_cpu_mtid && | 116 | if (smp_cpu_mtid && |
90 | time_after64(jiffies_64, __this_cpu_read(mt_scaling_jiffies))) { | 117 | time_after64(jiffies_64, this_cpu_read(mt_scaling_jiffies))) |
91 | u64 cycles_new[32], *cycles_old; | 118 | update_mt_scaling(); |
92 | u64 delta, fac, mult, div; | ||
93 | |||
94 | cycles_old = this_cpu_ptr(mt_cycles); | ||
95 | if (stcctm5(smp_cpu_mtid + 1, cycles_new) < 2) { | ||
96 | fac = 1; | ||
97 | mult = div = 0; | ||
98 | for (i = 0; i <= smp_cpu_mtid; i++) { | ||
99 | delta = cycles_new[i] - cycles_old[i]; | ||
100 | div += delta; | ||
101 | mult *= i + 1; | ||
102 | mult += delta * fac; | ||
103 | fac *= i + 1; | ||
104 | } | ||
105 | div *= fac; | ||
106 | if (div > 0) { | ||
107 | /* Update scaling factor */ | ||
108 | __this_cpu_write(mt_scaling_mult, mult); | ||
109 | __this_cpu_write(mt_scaling_div, div); | ||
110 | memcpy(cycles_old, cycles_new, | ||
111 | sizeof(u64) * (smp_cpu_mtid + 1)); | ||
112 | } | ||
113 | } | ||
114 | __this_cpu_write(mt_scaling_jiffies, jiffies_64); | ||
115 | } | ||
116 | 119 | ||
117 | user = S390_lowcore.user_timer - ti->user_timer; | 120 | user = S390_lowcore.user_timer - ti->user_timer; |
118 | S390_lowcore.steal_timer -= user; | 121 | S390_lowcore.steal_timer -= user; |
@@ -181,6 +184,11 @@ void vtime_account_irq_enter(struct task_struct *tsk) | |||
181 | S390_lowcore.last_update_timer = get_vtimer(); | 184 | S390_lowcore.last_update_timer = get_vtimer(); |
182 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | 185 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; |
183 | 186 | ||
187 | /* Update MT utilization calculation */ | ||
188 | if (smp_cpu_mtid && | ||
189 | time_after64(jiffies_64, this_cpu_read(mt_scaling_jiffies))) | ||
190 | update_mt_scaling(); | ||
191 | |||
184 | system = S390_lowcore.system_timer - ti->system_timer; | 192 | system = S390_lowcore.system_timer - ti->system_timer; |
185 | S390_lowcore.steal_timer -= system; | 193 | S390_lowcore.steal_timer -= system; |
186 | ti->system_timer = S390_lowcore.system_timer; | 194 | ti->system_timer = S390_lowcore.system_timer; |
diff --git a/arch/s390/numa/mode_emu.c b/arch/s390/numa/mode_emu.c index 7de4e2f780d7..30b2698a28e2 100644 --- a/arch/s390/numa/mode_emu.c +++ b/arch/s390/numa/mode_emu.c | |||
@@ -368,7 +368,7 @@ static void topology_add_core(struct toptree *core) | |||
368 | cpumask_copy(&top->thread_mask, &core->mask); | 368 | cpumask_copy(&top->thread_mask, &core->mask); |
369 | cpumask_copy(&top->core_mask, &core_mc(core)->mask); | 369 | cpumask_copy(&top->core_mask, &core_mc(core)->mask); |
370 | cpumask_copy(&top->book_mask, &core_book(core)->mask); | 370 | cpumask_copy(&top->book_mask, &core_book(core)->mask); |
371 | cpumask_set_cpu(cpu, node_to_cpumask_map[core_node(core)->id]); | 371 | cpumask_set_cpu(cpu, &node_to_cpumask_map[core_node(core)->id]); |
372 | top->node_id = core_node(core)->id; | 372 | top->node_id = core_node(core)->id; |
373 | } | 373 | } |
374 | } | 374 | } |
@@ -383,7 +383,7 @@ static void toptree_to_topology(struct toptree *numa) | |||
383 | 383 | ||
384 | /* Clear all node masks */ | 384 | /* Clear all node masks */ |
385 | for (i = 0; i < MAX_NUMNODES; i++) | 385 | for (i = 0; i < MAX_NUMNODES; i++) |
386 | cpumask_clear(node_to_cpumask_map[i]); | 386 | cpumask_clear(&node_to_cpumask_map[i]); |
387 | 387 | ||
388 | /* Rebuild all masks */ | 388 | /* Rebuild all masks */ |
389 | toptree_for_each(core, numa, CORE) | 389 | toptree_for_each(core, numa, CORE) |
diff --git a/arch/s390/numa/numa.c b/arch/s390/numa/numa.c index 09b1d2355bd9..43f32ce60aa3 100644 --- a/arch/s390/numa/numa.c +++ b/arch/s390/numa/numa.c | |||
@@ -23,7 +23,7 @@ | |||
23 | pg_data_t *node_data[MAX_NUMNODES]; | 23 | pg_data_t *node_data[MAX_NUMNODES]; |
24 | EXPORT_SYMBOL(node_data); | 24 | EXPORT_SYMBOL(node_data); |
25 | 25 | ||
26 | cpumask_var_t node_to_cpumask_map[MAX_NUMNODES]; | 26 | cpumask_t node_to_cpumask_map[MAX_NUMNODES]; |
27 | EXPORT_SYMBOL(node_to_cpumask_map); | 27 | EXPORT_SYMBOL(node_to_cpumask_map); |
28 | 28 | ||
29 | const struct numa_mode numa_mode_plain = { | 29 | const struct numa_mode numa_mode_plain = { |
@@ -144,7 +144,7 @@ void __init numa_setup(void) | |||
144 | static int __init numa_init_early(void) | 144 | static int __init numa_init_early(void) |
145 | { | 145 | { |
146 | /* Attach all possible CPUs to node 0 for now. */ | 146 | /* Attach all possible CPUs to node 0 for now. */ |
147 | cpumask_copy(node_to_cpumask_map[0], cpu_possible_mask); | 147 | cpumask_copy(&node_to_cpumask_map[0], cpu_possible_mask); |
148 | return 0; | 148 | return 0; |
149 | } | 149 | } |
150 | early_initcall(numa_init_early); | 150 | early_initcall(numa_init_early); |
diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild index 0b6cacaad933..ba35c41c71ff 100644 --- a/arch/tile/include/asm/Kbuild +++ b/arch/tile/include/asm/Kbuild | |||
@@ -40,5 +40,4 @@ generic-y += termbits.h | |||
40 | generic-y += termios.h | 40 | generic-y += termios.h |
41 | generic-y += trace_clock.h | 41 | generic-y += trace_clock.h |
42 | generic-y += types.h | 42 | generic-y += types.h |
43 | generic-y += word-at-a-time.h | ||
44 | generic-y += xor.h | 43 | generic-y += xor.h |
diff --git a/arch/tile/include/asm/word-at-a-time.h b/arch/tile/include/asm/word-at-a-time.h index 9e5ce0d7b292..b66a693c2c34 100644 --- a/arch/tile/include/asm/word-at-a-time.h +++ b/arch/tile/include/asm/word-at-a-time.h | |||
@@ -6,7 +6,7 @@ | |||
6 | struct word_at_a_time { /* unused */ }; | 6 | struct word_at_a_time { /* unused */ }; |
7 | #define WORD_AT_A_TIME_CONSTANTS {} | 7 | #define WORD_AT_A_TIME_CONSTANTS {} |
8 | 8 | ||
9 | /* Generate 0x01 byte values for non-zero bytes using a SIMD instruction. */ | 9 | /* Generate 0x01 byte values for zero bytes using a SIMD instruction. */ |
10 | static inline unsigned long has_zero(unsigned long val, unsigned long *data, | 10 | static inline unsigned long has_zero(unsigned long val, unsigned long *data, |
11 | const struct word_at_a_time *c) | 11 | const struct word_at_a_time *c) |
12 | { | 12 | { |
@@ -33,4 +33,10 @@ static inline long find_zero(unsigned long mask) | |||
33 | #endif | 33 | #endif |
34 | } | 34 | } |
35 | 35 | ||
36 | #ifdef __BIG_ENDIAN | ||
37 | #define zero_bytemask(mask) (~1ul << (63 - __builtin_clzl(mask))) | ||
38 | #else | ||
39 | #define zero_bytemask(mask) ((2ul << __builtin_ctzl(mask)) - 1) | ||
40 | #endif | ||
41 | |||
36 | #endif /* _ASM_WORD_AT_A_TIME_H */ | 42 | #endif /* _ASM_WORD_AT_A_TIME_H */ |
diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h index 83aea8055119..4c20dd333412 100644 --- a/arch/x86/include/asm/xen/hypercall.h +++ b/arch/x86/include/asm/xen/hypercall.h | |||
@@ -336,10 +336,10 @@ HYPERVISOR_update_descriptor(u64 ma, u64 desc) | |||
336 | return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32); | 336 | return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32); |
337 | } | 337 | } |
338 | 338 | ||
339 | static inline int | 339 | static inline long |
340 | HYPERVISOR_memory_op(unsigned int cmd, void *arg) | 340 | HYPERVISOR_memory_op(unsigned int cmd, void *arg) |
341 | { | 341 | { |
342 | return _hypercall2(int, memory_op, cmd, arg); | 342 | return _hypercall2(long, memory_op, cmd, arg); |
343 | } | 343 | } |
344 | 344 | ||
345 | static inline int | 345 | static inline int |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 30d12afe52ed..993b7a71386d 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -33,6 +33,10 @@ | |||
33 | #include <linux/memblock.h> | 33 | #include <linux/memblock.h> |
34 | #include <linux/edd.h> | 34 | #include <linux/edd.h> |
35 | 35 | ||
36 | #ifdef CONFIG_KEXEC_CORE | ||
37 | #include <linux/kexec.h> | ||
38 | #endif | ||
39 | |||
36 | #include <xen/xen.h> | 40 | #include <xen/xen.h> |
37 | #include <xen/events.h> | 41 | #include <xen/events.h> |
38 | #include <xen/interface/xen.h> | 42 | #include <xen/interface/xen.h> |
@@ -1077,6 +1081,7 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) | |||
1077 | /* Fast syscall setup is all done in hypercalls, so | 1081 | /* Fast syscall setup is all done in hypercalls, so |
1078 | these are all ignored. Stub them out here to stop | 1082 | these are all ignored. Stub them out here to stop |
1079 | Xen console noise. */ | 1083 | Xen console noise. */ |
1084 | break; | ||
1080 | 1085 | ||
1081 | default: | 1086 | default: |
1082 | if (!pmu_msr_write(msr, low, high, &ret)) | 1087 | if (!pmu_msr_write(msr, low, high, &ret)) |
@@ -1807,6 +1812,21 @@ static struct notifier_block xen_hvm_cpu_notifier = { | |||
1807 | .notifier_call = xen_hvm_cpu_notify, | 1812 | .notifier_call = xen_hvm_cpu_notify, |
1808 | }; | 1813 | }; |
1809 | 1814 | ||
1815 | #ifdef CONFIG_KEXEC_CORE | ||
1816 | static void xen_hvm_shutdown(void) | ||
1817 | { | ||
1818 | native_machine_shutdown(); | ||
1819 | if (kexec_in_progress) | ||
1820 | xen_reboot(SHUTDOWN_soft_reset); | ||
1821 | } | ||
1822 | |||
1823 | static void xen_hvm_crash_shutdown(struct pt_regs *regs) | ||
1824 | { | ||
1825 | native_machine_crash_shutdown(regs); | ||
1826 | xen_reboot(SHUTDOWN_soft_reset); | ||
1827 | } | ||
1828 | #endif | ||
1829 | |||
1810 | static void __init xen_hvm_guest_init(void) | 1830 | static void __init xen_hvm_guest_init(void) |
1811 | { | 1831 | { |
1812 | if (xen_pv_domain()) | 1832 | if (xen_pv_domain()) |
@@ -1826,6 +1846,10 @@ static void __init xen_hvm_guest_init(void) | |||
1826 | x86_init.irqs.intr_init = xen_init_IRQ; | 1846 | x86_init.irqs.intr_init = xen_init_IRQ; |
1827 | xen_hvm_init_time_ops(); | 1847 | xen_hvm_init_time_ops(); |
1828 | xen_hvm_init_mmu_ops(); | 1848 | xen_hvm_init_mmu_ops(); |
1849 | #ifdef CONFIG_KEXEC_CORE | ||
1850 | machine_ops.shutdown = xen_hvm_shutdown; | ||
1851 | machine_ops.crash_shutdown = xen_hvm_crash_shutdown; | ||
1852 | #endif | ||
1829 | } | 1853 | } |
1830 | #endif | 1854 | #endif |
1831 | 1855 | ||
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index bfc08b13044b..660b3cfef234 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
@@ -112,6 +112,15 @@ static unsigned long *p2m_identity; | |||
112 | static pte_t *p2m_missing_pte; | 112 | static pte_t *p2m_missing_pte; |
113 | static pte_t *p2m_identity_pte; | 113 | static pte_t *p2m_identity_pte; |
114 | 114 | ||
115 | /* | ||
116 | * Hint at last populated PFN. | ||
117 | * | ||
118 | * Used to set HYPERVISOR_shared_info->arch.max_pfn so the toolstack | ||
119 | * can avoid scanning the whole P2M (which may be sized to account for | ||
120 | * hotplugged memory). | ||
121 | */ | ||
122 | static unsigned long xen_p2m_last_pfn; | ||
123 | |||
115 | static inline unsigned p2m_top_index(unsigned long pfn) | 124 | static inline unsigned p2m_top_index(unsigned long pfn) |
116 | { | 125 | { |
117 | BUG_ON(pfn >= MAX_P2M_PFN); | 126 | BUG_ON(pfn >= MAX_P2M_PFN); |
@@ -270,7 +279,7 @@ void xen_setup_mfn_list_list(void) | |||
270 | else | 279 | else |
271 | HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = | 280 | HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = |
272 | virt_to_mfn(p2m_top_mfn); | 281 | virt_to_mfn(p2m_top_mfn); |
273 | HYPERVISOR_shared_info->arch.max_pfn = xen_max_p2m_pfn; | 282 | HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn; |
274 | HYPERVISOR_shared_info->arch.p2m_generation = 0; | 283 | HYPERVISOR_shared_info->arch.p2m_generation = 0; |
275 | HYPERVISOR_shared_info->arch.p2m_vaddr = (unsigned long)xen_p2m_addr; | 284 | HYPERVISOR_shared_info->arch.p2m_vaddr = (unsigned long)xen_p2m_addr; |
276 | HYPERVISOR_shared_info->arch.p2m_cr3 = | 285 | HYPERVISOR_shared_info->arch.p2m_cr3 = |
@@ -406,6 +415,8 @@ void __init xen_vmalloc_p2m_tree(void) | |||
406 | static struct vm_struct vm; | 415 | static struct vm_struct vm; |
407 | unsigned long p2m_limit; | 416 | unsigned long p2m_limit; |
408 | 417 | ||
418 | xen_p2m_last_pfn = xen_max_p2m_pfn; | ||
419 | |||
409 | p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE; | 420 | p2m_limit = (phys_addr_t)P2M_LIMIT * 1024 * 1024 * 1024 / PAGE_SIZE; |
410 | vm.flags = VM_ALLOC; | 421 | vm.flags = VM_ALLOC; |
411 | vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit), | 422 | vm.size = ALIGN(sizeof(unsigned long) * max(xen_max_p2m_pfn, p2m_limit), |
@@ -608,6 +619,12 @@ static bool alloc_p2m(unsigned long pfn) | |||
608 | free_p2m_page(p2m); | 619 | free_p2m_page(p2m); |
609 | } | 620 | } |
610 | 621 | ||
622 | /* Expanded the p2m? */ | ||
623 | if (pfn > xen_p2m_last_pfn) { | ||
624 | xen_p2m_last_pfn = pfn; | ||
625 | HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn; | ||
626 | } | ||
627 | |||
611 | return true; | 628 | return true; |
612 | } | 629 | } |
613 | 630 | ||
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index f5ef6746d47a..1c30e4ab1022 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -548,7 +548,7 @@ static unsigned long __init xen_get_max_pages(void) | |||
548 | { | 548 | { |
549 | unsigned long max_pages, limit; | 549 | unsigned long max_pages, limit; |
550 | domid_t domid = DOMID_SELF; | 550 | domid_t domid = DOMID_SELF; |
551 | int ret; | 551 | long ret; |
552 | 552 | ||
553 | limit = xen_get_pages_limit(); | 553 | limit = xen_get_pages_limit(); |
554 | max_pages = limit; | 554 | max_pages = limit; |
@@ -798,7 +798,7 @@ char * __init xen_memory_setup(void) | |||
798 | xen_ignore_unusable(); | 798 | xen_ignore_unusable(); |
799 | 799 | ||
800 | /* Make sure the Xen-supplied memory map is well-ordered. */ | 800 | /* Make sure the Xen-supplied memory map is well-ordered. */ |
801 | sanitize_e820_map(xen_e820_map, xen_e820_map_entries, | 801 | sanitize_e820_map(xen_e820_map, ARRAY_SIZE(xen_e820_map), |
802 | &xen_e820_map_entries); | 802 | &xen_e820_map_entries); |
803 | 803 | ||
804 | max_pages = xen_get_max_pages(); | 804 | max_pages = xen_get_max_pages(); |
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index f42f2bac6466..4c55cfbad19e 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c | |||
@@ -32,8 +32,7 @@ static DEFINE_MUTEX(regmap_debugfs_early_lock); | |||
32 | /* Calculate the length of a fixed format */ | 32 | /* Calculate the length of a fixed format */ |
33 | static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size) | 33 | static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size) |
34 | { | 34 | { |
35 | snprintf(buf, buf_size, "%x", max_val); | 35 | return snprintf(NULL, 0, "%x", max_val); |
36 | return strlen(buf); | ||
37 | } | 36 | } |
38 | 37 | ||
39 | static ssize_t regmap_name_read_file(struct file *file, | 38 | static ssize_t regmap_name_read_file(struct file *file, |
@@ -432,7 +431,7 @@ static ssize_t regmap_access_read_file(struct file *file, | |||
432 | /* If we're in the region the user is trying to read */ | 431 | /* If we're in the region the user is trying to read */ |
433 | if (p >= *ppos) { | 432 | if (p >= *ppos) { |
434 | /* ...but not beyond it */ | 433 | /* ...but not beyond it */ |
435 | if (buf_pos >= count - 1 - tot_len) | 434 | if (buf_pos + tot_len + 1 >= count) |
436 | break; | 435 | break; |
437 | 436 | ||
438 | /* Format the register */ | 437 | /* Format the register */ |
diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig index 1a82f3a17681..0ebca8ba7bc4 100644 --- a/drivers/bus/Kconfig +++ b/drivers/bus/Kconfig | |||
@@ -36,7 +36,6 @@ config ARM_CCI400_PORT_CTRL | |||
36 | 36 | ||
37 | config ARM_CCI500_PMU | 37 | config ARM_CCI500_PMU |
38 | bool "ARM CCI500 PMU support" | 38 | bool "ARM CCI500 PMU support" |
39 | default y | ||
40 | depends on (ARM && CPU_V7) || ARM64 | 39 | depends on (ARM && CPU_V7) || ARM64 |
41 | depends on PERF_EVENTS | 40 | depends on PERF_EVENTS |
42 | select ARM_CCI_PMU | 41 | select ARM_CCI_PMU |
diff --git a/drivers/md/dm-cache-policy-cleaner.c b/drivers/md/dm-cache-policy-cleaner.c index 240c9f0e85e7..8a096456579b 100644 --- a/drivers/md/dm-cache-policy-cleaner.c +++ b/drivers/md/dm-cache-policy-cleaner.c | |||
@@ -436,7 +436,7 @@ static struct dm_cache_policy *wb_create(dm_cblock_t cache_size, | |||
436 | static struct dm_cache_policy_type wb_policy_type = { | 436 | static struct dm_cache_policy_type wb_policy_type = { |
437 | .name = "cleaner", | 437 | .name = "cleaner", |
438 | .version = {1, 0, 0}, | 438 | .version = {1, 0, 0}, |
439 | .hint_size = 0, | 439 | .hint_size = 4, |
440 | .owner = THIS_MODULE, | 440 | .owner = THIS_MODULE, |
441 | .create = wb_create | 441 | .create = wb_create |
442 | }; | 442 | }; |
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index ebaa4f803eec..192bb8beeb6b 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c | |||
@@ -203,7 +203,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | |||
203 | return -EINVAL; | 203 | return -EINVAL; |
204 | } | 204 | } |
205 | 205 | ||
206 | tmp_store = kmalloc(sizeof(*tmp_store), GFP_KERNEL); | 206 | tmp_store = kzalloc(sizeof(*tmp_store), GFP_KERNEL); |
207 | if (!tmp_store) { | 207 | if (!tmp_store) { |
208 | ti->error = "Exception store allocation failed"; | 208 | ti->error = "Exception store allocation failed"; |
209 | return -ENOMEM; | 209 | return -ENOMEM; |
@@ -215,7 +215,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | |||
215 | else if (persistent == 'N') | 215 | else if (persistent == 'N') |
216 | type = get_type("N"); | 216 | type = get_type("N"); |
217 | else { | 217 | else { |
218 | ti->error = "Persistent flag is not P or N"; | 218 | ti->error = "Exception store type is not P or N"; |
219 | r = -EINVAL; | 219 | r = -EINVAL; |
220 | goto bad_type; | 220 | goto bad_type; |
221 | } | 221 | } |
@@ -233,7 +233,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | |||
233 | if (r) | 233 | if (r) |
234 | goto bad; | 234 | goto bad; |
235 | 235 | ||
236 | r = type->ctr(tmp_store, 0, NULL); | 236 | r = type->ctr(tmp_store, (strlen(argv[0]) > 1 ? &argv[0][1] : NULL)); |
237 | if (r) { | 237 | if (r) { |
238 | ti->error = "Exception store type constructor failed"; | 238 | ti->error = "Exception store type constructor failed"; |
239 | goto bad; | 239 | goto bad; |
diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h index 0b2536247cf5..fae34e7a0b1e 100644 --- a/drivers/md/dm-exception-store.h +++ b/drivers/md/dm-exception-store.h | |||
@@ -42,8 +42,7 @@ struct dm_exception_store_type { | |||
42 | const char *name; | 42 | const char *name; |
43 | struct module *module; | 43 | struct module *module; |
44 | 44 | ||
45 | int (*ctr) (struct dm_exception_store *store, | 45 | int (*ctr) (struct dm_exception_store *store, char *options); |
46 | unsigned argc, char **argv); | ||
47 | 46 | ||
48 | /* | 47 | /* |
49 | * Destroys this object when you've finished with it. | 48 | * Destroys this object when you've finished with it. |
@@ -123,6 +122,8 @@ struct dm_exception_store { | |||
123 | unsigned chunk_shift; | 122 | unsigned chunk_shift; |
124 | 123 | ||
125 | void *context; | 124 | void *context; |
125 | |||
126 | bool userspace_supports_overflow; | ||
126 | }; | 127 | }; |
127 | 128 | ||
128 | /* | 129 | /* |
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 97e165183e79..a0901214aef5 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -329,8 +329,7 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size) | |||
329 | */ | 329 | */ |
330 | if (min_region_size > (1 << 13)) { | 330 | if (min_region_size > (1 << 13)) { |
331 | /* If not a power of 2, make it the next power of 2 */ | 331 | /* If not a power of 2, make it the next power of 2 */ |
332 | if (min_region_size & (min_region_size - 1)) | 332 | region_size = roundup_pow_of_two(min_region_size); |
333 | region_size = 1 << fls(region_size); | ||
334 | DMINFO("Choosing default region size of %lu sectors", | 333 | DMINFO("Choosing default region size of %lu sectors", |
335 | region_size); | 334 | region_size); |
336 | } else { | 335 | } else { |
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index bf71583296f7..aeacad9be51d 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | #include "dm-exception-store.h" | 8 | #include "dm-exception-store.h" |
9 | 9 | ||
10 | #include <linux/ctype.h> | ||
10 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
11 | #include <linux/pagemap.h> | 12 | #include <linux/pagemap.h> |
12 | #include <linux/vmalloc.h> | 13 | #include <linux/vmalloc.h> |
@@ -843,8 +844,7 @@ static void persistent_drop_snapshot(struct dm_exception_store *store) | |||
843 | DMWARN("write header failed"); | 844 | DMWARN("write header failed"); |
844 | } | 845 | } |
845 | 846 | ||
846 | static int persistent_ctr(struct dm_exception_store *store, | 847 | static int persistent_ctr(struct dm_exception_store *store, char *options) |
847 | unsigned argc, char **argv) | ||
848 | { | 848 | { |
849 | struct pstore *ps; | 849 | struct pstore *ps; |
850 | 850 | ||
@@ -873,6 +873,16 @@ static int persistent_ctr(struct dm_exception_store *store, | |||
873 | return -ENOMEM; | 873 | return -ENOMEM; |
874 | } | 874 | } |
875 | 875 | ||
876 | if (options) { | ||
877 | char overflow = toupper(options[0]); | ||
878 | if (overflow == 'O') | ||
879 | store->userspace_supports_overflow = true; | ||
880 | else { | ||
881 | DMERR("Unsupported persistent store option: %s", options); | ||
882 | return -EINVAL; | ||
883 | } | ||
884 | } | ||
885 | |||
876 | store->context = ps; | 886 | store->context = ps; |
877 | 887 | ||
878 | return 0; | 888 | return 0; |
@@ -888,7 +898,8 @@ static unsigned persistent_status(struct dm_exception_store *store, | |||
888 | case STATUSTYPE_INFO: | 898 | case STATUSTYPE_INFO: |
889 | break; | 899 | break; |
890 | case STATUSTYPE_TABLE: | 900 | case STATUSTYPE_TABLE: |
891 | DMEMIT(" P %llu", (unsigned long long)store->chunk_size); | 901 | DMEMIT(" %s %llu", store->userspace_supports_overflow ? "PO" : "P", |
902 | (unsigned long long)store->chunk_size); | ||
892 | } | 903 | } |
893 | 904 | ||
894 | return sz; | 905 | return sz; |
diff --git a/drivers/md/dm-snap-transient.c b/drivers/md/dm-snap-transient.c index 1ce9a2586e41..9b7c8c8049d6 100644 --- a/drivers/md/dm-snap-transient.c +++ b/drivers/md/dm-snap-transient.c | |||
@@ -70,8 +70,7 @@ static void transient_usage(struct dm_exception_store *store, | |||
70 | *metadata_sectors = 0; | 70 | *metadata_sectors = 0; |
71 | } | 71 | } |
72 | 72 | ||
73 | static int transient_ctr(struct dm_exception_store *store, | 73 | static int transient_ctr(struct dm_exception_store *store, char *options) |
74 | unsigned argc, char **argv) | ||
75 | { | 74 | { |
76 | struct transient_c *tc; | 75 | struct transient_c *tc; |
77 | 76 | ||
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index c0bcd6516dfe..c06b74e91cd6 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -1098,7 +1098,7 @@ static void stop_merge(struct dm_snapshot *s) | |||
1098 | } | 1098 | } |
1099 | 1099 | ||
1100 | /* | 1100 | /* |
1101 | * Construct a snapshot mapping: <origin_dev> <COW-dev> <p/n> <chunk-size> | 1101 | * Construct a snapshot mapping: <origin_dev> <COW-dev> <p|po|n> <chunk-size> |
1102 | */ | 1102 | */ |
1103 | static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | 1103 | static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
1104 | { | 1104 | { |
@@ -1302,6 +1302,7 @@ static void __handover_exceptions(struct dm_snapshot *snap_src, | |||
1302 | 1302 | ||
1303 | u.store_swap = snap_dest->store; | 1303 | u.store_swap = snap_dest->store; |
1304 | snap_dest->store = snap_src->store; | 1304 | snap_dest->store = snap_src->store; |
1305 | snap_dest->store->userspace_supports_overflow = u.store_swap->userspace_supports_overflow; | ||
1305 | snap_src->store = u.store_swap; | 1306 | snap_src->store = u.store_swap; |
1306 | 1307 | ||
1307 | snap_dest->store->snap = snap_dest; | 1308 | snap_dest->store->snap = snap_dest; |
@@ -1739,8 +1740,11 @@ static int snapshot_map(struct dm_target *ti, struct bio *bio) | |||
1739 | 1740 | ||
1740 | pe = __find_pending_exception(s, pe, chunk); | 1741 | pe = __find_pending_exception(s, pe, chunk); |
1741 | if (!pe) { | 1742 | if (!pe) { |
1742 | s->snapshot_overflowed = 1; | 1743 | if (s->store->userspace_supports_overflow) { |
1743 | DMERR("Snapshot overflowed: Unable to allocate exception."); | 1744 | s->snapshot_overflowed = 1; |
1745 | DMERR("Snapshot overflowed: Unable to allocate exception."); | ||
1746 | } else | ||
1747 | __invalidate_snapshot(s, -ENOMEM); | ||
1744 | r = -EIO; | 1748 | r = -EIO; |
1745 | goto out_unlock; | 1749 | goto out_unlock; |
1746 | } | 1750 | } |
@@ -2365,7 +2369,7 @@ static struct target_type origin_target = { | |||
2365 | 2369 | ||
2366 | static struct target_type snapshot_target = { | 2370 | static struct target_type snapshot_target = { |
2367 | .name = "snapshot", | 2371 | .name = "snapshot", |
2368 | .version = {1, 14, 0}, | 2372 | .version = {1, 15, 0}, |
2369 | .module = THIS_MODULE, | 2373 | .module = THIS_MODULE, |
2370 | .ctr = snapshot_ctr, | 2374 | .ctr = snapshot_ctr, |
2371 | .dtr = snapshot_dtr, | 2375 | .dtr = snapshot_dtr, |
@@ -2379,7 +2383,7 @@ static struct target_type snapshot_target = { | |||
2379 | 2383 | ||
2380 | static struct target_type merge_target = { | 2384 | static struct target_type merge_target = { |
2381 | .name = dm_snapshot_merge_target_name, | 2385 | .name = dm_snapshot_merge_target_name, |
2382 | .version = {1, 3, 0}, | 2386 | .version = {1, 4, 0}, |
2383 | .module = THIS_MODULE, | 2387 | .module = THIS_MODULE, |
2384 | .ctr = snapshot_ctr, | 2388 | .ctr = snapshot_ctr, |
2385 | .dtr = snapshot_dtr, | 2389 | .dtr = snapshot_dtr, |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 6264781dc69a..1b5c6047e4f1 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -1001,6 +1001,7 @@ static void end_clone_bio(struct bio *clone) | |||
1001 | struct dm_rq_target_io *tio = info->tio; | 1001 | struct dm_rq_target_io *tio = info->tio; |
1002 | struct bio *bio = info->orig; | 1002 | struct bio *bio = info->orig; |
1003 | unsigned int nr_bytes = info->orig->bi_iter.bi_size; | 1003 | unsigned int nr_bytes = info->orig->bi_iter.bi_size; |
1004 | int error = clone->bi_error; | ||
1004 | 1005 | ||
1005 | bio_put(clone); | 1006 | bio_put(clone); |
1006 | 1007 | ||
@@ -1011,13 +1012,13 @@ static void end_clone_bio(struct bio *clone) | |||
1011 | * the remainder. | 1012 | * the remainder. |
1012 | */ | 1013 | */ |
1013 | return; | 1014 | return; |
1014 | else if (bio->bi_error) { | 1015 | else if (error) { |
1015 | /* | 1016 | /* |
1016 | * Don't notice the error to the upper layer yet. | 1017 | * Don't notice the error to the upper layer yet. |
1017 | * The error handling decision is made by the target driver, | 1018 | * The error handling decision is made by the target driver, |
1018 | * when the request is completed. | 1019 | * when the request is completed. |
1019 | */ | 1020 | */ |
1020 | tio->error = bio->bi_error; | 1021 | tio->error = error; |
1021 | return; | 1022 | return; |
1022 | } | 1023 | } |
1023 | 1024 | ||
@@ -2837,8 +2838,6 @@ static void __dm_destroy(struct mapped_device *md, bool wait) | |||
2837 | 2838 | ||
2838 | might_sleep(); | 2839 | might_sleep(); |
2839 | 2840 | ||
2840 | map = dm_get_live_table(md, &srcu_idx); | ||
2841 | |||
2842 | spin_lock(&_minor_lock); | 2841 | spin_lock(&_minor_lock); |
2843 | idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md)))); | 2842 | idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md)))); |
2844 | set_bit(DMF_FREEING, &md->flags); | 2843 | set_bit(DMF_FREEING, &md->flags); |
@@ -2852,14 +2851,14 @@ static void __dm_destroy(struct mapped_device *md, bool wait) | |||
2852 | * do not race with internal suspend. | 2851 | * do not race with internal suspend. |
2853 | */ | 2852 | */ |
2854 | mutex_lock(&md->suspend_lock); | 2853 | mutex_lock(&md->suspend_lock); |
2854 | map = dm_get_live_table(md, &srcu_idx); | ||
2855 | if (!dm_suspended_md(md)) { | 2855 | if (!dm_suspended_md(md)) { |
2856 | dm_table_presuspend_targets(map); | 2856 | dm_table_presuspend_targets(map); |
2857 | dm_table_postsuspend_targets(map); | 2857 | dm_table_postsuspend_targets(map); |
2858 | } | 2858 | } |
2859 | mutex_unlock(&md->suspend_lock); | ||
2860 | |||
2861 | /* dm_put_live_table must be before msleep, otherwise deadlock is possible */ | 2859 | /* dm_put_live_table must be before msleep, otherwise deadlock is possible */ |
2862 | dm_put_live_table(md, srcu_idx); | 2860 | dm_put_live_table(md, srcu_idx); |
2861 | mutex_unlock(&md->suspend_lock); | ||
2863 | 2862 | ||
2864 | /* | 2863 | /* |
2865 | * Rare, but there may be I/O requests still going to complete, | 2864 | * Rare, but there may be I/O requests still going to complete, |
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 2426db88db36..f04445b992f5 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
@@ -879,7 +879,7 @@ static void copy_spare(struct mtd_info *mtd, bool bfrom) | |||
879 | oob_chunk_size); | 879 | oob_chunk_size); |
880 | 880 | ||
881 | /* the last chunk */ | 881 | /* the last chunk */ |
882 | memcpy16_toio(&s[oob_chunk_size * sparebuf_size], | 882 | memcpy16_toio(&s[i * sparebuf_size], |
883 | &d[i * oob_chunk_size], | 883 | &d[i * oob_chunk_size], |
884 | host->used_oobsize - i * oob_chunk_size); | 884 | host->used_oobsize - i * oob_chunk_size); |
885 | } | 885 | } |
diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c index f97a58d6aae1..e7d333c162be 100644 --- a/drivers/mtd/nand/sunxi_nand.c +++ b/drivers/mtd/nand/sunxi_nand.c | |||
@@ -147,6 +147,10 @@ | |||
147 | #define NFC_ECC_MODE GENMASK(15, 12) | 147 | #define NFC_ECC_MODE GENMASK(15, 12) |
148 | #define NFC_RANDOM_SEED GENMASK(30, 16) | 148 | #define NFC_RANDOM_SEED GENMASK(30, 16) |
149 | 149 | ||
150 | /* NFC_USER_DATA helper macros */ | ||
151 | #define NFC_BUF_TO_USER_DATA(buf) ((buf)[0] | ((buf)[1] << 8) | \ | ||
152 | ((buf)[2] << 16) | ((buf)[3] << 24)) | ||
153 | |||
150 | #define NFC_DEFAULT_TIMEOUT_MS 1000 | 154 | #define NFC_DEFAULT_TIMEOUT_MS 1000 |
151 | 155 | ||
152 | #define NFC_SRAM_SIZE 1024 | 156 | #define NFC_SRAM_SIZE 1024 |
@@ -646,15 +650,9 @@ static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd, | |||
646 | offset = layout->eccpos[i * ecc->bytes] - 4 + mtd->writesize; | 650 | offset = layout->eccpos[i * ecc->bytes] - 4 + mtd->writesize; |
647 | 651 | ||
648 | /* Fill OOB data in */ | 652 | /* Fill OOB data in */ |
649 | if (oob_required) { | 653 | writel(NFC_BUF_TO_USER_DATA(chip->oob_poi + |
650 | tmp = 0xffffffff; | 654 | layout->oobfree[i].offset), |
651 | memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, &tmp, | 655 | nfc->regs + NFC_REG_USER_DATA_BASE); |
652 | 4); | ||
653 | } else { | ||
654 | memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, | ||
655 | chip->oob_poi + offset - mtd->writesize, | ||
656 | 4); | ||
657 | } | ||
658 | 656 | ||
659 | chip->cmdfunc(mtd, NAND_CMD_RNDIN, offset, -1); | 657 | chip->cmdfunc(mtd, NAND_CMD_RNDIN, offset, -1); |
660 | 658 | ||
@@ -784,14 +782,8 @@ static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd, | |||
784 | offset += ecc->size; | 782 | offset += ecc->size; |
785 | 783 | ||
786 | /* Fill OOB data in */ | 784 | /* Fill OOB data in */ |
787 | if (oob_required) { | 785 | writel(NFC_BUF_TO_USER_DATA(oob), |
788 | tmp = 0xffffffff; | 786 | nfc->regs + NFC_REG_USER_DATA_BASE); |
789 | memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, &tmp, | ||
790 | 4); | ||
791 | } else { | ||
792 | memcpy_toio(nfc->regs + NFC_REG_USER_DATA_BASE, oob, | ||
793 | 4); | ||
794 | } | ||
795 | 787 | ||
796 | tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ACCESS_DIR | | 788 | tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ACCESS_DIR | |
797 | (1 << 30); | 789 | (1 << 30); |
@@ -1389,6 +1381,7 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) | |||
1389 | node); | 1381 | node); |
1390 | nand_release(&chip->mtd); | 1382 | nand_release(&chip->mtd); |
1391 | sunxi_nand_ecc_cleanup(&chip->nand.ecc); | 1383 | sunxi_nand_ecc_cleanup(&chip->nand.ecc); |
1384 | list_del(&chip->node); | ||
1392 | } | 1385 | } |
1393 | } | 1386 | } |
1394 | 1387 | ||
diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c index 01bf3476a791..a9567af7cec0 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c | |||
@@ -192,9 +192,9 @@ static const struct regulator_desc axp22x_regulators[] = { | |||
192 | AXP_DESC(AXP22X, DCDC3, "dcdc3", "vin3", 600, 1860, 20, | 192 | AXP_DESC(AXP22X, DCDC3, "dcdc3", "vin3", 600, 1860, 20, |
193 | AXP22X_DCDC3_V_OUT, 0x3f, AXP22X_PWR_OUT_CTRL1, BIT(3)), | 193 | AXP22X_DCDC3_V_OUT, 0x3f, AXP22X_PWR_OUT_CTRL1, BIT(3)), |
194 | AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20, | 194 | AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20, |
195 | AXP22X_DCDC4_V_OUT, 0x3f, AXP22X_PWR_OUT_CTRL1, BIT(3)), | 195 | AXP22X_DCDC4_V_OUT, 0x3f, AXP22X_PWR_OUT_CTRL1, BIT(4)), |
196 | AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50, | 196 | AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50, |
197 | AXP22X_DCDC5_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(4)), | 197 | AXP22X_DCDC5_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL1, BIT(5)), |
198 | /* secondary switchable output of DCDC1 */ | 198 | /* secondary switchable output of DCDC1 */ |
199 | AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", "dcdc1", 1600, 3400, 100, | 199 | AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", "dcdc1", 1600, 3400, 100, |
200 | AXP22X_DCDC1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(7)), | 200 | AXP22X_DCDC1_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(7)), |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 7849187d91ae..8a34f6acc801 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -1403,6 +1403,10 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) | |||
1403 | return 0; | 1403 | return 0; |
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | /* Did the lookup explicitly defer for us? */ | ||
1407 | if (ret == -EPROBE_DEFER) | ||
1408 | return ret; | ||
1409 | |||
1406 | if (have_full_constraints()) { | 1410 | if (have_full_constraints()) { |
1407 | r = dummy_regulator_rdev; | 1411 | r = dummy_regulator_rdev; |
1408 | } else { | 1412 | } else { |
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index 3cf9faa6cc3f..a85d863d4a44 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c | |||
@@ -992,11 +992,12 @@ static int davinci_spi_probe(struct platform_device *pdev) | |||
992 | goto free_master; | 992 | goto free_master; |
993 | } | 993 | } |
994 | 994 | ||
995 | dspi->irq = platform_get_irq(pdev, 0); | 995 | ret = platform_get_irq(pdev, 0); |
996 | if (dspi->irq <= 0) { | 996 | if (ret == 0) |
997 | ret = -EINVAL; | 997 | ret = -EINVAL; |
998 | if (ret < 0) | ||
998 | goto free_master; | 999 | goto free_master; |
999 | } | 1000 | dspi->irq = ret; |
1000 | 1001 | ||
1001 | ret = devm_request_threaded_irq(&pdev->dev, dspi->irq, davinci_spi_irq, | 1002 | ret = devm_request_threaded_irq(&pdev->dev, dspi->irq, davinci_spi_irq, |
1002 | dummy_thread_fn, 0, dev_name(&pdev->dev), dspi); | 1003 | dummy_thread_fn, 0, dev_name(&pdev->dev), dspi); |
diff --git a/drivers/video/fbdev/broadsheetfb.c b/drivers/video/fbdev/broadsheetfb.c index 0e5fde1d3ffb..9f9a7bef1ff6 100644 --- a/drivers/video/fbdev/broadsheetfb.c +++ b/drivers/video/fbdev/broadsheetfb.c | |||
@@ -752,7 +752,7 @@ static ssize_t broadsheet_loadstore_waveform(struct device *dev, | |||
752 | if ((fw_entry->size < 8*1024) || (fw_entry->size > 64*1024)) { | 752 | if ((fw_entry->size < 8*1024) || (fw_entry->size > 64*1024)) { |
753 | dev_err(dev, "Invalid waveform\n"); | 753 | dev_err(dev, "Invalid waveform\n"); |
754 | err = -EINVAL; | 754 | err = -EINVAL; |
755 | goto err_failed; | 755 | goto err_fw; |
756 | } | 756 | } |
757 | 757 | ||
758 | mutex_lock(&(par->io_lock)); | 758 | mutex_lock(&(par->io_lock)); |
@@ -762,13 +762,15 @@ static ssize_t broadsheet_loadstore_waveform(struct device *dev, | |||
762 | mutex_unlock(&(par->io_lock)); | 762 | mutex_unlock(&(par->io_lock)); |
763 | if (err < 0) { | 763 | if (err < 0) { |
764 | dev_err(dev, "Failed to store broadsheet waveform\n"); | 764 | dev_err(dev, "Failed to store broadsheet waveform\n"); |
765 | goto err_failed; | 765 | goto err_fw; |
766 | } | 766 | } |
767 | 767 | ||
768 | dev_info(dev, "Stored broadsheet waveform, size %zd\n", fw_entry->size); | 768 | dev_info(dev, "Stored broadsheet waveform, size %zd\n", fw_entry->size); |
769 | 769 | ||
770 | return len; | 770 | err = len; |
771 | 771 | ||
772 | err_fw: | ||
773 | release_firmware(fw_entry); | ||
772 | err_failed: | 774 | err_failed: |
773 | return err; | 775 | return err; |
774 | } | 776 | } |
diff --git a/drivers/video/fbdev/fsl-diu-fb.c b/drivers/video/fbdev/fsl-diu-fb.c index 7fa2e6f9e322..b335c1ae8625 100644 --- a/drivers/video/fbdev/fsl-diu-fb.c +++ b/drivers/video/fbdev/fsl-diu-fb.c | |||
@@ -1628,9 +1628,16 @@ static int fsl_diu_suspend(struct platform_device *ofdev, pm_message_t state) | |||
1628 | static int fsl_diu_resume(struct platform_device *ofdev) | 1628 | static int fsl_diu_resume(struct platform_device *ofdev) |
1629 | { | 1629 | { |
1630 | struct fsl_diu_data *data; | 1630 | struct fsl_diu_data *data; |
1631 | unsigned int i; | ||
1631 | 1632 | ||
1632 | data = dev_get_drvdata(&ofdev->dev); | 1633 | data = dev_get_drvdata(&ofdev->dev); |
1633 | enable_lcdc(data->fsl_diu_info); | 1634 | |
1635 | fsl_diu_enable_interrupts(data); | ||
1636 | update_lcdc(data->fsl_diu_info); | ||
1637 | for (i = 0; i < NUM_AOIS; i++) { | ||
1638 | if (data->mfb[i].count) | ||
1639 | fsl_diu_enable_panel(&data->fsl_diu_info[i]); | ||
1640 | } | ||
1634 | 1641 | ||
1635 | return 0; | 1642 | return 0; |
1636 | } | 1643 | } |
diff --git a/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c b/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c index 9b8bebdf8f86..f9ec5c0484fa 100644 --- a/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c +++ b/drivers/video/fbdev/mb862xx/mb862xxfbdrv.c | |||
@@ -831,6 +831,7 @@ static struct of_device_id of_platform_mb862xx_tbl[] = { | |||
831 | { .compatible = "fujitsu,coral", }, | 831 | { .compatible = "fujitsu,coral", }, |
832 | { /* end */ } | 832 | { /* end */ } |
833 | }; | 833 | }; |
834 | MODULE_DEVICE_TABLE(of, of_platform_mb862xx_tbl); | ||
834 | 835 | ||
835 | static struct platform_driver of_platform_mb862xxfb_driver = { | 836 | static struct platform_driver of_platform_mb862xxfb_driver = { |
836 | .driver = { | 837 | .driver = { |
diff --git a/drivers/video/fbdev/omap2/displays-new/connector-dvi.c b/drivers/video/fbdev/omap2/displays-new/connector-dvi.c index a8ce920fa797..d811e6dcaef7 100644 --- a/drivers/video/fbdev/omap2/displays-new/connector-dvi.c +++ b/drivers/video/fbdev/omap2/displays-new/connector-dvi.c | |||
@@ -294,7 +294,7 @@ static int dvic_probe_of(struct platform_device *pdev) | |||
294 | 294 | ||
295 | adapter_node = of_parse_phandle(node, "ddc-i2c-bus", 0); | 295 | adapter_node = of_parse_phandle(node, "ddc-i2c-bus", 0); |
296 | if (adapter_node) { | 296 | if (adapter_node) { |
297 | adapter = of_find_i2c_adapter_by_node(adapter_node); | 297 | adapter = of_get_i2c_adapter_by_node(adapter_node); |
298 | if (adapter == NULL) { | 298 | if (adapter == NULL) { |
299 | dev_err(&pdev->dev, "failed to parse ddc-i2c-bus\n"); | 299 | dev_err(&pdev->dev, "failed to parse ddc-i2c-bus\n"); |
300 | omap_dss_put_device(ddata->in); | 300 | omap_dss_put_device(ddata->in); |
diff --git a/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c b/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c index 90cbc4c3406c..c581231c74a5 100644 --- a/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c +++ b/drivers/video/fbdev/omap2/displays-new/panel-sony-acx565akm.c | |||
@@ -898,6 +898,7 @@ static const struct of_device_id acx565akm_of_match[] = { | |||
898 | { .compatible = "omapdss,sony,acx565akm", }, | 898 | { .compatible = "omapdss,sony,acx565akm", }, |
899 | {}, | 899 | {}, |
900 | }; | 900 | }; |
901 | MODULE_DEVICE_TABLE(of, acx565akm_of_match); | ||
901 | 902 | ||
902 | static struct spi_driver acx565akm_driver = { | 903 | static struct spi_driver acx565akm_driver = { |
903 | .driver = { | 904 | .driver = { |
diff --git a/drivers/video/fbdev/tridentfb.c b/drivers/video/fbdev/tridentfb.c index 7ed9a227f5ea..01b43e9ce941 100644 --- a/drivers/video/fbdev/tridentfb.c +++ b/drivers/video/fbdev/tridentfb.c | |||
@@ -226,7 +226,7 @@ static void blade_image_blit(struct tridentfb_par *par, const char *data, | |||
226 | writemmr(par, DST1, point(x, y)); | 226 | writemmr(par, DST1, point(x, y)); |
227 | writemmr(par, DST2, point(x + w - 1, y + h - 1)); | 227 | writemmr(par, DST2, point(x + w - 1, y + h - 1)); |
228 | 228 | ||
229 | memcpy(par->io_virt + 0x10000, data, 4 * size); | 229 | iowrite32_rep(par->io_virt + 0x10000, data, size); |
230 | } | 230 | } |
231 | 231 | ||
232 | static void blade_copy_rect(struct tridentfb_par *par, | 232 | static void blade_copy_rect(struct tridentfb_par *par, |
@@ -673,8 +673,14 @@ static int get_nativex(struct tridentfb_par *par) | |||
673 | static inline void set_lwidth(struct tridentfb_par *par, int width) | 673 | static inline void set_lwidth(struct tridentfb_par *par, int width) |
674 | { | 674 | { |
675 | write3X4(par, VGA_CRTC_OFFSET, width & 0xFF); | 675 | write3X4(par, VGA_CRTC_OFFSET, width & 0xFF); |
676 | write3X4(par, AddColReg, | 676 | /* chips older than TGUI9660 have only 1 width bit in AddColReg */ |
677 | (read3X4(par, AddColReg) & 0xCF) | ((width & 0x300) >> 4)); | 677 | /* touching the other one breaks I2C/DDC */ |
678 | if (par->chip_id == TGUI9440 || par->chip_id == CYBER9320) | ||
679 | write3X4(par, AddColReg, | ||
680 | (read3X4(par, AddColReg) & 0xEF) | ((width & 0x100) >> 4)); | ||
681 | else | ||
682 | write3X4(par, AddColReg, | ||
683 | (read3X4(par, AddColReg) & 0xCF) | ((width & 0x300) >> 4)); | ||
678 | } | 684 | } |
679 | 685 | ||
680 | /* For resolutions smaller than FP resolution stretch */ | 686 | /* For resolutions smaller than FP resolution stretch */ |
diff --git a/drivers/video/of_display_timing.c b/drivers/video/of_display_timing.c index 32d8275e4c88..8a1076beecd3 100644 --- a/drivers/video/of_display_timing.c +++ b/drivers/video/of_display_timing.c | |||
@@ -210,6 +210,7 @@ struct display_timings *of_get_display_timings(struct device_node *np) | |||
210 | */ | 210 | */ |
211 | pr_err("%s: error in timing %d\n", | 211 | pr_err("%s: error in timing %d\n", |
212 | of_node_full_name(np), disp->num_timings + 1); | 212 | of_node_full_name(np), disp->num_timings + 1); |
213 | kfree(dt); | ||
213 | goto timingfail; | 214 | goto timingfail; |
214 | } | 215 | } |
215 | 216 | ||
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 295795aebe0b..1e60d00d4ea7 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2847,6 +2847,8 @@ int open_ctree(struct super_block *sb, | |||
2847 | !extent_buffer_uptodate(chunk_root->node)) { | 2847 | !extent_buffer_uptodate(chunk_root->node)) { |
2848 | printk(KERN_ERR "BTRFS: failed to read chunk root on %s\n", | 2848 | printk(KERN_ERR "BTRFS: failed to read chunk root on %s\n", |
2849 | sb->s_id); | 2849 | sb->s_id); |
2850 | if (!IS_ERR(chunk_root->node)) | ||
2851 | free_extent_buffer(chunk_root->node); | ||
2850 | chunk_root->node = NULL; | 2852 | chunk_root->node = NULL; |
2851 | goto fail_tree_roots; | 2853 | goto fail_tree_roots; |
2852 | } | 2854 | } |
@@ -2885,6 +2887,8 @@ retry_root_backup: | |||
2885 | !extent_buffer_uptodate(tree_root->node)) { | 2887 | !extent_buffer_uptodate(tree_root->node)) { |
2886 | printk(KERN_WARNING "BTRFS: failed to read tree root on %s\n", | 2888 | printk(KERN_WARNING "BTRFS: failed to read tree root on %s\n", |
2887 | sb->s_id); | 2889 | sb->s_id); |
2890 | if (!IS_ERR(tree_root->node)) | ||
2891 | free_extent_buffer(tree_root->node); | ||
2888 | tree_root->node = NULL; | 2892 | tree_root->node = NULL; |
2889 | goto recovery_tree_root; | 2893 | goto recovery_tree_root; |
2890 | } | 2894 | } |
diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 8d052209f473..2513a7f53334 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c | |||
@@ -112,11 +112,11 @@ static struct dentry *btrfs_fh_to_parent(struct super_block *sb, struct fid *fh, | |||
112 | u32 generation; | 112 | u32 generation; |
113 | 113 | ||
114 | if (fh_type == FILEID_BTRFS_WITH_PARENT) { | 114 | if (fh_type == FILEID_BTRFS_WITH_PARENT) { |
115 | if (fh_len != BTRFS_FID_SIZE_CONNECTABLE) | 115 | if (fh_len < BTRFS_FID_SIZE_CONNECTABLE) |
116 | return NULL; | 116 | return NULL; |
117 | root_objectid = fid->root_objectid; | 117 | root_objectid = fid->root_objectid; |
118 | } else if (fh_type == FILEID_BTRFS_WITH_PARENT_ROOT) { | 118 | } else if (fh_type == FILEID_BTRFS_WITH_PARENT_ROOT) { |
119 | if (fh_len != BTRFS_FID_SIZE_CONNECTABLE_ROOT) | 119 | if (fh_len < BTRFS_FID_SIZE_CONNECTABLE_ROOT) |
120 | return NULL; | 120 | return NULL; |
121 | root_objectid = fid->parent_root_objectid; | 121 | root_objectid = fid->parent_root_objectid; |
122 | } else | 122 | } else |
@@ -136,11 +136,11 @@ static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh, | |||
136 | u32 generation; | 136 | u32 generation; |
137 | 137 | ||
138 | if ((fh_type != FILEID_BTRFS_WITH_PARENT || | 138 | if ((fh_type != FILEID_BTRFS_WITH_PARENT || |
139 | fh_len != BTRFS_FID_SIZE_CONNECTABLE) && | 139 | fh_len < BTRFS_FID_SIZE_CONNECTABLE) && |
140 | (fh_type != FILEID_BTRFS_WITH_PARENT_ROOT || | 140 | (fh_type != FILEID_BTRFS_WITH_PARENT_ROOT || |
141 | fh_len != BTRFS_FID_SIZE_CONNECTABLE_ROOT) && | 141 | fh_len < BTRFS_FID_SIZE_CONNECTABLE_ROOT) && |
142 | (fh_type != FILEID_BTRFS_WITHOUT_PARENT || | 142 | (fh_type != FILEID_BTRFS_WITHOUT_PARENT || |
143 | fh_len != BTRFS_FID_SIZE_NON_CONNECTABLE)) | 143 | fh_len < BTRFS_FID_SIZE_NON_CONNECTABLE)) |
144 | return NULL; | 144 | return NULL; |
145 | 145 | ||
146 | objectid = fid->objectid; | 146 | objectid = fid->objectid; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 9f9604201333..601d7d45d164 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -2828,6 +2828,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2828 | struct btrfs_delayed_ref_head *head; | 2828 | struct btrfs_delayed_ref_head *head; |
2829 | int ret; | 2829 | int ret; |
2830 | int run_all = count == (unsigned long)-1; | 2830 | int run_all = count == (unsigned long)-1; |
2831 | bool can_flush_pending_bgs = trans->can_flush_pending_bgs; | ||
2831 | 2832 | ||
2832 | /* We'll clean this up in btrfs_cleanup_transaction */ | 2833 | /* We'll clean this up in btrfs_cleanup_transaction */ |
2833 | if (trans->aborted) | 2834 | if (trans->aborted) |
@@ -2844,6 +2845,7 @@ again: | |||
2844 | #ifdef SCRAMBLE_DELAYED_REFS | 2845 | #ifdef SCRAMBLE_DELAYED_REFS |
2845 | delayed_refs->run_delayed_start = find_middle(&delayed_refs->root); | 2846 | delayed_refs->run_delayed_start = find_middle(&delayed_refs->root); |
2846 | #endif | 2847 | #endif |
2848 | trans->can_flush_pending_bgs = false; | ||
2847 | ret = __btrfs_run_delayed_refs(trans, root, count); | 2849 | ret = __btrfs_run_delayed_refs(trans, root, count); |
2848 | if (ret < 0) { | 2850 | if (ret < 0) { |
2849 | btrfs_abort_transaction(trans, root, ret); | 2851 | btrfs_abort_transaction(trans, root, ret); |
@@ -2893,6 +2895,7 @@ again: | |||
2893 | } | 2895 | } |
2894 | out: | 2896 | out: |
2895 | assert_qgroups_uptodate(trans); | 2897 | assert_qgroups_uptodate(trans); |
2898 | trans->can_flush_pending_bgs = can_flush_pending_bgs; | ||
2896 | return 0; | 2899 | return 0; |
2897 | } | 2900 | } |
2898 | 2901 | ||
@@ -4306,7 +4309,8 @@ out: | |||
4306 | * the block groups that were made dirty during the lifetime of the | 4309 | * the block groups that were made dirty during the lifetime of the |
4307 | * transaction. | 4310 | * transaction. |
4308 | */ | 4311 | */ |
4309 | if (trans->chunk_bytes_reserved >= (2 * 1024 * 1024ull)) { | 4312 | if (trans->can_flush_pending_bgs && |
4313 | trans->chunk_bytes_reserved >= (2 * 1024 * 1024ull)) { | ||
4310 | btrfs_create_pending_block_groups(trans, trans->root); | 4314 | btrfs_create_pending_block_groups(trans, trans->root); |
4311 | btrfs_trans_release_chunk_metadata(trans); | 4315 | btrfs_trans_release_chunk_metadata(trans); |
4312 | } | 4316 | } |
@@ -9560,7 +9564,9 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | |||
9560 | struct btrfs_block_group_item item; | 9564 | struct btrfs_block_group_item item; |
9561 | struct btrfs_key key; | 9565 | struct btrfs_key key; |
9562 | int ret = 0; | 9566 | int ret = 0; |
9567 | bool can_flush_pending_bgs = trans->can_flush_pending_bgs; | ||
9563 | 9568 | ||
9569 | trans->can_flush_pending_bgs = false; | ||
9564 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) { | 9570 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, bg_list) { |
9565 | if (ret) | 9571 | if (ret) |
9566 | goto next; | 9572 | goto next; |
@@ -9581,6 +9587,7 @@ void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | |||
9581 | next: | 9587 | next: |
9582 | list_del_init(&block_group->bg_list); | 9588 | list_del_init(&block_group->bg_list); |
9583 | } | 9589 | } |
9590 | trans->can_flush_pending_bgs = can_flush_pending_bgs; | ||
9584 | } | 9591 | } |
9585 | 9592 | ||
9586 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, | 9593 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index e2357e31609a..3915c9473e94 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -3132,12 +3132,12 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, | |||
3132 | get_extent_t *get_extent, | 3132 | get_extent_t *get_extent, |
3133 | struct extent_map **em_cached, | 3133 | struct extent_map **em_cached, |
3134 | struct bio **bio, int mirror_num, | 3134 | struct bio **bio, int mirror_num, |
3135 | unsigned long *bio_flags, int rw) | 3135 | unsigned long *bio_flags, int rw, |
3136 | u64 *prev_em_start) | ||
3136 | { | 3137 | { |
3137 | struct inode *inode; | 3138 | struct inode *inode; |
3138 | struct btrfs_ordered_extent *ordered; | 3139 | struct btrfs_ordered_extent *ordered; |
3139 | int index; | 3140 | int index; |
3140 | u64 prev_em_start = (u64)-1; | ||
3141 | 3141 | ||
3142 | inode = pages[0]->mapping->host; | 3142 | inode = pages[0]->mapping->host; |
3143 | while (1) { | 3143 | while (1) { |
@@ -3153,7 +3153,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree, | |||
3153 | 3153 | ||
3154 | for (index = 0; index < nr_pages; index++) { | 3154 | for (index = 0; index < nr_pages; index++) { |
3155 | __do_readpage(tree, pages[index], get_extent, em_cached, bio, | 3155 | __do_readpage(tree, pages[index], get_extent, em_cached, bio, |
3156 | mirror_num, bio_flags, rw, &prev_em_start); | 3156 | mirror_num, bio_flags, rw, prev_em_start); |
3157 | page_cache_release(pages[index]); | 3157 | page_cache_release(pages[index]); |
3158 | } | 3158 | } |
3159 | } | 3159 | } |
@@ -3163,7 +3163,8 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3163 | int nr_pages, get_extent_t *get_extent, | 3163 | int nr_pages, get_extent_t *get_extent, |
3164 | struct extent_map **em_cached, | 3164 | struct extent_map **em_cached, |
3165 | struct bio **bio, int mirror_num, | 3165 | struct bio **bio, int mirror_num, |
3166 | unsigned long *bio_flags, int rw) | 3166 | unsigned long *bio_flags, int rw, |
3167 | u64 *prev_em_start) | ||
3167 | { | 3168 | { |
3168 | u64 start = 0; | 3169 | u64 start = 0; |
3169 | u64 end = 0; | 3170 | u64 end = 0; |
@@ -3184,7 +3185,7 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3184 | index - first_index, start, | 3185 | index - first_index, start, |
3185 | end, get_extent, em_cached, | 3186 | end, get_extent, em_cached, |
3186 | bio, mirror_num, bio_flags, | 3187 | bio, mirror_num, bio_flags, |
3187 | rw); | 3188 | rw, prev_em_start); |
3188 | start = page_start; | 3189 | start = page_start; |
3189 | end = start + PAGE_CACHE_SIZE - 1; | 3190 | end = start + PAGE_CACHE_SIZE - 1; |
3190 | first_index = index; | 3191 | first_index = index; |
@@ -3195,7 +3196,8 @@ static void __extent_readpages(struct extent_io_tree *tree, | |||
3195 | __do_contiguous_readpages(tree, &pages[first_index], | 3196 | __do_contiguous_readpages(tree, &pages[first_index], |
3196 | index - first_index, start, | 3197 | index - first_index, start, |
3197 | end, get_extent, em_cached, bio, | 3198 | end, get_extent, em_cached, bio, |
3198 | mirror_num, bio_flags, rw); | 3199 | mirror_num, bio_flags, rw, |
3200 | prev_em_start); | ||
3199 | } | 3201 | } |
3200 | 3202 | ||
3201 | static int __extent_read_full_page(struct extent_io_tree *tree, | 3203 | static int __extent_read_full_page(struct extent_io_tree *tree, |
@@ -4207,6 +4209,7 @@ int extent_readpages(struct extent_io_tree *tree, | |||
4207 | struct page *page; | 4209 | struct page *page; |
4208 | struct extent_map *em_cached = NULL; | 4210 | struct extent_map *em_cached = NULL; |
4209 | int nr = 0; | 4211 | int nr = 0; |
4212 | u64 prev_em_start = (u64)-1; | ||
4210 | 4213 | ||
4211 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { | 4214 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { |
4212 | page = list_entry(pages->prev, struct page, lru); | 4215 | page = list_entry(pages->prev, struct page, lru); |
@@ -4223,12 +4226,12 @@ int extent_readpages(struct extent_io_tree *tree, | |||
4223 | if (nr < ARRAY_SIZE(pagepool)) | 4226 | if (nr < ARRAY_SIZE(pagepool)) |
4224 | continue; | 4227 | continue; |
4225 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, | 4228 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, |
4226 | &bio, 0, &bio_flags, READ); | 4229 | &bio, 0, &bio_flags, READ, &prev_em_start); |
4227 | nr = 0; | 4230 | nr = 0; |
4228 | } | 4231 | } |
4229 | if (nr) | 4232 | if (nr) |
4230 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, | 4233 | __extent_readpages(tree, pagepool, nr, get_extent, &em_cached, |
4231 | &bio, 0, &bio_flags, READ); | 4234 | &bio, 0, &bio_flags, READ, &prev_em_start); |
4232 | 4235 | ||
4233 | if (em_cached) | 4236 | if (em_cached) |
4234 | free_extent_map(em_cached); | 4237 | free_extent_map(em_cached); |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index aa72bfd28f7d..a739b825bdd3 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
@@ -1920,10 +1920,12 @@ static int did_overwrite_ref(struct send_ctx *sctx, | |||
1920 | /* | 1920 | /* |
1921 | * We know that it is or will be overwritten. Check this now. | 1921 | * We know that it is or will be overwritten. Check this now. |
1922 | * The current inode being processed might have been the one that caused | 1922 | * The current inode being processed might have been the one that caused |
1923 | * inode 'ino' to be orphanized, therefore ow_inode can actually be the | 1923 | * inode 'ino' to be orphanized, therefore check if ow_inode matches |
1924 | * same as sctx->send_progress. | 1924 | * the current inode being processed. |
1925 | */ | 1925 | */ |
1926 | if (ow_inode <= sctx->send_progress) | 1926 | if ((ow_inode < sctx->send_progress) || |
1927 | (ino != sctx->cur_ino && ow_inode == sctx->cur_ino && | ||
1928 | gen == sctx->cur_inode_gen)) | ||
1927 | ret = 1; | 1929 | ret = 1; |
1928 | else | 1930 | else |
1929 | ret = 0; | 1931 | ret = 0; |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 74bc3338418b..a5b06442f0bf 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -557,6 +557,7 @@ again: | |||
557 | h->delayed_ref_elem.seq = 0; | 557 | h->delayed_ref_elem.seq = 0; |
558 | h->type = type; | 558 | h->type = type; |
559 | h->allocating_chunk = false; | 559 | h->allocating_chunk = false; |
560 | h->can_flush_pending_bgs = true; | ||
560 | h->reloc_reserved = false; | 561 | h->reloc_reserved = false; |
561 | h->sync = false; | 562 | h->sync = false; |
562 | INIT_LIST_HEAD(&h->qgroup_ref_list); | 563 | INIT_LIST_HEAD(&h->qgroup_ref_list); |
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 87964bf8892d..a994bb097ee5 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h | |||
@@ -118,6 +118,7 @@ struct btrfs_trans_handle { | |||
118 | short aborted; | 118 | short aborted; |
119 | short adding_csums; | 119 | short adding_csums; |
120 | bool allocating_chunk; | 120 | bool allocating_chunk; |
121 | bool can_flush_pending_bgs; | ||
121 | bool reloc_reserved; | 122 | bool reloc_reserved; |
122 | bool sync; | 123 | bool sync; |
123 | unsigned int type; | 124 | unsigned int type; |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 27aea110e923..c3cc1609025f 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
@@ -136,5 +136,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); | |||
136 | extern const struct export_operations cifs_export_ops; | 136 | extern const struct export_operations cifs_export_ops; |
137 | #endif /* CONFIG_CIFS_NFSD_EXPORT */ | 137 | #endif /* CONFIG_CIFS_NFSD_EXPORT */ |
138 | 138 | ||
139 | #define CIFS_VERSION "2.07" | 139 | #define CIFS_VERSION "2.08" |
140 | #endif /* _CIFSFS_H */ | 140 | #endif /* _CIFSFS_H */ |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index f621b44cb800..6b66dd5d1540 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -2034,7 +2034,6 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
2034 | struct tcon_link *tlink = NULL; | 2034 | struct tcon_link *tlink = NULL; |
2035 | struct cifs_tcon *tcon = NULL; | 2035 | struct cifs_tcon *tcon = NULL; |
2036 | struct TCP_Server_Info *server; | 2036 | struct TCP_Server_Info *server; |
2037 | struct cifs_io_parms io_parms; | ||
2038 | 2037 | ||
2039 | /* | 2038 | /* |
2040 | * To avoid spurious oplock breaks from server, in the case of | 2039 | * To avoid spurious oplock breaks from server, in the case of |
@@ -2056,18 +2055,6 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
2056 | rc = -ENOSYS; | 2055 | rc = -ENOSYS; |
2057 | cifsFileInfo_put(open_file); | 2056 | cifsFileInfo_put(open_file); |
2058 | cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc); | 2057 | cifs_dbg(FYI, "SetFSize for attrs rc = %d\n", rc); |
2059 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | ||
2060 | unsigned int bytes_written; | ||
2061 | |||
2062 | io_parms.netfid = open_file->fid.netfid; | ||
2063 | io_parms.pid = open_file->pid; | ||
2064 | io_parms.tcon = tcon; | ||
2065 | io_parms.offset = 0; | ||
2066 | io_parms.length = attrs->ia_size; | ||
2067 | rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, | ||
2068 | NULL, NULL, 1); | ||
2069 | cifs_dbg(FYI, "Wrt seteof rc %d\n", rc); | ||
2070 | } | ||
2071 | } else | 2058 | } else |
2072 | rc = -EINVAL; | 2059 | rc = -EINVAL; |
2073 | 2060 | ||
@@ -2093,28 +2080,7 @@ cifs_set_file_size(struct inode *inode, struct iattr *attrs, | |||
2093 | else | 2080 | else |
2094 | rc = -ENOSYS; | 2081 | rc = -ENOSYS; |
2095 | cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc); | 2082 | cifs_dbg(FYI, "SetEOF by path (setattrs) rc = %d\n", rc); |
2096 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | ||
2097 | __u16 netfid; | ||
2098 | int oplock = 0; | ||
2099 | 2083 | ||
2100 | rc = SMBLegacyOpen(xid, tcon, full_path, FILE_OPEN, | ||
2101 | GENERIC_WRITE, CREATE_NOT_DIR, &netfid, | ||
2102 | &oplock, NULL, cifs_sb->local_nls, | ||
2103 | cifs_remap(cifs_sb)); | ||
2104 | if (rc == 0) { | ||
2105 | unsigned int bytes_written; | ||
2106 | |||
2107 | io_parms.netfid = netfid; | ||
2108 | io_parms.pid = current->tgid; | ||
2109 | io_parms.tcon = tcon; | ||
2110 | io_parms.offset = 0; | ||
2111 | io_parms.length = attrs->ia_size; | ||
2112 | rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, NULL, | ||
2113 | NULL, 1); | ||
2114 | cifs_dbg(FYI, "wrt seteof rc %d\n", rc); | ||
2115 | CIFSSMBClose(xid, tcon, netfid); | ||
2116 | } | ||
2117 | } | ||
2118 | if (tlink) | 2084 | if (tlink) |
2119 | cifs_put_tlink(tlink); | 2085 | cifs_put_tlink(tlink); |
2120 | 2086 | ||
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index ce83e2edbe0a..597a417ba94d 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c | |||
@@ -922,7 +922,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree, | |||
922 | if (tcon && tcon->bad_network_name) | 922 | if (tcon && tcon->bad_network_name) |
923 | return -ENOENT; | 923 | return -ENOENT; |
924 | 924 | ||
925 | if ((tcon->seal) && | 925 | if ((tcon && tcon->seal) && |
926 | ((ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION) == 0)) { | 926 | ((ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION) == 0)) { |
927 | cifs_dbg(VFS, "encryption requested but no server support"); | 927 | cifs_dbg(VFS, "encryption requested but no server support"); |
928 | return -EOPNOTSUPP; | 928 | return -EOPNOTSUPP; |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f93b9cdb4934..5133bb18830e 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -1458,12 +1458,18 @@ nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state) | |||
1458 | if (delegation) | 1458 | if (delegation) |
1459 | delegation_flags = delegation->flags; | 1459 | delegation_flags = delegation->flags; |
1460 | rcu_read_unlock(); | 1460 | rcu_read_unlock(); |
1461 | if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) { | 1461 | switch (data->o_arg.claim) { |
1462 | default: | ||
1463 | break; | ||
1464 | case NFS4_OPEN_CLAIM_DELEGATE_CUR: | ||
1465 | case NFS4_OPEN_CLAIM_DELEG_CUR_FH: | ||
1462 | pr_err_ratelimited("NFS: Broken NFSv4 server %s is " | 1466 | pr_err_ratelimited("NFS: Broken NFSv4 server %s is " |
1463 | "returning a delegation for " | 1467 | "returning a delegation for " |
1464 | "OPEN(CLAIM_DELEGATE_CUR)\n", | 1468 | "OPEN(CLAIM_DELEGATE_CUR)\n", |
1465 | clp->cl_hostname); | 1469 | clp->cl_hostname); |
1466 | } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | 1470 | return; |
1471 | } | ||
1472 | if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0) | ||
1467 | nfs_inode_set_delegation(state->inode, | 1473 | nfs_inode_set_delegation(state->inode, |
1468 | data->owner->so_cred, | 1474 | data->owner->so_cred, |
1469 | &data->o_res); | 1475 | &data->o_res); |
@@ -1771,6 +1777,9 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, | |||
1771 | if (IS_ERR(opendata)) | 1777 | if (IS_ERR(opendata)) |
1772 | return PTR_ERR(opendata); | 1778 | return PTR_ERR(opendata); |
1773 | nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); | 1779 | nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); |
1780 | write_seqlock(&state->seqlock); | ||
1781 | nfs4_stateid_copy(&state->stateid, &state->open_stateid); | ||
1782 | write_sequnlock(&state->seqlock); | ||
1774 | clear_bit(NFS_DELEGATED_STATE, &state->flags); | 1783 | clear_bit(NFS_DELEGATED_STATE, &state->flags); |
1775 | switch (type & (FMODE_READ|FMODE_WRITE)) { | 1784 | switch (type & (FMODE_READ|FMODE_WRITE)) { |
1776 | case FMODE_READ|FMODE_WRITE: | 1785 | case FMODE_READ|FMODE_WRITE: |
@@ -1863,6 +1872,8 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) | |||
1863 | data->rpc_done = 0; | 1872 | data->rpc_done = 0; |
1864 | data->rpc_status = 0; | 1873 | data->rpc_status = 0; |
1865 | data->timestamp = jiffies; | 1874 | data->timestamp = jiffies; |
1875 | if (data->is_recover) | ||
1876 | nfs4_set_sequence_privileged(&data->c_arg.seq_args); | ||
1866 | task = rpc_run_task(&task_setup_data); | 1877 | task = rpc_run_task(&task_setup_data); |
1867 | if (IS_ERR(task)) | 1878 | if (IS_ERR(task)) |
1868 | return PTR_ERR(task); | 1879 | return PTR_ERR(task); |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 5db324635e92..d854693a15b0 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -1725,7 +1725,8 @@ restart: | |||
1725 | if (!test_and_clear_bit(ops->owner_flag_bit, | 1725 | if (!test_and_clear_bit(ops->owner_flag_bit, |
1726 | &sp->so_flags)) | 1726 | &sp->so_flags)) |
1727 | continue; | 1727 | continue; |
1728 | atomic_inc(&sp->so_count); | 1728 | if (!atomic_inc_not_zero(&sp->so_count)) |
1729 | continue; | ||
1729 | spin_unlock(&clp->cl_lock); | 1730 | spin_unlock(&clp->cl_lock); |
1730 | rcu_read_unlock(); | 1731 | rcu_read_unlock(); |
1731 | 1732 | ||
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 28df12e525ba..671cf68fe56b 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h | |||
@@ -409,7 +409,7 @@ DECLARE_EVENT_CLASS(nfs4_open_event, | |||
409 | __entry->flags = flags; | 409 | __entry->flags = flags; |
410 | __entry->fmode = (__force unsigned int)ctx->mode; | 410 | __entry->fmode = (__force unsigned int)ctx->mode; |
411 | __entry->dev = ctx->dentry->d_sb->s_dev; | 411 | __entry->dev = ctx->dentry->d_sb->s_dev; |
412 | if (!IS_ERR(state)) | 412 | if (!IS_ERR_OR_NULL(state)) |
413 | inode = state->inode; | 413 | inode = state->inode; |
414 | if (inode != NULL) { | 414 | if (inode != NULL) { |
415 | __entry->fileid = NFS_FILEID(inode); | 415 | __entry->fileid = NFS_FILEID(inode); |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 72624dc4a623..75ab7622e0cc 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -569,19 +569,17 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, | |||
569 | if (!nfs_pageio_add_request(pgio, req)) { | 569 | if (!nfs_pageio_add_request(pgio, req)) { |
570 | nfs_redirty_request(req); | 570 | nfs_redirty_request(req); |
571 | ret = pgio->pg_error; | 571 | ret = pgio->pg_error; |
572 | } | 572 | } else |
573 | nfs_add_stats(page_file_mapping(page)->host, | ||
574 | NFSIOS_WRITEPAGES, 1); | ||
573 | out: | 575 | out: |
574 | return ret; | 576 | return ret; |
575 | } | 577 | } |
576 | 578 | ||
577 | static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, struct nfs_pageio_descriptor *pgio) | 579 | static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, struct nfs_pageio_descriptor *pgio) |
578 | { | 580 | { |
579 | struct inode *inode = page_file_mapping(page)->host; | ||
580 | int ret; | 581 | int ret; |
581 | 582 | ||
582 | nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); | ||
583 | nfs_add_stats(inode, NFSIOS_WRITEPAGES, 1); | ||
584 | |||
585 | nfs_pageio_cond_complete(pgio, page_file_index(page)); | 583 | nfs_pageio_cond_complete(pgio, page_file_index(page)); |
586 | ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE); | 584 | ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE); |
587 | if (ret == -EAGAIN) { | 585 | if (ret == -EAGAIN) { |
@@ -597,9 +595,11 @@ static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, st | |||
597 | static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc) | 595 | static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc) |
598 | { | 596 | { |
599 | struct nfs_pageio_descriptor pgio; | 597 | struct nfs_pageio_descriptor pgio; |
598 | struct inode *inode = page_file_mapping(page)->host; | ||
600 | int err; | 599 | int err; |
601 | 600 | ||
602 | nfs_pageio_init_write(&pgio, page->mapping->host, wb_priority(wbc), | 601 | nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); |
602 | nfs_pageio_init_write(&pgio, inode, wb_priority(wbc), | ||
603 | false, &nfs_async_write_completion_ops); | 603 | false, &nfs_async_write_completion_ops); |
604 | err = nfs_do_writepage(page, wbc, &pgio); | 604 | err = nfs_do_writepage(page, wbc, &pgio); |
605 | nfs_pageio_complete(&pgio); | 605 | nfs_pageio_complete(&pgio); |
@@ -1223,7 +1223,7 @@ static int nfs_can_extend_write(struct file *file, struct page *page, struct ino | |||
1223 | return 1; | 1223 | return 1; |
1224 | if (!flctx || (list_empty_careful(&flctx->flc_flock) && | 1224 | if (!flctx || (list_empty_careful(&flctx->flc_flock) && |
1225 | list_empty_careful(&flctx->flc_posix))) | 1225 | list_empty_careful(&flctx->flc_posix))) |
1226 | return 0; | 1226 | return 1; |
1227 | 1227 | ||
1228 | /* Check to see if there are whole file write locks */ | 1228 | /* Check to see if there are whole file write locks */ |
1229 | ret = 0; | 1229 | ret = 0; |
diff --git a/include/xen/interface/sched.h b/include/xen/interface/sched.h index 9ce083960a25..f18490985fc8 100644 --- a/include/xen/interface/sched.h +++ b/include/xen/interface/sched.h | |||
@@ -107,5 +107,13 @@ struct sched_watchdog { | |||
107 | #define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ | 107 | #define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. */ |
108 | #define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ | 108 | #define SHUTDOWN_crash 3 /* Tell controller we've crashed. */ |
109 | #define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ | 109 | #define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. */ |
110 | /* | ||
111 | * Domain asked to perform 'soft reset' for it. The expected behavior is to | ||
112 | * reset internal Xen state for the domain returning it to the point where it | ||
113 | * was created but leaving the domain's memory contents and vCPU contexts | ||
114 | * intact. This will allow the domain to start over and set up all Xen specific | ||
115 | * interfaces again. | ||
116 | */ | ||
117 | #define SHUTDOWN_soft_reset 5 | ||
110 | 118 | ||
111 | #endif /* __XEN_PUBLIC_SCHED_H__ */ | 119 | #endif /* __XEN_PUBLIC_SCHED_H__ */ |
diff --git a/lib/string.c b/lib/string.c index 8dbb7b1eab50..84775ba873b9 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -203,12 +203,13 @@ ssize_t strscpy(char *dest, const char *src, size_t count) | |||
203 | unsigned long c, data; | 203 | unsigned long c, data; |
204 | 204 | ||
205 | c = *(unsigned long *)(src+res); | 205 | c = *(unsigned long *)(src+res); |
206 | *(unsigned long *)(dest+res) = c; | ||
207 | if (has_zero(c, &data, &constants)) { | 206 | if (has_zero(c, &data, &constants)) { |
208 | data = prep_zero_mask(c, data, &constants); | 207 | data = prep_zero_mask(c, data, &constants); |
209 | data = create_zero_mask(data); | 208 | data = create_zero_mask(data); |
209 | *(unsigned long *)(dest+res) = c & zero_bytemask(data); | ||
210 | return res + find_zero(data); | 210 | return res + find_zero(data); |
211 | } | 211 | } |
212 | *(unsigned long *)(dest+res) = c; | ||
212 | res += sizeof(unsigned long); | 213 | res += sizeof(unsigned long); |
213 | count -= sizeof(unsigned long); | 214 | count -= sizeof(unsigned long); |
214 | max -= sizeof(unsigned long); | 215 | max -= sizeof(unsigned long); |
diff --git a/mm/filemap.c b/mm/filemap.c index 72940fb38666..1cc5467cf36c 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -2473,6 +2473,21 @@ ssize_t generic_perform_write(struct file *file, | |||
2473 | iov_iter_count(i)); | 2473 | iov_iter_count(i)); |
2474 | 2474 | ||
2475 | again: | 2475 | again: |
2476 | /* | ||
2477 | * Bring in the user page that we will copy from _first_. | ||
2478 | * Otherwise there's a nasty deadlock on copying from the | ||
2479 | * same page as we're writing to, without it being marked | ||
2480 | * up-to-date. | ||
2481 | * | ||
2482 | * Not only is this an optimisation, but it is also required | ||
2483 | * to check that the address is actually valid, when atomic | ||
2484 | * usercopies are used, below. | ||
2485 | */ | ||
2486 | if (unlikely(iov_iter_fault_in_readable(i, bytes))) { | ||
2487 | status = -EFAULT; | ||
2488 | break; | ||
2489 | } | ||
2490 | |||
2476 | status = a_ops->write_begin(file, mapping, pos, bytes, flags, | 2491 | status = a_ops->write_begin(file, mapping, pos, bytes, flags, |
2477 | &page, &fsdata); | 2492 | &page, &fsdata); |
2478 | if (unlikely(status < 0)) | 2493 | if (unlikely(status < 0)) |
@@ -2480,17 +2495,8 @@ again: | |||
2480 | 2495 | ||
2481 | if (mapping_writably_mapped(mapping)) | 2496 | if (mapping_writably_mapped(mapping)) |
2482 | flush_dcache_page(page); | 2497 | flush_dcache_page(page); |
2483 | /* | 2498 | |
2484 | * 'page' is now locked. If we are trying to copy from a | ||
2485 | * mapping of 'page' in userspace, the copy might fault and | ||
2486 | * would need PageUptodate() to complete. But, page can not be | ||
2487 | * made Uptodate without acquiring the page lock, which we hold. | ||
2488 | * Deadlock. Avoid with pagefault_disable(). Fix up below with | ||
2489 | * iov_iter_fault_in_readable(). | ||
2490 | */ | ||
2491 | pagefault_disable(); | ||
2492 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); | 2499 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); |
2493 | pagefault_enable(); | ||
2494 | flush_dcache_page(page); | 2500 | flush_dcache_page(page); |
2495 | 2501 | ||
2496 | status = a_ops->write_end(file, mapping, pos, bytes, copied, | 2502 | status = a_ops->write_end(file, mapping, pos, bytes, copied, |
@@ -2513,14 +2519,6 @@ again: | |||
2513 | */ | 2519 | */ |
2514 | bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset, | 2520 | bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset, |
2515 | iov_iter_single_seg_count(i)); | 2521 | iov_iter_single_seg_count(i)); |
2516 | /* | ||
2517 | * This is the fallback to recover if the copy from | ||
2518 | * userspace above faults. | ||
2519 | */ | ||
2520 | if (unlikely(iov_iter_fault_in_readable(i, bytes))) { | ||
2521 | status = -EFAULT; | ||
2522 | break; | ||
2523 | } | ||
2524 | goto again; | 2522 | goto again; |
2525 | } | 2523 | } |
2526 | pos += copied; | 2524 | pos += copied; |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index cb5174284074..5f6ca47092b0 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | |||
@@ -136,7 +136,8 @@ int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt, | |||
136 | ctxt->direction = DMA_FROM_DEVICE; | 136 | ctxt->direction = DMA_FROM_DEVICE; |
137 | ctxt->read_hdr = head; | 137 | ctxt->read_hdr = head; |
138 | pages_needed = min_t(int, pages_needed, xprt->sc_max_sge_rd); | 138 | pages_needed = min_t(int, pages_needed, xprt->sc_max_sge_rd); |
139 | read = min_t(int, pages_needed << PAGE_SHIFT, rs_length); | 139 | read = min_t(int, (pages_needed << PAGE_SHIFT) - *page_offset, |
140 | rs_length); | ||
140 | 141 | ||
141 | for (pno = 0; pno < pages_needed; pno++) { | 142 | for (pno = 0; pno < pages_needed; pno++) { |
142 | int len = min_t(int, rs_length, PAGE_SIZE - pg_off); | 143 | int len = min_t(int, rs_length, PAGE_SIZE - pg_off); |
@@ -235,7 +236,8 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt, | |||
235 | ctxt->direction = DMA_FROM_DEVICE; | 236 | ctxt->direction = DMA_FROM_DEVICE; |
236 | ctxt->frmr = frmr; | 237 | ctxt->frmr = frmr; |
237 | pages_needed = min_t(int, pages_needed, xprt->sc_frmr_pg_list_len); | 238 | pages_needed = min_t(int, pages_needed, xprt->sc_frmr_pg_list_len); |
238 | read = min_t(int, pages_needed << PAGE_SHIFT, rs_length); | 239 | read = min_t(int, (pages_needed << PAGE_SHIFT) - *page_offset, |
240 | rs_length); | ||
239 | 241 | ||
240 | frmr->kva = page_address(rqstp->rq_arg.pages[pg_no]); | 242 | frmr->kva = page_address(rqstp->rq_arg.pages[pg_no]); |
241 | frmr->direction = DMA_FROM_DEVICE; | 243 | frmr->direction = DMA_FROM_DEVICE; |
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 64443eb754ad..41e452bc580c 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
@@ -270,8 +270,8 @@ xprt_rdma_destroy(struct rpc_xprt *xprt) | |||
270 | 270 | ||
271 | xprt_clear_connected(xprt); | 271 | xprt_clear_connected(xprt); |
272 | 272 | ||
273 | rpcrdma_buffer_destroy(&r_xprt->rx_buf); | ||
274 | rpcrdma_ep_destroy(&r_xprt->rx_ep, &r_xprt->rx_ia); | 273 | rpcrdma_ep_destroy(&r_xprt->rx_ep, &r_xprt->rx_ia); |
274 | rpcrdma_buffer_destroy(&r_xprt->rx_buf); | ||
275 | rpcrdma_ia_close(&r_xprt->rx_ia); | 275 | rpcrdma_ia_close(&r_xprt->rx_ia); |
276 | 276 | ||
277 | xprt_rdma_free_addresses(xprt); | 277 | xprt_rdma_free_addresses(xprt); |
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index eb081ad05e33..8a477e27bad7 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -755,19 +755,22 @@ rpcrdma_ep_destroy(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) | |||
755 | 755 | ||
756 | cancel_delayed_work_sync(&ep->rep_connect_worker); | 756 | cancel_delayed_work_sync(&ep->rep_connect_worker); |
757 | 757 | ||
758 | if (ia->ri_id->qp) { | 758 | if (ia->ri_id->qp) |
759 | rpcrdma_ep_disconnect(ep, ia); | 759 | rpcrdma_ep_disconnect(ep, ia); |
760 | |||
761 | rpcrdma_clean_cq(ep->rep_attr.recv_cq); | ||
762 | rpcrdma_clean_cq(ep->rep_attr.send_cq); | ||
763 | |||
764 | if (ia->ri_id->qp) { | ||
760 | rdma_destroy_qp(ia->ri_id); | 765 | rdma_destroy_qp(ia->ri_id); |
761 | ia->ri_id->qp = NULL; | 766 | ia->ri_id->qp = NULL; |
762 | } | 767 | } |
763 | 768 | ||
764 | rpcrdma_clean_cq(ep->rep_attr.recv_cq); | ||
765 | rc = ib_destroy_cq(ep->rep_attr.recv_cq); | 769 | rc = ib_destroy_cq(ep->rep_attr.recv_cq); |
766 | if (rc) | 770 | if (rc) |
767 | dprintk("RPC: %s: ib_destroy_cq returned %i\n", | 771 | dprintk("RPC: %s: ib_destroy_cq returned %i\n", |
768 | __func__, rc); | 772 | __func__, rc); |
769 | 773 | ||
770 | rpcrdma_clean_cq(ep->rep_attr.send_cq); | ||
771 | rc = ib_destroy_cq(ep->rep_attr.send_cq); | 774 | rc = ib_destroy_cq(ep->rep_attr.send_cq); |
772 | if (rc) | 775 | if (rc) |
773 | dprintk("RPC: %s: ib_destroy_cq returned %i\n", | 776 | dprintk("RPC: %s: ib_destroy_cq returned %i\n", |