commit:     c894a4336e2b325448b757f54c532361f781a813
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Apr  6 11:21:37 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Apr  6 11:21:37 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=c894a433

Linux patch 3.18.30

 0000_README              |   4 +
 1029_linux-3.18.30.patch | 689 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 693 insertions(+)

diff --git a/0000_README b/0000_README
index 51c140d..eee1fbe 100644
--- a/0000_README
+++ b/0000_README
@@ -159,6 +159,10 @@ Patch:  1028_linux-3.18.29.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.18.29
 
+Patch:  1029_linux-3.18.30.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.18.30
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1029_linux-3.18.30.patch b/1029_linux-3.18.30.patch
new file mode 100644
index 0000000..26bd181
--- /dev/null
+++ b/1029_linux-3.18.30.patch
@@ -0,0 +1,689 @@
+diff --git a/Makefile b/Makefile
+index 13063ba47412..cdc9cf7cb4dd 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 18
+-SUBLEVEL = 29
++SUBLEVEL = 30
+ EXTRAVERSION =
+ NAME = Diseased Newt
+ 
+diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
+index 666e796847d8..8ba02cb2955f 100644
+--- a/arch/arm/boot/dts/dra7.dtsi
++++ b/arch/arm/boot/dts/dra7.dtsi
+@@ -34,6 +34,8 @@
+               serial3 = &uart4;
+               serial4 = &uart5;
+               serial5 = &uart6;
++              ethernet0 = &cpsw_emac0;
++              ethernet1 = &cpsw_emac1;
+       };
+ 
+       timer {
+@@ -1265,6 +1267,75 @@
+                       ti,irqs-skip = <10 133 139 140>;
+                       ti,irqs-safe-map = <0>;
+               };
++
++              mac: ethernet@4a100000 {
++                      compatible = "ti,cpsw";
++                      ti,hwmods = "gmac";
++                      clocks = <&dpll_gmac_ck>, <&gmac_gmii_ref_clk_div>;
++                      clock-names = "fck", "cpts";
++                      cpdma_channels = <8>;
++                      ale_entries = <1024>;
++                      bd_ram_size = <0x2000>;
++                      no_bd_ram = <0>;
++                      rx_descs = <64>;
++                      mac_control = <0x20>;
++                      slaves = <2>;
++                      active_slave = <0>;
++                      cpts_clock_mult = <0x80000000>;
++                      cpts_clock_shift = <29>;
++                      reg = <0x48484000 0x1000
++                             0x48485200 0x2E00>;
++                      #address-cells = <1>;
++                      #size-cells = <1>;
++
++                      /*
++                       * Do not allow gating of cpsw clock as workaround
++                       * for errata i877. Keeping internal clock disabled
++                       * causes the device switching characteristics
++                       * to degrade over time and eventually fail to meet
++                       * the data manual delay time/skew specs.
++                       */
++                      ti,no-idle;
++
++                      /*
++                       * rx_thresh_pend
++                       * rx_pend
++                       * tx_pend
++                       * misc_pend
++                       */
++                      interrupts = <GIC_SPI 334 IRQ_TYPE_LEVEL_HIGH>,
++                                   <GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>,
++                                   <GIC_SPI 336 IRQ_TYPE_LEVEL_HIGH>,
++                                   <GIC_SPI 337 IRQ_TYPE_LEVEL_HIGH>;
++                      ranges;
++                      status = "disabled";
++
++                      davinci_mdio: mdio@48485000 {
++                              compatible = "ti,davinci_mdio";
++                              #address-cells = <1>;
++                              #size-cells = <0>;
++                              ti,hwmods = "davinci_mdio";
++                              bus_freq = <1000000>;
++                              reg = <0x48485000 0x100>;
++                      };
++
++                      cpsw_emac0: slave@48480200 {
++                              /* Filled in by U-Boot */
++                              mac-address = [ 00 00 00 00 00 00 ];
++                      };
++
++                      cpsw_emac1: slave@48480300 {
++                              /* Filled in by U-Boot */
++                              mac-address = [ 00 00 00 00 00 00 ];
++                      };
++
++                      phy_sel: cpsw-phy-sel@4a002554 {
++                              compatible = "ti,dra7xx-cpsw-phy-sel";
++                              reg= <0x4a002554 0x4>;
++                              reg-names = "gmii-sel";
++                      };
++              };
++
+       };
+ };
+ 
+diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
+index da2272811a31..33cba01d4f33 100644
+--- a/arch/arm64/kernel/Makefile
++++ b/arch/arm64/kernel/Makefile
+@@ -15,7 +15,7 @@ arm64-obj-y          := cputable.o debug-monitors.o entry.o 
irq.o fpsimd.o   \
+                          entry-fpsimd.o process.o ptrace.o setup.o signal.o   
\
+                          sys.o stacktrace.o time.o traps.o io.o vdso.o        
\
+                          hyp-stub.o psci.o cpu_ops.o insn.o return_address.o  
\
+-                         cpuinfo.o cpu_errata.o alternative.o
++                         cpuinfo.o cpu_errata.o alternative.o psci-call.o
+ 
+ arm64-obj-$(CONFIG_COMPAT)            += sys32.o kuser32.o signal32.o         
\
+                                          sys_compat.o
+diff --git a/arch/arm64/kernel/psci-call.S b/arch/arm64/kernel/psci-call.S
+new file mode 100644
+index 000000000000..cf83e61cd3b5
+--- /dev/null
++++ b/arch/arm64/kernel/psci-call.S
+@@ -0,0 +1,28 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * Copyright (C) 2015 ARM Limited
++ *
++ * Author: Will Deacon <will.dea...@arm.com>
++ */
++
++#include <linux/linkage.h>
++
++/* int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */
++ENTRY(__invoke_psci_fn_hvc)
++      hvc     #0
++      ret
++ENDPROC(__invoke_psci_fn_hvc)
++
++/* int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */
++ENTRY(__invoke_psci_fn_smc)
++      smc     #0
++      ret
++ENDPROC(__invoke_psci_fn_smc)
+diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
+index 663da771580a..81c081eaca42 100644
+--- a/arch/arm64/kernel/psci.c
++++ b/arch/arm64/kernel/psci.c
+@@ -57,6 +57,9 @@ static struct psci_operations psci_ops;
+ static int (*invoke_psci_fn)(u64, u64, u64, u64);
+ typedef int (*psci_initcall_t)(const struct device_node *);
+ 
++asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64);
++asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64);
++
+ enum psci_function {
+       PSCI_FN_CPU_SUSPEND,
+       PSCI_FN_CPU_ON,
+@@ -109,40 +112,6 @@ static void psci_power_state_unpack(u32 power_state,
+                       PSCI_0_2_POWER_STATE_AFFL_SHIFT;
+ }
+ 
+-/*
+- * The following two functions are invoked via the invoke_psci_fn pointer
+- * and will not be inlined, allowing us to piggyback on the AAPCS.
+- */
+-static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1,
+-                                       u64 arg2)
+-{
+-      asm volatile(
+-                      __asmeq("%0", "x0")
+-                      __asmeq("%1", "x1")
+-                      __asmeq("%2", "x2")
+-                      __asmeq("%3", "x3")
+-                      "hvc    #0\n"
+-              : "+r" (function_id)
+-              : "r" (arg0), "r" (arg1), "r" (arg2));
+-
+-      return function_id;
+-}
+-
+-static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1,
+-                                       u64 arg2)
+-{
+-      asm volatile(
+-                      __asmeq("%0", "x0")
+-                      __asmeq("%1", "x1")
+-                      __asmeq("%2", "x2")
+-                      __asmeq("%3", "x3")
+-                      "smc    #0\n"
+-              : "+r" (function_id)
+-              : "r" (arg0), "r" (arg1), "r" (arg2));
+-
+-      return function_id;
+-}
+-
+ static int psci_get_version(void)
+ {
+       int err;
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 155bb7f5ad28..9536ef912f59 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -2048,7 +2048,7 @@ config MIPS_CMP
+ 
+ config MIPS_CPS
+       bool "MIPS Coherent Processing System support"
+-      depends on SYS_SUPPORTS_MIPS_CPS && !64BIT
++      depends on SYS_SUPPORTS_MIPS_CPS
+       select MIPS_CM
+       select MIPS_CPC
+       select MIPS_CPS_PM if HOTPLUG_CPU
+diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S 
b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+index 3e9d73f58718..4329ea316683 100644
+--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+@@ -1284,6 +1284,20 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
+       std     r6, VCPU_ACOP(r9)
+       stw     r7, VCPU_GUEST_PID(r9)
+       std     r8, VCPU_WORT(r9)
++      /*
++       * Restore various registers to 0, where non-zero values
++       * set by the guest could disrupt the host.
++       */
++      li      r0, 0
++      mtspr   SPRN_IAMR, r0
++      mtspr   SPRN_CIABR, r0
++      mtspr   SPRN_DAWRX, r0
++      mtspr   SPRN_TCSCR, r0
++      mtspr   SPRN_WORT, r0
++      /* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */
++      li      r0, 1
++      sldi    r0, r0, 31
++      mtspr   SPRN_MMCRS, r0
+ 8:
+ 
+       /* Save and reset AMR and UAMOR before turning on the MMU */
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 84de207a8848..49cce7508a54 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -1600,6 +1600,13 @@ static void add_atomic_switch_msr(struct vcpu_vmx *vmx, 
unsigned msr,
+                       return;
+               }
+               break;
++      case MSR_IA32_PEBS_ENABLE:
++              /* PEBS needs a quiescent period after being disabled (to write
++               * a record).  Disabling PEBS through VMX MSR swapping doesn't
++               * provide that period, so a CPU could write host's record into
++               * guest's memory.
++               */
++              wrmsrl(MSR_IA32_PEBS_ENABLE, 0);
+       }
+ 
+       for (i = 0; i < m->nr; ++i)
+diff --git a/drivers/gpu/drm/radeon/radeon_pm.c 
b/drivers/gpu/drm/radeon/radeon_pm.c
+index d5ea5c106dd1..ab782e3f5d95 100644
+--- a/drivers/gpu/drm/radeon/radeon_pm.c
++++ b/drivers/gpu/drm/radeon/radeon_pm.c
+@@ -936,6 +936,8 @@ force:
+ 
+       /* update display watermarks based on new power state */
+       radeon_bandwidth_update(rdev);
++      /* update displays */
++      radeon_dpm_display_configuration_changed(rdev);
+ 
+       /* wait for the rings to drain */
+       for (i = 0; i < RADEON_NUM_RINGS; i++) {
+@@ -952,9 +954,6 @@ force:
+ 
+       radeon_dpm_post_set_power_state(rdev);
+ 
+-      /* update displays */
+-      radeon_dpm_display_configuration_changed(rdev);
+-
+       rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
+       rdev->pm.dpm.current_active_crtc_count = 
rdev->pm.dpm.new_active_crtc_count;
+       rdev->pm.dpm.single_display = single_display;
+diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
+index 009acc8641fc..09c23a5ba1d4 100644
+--- a/drivers/net/can/usb/gs_usb.c
++++ b/drivers/net/can/usb/gs_usb.c
+@@ -826,9 +826,8 @@ static struct gs_can *gs_make_candev(unsigned int channel, 
struct usb_interface
+ static void gs_destroy_candev(struct gs_can *dev)
+ {
+       unregister_candev(dev->netdev);
+-      free_candev(dev->netdev);
+       usb_kill_anchored_urbs(&dev->tx_submitted);
+-      kfree(dev);
++      free_candev(dev->netdev);
+ }
+ 
+ static int gs_usb_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
+@@ -911,12 +910,15 @@ static int gs_usb_probe(struct usb_interface *intf, 
const struct usb_device_id *
+       for (i = 0; i < icount; i++) {
+               dev->canch[i] = gs_make_candev(i, intf);
+               if (IS_ERR_OR_NULL(dev->canch[i])) {
++                      /* save error code to return later */
++                      rc = PTR_ERR(dev->canch[i]);
++
+                       /* on failure destroy previously created candevs */
+                       icount = i;
+-                      for (i = 0; i < icount; i++) {
++                      for (i = 0; i < icount; i++)
+                               gs_destroy_candev(dev->canch[i]);
+-                              dev->canch[i] = NULL;
+-                      }
++
++                      usb_kill_anchored_urbs(&dev->rx_submitted);
+                       kfree(dev);
+                       return rc;
+               }
+@@ -937,16 +939,12 @@ static void gs_usb_disconnect(struct usb_interface *intf)
+               return;
+       }
+ 
+-      for (i = 0; i < GS_MAX_INTF; i++) {
+-              struct gs_can *can = dev->canch[i];
+-
+-              if (!can)
+-                      continue;
+-
+-              gs_destroy_candev(can);
+-      }
++      for (i = 0; i < GS_MAX_INTF; i++)
++              if (dev->canch[i])
++                      gs_destroy_candev(dev->canch[i]);
+ 
+       usb_kill_anchored_urbs(&dev->rx_submitted);
++      kfree(dev);
+ }
+ 
+ static const struct usb_device_id gs_usb_table[] = {
+diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c 
b/drivers/net/wireless/iwlwifi/mvm/tx.c
+index 5928c9db49ce..98639fe2448b 100644
+--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
++++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
+@@ -359,6 +359,15 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct 
sk_buff *skb)
+               return -1;
+       }
+ 
++      /*
++       * Increase the pending frames counter, so that later when a reply comes
++       * in and the counter is decreased - we don't start getting negative
++       * values.
++       * Note that we don't need to make sure it isn't agg'd, since we're
++       * TXing non-sta
++       */
++      atomic_inc(&mvm->pending_frames[sta_id]);
++
+       return 0;
+ }
+ 
+diff --git a/drivers/target/target_core_tmr.c 
b/drivers/target/target_core_tmr.c
+index a5c2b3cf7d1a..05c0a90e11a9 100644
+--- a/drivers/target/target_core_tmr.c
++++ b/drivers/target/target_core_tmr.c
+@@ -181,7 +181,6 @@ void core_tmr_abort_task(
+ 
+               if (!__target_check_io_state(se_cmd, se_sess, 0)) {
+                       spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+-                      target_put_sess_cmd(se_cmd);
+                       goto out;
+               }
+ 
+diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
+index 8ffc4b980f1b..ddb1dc97859e 100644
+--- a/fs/overlayfs/dir.c
++++ b/fs/overlayfs/dir.c
+@@ -595,7 +595,8 @@ static int ovl_remove_upper(struct dentry *dentry, bool 
is_dir)
+        * sole user of this dentry.  Too tricky...  Just unhash for
+        * now.
+        */
+-      d_drop(dentry);
++      if (!err)
++              d_drop(dentry);
+       mutex_unlock(&dir->i_mutex);
+ 
+       return err;
+diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
+index e3903b74a1f2..8774ebb5d80a 100644
+--- a/fs/overlayfs/inode.c
++++ b/fs/overlayfs/inode.c
+@@ -53,6 +53,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
+       if (upperdentry) {
+               mutex_lock(&upperdentry->d_inode->i_mutex);
+               err = notify_change(upperdentry, attr, NULL);
++              if (!err)
++                      ovl_copyattr(upperdentry->d_inode, dentry->d_inode);
+               mutex_unlock(&upperdentry->d_inode->i_mutex);
+       } else {
+               err = ovl_copy_up_last(dentry, attr, false);
+diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
+index 72486551c4ca..e267dc488cdf 100644
+--- a/include/linux/tracepoint.h
++++ b/include/linux/tracepoint.h
+@@ -123,9 +123,6 @@ extern void syscall_unregfunc(void);
+               void *it_func;                                          \
+               void *__data;                                           \
+                                                                       \
+-              if (!cpu_online(raw_smp_processor_id()))                \
+-                      return;                                         \
+-                                                                      \
+               if (!(cond))                                            \
+                       return;                                         \
+               prercu;                                                 \
+@@ -324,15 +321,19 @@ extern void syscall_unregfunc(void);
+  * "void *__data, proto" as the callback prototype.
+  */
+ #define DECLARE_TRACE_NOARGS(name)                                    \
+-              __DECLARE_TRACE(name, void, , 1, void *__data, __data)
++      __DECLARE_TRACE(name, void, ,                                   \
++                      cpu_online(raw_smp_processor_id()),             \
++                      void *__data, __data)
+ 
+ #define DECLARE_TRACE(name, proto, args)                              \
+-              __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1,   \
+-                              PARAMS(void *__data, proto),            \
+-                              PARAMS(__data, args))
++      __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
++                      cpu_online(raw_smp_processor_id()),             \
++                      PARAMS(void *__data, proto),                    \
++                      PARAMS(__data, args))
+ 
+ #define DECLARE_TRACE_CONDITION(name, proto, args, cond)              \
+-      __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \
++      __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args),              \
++                      cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \
+                       PARAMS(void *__data, proto),                    \
+                       PARAMS(__data, args))
+ 
+diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h
+index a830b01baba4..e8aa72eaded5 100644
+--- a/include/net/iw_handler.h
++++ b/include/net/iw_handler.h
+@@ -439,6 +439,12 @@ int dev_get_wireless_info(char *buffer, char **start, 
off_t offset, int length);
+ /* Send a single event to user space */
+ void wireless_send_event(struct net_device *dev, unsigned int cmd,
+                        union iwreq_data *wrqu, const char *extra);
++#ifdef CONFIG_WEXT_CORE
++/* flush all previous wext events - if work is done from netdev notifiers */
++void wireless_nlevent_flush(void);
++#else
++static inline void wireless_nlevent_flush(void) {}
++#endif
+ 
+ /* We may need a function to send a stream of events to user space.
+  * More on that later... */
+diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
+index 7702978a4c99..f73fddfa548c 100644
+--- a/net/mac80211/agg-rx.c
++++ b/net/mac80211/agg-rx.c
+@@ -281,7 +281,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
+       }
+ 
+       /* prepare A-MPDU MLME for Rx aggregation */
+-      tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
++      tid_agg_rx = kzalloc(sizeof(*tid_agg_rx), GFP_KERNEL);
+       if (!tid_agg_rx)
+               goto end;
+ 
+diff --git a/net/mac80211/rc80211_minstrel_ht.c 
b/net/mac80211/rc80211_minstrel_ht.c
+index 408fd8ab4eef..0f632d6c6904 100644
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -557,7 +557,7 @@ minstrel_aggr_check(struct ieee80211_sta *pubsta, struct 
sk_buff *skb)
+       if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
+               return;
+ 
+-      ieee80211_start_tx_ba_session(pubsta, tid, 5000);
++      ieee80211_start_tx_ba_session(pubsta, tid, 0);
+ }
+ 
+ static void
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index a578c5717112..074cdfa04cc4 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -3171,6 +3171,7 @@ static bool prepare_for_handlers(struct 
ieee80211_rx_data *rx,
+                               return false;
+                       /* ignore action frames to TDLS-peers */
+                       if (ieee80211_is_action(hdr->frame_control) &&
++                          !is_broadcast_ether_addr(bssid) &&
+                           !ether_addr_equal(bssid, hdr->addr1))
+                               return false;
+               }
+diff --git a/net/wireless/core.c b/net/wireless/core.c
+index f52a4cd7017c..6c23065490d3 100644
+--- a/net/wireless/core.c
++++ b/net/wireless/core.c
+@@ -1039,6 +1039,8 @@ static int cfg80211_netdev_notifier_call(struct 
notifier_block *nb,
+               return NOTIFY_DONE;
+       }
+ 
++      wireless_nlevent_flush();
++
+       return NOTIFY_OK;
+ }
+ 
+diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c
+index c8717c1d082e..b50ee5d622e1 100644
+--- a/net/wireless/wext-core.c
++++ b/net/wireless/wext-core.c
+@@ -342,6 +342,40 @@ static const int compat_event_type_size[] = {
+ 
+ /* IW event code */
+ 
++void wireless_nlevent_flush(void)
++{
++      struct sk_buff *skb;
++      struct net *net;
++
++      ASSERT_RTNL();
++
++      for_each_net(net) {
++              while ((skb = skb_dequeue(&net->wext_nlevents)))
++                      rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL,
++                                  GFP_KERNEL);
++      }
++}
++EXPORT_SYMBOL_GPL(wireless_nlevent_flush);
++
++static int wext_netdev_notifier_call(struct notifier_block *nb,
++                                   unsigned long state, void *ptr)
++{
++      /*
++       * When a netdev changes state in any way, flush all pending messages
++       * to avoid them going out in a strange order, e.g. RTM_NEWLINK after
++       * RTM_DELLINK, or with IFF_UP after without IFF_UP during dev_close()
++       * or similar - all of which could otherwise happen due to delays from
++       * schedule_work().
++       */
++      wireless_nlevent_flush();
++
++      return NOTIFY_OK;
++}
++
++static struct notifier_block wext_netdev_notifier = {
++      .notifier_call = wext_netdev_notifier_call,
++};
++
+ static int __net_init wext_pernet_init(struct net *net)
+ {
+       skb_queue_head_init(&net->wext_nlevents);
+@@ -360,7 +394,12 @@ static struct pernet_operations wext_pernet_ops = {
+ 
+ static int __init wireless_nlevent_init(void)
+ {
+-      return register_pernet_subsys(&wext_pernet_ops);
++      int err = register_pernet_subsys(&wext_pernet_ops);
++
++      if (err)
++              return err;
++
++      return register_netdevice_notifier(&wext_netdev_notifier);
+ }
+ 
+ subsys_initcall(wireless_nlevent_init);
+@@ -368,17 +407,8 @@ subsys_initcall(wireless_nlevent_init);
+ /* Process events generated by the wireless layer or the driver. */
+ static void wireless_nlevent_process(struct work_struct *work)
+ {
+-      struct sk_buff *skb;
+-      struct net *net;
+-
+       rtnl_lock();
+-
+-      for_each_net(net) {
+-              while ((skb = skb_dequeue(&net->wext_nlevents)))
+-                      rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL,
+-                                  GFP_KERNEL);
+-      }
+-
++      wireless_nlevent_flush();
+       rtnl_unlock();
+ }
+ 
+diff --git a/scripts/ld-version.sh b/scripts/ld-version.sh
+index 198580d245e0..1659b409ef10 100755
+--- a/scripts/ld-version.sh
++++ b/scripts/ld-version.sh
+@@ -1,7 +1,7 @@
+ #!/usr/bin/awk -f
+ # extract linker version number from stdin and turn into single number
+       {
+-      gsub(".*)", "");
++      gsub(".*\\)", "");
+       split($1,a, ".");
+       print a[1]*10000000 + a[2]*100000 + a[3]*10000 + a[4]*100 + a[5];
+       exit
+diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c
+index 0dada7f0105e..92c3fa57b600 100644
+--- a/sound/soc/codecs/wm8958-dsp2.c
++++ b/sound/soc/codecs/wm8958-dsp2.c
+@@ -459,7 +459,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol 
*kcontrol,
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+       struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+       struct wm8994 *control = wm8994->wm8994;
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+       int reg;
+ 
+       /* Don't allow on the fly reconfiguration */
+@@ -549,7 +549,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol 
*kcontrol,
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+       struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+       struct wm8994 *control = wm8994->wm8994;
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+       int reg;
+ 
+       /* Don't allow on the fly reconfiguration */
+@@ -582,7 +582,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol 
*kcontrol,
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+       struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+       struct wm8994 *control = wm8994->wm8994;
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+       int reg;
+ 
+       /* Don't allow on the fly reconfiguration */
+@@ -749,7 +749,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol 
*kcontrol,
+       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+       struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+       struct wm8994 *control = wm8994->wm8994;
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+       int reg;
+ 
+       /* Don't allow on the fly reconfiguration */
+diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
+index e5f14c878636..ba7d8e95ba78 100644
+--- a/sound/soc/codecs/wm8994.c
++++ b/sound/soc/codecs/wm8994.c
+@@ -360,7 +360,7 @@ static int wm8994_put_drc_enum(struct snd_kcontrol 
*kcontrol,
+       struct wm8994 *control = wm8994->wm8994;
+       struct wm8994_pdata *pdata = &control->pdata;
+       int drc = wm8994_get_drc(kcontrol->id.name);
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+ 
+       if (drc < 0)
+               return drc;
+@@ -467,7 +467,7 @@ static int wm8994_put_retune_mobile_enum(struct 
snd_kcontrol *kcontrol,
+       struct wm8994 *control = wm8994->wm8994;
+       struct wm8994_pdata *pdata = &control->pdata;
+       int block = wm8994_get_retune_mobile_block(kcontrol->id.name);
+-      int value = ucontrol->value.integer.value[0];
++      int value = ucontrol->value.enumerated.item[0];
+ 
+       if (block < 0)
+               return block;
+diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
+index 67124783558a..7f2f661c6453 100644
+--- a/sound/soc/codecs/wm_adsp.c
++++ b/sound/soc/codecs/wm_adsp.c
+@@ -246,7 +246,7 @@ static int wm_adsp_fw_get(struct snd_kcontrol *kcontrol,
+       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+       struct wm_adsp *adsp = snd_soc_codec_get_drvdata(codec);
+ 
+-      ucontrol->value.integer.value[0] = adsp[e->shift_l].fw;
++      ucontrol->value.enumerated.item[0] = adsp[e->shift_l].fw;
+ 
+       return 0;
+ }
+@@ -258,16 +258,16 @@ static int wm_adsp_fw_put(struct snd_kcontrol *kcontrol,
+       struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
+       struct wm_adsp *adsp = snd_soc_codec_get_drvdata(codec);
+ 
+-      if (ucontrol->value.integer.value[0] == adsp[e->shift_l].fw)
++      if (ucontrol->value.enumerated.item[0] == adsp[e->shift_l].fw)
+               return 0;
+ 
+-      if (ucontrol->value.integer.value[0] >= WM_ADSP_NUM_FW)
++      if (ucontrol->value.enumerated.item[0] >= WM_ADSP_NUM_FW)
+               return -EINVAL;
+ 
+       if (adsp[e->shift_l].running)
+               return -EBUSY;
+ 
+-      adsp[e->shift_l].fw = ucontrol->value.integer.value[0];
++      adsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
+ 
+       return 0;
+ }

Reply via email to