Linux 4.4.33
Greg KH
maintainerI'm announcing the release of the 4.4.33 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arc/kernel/time.c | 19 ++- arch/mips/include/asm/kvm_host.h | 7 - arch/mips/kvm/emulate.c | 24 +++- arch/s390/hypfs/hypfs_diag.c | 6 - drivers/acpi/apei/ghes.c | 2 drivers/block/drbd/drbd_main.c | 2 drivers/char/hw_random/core.c | 6 - drivers/clk/clk-qoriq.c | 13 +- drivers/dma/at_xdmac.c | 18 +++ drivers/gpu/drm/i915/intel_hdmi.c | 84 +++++++++-------- drivers/iio/common/hid-sensors/hid-sensor-attributes.c | 56 +++++------ drivers/iio/orientation/hid-sensor-rotation.c | 1 drivers/iommu/amd_iommu.c | 3 drivers/iommu/intel-iommu.c | 14 ++ drivers/media/usb/dvb-usb/dib0700_core.c | 5 - drivers/misc/mei/bus-fixup.c | 2 drivers/mmc/host/mxs-mmc.c | 4 drivers/net/ethernet/intel/i40e/i40e_main.c | 2 drivers/nfc/mei_phy.c | 2 drivers/pinctrl/intel/pinctrl-cherryview.c | 17 ++- drivers/platform/x86/toshiba-wmi.c | 26 +++-- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 4 drivers/scsi/qla2xxx/qla_os.c | 2 drivers/staging/iio/impedance-analyzer/ad5933.c | 17 ++- drivers/staging/nvec/nvec_ps2.c | 8 - drivers/tty/serial/atmel_serial.c | 27 ++++- drivers/usb/class/cdc-acm.c | 2 drivers/usb/gadget/function/u_ether.c | 8 - fs/btrfs/inode.c | 9 + fs/coredump.c | 3 lib/genalloc.c | 3 mm/swapfile.c | 2 net/netfilter/nf_log.c | 6 - sound/core/info.c | 9 + sound/soc/codecs/cs4270.c | 8 - sound/soc/sunxi/sun4i-codec.c | 7 - 37 files changed, 268 insertions(+), 162 deletions(-)
Alexander Usyskin (1):
mei: bus: fix received data size check in NFC fixup
Andrew Lutomirski (1):
hwrng: core - Don't use a stack buffer in add_early_randomness()
Andrey Ryabinin (1):
coredump: fix unfreezable coredumping task
Arnd Bergmann (1):
staging: iio: ad5933: avoid uninitialized variable in error case
Azael Avalos (1):
toshiba-wmi: Fix loading the driver on non Toshiba laptops
Baoquan He (1):
iommu/amd: Free domain id when free a domain of struct dma_ops_domain
Bill Kuzeja (1):
scsi: qla2xxx: Fix scsi scan hang triggered if adapter fails during init
Chen-Yu Tsai (1):
ASoC: sun4i-codec: return error code instead of NULL when create_card fails
Daniel Mentz (1):
lib/genalloc.c: start search from start of chunk
Fabio Estevam (1):
mmc: mxs: Initialize the spinlock prior to using it
Felipe Balbi (1):
usb: gadget: u_ether: remove interrupt throttling
Goldwyn Rodrigues (1):
btrfs: qgroup: Prevent qgroup->reserved from going subzero
Greg Kroah-Hartman (1):
Linux 4.4.33
Huaibin Wang (1):
i40e: fix call of ndo_dflt_bridge_getlink()
James Hogan (1):
KVM: MIPS: Precalculate MMIO load resume PC
Jann Horn (2):
swapfile: fix memory corruption via malformed swapfile
netfilter: fix namespace handling in nf_log_proc_dostring
Joerg Roedel (1):
iommu/vt-d: Fix dead-locks in disable_dmar_iommu() path
Johan Hovold (1):
USB: cdc-acm: fix TIOCMIWAIT
Ludovic Desroches (1):
dmaengine: at_xdmac: fix spurious flag status for mem2mem transfers
Marc Dietrich (1):
staging: nvec: remove managed resource from PS2 driver
Michael Holzheu (1):
s390/hypfs: Use get_free_page() instead of kmalloc to ensure page alignment
Mika Westerberg (2):
pinctrl: cherryview: Serialize register access in suspend/resume
pinctrl: cherryview: Prevent possible interrupt storm on resume
Paul Fertser (2):
drivers: staging: nvec: remove bogus reset command for PS/2 interface Revert "staging: nvec: ps2: change serio type to passthrough"
Punit Agrawal (1):
ACPI / APEI: Fix incorrect return value of ghes_proc()
Richard Genoud (1):
tty/serial: at91: fix hardware handshake on Atmel platforms
Richard Weinberger (1):
drbd: Fix kernel_sendmsg() usage - potential NULL deref
Scott Wood (1):
clk: qoriq: Don't allow CPU clocks higher than starting value
Sean Young (1):
dib0700: fix nec repeat handling
Song Hongyan (2):
iio: hid-sensors: Increase the precision of scale to fix wrong reading interpretation.
iio: orientation: hid-sensor-rotation: Add PM function (fix non working driver)
Sreekanth Reddy (1):
scsi: mpt3sas: Fix for block device of raid exists even after deleting raid disk
Takashi Iwai (2):
ALSA: info: Return error for invalid read/write
ALSA: info: Limit the proc text input size
Ville Syrjälä (1):
drm/i915: Respect alternate_ddc_pin for all DDI ports
Vineet Gupta (1):
ARC: timer: rtc: implement read loop in "C" vs. inline asm
murray foster (1):
ASoC: cs4270: fix DAPM stream name mismatch
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 32 +SUBLEVEL = 33 EXTRAVERSION = NAME = Blurry Fish Butt
arch/arc/kernel/time.c +11 -8
@@ -130,14 +130,17 @@ static cycle_t arc_counter_read(struct clocksource *cs)cycle_t full; } stamp; - - __asm__ __volatile( - "1: \n" - " lr %0, [AUX_RTC_LOW] \n" - " lr %1, [AUX_RTC_HIGH] \n" - " lr %2, [AUX_RTC_CTRL] \n" - " bbit0.nt %2, 31, 1b \n" - : "=r" (stamp.low), "=r" (stamp.high), "=r" (status)); +/* +* hardware has an internal state machine which tracks readout of +* low/high and updates the CTRL.status if +* - interrupt/exception taken between the two reads +* - high increments after low has been read +*/ +do { + stamp.low =read_aux_reg (AUX_RTC_LOW ); + stamp.high =read_aux_reg (AUX_RTC_HIGH ); + status =read_aux_reg (AUX_RTC_CTRL ); + }while (!(status &_BITUL (31 )));return stamp.full; }
arch/mips/include/asm/kvm_host.h +4 -3
@@ -400,7 +400,10 @@ struct kvm_vcpu_arch {/* Host KSEG0 address of the EI/DI offset */ void *kseg0_commpage; -u32 io_gpr;/* GPR used as IO source/target */ +/* Resume PC after MMIO completion */ +unsigned long io_pc; +/* GPR used as IO source/target */ +u32 io_gpr;struct hrtimer comparecount_timer;/* Count timer control KVM register */
@@ -422,8 +425,6 @@ struct kvm_vcpu_arch {/* Bitmask of pending exceptions to be cleared */ unsigned long pending_exceptions_clr; -unsigned long pending_load_cause; -/* Save/Restore the entryhi register when are are preempted/scheduled back in */ unsigned long preempt_entryhi;
arch/mips/kvm/emulate.c +15 -9
@@ -1473,6 +1473,7 @@ enum emulation_result kvm_mips_emulate_load(uint32_t inst, uint32_t cause, struct kvm_vcpu *vcpu) {enum emulation_result er =EMULATE_DO_MMIO ; +unsigned long curr_pc;int32_t op, base, rt, offset;uint32_t bytes;
@@ -1481,7 +1482,18 @@ enum emulation_result kvm_mips_emulate_load(uint32_t inst, uint32_t cause, offset = inst &0xffff ; op = (inst >>26 ) &0x3f ; - vcpu->arch.pending_load_cause = cause; +/* +* Find the resume PC now while we have safe and easy access to the +* prior branch instruction, and save it for +* kvm_mips_complete_mmio_load() to restore later. +*/ + curr_pc = vcpu->arch.pc; + er =update_pc (vcpu, cause); +if (er ==EMULATE_FAIL ) +return er; + vcpu->arch.io_pc = vcpu->arch.pc; + vcpu->arch.pc = curr_pc; + vcpu->arch.io_gpr = rt;switch (op) {
@@ -2461,9 +2473,8 @@ enum emulation_result kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu, goto done; } - er =update_pc (vcpu, vcpu->arch.pending_load_cause); -if (er ==EMULATE_FAIL ) -return er; +/* Restore saved resume PC */ + vcpu->arch.pc = vcpu->arch.io_pc;switch (run->mmio.len) {case 4 :
@@ -2485,11 +2496,6 @@ enum emulation_result kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu,break ; } -if (vcpu->arch.pending_load_cause &CAUSEF_BD ) -kvm_debug ("[%#lx] Completing %d byte BD Load to gpr %d (0x%08lx) type %d\n" , - vcpu->arch.pc, run->mmio.len, vcpu->arch.io_gpr, *gpr, - vcpu->mmio_needed); - done:return er; }
arch/s390/hypfs/hypfs_diag.c +3 -3
@@ -525,11 +525,11 @@ static int diag224(void *ptr)static int diag224_get_name_table (void ) {/* memory must be below 2GB */ - diag224_cpu_names =kmalloc (PAGE_SIZE ,GFP_KERNEL |GFP_DMA ); + diag224_cpu_names = (char *)__get_free_page (GFP_KERNEL |GFP_DMA );if (!diag224_cpu_names)return -ENOMEM ;if (diag224 (diag224_cpu_names)) { -kfree (diag224_cpu_names); +free_page ((unsigned long ) diag224_cpu_names);return -EOPNOTSUPP ; }EBCASC (diag224_cpu_names +16 , (*diag224_cpu_names +1 ) *16 );
@@ -538,7 +538,7 @@ static int diag224_get_name_table(void)static void diag224_delete_name_table (void ) { -kfree (diag224_cpu_names); +free_page ((unsigned long ) diag224_cpu_names); }static int diag224_idx2name (int index,char *name)
drivers/acpi/apei/ghes.c +1 -1
@@ -657,7 +657,7 @@ static int ghes_proc(struct ghes *ghes)ghes_do_proc (ghes, ghes->estatus); out:ghes_clear_estatus (ghes); -return 0 ; +return rc; }static void ghes_add_timer (struct ghes *ghes)
drivers/block/drbd/drbd_main.c +1 -1
@@ -1802,7 +1802,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,* do we need to block DRBD_SIG if sock == &meta.socket ?? * otherwise wake_asender() might interrupt some send_*Ack ! */ - rv =kernel_sendmsg (sock, &msg, &iov,1 , size); + rv =kernel_sendmsg (sock, &msg, &iov,1 , iov.iov_len);if (rv == -EAGAIN ) {if (we_should_drop_the_connection (connection, sock))break ;
drivers/char/hw_random/core.c +3 -3
@@ -84,14 +84,14 @@ static size_t rng_buffer_size(void)static void add_early_randomness (struct hwrng *rng) { -unsigned char bytes[16 ];int bytes_read; +size_t size =min_t (size_t,16 ,rng_buffer_size ());mutex_lock (&reading_mutex); - bytes_read =rng_get_data (rng, bytes,sizeof (bytes),1 ); + bytes_read =rng_get_data (rng, rng_buffer, size,1 );mutex_unlock (&reading_mutex);if (bytes_read >0 ) -add_device_randomness (bytes, bytes_read); +add_device_randomness (rng_buffer, bytes_read); }static inline void cleanup_rng (struct kref *kref)
drivers/clk/clk-qoriq.c +8 -5
@@ -700,6 +700,7 @@ static struct clk * __init create_mux_common(struct clockgen *cg,struct mux_hwclock *hwc, const struct clk_ops *ops, unsigned long min_rate, + unsigned long max_rate, unsigned long pct80_rate, const char *fmt, int idx) {
@@ -728,6 +729,8 @@ static struct clk * __init create_mux_common(struct clockgen *cg,continue ;if (rate < min_rate)continue ; +if (rate > max_rate) +continue ; parent_names[j] = div->name; hwc->parent_to_clksel[j] = i;
@@ -759,7 +762,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)struct mux_hwclock *hwc;const struct clockgen_pll_div *div;unsigned long plat_rate, min_rate; -u64 pct80_rate; +u64 max_rate, pct80_rate;u32 clksel; hwc =kzalloc (sizeof (*hwc),GFP_KERNEL );
@@ -787,8 +790,8 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)return NULL ; } - pct80_rate =clk_get_rate (div->clk); - pct80_rate *=8 ; + max_rate =clk_get_rate (div->clk); + pct80_rate = max_rate *8 ;do_div (pct80_rate,10 ); plat_rate =clk_get_rate (cg->pll[PLATFORM_PLL ].div[PLL_DIV1 ].clk);
@@ -798,7 +801,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)else min_rate = plat_rate /2 ; -return create_mux_common (cg, hwc, &cmux_ops, min_rate, +return create_mux_common (cg, hwc, &cmux_ops, min_rate, max_rate, pct80_rate,"cg-cmux%d" , idx); }
@@ -813,7 +816,7 @@ static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx) hwc->reg = cg->regs +0x20 * idx +0x10 ; hwc->info = cg->info.hwaccel[idx]; -return create_mux_common (cg, hwc, &hwaccel_ops,0 ,0 , +return create_mux_common (cg, hwc, &hwaccel_ops,0 ,ULONG_MAX ,0 ,"cg-hwaccel%d" , idx); }
drivers/dma/at_xdmac.c +15 -3
@@ -864,8 +864,12 @@ at_xdmac_interleaved_queue_desc(struct dma_chan *chan,* access. Hopefully we can access DDR through both ports (at least on * SAMA5D4x), so we can use the same interface for source and dest, * that solves the fact we don't know the direction. +* ERRATA: Even if useless for memory transfers, the PERID has to not +* match the one of another channel. If not, it could lead to spurious +* flag status. */ -u32 chan_cc =AT_XDMAC_CC_DIF (0 ) +u32 chan_cc =AT_XDMAC_CC_PERID (0x3f ) + |AT_XDMAC_CC_DIF (0 ) |AT_XDMAC_CC_SIF (0 ) |AT_XDMAC_CC_MBSIZE_SIXTEEN |AT_XDMAC_CC_TYPE_MEM_TRAN ;
@@ -1042,8 +1046,12 @@ at_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,* access DDR through both ports (at least on SAMA5D4x), so we can use * the same interface for source and dest, that solves the fact we * don't know the direction. +* ERRATA: Even if useless for memory transfers, the PERID has to not +* match the one of another channel. If not, it could lead to spurious +* flag status. */ -u32 chan_cc =AT_XDMAC_CC_DAM_INCREMENTED_AM +u32 chan_cc =AT_XDMAC_CC_PERID (0x3f ) + |AT_XDMAC_CC_DAM_INCREMENTED_AM |AT_XDMAC_CC_SAM_INCREMENTED_AM |AT_XDMAC_CC_DIF (0 ) |AT_XDMAC_CC_SIF (0 )
@@ -1144,8 +1152,12 @@ static struct at_xdmac_desc *at_xdmac_memset_create_desc(struct dma_chan *chan,* access. Hopefully we can access DDR through both ports (at least on * SAMA5D4x), so we can use the same interface for source and dest, * that solves the fact we don't know the direction. +* ERRATA: Even if useless for memory transfers, the PERID has to not +* match the one of another channel. If not, it could lead to spurious +* flag status. */ -u32 chan_cc =AT_XDMAC_CC_DAM_UBS_AM +u32 chan_cc =AT_XDMAC_CC_PERID (0x3f ) + |AT_XDMAC_CC_DAM_UBS_AM |AT_XDMAC_CC_SAM_INCREMENTED_AM |AT_XDMAC_CC_DIF (0 ) |AT_XDMAC_CC_SIF (0 )
drivers/gpu/drm/i915/intel_hdmi.c +48 -36
119 lines not on this page · raw message
drivers/iio/common/hid-sensors/hid-sensor-attributes.c +28 -28
122 lines not on this page · raw message
drivers/iio/orientation/hid-sensor-rotation.c +1 -0
@@ -335,6 +335,7 @@ static struct platform_driver hid_dev_rot_platform_driver = { .id_table = hid_dev_rot_ids, .driver = { .name = KBUILD_MODNAME, + .pm = &hid_sensor_pm_ops, }, .probe = hid_dev_rot_probe, .remove = hid_dev_rot_remove,
drivers/iommu/amd_iommu.c +3 -0
@@ -1833,6 +1833,9 @@ static void dma_ops_domain_free(struct dma_ops_domain *dom)kfree (dom->aperture[i]); } +if (dom->domain.id) +domain_id_free (dom->domain.id); +kfree (dom); }
drivers/iommu/intel-iommu.c +12 -2
@@ -1672,6 +1672,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)if (!iommu->domains || !iommu->domain_ids)return ; +again:spin_lock_irqsave (&device_domain_lock, flags);list_for_each_entry_safe (info, tmp, &device_domain_list, global) {struct dmar_domain *domain;
@@ -1684,10 +1685,19 @@ static void disable_dmar_iommu(struct intel_iommu *iommu) domain = info->domain; -dmar_remove_one_dev_info (domain, info->dev); +__dmar_remove_one_dev_info (info); -if (!domain_type_is_vm_or_si (domain)) +if (!domain_type_is_vm_or_si (domain)) { +/* +* The domain_exit() function can't be called under +* device_domain_lock, as it takes this lock itself. +* So release the lock here and re-run the loop +* afterwards. +*/ +spin_unlock_irqrestore (&device_domain_lock, flags);domain_exit (domain); + goto again; + } }spin_unlock_irqrestore (&device_domain_lock, flags);
drivers/media/usb/dvb-usb/dib0700_core.c +3 -2
@@ -677,7 +677,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)struct dvb_usb_device *d = purb->context;struct dib0700_rc_response *poll_reply;enum rc_type protocol; -u32 uninitialized_var (keycode ); +u32 keycode;u8 toggle;deb_info ("%s()\n" , __func__);
@@ -719,7 +719,8 @@ static void dib0700_rc_urb_completion(struct urb *purb) poll_reply->nec.data == 0x00 && poll_reply->nec.not_data == 0xff) { poll_reply->data_state =2 ; -break ; +rc_repeat (d->rc_dev); + goto resubmit; }if ((poll_reply->nec.data ^ poll_reply->nec.not_data) !=0xff ) {
drivers/misc/mei/bus-fixup.c +1 -1
@@ -151,7 +151,7 @@ static int mei_nfc_if_version(struct mei_cl *cl, ret =0 ; bytes_recv =__mei_cl_recv (cl, (u8 *)reply, if_version_length); -if (bytes_recv <0 || bytes_recv <sizeof (struct mei_nfc_reply )) { +if (bytes_recv < if_version_length) {dev_err (bus->dev,"Could not read IF version\n" ); ret = -EIO ; goto err;
drivers/mmc/host/mxs-mmc.c +2 -2
@@ -661,13 +661,13 @@ static int mxs_mmc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, mmc); +spin_lock_init (&host->lock); + ret =devm_request_irq (&pdev->dev, irq_err, mxs_mmc_irq_handler,0 ,dev_name (&pdev->dev), host);if (ret) goto out_free_dma; -spin_lock_init (&host->lock); - ret =mmc_add_host (mmc);if (ret) goto out_free_dma;
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -8595,7 +8595,7 @@ static int i40e_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,return 0 ;return ndo_dflt_bridge_getlink (skb, pid, seq, dev, veb->bridge_mode, - nlflags,0 ,0 , filter_mask,NULL ); +0 ,0 , nlflags, filter_mask,NULL ); }#define I40E_MAX_TUNNEL_HDR_LEN 80
drivers/nfc/mei_phy.c +1 -1
@@ -133,7 +133,7 @@ static int mei_nfc_if_version(struct nfc_mei_phy *phy)return -ENOMEM ; bytes_recv =mei_cldev_recv (phy->cldev, (u8 *)reply, if_version_length); -if (bytes_recv <0 || bytes_recv <sizeof (struct mei_nfc_reply )) { +if (bytes_recv <0 || bytes_recv < if_version_length) {pr_err ("Could not read IF version\n" ); r = -EIO ; goto err;
drivers/pinctrl/intel/pinctrl-cherryview.c +14 -3
@@ -1564,12 +1564,15 @@ static int chv_pinctrl_remove(struct platform_device *pdev) }#ifdef CONFIG_PM_SLEEP -static int chv_pinctrl_suspend (struct device *dev) +static int chv_pinctrl_suspend_noirq (struct device *dev) {struct platform_device *pdev =to_platform_device (dev);struct chv_pinctrl *pctrl =platform_get_drvdata (pdev); +unsigned long flags;int i; +raw_spin_lock_irqsave (&chv_lock, flags); + pctrl->saved_intmask =readl (pctrl->regs +CHV_INTMASK );for (i =0 ; i < pctrl->community->npins; i++) {
@@ -1590,15 +1593,20 @@ static int chv_pinctrl_suspend(struct device *dev) ctx->padctrl1 =readl (reg); } +raw_spin_unlock_irqrestore (&chv_lock, flags); +return 0 ; } -static int chv_pinctrl_resume (struct device *dev) +static int chv_pinctrl_resume_noirq (struct device *dev) {struct platform_device *pdev =to_platform_device (dev);struct chv_pinctrl *pctrl =platform_get_drvdata (pdev); +unsigned long flags;int i; +raw_spin_lock_irqsave (&chv_lock, flags); +/* * Mask all interrupts before restoring per-pin configuration * registers because we don't know in which state BIOS left them
@@ -1643,12 +1651,15 @@ static int chv_pinctrl_resume(struct device *dev)chv_writel (0xffff , pctrl->regs +CHV_INTSTAT );chv_writel (pctrl->saved_intmask, pctrl->regs +CHV_INTMASK ); +raw_spin_unlock_irqrestore (&chv_lock, flags); +return 0 ; }#endif static const struct dev_pm_ops chv_pinctrl_pm_ops = { -SET_LATE_SYSTEM_SLEEP_PM_OPS (chv_pinctrl_suspend, chv_pinctrl_resume) +SET_NOIRQ_SYSTEM_SLEEP_PM_OPS (chv_pinctrl_suspend_noirq, + chv_pinctrl_resume_noirq) };static const struct acpi_device_id chv_pinctrl_acpi_match[] = {
drivers/platform/x86/toshiba-wmi.c +19 -7
@@ -24,14 +24,15 @@#include <linux/acpi.h> #include <linux/input.h> #include <linux/input/sparse-keymap.h> +#include <linux/dmi.h> MODULE_AUTHOR ("Azael Avalos" );MODULE_DESCRIPTION ("Toshiba WMI Hotkey Driver" );MODULE_LICENSE ("GPL" ); -#define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" +#define WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" -MODULE_ALIAS ("wmi:" TOSHIBA_WMI_EVENT_GUID ); +MODULE_ALIAS ("wmi:" WMI_EVENT_GUID );static struct input_dev *toshiba_wmi_input_dev;
@@ -63,6 +64,16 @@ static void toshiba_wmi_notify(u32 value, void *context)kfree (response.pointer); } +static struct dmi_system_id toshiba_wmi_dmi_table[]__initdata = { + { + .ident ="Toshiba laptop" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"TOSHIBA" ), + }, + }, + {} +}; +static int __init toshiba_wmi_input_setup (void ) {acpi_status status;
@@ -81,7 +92,7 @@ static int __init toshiba_wmi_input_setup(void)if (err) goto err_free_dev; - status =wmi_install_notify_handler (TOSHIBA_WMI_EVENT_GUID , + status =wmi_install_notify_handler (WMI_EVENT_GUID , toshiba_wmi_notify,NULL );if (ACPI_FAILURE (status)) { err = -EIO ;
@@ -95,7 +106,7 @@ static int __init toshiba_wmi_input_setup(void)return 0 ; err_remove_notifier: -wmi_remove_notify_handler (TOSHIBA_WMI_EVENT_GUID ); +wmi_remove_notify_handler (WMI_EVENT_GUID ); err_free_keymap:sparse_keymap_free (toshiba_wmi_input_dev); err_free_dev:
@@ -105,7 +116,7 @@ static int __init toshiba_wmi_input_setup(void)static void toshiba_wmi_input_destroy (void ) { -wmi_remove_notify_handler (TOSHIBA_WMI_EVENT_GUID ); +wmi_remove_notify_handler (WMI_EVENT_GUID );sparse_keymap_free (toshiba_wmi_input_dev);input_unregister_device (toshiba_wmi_input_dev); }
@@ -114,7 +125,8 @@ static int __init toshiba_wmi_init(void) {int ret; -if (!wmi_has_guid (TOSHIBA_WMI_EVENT_GUID )) +if (!wmi_has_guid (WMI_EVENT_GUID ) || + !dmi_check_system (toshiba_wmi_dmi_table))return -ENODEV ; ret =toshiba_wmi_input_setup ();
@@ -130,7 +142,7 @@ static int __init toshiba_wmi_init(void) static void __exit toshiba_wmi_exit(void) { -if (wmi_has_guid (TOSHIBA_WMI_EVENT_GUID )) +if (wmi_has_guid (WMI_EVENT_GUID ))toshiba_wmi_input_destroy (); }
drivers/scsi/mpt3sas/mpt3sas_scsih.c +2 -2
@@ -1275,9 +1275,9 @@ scsih_target_alloc(struct scsi_target *starget) sas_target_priv_data->handle = raid_device->handle; sas_target_priv_data->sas_address = raid_device->wwid; sas_target_priv_data->flags |=MPT_TARGET_FLAGS_VOLUME ; - sas_target_priv_data->raid_device = raid_device;if (ioc->is_warpdrive) - raid_device->starget = starget; + sas_target_priv_data->raid_device = raid_device; + raid_device->starget = starget; }spin_unlock_irqrestore (&ioc->raid_device_lock, flags);return 0 ;
drivers/scsi/qla2xxx/qla_os.c +2 -0
@@ -2257,6 +2257,8 @@ qla2xxx_scan_finished(struct Scsi_Host *shost, unsigned long time) {scsi_qla_host_t *vha =shost_priv (shost); +if (test_bit (UNLOADING , &vha->dpc_flags)) +return 1 ;if (!vha->host)return 1 ;if (time > vha->hw->loop_reset_delay *HZ )
drivers/staging/iio/impedance-analyzer/ad5933.c +10 -7
@@ -647,6 +647,7 @@ static void ad5933_work(struct work_struct *work)__be16 buf[2 ];int val[2 ];unsigned char status; +int ret;mutex_lock (&indio_dev->mlock);if (st->state ==AD5933_CTRL_INIT_START_FREQ ) {
@@ -654,19 +655,22 @@ static void ad5933_work(struct work_struct *work)ad5933_cmd (st,AD5933_CTRL_START_SWEEP ); st->state =AD5933_CTRL_START_SWEEP ;schedule_delayed_work (&st->work, st->poll_time_jiffies); -mutex_unlock (&indio_dev->mlock); -return ; + goto out; } -ad5933_i2c_read (st->client,AD5933_REG_STATUS ,1 , &status); + ret =ad5933_i2c_read (st->client,AD5933_REG_STATUS ,1 , &status); +if (ret) + goto out;if (status &AD5933_STAT_DATA_VALID ) {int scan_count =bitmap_weight (indio_dev->active_scan_mask, indio_dev->masklength); -ad5933_i2c_read (st->client, + ret =ad5933_i2c_read (st->client,test_bit (1 , indio_dev->active_scan_mask) ?AD5933_REG_REAL_DATA :AD5933_REG_IMAG_DATA , scan_count *2 , (u8 *)buf); +if (ret) + goto out;if (scan_count ==2 ) { val[0 ] =be16_to_cpu (buf[0 ]);
@@ -678,8 +682,7 @@ static void ad5933_work(struct work_struct *work) }else {/* no data available - try again later */ schedule_delayed_work (&st->work, st->poll_time_jiffies); -mutex_unlock (&indio_dev->mlock); -return ; + goto out; }if (status &AD5933_STAT_SWEEP_DONE ) {
@@ -691,7 +694,7 @@ static void ad5933_work(struct work_struct *work)ad5933_cmd (st,AD5933_CTRL_INC_FREQ );schedule_delayed_work (&st->work, st->poll_time_jiffies); } - +out:mutex_unlock (&indio_dev->mlock); }
drivers/staging/nvec/nvec_ps2.c +2 -6
@@ -106,13 +106,12 @@ static int nvec_mouse_probe(struct platform_device *pdev) {struct nvec_chip *nvec =dev_get_drvdata (pdev->dev.parent);struct serio *ser_dev; -char mouse_reset[] = {NVEC_PS2 ,SEND_COMMAND ,PSMOUSE_RST ,3 }; - ser_dev =devm_kzalloc (&pdev->dev,sizeof (struct serio ),GFP_KERNEL ); + ser_dev =kzalloc (sizeof (struct serio ),GFP_KERNEL );if (!ser_dev)return -ENOMEM ; - ser_dev->id.type =SERIO_PS_PSTHRU ; + ser_dev->id.type =SERIO_8042 ; ser_dev->write = ps2_sendcommand; ser_dev->start = ps2_startstreaming; ser_dev->stop = ps2_stopstreaming;
@@ -127,9 +126,6 @@ static int nvec_mouse_probe(struct platform_device *pdev)serio_register_port (ser_dev); -/* mouse reset */ -nvec_write_async (nvec, mouse_reset,sizeof (mouse_reset)); -return 0 ; }
drivers/tty/serial/atmel_serial.c +23 -4
@@ -2075,6 +2075,7 @@ static void atmel_serial_pm(struct uart_port *port, unsigned int state,static void atmel_set_termios (struct uart_port *port,struct ktermios *termios,struct ktermios *old) { +struct atmel_uart_port *atmel_port =to_atmel_uart_port (port);unsigned long flags;unsigned int old_mode, mode, imr, quot, baud;
@@ -2178,11 +2179,29 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, mode |=ATMEL_US_USMODE_RS485 ; }else if (termios->c_cflag &CRTSCTS ) {/* RS232 with hardware handshake (RTS/CTS) */ -if (atmel_use_dma_rx (port) && !atmel_use_fifo (port)) { -dev_info (port->dev,"not enabling hardware flow control because DMA is used" ); - termios->c_cflag &= ~CRTSCTS ; - }else { +if (atmel_use_fifo (port) && + !mctrl_gpio_to_gpiod (atmel_port->gpios,UART_GPIO_CTS )) { +/* +* with ATMEL_US_USMODE_HWHS set, the controller will +* be able to drive the RTS pin high/low when the RX +* FIFO is above RXFTHRES/below RXFTHRES2. +* It will also disable the transmitter when the CTS +* pin is high. +* This mode is not activated if CTS pin is a GPIO +* because in this case, the transmitter is always +* disabled (there must be an internal pull-up +* responsible for this behaviour). +* If the RTS pin is a GPIO, the controller won't be +* able to drive it according to the FIFO thresholds, +* but it will be handled by the driver. +*/ mode |=ATMEL_US_USMODE_HWHS ; + }else { +/* +* For platforms without FIFO, the flow control is +* handled by the driver. +*/ + mode |=ATMEL_US_USMODE_NORMAL ; } }else {/* RS232 without hadware handshake */
drivers/usb/class/cdc-acm.c +0 -2
@@ -877,8 +877,6 @@ static int wait_serial_change(struct acm *acm, unsigned long arg)DECLARE_WAITQUEUE (wait, current);struct async_icount old, new; -if (arg & (TIOCM_DSR |TIOCM_RI |TIOCM_CD )) -return -EINVAL ; do { spin_lock_irq(&acm->read_lock); old = acm->oldcount;
drivers/usb/gadget/function/u_ether.c +0 -8
@@ -594,14 +594,6 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb, req->length = length; -/* throttle high/super speed IRQ rate back slightly */ -if (gadget_is_dualspeed (dev->gadget)) - req->no_interrupt = (((dev->gadget->speed ==USB_SPEED_HIGH || - dev->gadget->speed ==USB_SPEED_SUPER )) && - !list_empty (&dev->tx_reqs)) - ? ((atomic_read (&dev->tx_qlen) % dev->qmult) !=0 ) - :0 ; - retval =usb_ep_queue (in, req,GFP_ATOMIC );switch (retval) {default :
fs/btrfs/inode.c +7 -2
@@ -8691,9 +8691,14 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,* So even we call qgroup_free_data(), it won't decrease reserved * space. * 2) Not written to disk -* This means the reserved space should be freed here. +* This means the reserved space should be freed here. However, +* if a truncate invalidates the page (by clearing PageDirty) +* and the page is accounted for while allocating extent +* in btrfs_check_data_free_space() we let delayed_ref to +* free the entire extent. */ -btrfs_qgroup_free_data (inode, page_start,PAGE_CACHE_SIZE ); +if (PageDirty (page)) +btrfs_qgroup_free_data (inode, page_start,PAGE_SIZE );if (!inode_evicting) { clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED | EXTENT_DIRTY |
fs/coredump.c +3 -0
@@ -1,6 +1,7 @@#include <linux/slab.h> #include <linux/file.h> #include <linux/fdtable.h> +#include <linux/freezer.h> #include <linux/mm.h> #include <linux/stat.h> #include <linux/fcntl.h>
@@ -399,7 +400,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state)if (core_waiters >0 ) {struct core_thread *ptr; +freezer_do_not_count ();wait_for_completion (&core_state->startup); +freezer_count ();/* * Wait for all the threads to become inactive, so that * all the thread context (extended register state, like
lib/genalloc.c +2 -1
@@ -273,7 +273,7 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)struct gen_pool_chunk *chunk;unsigned long addr =0 ;int order = pool->min_alloc_order; -int nbits, start_bit =0 , end_bit, remain; +int nbits, start_bit, end_bit, remain;#ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG BUG_ON (in_nmi ());
@@ -288,6 +288,7 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)if (size >atomic_read (&chunk->avail))continue ; + start_bit =0 ; end_bit =chunk_size (chunk) >> order; retry: start_bit = pool->algo(chunk->bits, end_bit, start_bit, nbits,
mm/swapfile.c +2 -0
@@ -2225,6 +2225,8 @@ static unsigned long read_swap_header(struct swap_info_struct *p,swab32s (&swap_header->info.version);swab32s (&swap_header->info.last_page);swab32s (&swap_header->info.nr_badpages); +if (swap_header->info.nr_badpages >MAX_SWAP_BADPAGES ) +return 0 ;for (i =0 ; i < swap_header->info.nr_badpages; i++)swab32s (&swap_header->info.badpages[i]); }
net/netfilter/nf_log.c +4 -2
@@ -401,7 +401,7 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write,size_t size = *lenp;int r =0 ;int tindex = (unsigned long )table->extra1; -struct net *net = current->nsproxy->net_ns; +struct net *net = table->extra2;if (write) {if (size >sizeof (buf))
@@ -453,7 +453,6 @@ static int netfilter_log_sysctl_init(struct net *net) 3, "%d", i); nf_log_sysctl_table[i].procname = nf_log_sysctl_fnames[i]; - nf_log_sysctl_table[i].data =NULL ; nf_log_sysctl_table[i].maxlen =NFLOGGER_NAME_LEN ; nf_log_sysctl_table[i].mode =0644 ; nf_log_sysctl_table[i].proc_handler =
@@ -463,6 +462,9 @@ static int netfilter_log_sysctl_init(struct net *net) } } +for (i =NFPROTO_UNSPEC ; i <NFPROTO_NUMPROTO ; i++) + table[i].extra2 = net; + net->nf.nf_log_dir_header =register_net_sysctl (net,"net/netfilter/nf_log" , table);
sound/core/info.c +8 -1
@@ -325,10 +325,15 @@ static ssize_t snd_info_text_entry_write(struct file *file,size_t next;int err =0 ; +if (!entry->c.text.write) +return -EIO ; pos = *offset;if (!valid_pos (pos, count))return -EIO ; next = pos + count; +/* don't handle too large text inputs */ +if (next >16 *1024 ) +return -EIO ;mutex_lock (&entry->access); buf = data->wbuffer;if (!buf) {
@@ -366,7 +371,9 @@ static int snd_info_seq_show(struct seq_file *seq, void *p)struct snd_info_private_data *data = seq->private;struct snd_info_entry *entry = data->entry; -if (entry->c.text.read) { +if (!entry->c.text.read) { +return -EIO ; + }else { data->rbuffer->buffer = (char *)seq;/* XXX hack! */ entry->c.text.read (entry, data->rbuffer); }
sound/soc/codecs/cs4270.c +4 -4
@@ -148,11 +148,11 @@ SND_SOC_DAPM_OUTPUT("AOUTR"), };static const struct snd_soc_dapm_route cs4270_dapm_routes[] = { - {"Capture" ,NULL ,"AINA" }, - {"Capture" ,NULL ,"AINB" }, + {"Capture" ,NULL ,"AINL" }, + {"Capture" ,NULL ,"AINR" }, - {"AOUTA" ,NULL ,"Playback" }, - {"AOUTB" ,NULL ,"Playback" }, + {"AOUTL" ,NULL ,"Playback" }, + {"AOUTR" ,NULL ,"Playback" }, };/**
sound/soc/sunxi/sun4i-codec.c +4 -3
@@ -575,11 +575,11 @@ static struct snd_soc_card *sun4i_codec_create_card(struct device *dev) card =devm_kzalloc (dev,sizeof (*card),GFP_KERNEL );if (!card) -return NULL ; +return ERR_PTR (-ENOMEM ); card->dai_link =sun4i_codec_create_link (dev, &card->num_links);if (!card->dai_link) -return NULL ; +return ERR_PTR (-ENOMEM ); card->dev = dev; card->name ="sun4i-codec" ;
@@ -661,7 +661,8 @@ static int sun4i_codec_probe(struct platform_device *pdev) } card =sun4i_codec_create_card (&pdev->dev); -if (!card) { +if (IS_ERR (card)) { + ret =PTR_ERR (card);dev_err (&pdev->dev,"Failed to create our card\n" ); goto err_unregister_codec; }