Linux 4.4.216
Greg KH
maintainerI'm announcing the release of the 4.4.216 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:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/mach-imx/Makefile | 2 arch/arm/mach-imx/common.h | 4 - arch/arm/mach-imx/resume-imx6.S | 24 +++++++ arch/arm/mach-imx/suspend-imx6.S | 14 ---- arch/mips/kernel/vpe.c | 2 arch/powerpc/kernel/cputable.c | 4 - arch/s390/mm/gup.c | 6 + arch/x86/mm/gup.c | 9 ++ crypto/algif_skcipher.c | 2 drivers/char/ipmi/ipmi_ssif.c | 10 ++- drivers/dma/coh901318.c | 4 - drivers/dma/tegra20-apb-dma.c | 6 - drivers/gpu/drm/msm/dsi/dsi_manager.c | 7 +- drivers/hid/hid-core.c | 4 - drivers/hid/usbhid/hiddev.c | 2 drivers/hwmon/adt7462.c | 2 drivers/i2c/busses/i2c-jz4780.c | 36 ---------- drivers/infiniband/core/cm.c | 1 drivers/infiniband/core/iwcm.c | 4 - drivers/md/dm-cache-target.c | 4 - drivers/net/ethernet/micrel/ks8851_mll.c | 53 ++------------- drivers/net/phy/mdio-bcm-iproc.c | 20 ++++++ drivers/net/slip/slip.c | 1 drivers/net/wireless/iwlwifi/pcie/rx.c | 6 + drivers/nfc/pn544/i2c.c | 1 drivers/s390/cio/blacklist.c | 5 - drivers/tty/serial/ar933x_uart.c | 8 ++ drivers/tty/sysrq.c | 8 +- drivers/tty/vt/selection.c | 24 ++++++- drivers/tty/vt/vt.c | 2 drivers/usb/core/hub.c | 6 + drivers/usb/core/port.c | 10 ++- drivers/usb/core/quirks.c | 3 drivers/usb/gadget/function/f_fs.c | 5 - drivers/usb/gadget/function/u_serial.c | 4 - drivers/usb/storage/unusual_devs.h | 6 + drivers/video/console/vgacon.c | 3 drivers/watchdog/da9062_wdt.c | 7 -- fs/cifs/cifsacl.c | 4 - fs/cifs/connect.c | 2 fs/cifs/inode.c | 8 +- fs/ecryptfs/keystore.c | 4 - fs/ext4/balloc.c | 14 +++- fs/ext4/ext4.h | 30 +++++++-- fs/ext4/ialloc.c | 23 ++++-- fs/ext4/mballoc.c | 61 ++++++++++++------ fs/ext4/resize.c | 62 ++++++++++++++---- fs/ext4/super.c | 103 +++++++++++++++++++++---------- fs/fat/inode.c | 19 ++--- fs/fuse/dev.c | 12 +-- fs/namei.c | 2 fs/pipe.c | 4 - fs/splice.c | 12 +++ include/linux/bitops.h | 3 include/linux/hid.h | 2 include/linux/mm.h | 23 ++++++ include/linux/pipe_fs_i.h | 17 ++++- include/net/flow_dissector.h | 9 ++ kernel/audit.c | 40 ++++++------ kernel/auditfilter.c | 71 +++++++++++---------- kernel/trace/trace.c | 6 + mm/gup.c | 51 ++++++++++----- mm/hugetlb.c | 16 ++++ mm/internal.h | 28 +++++++- net/core/fib_rules.c | 2 net/ipv6/ip6_fib.c | 7 +- net/ipv6/route.c | 1 net/mac80211/util.c | 18 +++-- net/netlink/af_netlink.c | 5 - net/sched/cls_flower.c | 1 net/sctp/sm_statefuns.c | 27 ++++++-- net/wireless/ethtool.c | 8 +- net/wireless/nl80211.c | 1 sound/soc/codecs/pcm512x.c | 8 +- sound/soc/soc-dapm.c | 2 sound/soc/soc-pcm.c | 16 ++-- virt/kvm/kvm_main.c | 12 +-- 78 files changed, 683 insertions(+), 372 deletions(-)
Ahmad Fatoum (1):
ARM: imx: build v7_cpu_resume() unconditionally
Aleksa Sarai (1):
namei: only return -ECHILD from follow_dotdot_rcu()
Arun Parameswaran (1):
net: phy: restore mdio regs in the iproc mdio driver
Benjamin Poirier (2):
ipv6: Fix nlmsg_flags when splitting a multipath route
ipv6: Fix route replacement with dev-only route
Bernard Metzler (1):
RDMA/iwcm: Fix iwcm work deallocation
Charles Keepax (1):
ASoC: dapm: Correct DAPM handling of active widgets during shutdown
Chris Wilson (1):
include/linux/bitops.h: introduce BITS_PER_TYPE
Christophe JAILLET (1):
MIPS: VPE: Fix a double free and a memory leak in 'release_vpe()'
Corey Minyard (1):
ipmi:ssif: Handle a possible NULL pointer reference
Dan Carpenter (3):
ext4: potential crash on allocation error in ext4_alloc_flex_bg_array()
hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT()
dmaengine: coh901318: Fix a double lock bug in dma_tc_handle()
Dan Lazewatsky (1):
usb: quirks: add NO_LPM quirk for Logitech Screen Share
Daniel Golle (1):
serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE
Desnes A. Nunes do Rosario (1):
powerpc: fix hardware PMU exception bug on PowerVM compatibility mode systems
Dmitry Osipenko (3):
nfc: pn544: Fix occasional HW initialization failure
dmaengine: tegra-apb: Fix use-after-free
dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list
Eugeniu Rosca (2):
usb: core: hub: do error out if usb_autopm_get_interface() fails
usb: core: port: do error out if usb_autopm_get_interface() fails
Frank Sorenson (1):
cifs: Fix mode output in debugging statements
Greg Kroah-Hartman (1):
Linux 4.4.216
Harigovindan P (1):
drm/msm/dsi: save pll state before dsi host is powered off
Jason Baron (1):
net: sched: correct flower port blocking
Jason Gunthorpe (1):
RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen()
Jethro Beekman (1):
net: fib_rules: Correctly set table field when table number exceeds 8 bits
Jim Lin (1):
usb: storage: Add quirk for Samsung Fit flash
Jiri Slaby (3):
vt: selection, close sel_buffer race
vt: selection, push console lock down
vt: selection, push sel_lock up
Johan Korsnes (2):
HID: core: fix off-by-one memset in hid_report_raw_event()
HID: core: increase HID report buffer size to 8KiB
Johannes Berg (2):
iwlwifi: pcie: fix rb_allocator workqueue allocation
mac80211: consider more elements in parsing CRC
John Stultz (1):
drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI
Lars-Peter Clausen (1):
usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags
Linus Torvalds (3):
mm: make page ref count overflow check tighter and more explicit
mm: add 'try_get_page()' helper function
mm: prevent get_user_pages() from overflowing page refcount
Marco Felsch (1):
watchdog: da9062: do not ping the hw during stop()
Marek Vasut (3):
net: ks8851-ml: Remove 8-bit bus accessors
net: ks8851-ml: Fix 16-bit data access
net: ks8851-ml: Fix 16-bit IO operationMatthew Wilcox (1):
fs: prevent page refcount overflow in pipe_buf_get
Matthias Reichl (1):
ASoC: pcm512x: Fix unbalanced regulator enable call in probe error path
Miklos Szeredi (1):
pipe: add pipe_buf_get() helper
Mikulas Patocka (1):
dm cache: fix a crash due to incorrect work item cancelling
Nathan Chancellor (1):
ecryptfs: Fix up bad backport of fe2e082f5da5b4a0a92ae32978f81507ef37ec66
Nikolay Aleksandrov (1):
net: netlink: cap max groups which will be considered in netlink_bind()
OGAWA Hirofumi (1):
fat: fix uninit-memory access for partial initialized inode
Paul Moore (2):
audit: fix error handling in audit_data_to_entry()
audit: always check the netlink payload length in audit_receive_msg()
Petr Mladek (2):
sysrq: Restore original console_loglevel when sysrq disabled
sysrq: Remove duplicated sysrq message
Punit Agrawal (1):
mm, gup: ensure real head page is ref-counted when using hugepages
Ronnie Sahlberg (1):
cifs: don't leak -EAGAIN for stat() during reconnect
Sean Christopherson (1):
KVM: Check for a bad hva before dropping into the ghc slow path
Sergey Matyukevich (2):
cfg80211: check wiphy driver existence for drvinfo report
cfg80211: add missing policy for NL80211_ATTR_STATUS_CODE
Sergey Organov (1):
usb: gadget: serial: fix Tx stall after buffer overflow
Suraj Jitindar Singh (2):
ext4: fix potential race between s_flex_groups online resizing and access
ext4: fix potential race between s_group_info online resizing and access
Takashi Iwai (1):
ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output
Theodore Ts'o (1):
ext4: fix potential race between online resizing and write operations
Vasily Averin (1):
s390/cio: cio_ignore_proc_seq_next should increase position index
Will Deacon (1):
mm, gup: remove broken VM_BUG_ON_PAGE compound check for hugepages
Wolfram Sang (1):
i2c: jz4780: silence log flood on txabrt
Xin Long (1):
sctp: move the format error check out of __sctp_sf_do_9_1_abort
Zhang Xiaoxu (1):
vgacon: Fix a UAF in vgacon_invert_region
[email protected] (1):
HID: hiddev: Fix race in in hiddev_disconnect()
yangerkun (2):
slip: stop double free sl->dev in slip_open
crypto: algif_skcipher - use ZERO_OR_NULL_PTR in skcipher_recvmsg_async
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 215 +SUBLEVEL = 216 EXTRAVERSION = NAME = Blurry Fish Butt
arch/arm/mach-imx/Makefile +2 -0
@@ -91,6 +91,8 @@ AFLAGS_suspend-imx6.o :=-Wa,-march=armv7-a obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o endif +AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a +obj-$(CONFIG_SOC_IMX6) += resume-imx6.o obj-$(CONFIG_SOC_IMX6) += pm-imx6.o obj-$(CONFIG_SOC_IMX50) += mach-imx50.o
arch/arm/mach-imx/common.h +2 -2
@@ -115,17 +115,17 @@ void imx_cpu_die(unsigned int cpu);int imx_cpu_kill (unsigned int cpu);#ifdef CONFIG_SUSPEND -void v7_cpu_resume (void );void imx53_suspend (void __iomem *ocram_vbase);extern const u32 imx53_suspend_sz;void imx6_suspend (void __iomem *ocram_vbase);#else -static inline void v7_cpu_resume (void ) {}static inline void imx53_suspend (void __iomem *ocram_vbase) {}static const u32 imx53_suspend_sz;static inline void imx6_suspend (void __iomem *ocram_vbase) {}#endif +void v7_cpu_resume (void ); +void imx6_pm_ccm_init (const char *ccm_compat);void imx6q_pm_init (void );void imx6dl_pm_init (void );
arch/arm/mach-imx/resume-imx6.S new file +24 -0
@@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright 2014 Freescale Semiconductor, Inc. + */ + +#include <linux/linkage.h> +#include <asm/assembler.h> +#include <asm/asm-offsets.h> +#include <asm/hardware/cache-l2x0.h> +#include "hardware.h" + +/* + * The following code must assume it is running from physical address + * where absolute virtual addresses to the data section have to be + * turned into relative ones. + */ + +ENTRY(v7_cpu_resume) + bl v7_invalidate_l1 +#ifdef CONFIG_CACHE_L2X0 + bl l2c310_early_resume +#endif + b cpu_resume +ENDPROC(v7_cpu_resume)
arch/arm/mach-imx/suspend-imx6.S +0 -14
@@ -333,17 +333,3 @@ resume: ret lr ENDPROC(imx6_suspend) - -/* - * The following code must assume it is running from physical address - * where absolute virtual addresses to the data section have to be - * turned into relative ones. - */ - -ENTRY(v7_cpu_resume) - bl v7_invalidate_l1 -#ifdef CONFIG_CACHE_L2X0 - bl l2c310_early_resume -#endif - b cpu_resume -ENDPROC(v7_cpu_resume)
arch/mips/kernel/vpe.c +1 -1
@@ -134,7 +134,7 @@ void release_vpe(struct vpe *v) {list_del (&v->list);if (v->load_addr) -release_progmem (v); +release_progmem (v->load_addr);kfree (v); }
arch/powerpc/kernel/cputable.c +3 -1
@@ -2147,11 +2147,13 @@ static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,* oprofile_cpu_type already has a value, then we are * possibly overriding a real PVR with a logical one, * and, in that case, keep the current value for -* oprofile_cpu_type. +* oprofile_cpu_type. Futhermore, let's ensure that the +* fix for the PMAO bug is enabled on compatibility mode. */ if (old.oprofile_cpu_type !=NULL ) { t->oprofile_cpu_type = old.oprofile_cpu_type; t->oprofile_type = old.oprofile_type; + t->cpu_features |= old.cpu_features &CPU_FTR_PMAO_BUG ; } }
arch/s390/mm/gup.c +4 -2
@@ -37,7 +37,8 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,return 0 ;VM_BUG_ON (!pfn_valid (pte_pfn (pte))); page =pte_page (pte); -if (!page_cache_get_speculative (page)) +if (WARN_ON_ONCE (page_ref_count (page) <0 ) + || !page_cache_get_speculative (page))return 0 ;if (unlikely (pte_val (pte) !=pte_val (*ptep))) {put_page (page);
@@ -76,7 +77,8 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, refs++; }while (addr +=PAGE_SIZE , addr != end); -if (!page_cache_add_speculative (head, refs)) { +if (WARN_ON_ONCE (page_ref_count (head) <0 ) + || !page_cache_add_speculative (head, refs)) { *nr -= refs;return 0 ; }
arch/x86/mm/gup.c +8 -1
@@ -95,7 +95,10 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, }VM_BUG_ON (!pfn_valid (pte_pfn (pte))); page =pte_page (pte); -get_page (page); +if (unlikely (!try_get_page (page))) { +pte_unmap (ptep); +return 0 ; + }SetPageReferenced (page); pages[*nr] = page; (*nr)++;
@@ -132,6 +135,8 @@ static noinline int gup_huge_pmd(pmd_t pmd, unsigned long addr, refs =0 ; head =pmd_page (pmd); +if (WARN_ON_ONCE (page_ref_count (head) <=0 )) +return 0 ; page = head + ((addr & ~PMD_MASK ) >>PAGE_SHIFT ); do { VM_BUG_ON_PAGE(compound_head(page) != head, page);
@@ -208,6 +213,8 @@ static noinline int gup_huge_pud(pud_t pud, unsigned long addr, refs =0 ; head =pud_page (pud); +if (WARN_ON_ONCE (page_ref_count (head) <=0 )) +return 0 ; page = head + ((addr & ~PUD_MASK ) >>PAGE_SHIFT ); do { VM_BUG_ON_PAGE(compound_head(page) != head, page);
crypto/algif_skcipher.c +1 -1
@@ -538,7 +538,7 @@ static int skcipher_recvmsg_async(struct socket *sock, struct msghdr *msg,lock_sock (sk); tx_nents =skcipher_all_sg_nents (ctx); sreq->tsg =kcalloc (tx_nents,sizeof (*sg),GFP_KERNEL ); -if (unlikely (!sreq->tsg)) +if (unlikely (ZERO_OR_NULL_PTR (sreq->tsg))) goto unlock;sg_init_table (sreq->tsg, tx_nents);memcpy (iv, ctx->iv, ivsize);
drivers/char/ipmi/ipmi_ssif.c +7 -3
@@ -742,10 +742,14 @@ static void msg_done_handler(struct ssif_info *ssif_info, int result, flags =ipmi_ssif_lock_cond (ssif_info, &oflags); msg = ssif_info->curr_msg;if (msg) { +if (data) { +if (len >IPMI_MAX_MSG_LENGTH ) + len =IPMI_MAX_MSG_LENGTH ; +memcpy (msg->rsp, data, len); + }else { + len =0 ; + } msg->rsp_size = len; -if (msg->rsp_size >IPMI_MAX_MSG_LENGTH ) - msg->rsp_size =IPMI_MAX_MSG_LENGTH ; -memcpy (msg->rsp, data, msg->rsp_size); ssif_info->curr_msg =NULL ; }
drivers/dma/coh901318.c +0 -4
@@ -1960,8 +1960,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)return ; } -spin_lock (&cohc->lock); -/* * When we reach this point, at least one queue item * should have been moved over from cohc->queue to
@@ -1982,8 +1980,6 @@ static void dma_tc_handle(struct coh901318_chan *cohc)if (coh901318_queue_start (cohc) ==NULL ) cohc->busy =0 ; -spin_unlock (&cohc->lock); -/* * This tasklet will remove items from cohc->active * and thus terminates them.
drivers/dma/tegra20-apb-dma.c +1 -5
@@ -285,7 +285,7 @@ static struct tegra_dma_desc *tegra_dma_desc_get(/* Do not allocate if desc are waiting for ack */ list_for_each_entry (dma_desc, &tdc->free_dma_desc, node) { -if (async_tx_test_ack (&dma_desc->txd)) { +if (async_tx_test_ack (&dma_desc->txd) && !dma_desc->cb_count) {list_del (&dma_desc->node);spin_unlock_irqrestore (&tdc->lock, flags); dma_desc->txd.flags =0 ;
@@ -754,10 +754,6 @@ static int tegra_dma_terminate_all(struct dma_chan *dc)bool was_busy;spin_lock_irqsave (&tdc->lock, flags); -if (list_empty (&tdc->pending_sg_req)) { -spin_unlock_irqrestore (&tdc->lock, flags); -return 0 ; - }if (!tdc->busy) goto skip_dma_stop;
drivers/gpu/drm/msm/dsi/dsi_manager.c +6 -1
@@ -302,7 +302,7 @@ static int dsi_mgr_connector_get_modes(struct drm_connector *connector)return num; } -static int dsi_mgr_connector_mode_valid (struct drm_connector *connector, +static enum drm_mode_status dsi_mgr_connector_mode_valid (struct drm_connector *connector,struct drm_display_mode *mode) {int id =dsi_mgr_connector_get_id (connector);
@@ -434,6 +434,7 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)struct msm_dsi *msm_dsi1 =dsi_mgr_get_dsi (DSI_1 );struct mipi_dsi_host *host = msm_dsi->host;struct drm_panel *panel = msm_dsi->panel; +struct msm_dsi_pll *src_pll;bool is_dual_dsi =IS_DUAL_DSI ();int ret;
@@ -467,6 +468,10 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge) id, ret); } +/* Save PLL status if it is a clock source */ + src_pll =msm_dsi_phy_get_pll (msm_dsi->phy); +msm_dsi_pll_save_state (src_pll); + ret =msm_dsi_host_power_off (host);if (ret)pr_err ("%s: host %d power off failed,%d\n" , __func__, id, ret);
drivers/hid/hid-core.c +3 -1
@@ -1508,7 +1508,9 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size, rsize = ((report->size -1 ) >>3 ) +1 ; -if (rsize >HID_MAX_BUFFER_SIZE ) +if (report_enum->numbered && rsize >=HID_MAX_BUFFER_SIZE ) + rsize =HID_MAX_BUFFER_SIZE -1 ; +else if (rsize >HID_MAX_BUFFER_SIZE ) rsize =HID_MAX_BUFFER_SIZE ;if (csize < rsize) {
drivers/hid/usbhid/hiddev.c +1 -1
@@ -962,9 +962,9 @@ void hiddev_disconnect(struct hid_device *hid) hiddev->exist =0 ;if (hiddev->open) { -mutex_unlock (&hiddev->existancelock);usbhid_close (hiddev->hid);wake_up_interruptible (&hiddev->wait); +mutex_unlock (&hiddev->existancelock); }else {mutex_unlock (&hiddev->existancelock);kfree (hiddev);
drivers/hwmon/adt7462.c +1 -1
@@ -426,7 +426,7 @@ static int ADT7462_REG_VOLT(struct adt7462_data *data, int which)return 0x95 ;break ; } -return -ENODEV ; +return 0 ; }/* Provide labels for sysfs */
drivers/i2c/busses/i2c-jz4780.c +2 -34
@@ -82,25 +82,6 @@#define JZ4780_I2C_STA_TFNF BIT(1)#define JZ4780_I2C_STA_ACT BIT(0) -static const char *const jz4780_i2c_abrt_src[] = { -"ABRT_7B_ADDR_NOACK" , -"ABRT_10ADDR1_NOACK" , -"ABRT_10ADDR2_NOACK" , -"ABRT_XDATA_NOACK" , -"ABRT_GCALL_NOACK" , -"ABRT_GCALL_READ" , -"ABRT_HS_ACKD" , -"SBYTE_ACKDET" , -"ABRT_HS_NORSTRT" , -"SBYTE_NORSTRT" , -"ABRT_10B_RD_NORSTRT" , -"ABRT_MASTER_DIS" , -"ARB_LOST" , -"SLVFLUSH_TXFIFO" , -"SLV_ARBLOST" , -"SLVRD_INTX" , -}; -#define JZ4780_I2C_INTST_IGC BIT(11)#define JZ4780_I2C_INTST_ISTT BIT(10)#define JZ4780_I2C_INTST_ISTP BIT(9)
@@ -538,21 +519,8 @@ done:static void jz4780_i2c_txabrt (struct jz4780_i2c *i2c,int src) { -int i; - -dev_err (&i2c->adap.dev,"txabrt: 0x%08x\n" , src); -dev_err (&i2c->adap.dev,"device addr=%x\n" , -jz4780_i2c_readw (i2c,JZ4780_I2C_TAR )); -dev_err (&i2c->adap.dev,"send cmd count:%d %d\n" , - i2c->cmd, i2c->cmd_buf[i2c->cmd]); -dev_err (&i2c->adap.dev,"receive data count:%d %d\n" , - i2c->cmd, i2c->data_buf[i2c->cmd]); - -for (i =0 ; i <16 ; i++) { -if (src &BIT (i)) -dev_dbg (&i2c->adap.dev,"I2C TXABRT[%d]=%s\n" , - i, jz4780_i2c_abrt_src[i]); - } +dev_dbg (&i2c->adap.dev,"txabrt: 0x%08x, cmd: %d, send: %d, recv: %d\n" , + src, i2c->cmd, i2c->cmd_buf[i2c->cmd], i2c->data_buf[i2c->cmd]); } static inline int jz4780_i2c_xfer_read(struct jz4780_i2c *i2c,
drivers/infiniband/core/cm.c +1 -0
@@ -1073,6 +1073,7 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,/* Sharing an ib_cm_id with different handlers is not * supported */ spin_unlock_irqrestore (&cm.lock, flags); +ib_destroy_cm_id (cm_id);return ERR_PTR (-EINVAL ); }atomic_inc (&cm_id_priv->refcount);
drivers/infiniband/core/iwcm.c +3 -1
@@ -125,8 +125,10 @@ static void dealloc_work_entries(struct iwcm_id_private *cm_id_priv) {struct list_head *e, *tmp; -list_for_each_safe (e, tmp, &cm_id_priv->work_free_list) +list_for_each_safe (e, tmp, &cm_id_priv->work_free_list) { +list_del (e);kfree (list_entry(e ,struct iwcm_work ,free_list )); + } }static int alloc_work_entries (struct iwcm_id_private *cm_id_priv,int count)
drivers/md/dm-cache-target.c +2 -2
@@ -2193,8 +2193,8 @@ static void wait_for_migrations(struct cache *cache)static void stop_worker (struct cache *cache) { -cancel_delayed_work (&cache->waker); -flush_workqueue (cache->wq); +cancel_delayed_work_sync (&cache->waker); +drain_workqueue (cache->wq); }static void requeue_deferred_cells (struct cache *cache)
drivers/net/ethernet/micrel/ks8851_mll.c +9 -44
116 lines not on this page · raw message
drivers/net/phy/mdio-bcm-iproc.c +20 -0
@@ -188,6 +188,23 @@ static int iproc_mdio_remove(struct platform_device *pdev)return 0 ; } +#ifdef CONFIG_PM_SLEEP +int iproc_mdio_resume (struct device *dev) +{ +struct platform_device *pdev =to_platform_device (dev); +struct iproc_mdio_priv *priv =platform_get_drvdata (pdev); + +/* restore the mii clock configuration */ +iproc_mdio_config_clk (priv->base); + +return 0 ; +} + +static const struct dev_pm_ops iproc_mdio_pm_ops = { + .resume = iproc_mdio_resume +}; +#endif /* CONFIG_PM_SLEEP */ +static const struct of_device_id iproc_mdio_of_match[] = { { .compatible ="brcm,iproc-mdio" , }, {/* sentinel */ },
@@ -198,6 +215,9 @@ static struct platform_driver iproc_mdio_driver = { .driver = { .name = "iproc-mdio", .of_match_table = iproc_mdio_of_match, +#ifdef CONFIG_PM_SLEEP + .pm = &iproc_mdio_pm_ops, +#endif }, .probe = iproc_mdio_probe, .remove = iproc_mdio_remove,
drivers/net/slip/slip.c +0 -1
@@ -868,7 +868,6 @@ err_free_chan: tty->disc_data =NULL ;clear_bit (SLF_INUSE , &sl->flags);sl_free_netdev (sl->dev); -free_netdev (sl->dev); err_exit:rtnl_unlock ();
drivers/net/wireless/iwlwifi/pcie/rx.c +5 -1
@@ -708,9 +708,13 @@ int iwl_pcie_rx_init(struct iwl_trans *trans)if (err)return err; } -if (!rba->alloc_wq) +if (!rba->alloc_wq) { rba->alloc_wq =alloc_workqueue ("rb_allocator" ,WQ_HIGHPRI |WQ_UNBOUND ,1 ); +if (!rba->alloc_wq) +return -ENOMEM ; + } +INIT_WORK (&rba->rx_alloc, iwl_pcie_rx_allocator_work);cancel_work_sync (&rba->rx_alloc);
drivers/nfc/pn544/i2c.c +1 -0
@@ -241,6 +241,7 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy) out:gpio_set_value_cansleep (phy->gpio_en, !phy->en_polarity); +usleep_range (10000 ,15000 ); }static void pn544_hci_i2c_enable_mode (struct pn544_i2c_phy *phy,int run_mode)
drivers/s390/cio/blacklist.c +3 -2
@@ -303,8 +303,10 @@ static void * cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset) { struct ccwdev_iter *iter; +loff_t p = *offset; -if (*offset >= (__MAX_SUBCHANNEL +1 ) * (__MAX_SSID +1 )) + (*offset)++; +if (p >= (__MAX_SUBCHANNEL +1 ) * (__MAX_SSID +1 ))return NULL ; iter = it;if (iter->devno == __MAX_SUBCHANNEL) {
@@ -314,7 +316,6 @@ cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset)return NULL ; }else iter->devno++; - (*offset)++;return iter; }
drivers/tty/serial/ar933x_uart.c +8 -0
@@ -294,6 +294,10 @@ static void ar933x_uart_set_termios(struct uart_port *port,ar933x_uart_rmw_set (up,AR933X_UART_CS_REG ,AR933X_UART_CS_HOST_INT_EN ); +/* enable RX and TX ready overide */ +ar933x_uart_rmw_set (up,AR933X_UART_CS_REG , +AR933X_UART_CS_TX_READY_ORIDE |AR933X_UART_CS_RX_READY_ORIDE ); +/* reenable the UART */ ar933x_uart_rmw(up, AR933X_UART_CS_REG, AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
@@ -426,6 +430,10 @@ static int ar933x_uart_startup(struct uart_port *port)ar933x_uart_rmw_set (up,AR933X_UART_CS_REG ,AR933X_UART_CS_HOST_INT_EN ); +/* enable RX and TX ready overide */ +ar933x_uart_rmw_set (up,AR933X_UART_CS_REG , +AR933X_UART_CS_TX_READY_ORIDE |AR933X_UART_CS_RX_READY_ORIDE ); +/* Enable RX interrupts */ up->ier =AR933X_UART_INT_RX_VALID ;ar933x_uart_write (up,AR933X_UART_INT_EN_REG , up->ier);
drivers/tty/sysrq.c +4 -4
@@ -542,7 +542,6 @@ void __handle_sysrq(int key, bool check_mask)*/ orig_log_level = console_loglevel; console_loglevel =CONSOLE_LOGLEVEL_DEFAULT ; -pr_info ("SysRq : " ); op_p =__sysrq_get_key_op (key);if (op_p) {
@@ -551,14 +550,15 @@ void __handle_sysrq(int key, bool check_mask)* should not) and is the invoked operation enabled? */ if (!check_mask ||sysrq_on_mask (op_p->enable_mask)) { -pr_cont ("%s\n" , op_p->action_msg); +pr_info ("%s\n" , op_p->action_msg); console_loglevel = orig_log_level; op_p->handler (key); }else { -pr_cont ("This sysrq operation is disabled.\n" ); +pr_info ("This sysrq operation is disabled.\n" ); + console_loglevel = orig_log_level; } }else { -pr_cont ("HELP : " ); +pr_info ("HELP : " );/* Only print the help msg once per handler */ for (i =0 ; i <ARRAY_SIZE (sysrq_key_table); i++) {if (sysrq_key_table[i]) {
drivers/tty/vt/selection.c +21 -3
@@ -13,6 +13,7 @@#include <linux/tty.h> #include <linux/sched.h> #include <linux/mm.h> +#include <linux/mutex.h> #include <linux/slab.h> #include <linux/types.h>
@@ -40,6 +41,7 @@ static volatile int sel_start = -1; /* cleared by clear_selection */static int sel_end;static int sel_buffer_lth;static char *sel_buffer; +static DEFINE_MUTEX (sel_lock);/* clear_selection, highlight and highlight_pointer can be called from interrupt (via scrollback/front) */
@@ -156,14 +158,14 @@ static int store_utf8(u16 c, char *p)* The entire selection process is managed under the console_lock. It's * a lot under the lock but its hardly a performance path */ -int set_selection (const struct tiocl_selection __user *sel,struct tty_struct *tty) +static int __set_selection (const struct tiocl_selection __user *sel,struct tty_struct *tty) {struct vc_data *vc = vc_cons[fg_console].d;int sel_mode, new_sel_start, new_sel_end, spc;char *bp, *obp;int i, ps, pe, multiplier;u16 c; -int mode; +int mode, ret =0 ;poke_blanked_console ();
@@ -324,7 +326,21 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t } } sel_buffer_lth = bp - sel_buffer; -return 0 ; + +return ret; +} + +int set_selection (const struct tiocl_selection __user *v,struct tty_struct *tty) +{ +int ret; + +mutex_lock (&sel_lock); +console_lock (); + ret =__set_selection (v, tty); +console_unlock (); +mutex_unlock (&sel_lock); + +return ret; }/* Insert the contents of the selection buffer into the
@@ -350,6 +366,7 @@ int paste_selection(struct tty_struct *tty)tty_buffer_lock_exclusive (&vc->port);add_wait_queue (&vc->paste_wait, &wait); +mutex_lock (&sel_lock);while (sel_buffer && sel_buffer_lth > pasted) {set_current_state (TASK_INTERRUPTIBLE );if (test_bit (TTY_THROTTLED , &tty->flags)) {
@@ -362,6 +379,7 @@ int paste_selection(struct tty_struct *tty) count); pasted += count; } +mutex_unlock (&sel_lock);remove_wait_queue (&vc->paste_wait, &wait);__set_current_state (TASK_RUNNING );
drivers/tty/vt/vt.c +0 -2
@@ -2687,9 +2687,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)switch (type) {case TIOCL_SETSEL : -console_lock (); ret =set_selection ((struct tiocl_selection __user *)(p+1 ), tty); -console_unlock ();break ;case TIOCL_PASTESEL : ret =paste_selection (tty);
drivers/usb/core/hub.c +5 -1
@@ -938,13 +938,17 @@ int usb_remove_device(struct usb_device *udev) {struct usb_hub *hub;struct usb_interface *intf; +int ret;if (!udev->parent)/* Can't remove a root hub */ return -EINVAL ; hub =usb_hub_to_struct_hub (udev->parent); intf =to_usb_interface (hub->intfdev); -usb_autopm_get_interface (intf); + ret =usb_autopm_get_interface (intf); +if (ret <0 ) +return ret; +set_bit (udev->portnum, hub->removed_bits);hub_port_logical_disconnect (hub, udev->portnum);usb_autopm_put_interface (intf);
drivers/usb/core/port.c +8 -2
@@ -98,7 +98,10 @@ static int usb_port_runtime_resume(struct device *dev)if (!port_dev->is_superspeed && peer)pm_runtime_get_sync (&peer->dev); -usb_autopm_get_interface (intf); + retval =usb_autopm_get_interface (intf); +if (retval <0 ) +return retval; + retval =usb_hub_set_port_power (hdev, hub, port1, true);msleep (hub_power_on_good_delay (hub));if (udev && !retval) {
@@ -151,7 +154,10 @@ static int usb_port_runtime_suspend(struct device *dev)if (usb_port_block_power_off)return -EBUSY ; -usb_autopm_get_interface (intf); + retval =usb_autopm_get_interface (intf); +if (retval <0 ) +return retval; + retval =usb_hub_set_port_power (hdev, hub, port1, false);usb_clear_port_feature (hdev, port1,USB_PORT_FEAT_C_CONNECTION );if (!port_dev->is_superspeed)
drivers/usb/core/quirks.c +3 -0
@@ -86,6 +86,9 @@ static const struct usb_device_id usb_quirk_list[] = {/* Logitech PTZ Pro Camera */ { USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT }, + /* Logitech Screen Share */ + { USB_DEVICE(0x046d, 0x086c), .driver_info = USB_QUIRK_NO_LPM }, + /* Logitech Quickcam Fusion */ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
drivers/usb/gadget/function/f_fs.c +3 -2
@@ -888,18 +888,19 @@ static int ffs_aio_cancel(struct kiocb *kiocb) {struct ffs_io_data *io_data = kiocb->private;struct ffs_epfile *epfile = kiocb->ki_filp->private_data; +unsigned long flags;int value;ENTER (); -spin_lock_irq (&epfile->ffs->eps_lock); +spin_lock_irqsave (&epfile->ffs->eps_lock, flags);if (likely (io_data && io_data->ep && io_data->req)) value =usb_ep_dequeue (io_data->ep, io_data->req);else value = -EINVAL ; -spin_unlock_irq (&epfile->ffs->eps_lock); +spin_unlock_irqrestore (&epfile->ffs->eps_lock, flags);return value; }
drivers/usb/gadget/function/u_serial.c +3 -1
@@ -701,8 +701,10 @@ static int gs_start_io(struct gs_port *port) port->n_read =0 ; started =gs_start_rx (port); -/* unblock any pending writes into our circular buffer */ if (started) { +gs_start_tx (port); +/* Unblock any pending writes into our circular buffer, in case +* we didn't in gs_start_tx() */ tty_wakeup (port->port.tty); }else {gs_free_requests (ep, head, &port->read_allocated);
drivers/usb/storage/unusual_devs.h +6 -0
@@ -1206,6 +1206,12 @@ UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999, USB_SC_RBC, USB_PR_BULK, NULL, 0 ), +UNUSUAL_DEV (0x090c ,0x1000 ,0x1100 ,0x1100 , +"Samsung" , +"Flash Drive FIT" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_MAX_SECTORS_64 ), +/* aeb */ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, "Feiya",
drivers/video/console/vgacon.c +3 -0
@@ -1330,6 +1330,9 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font)static int vgacon_resize (struct vc_data *c,unsigned int width,unsigned int height,unsigned int user) { +if ((width <<1 ) * height > vga_vram_size) +return -EINVAL ; +if (width %2 || width > screen_info.orig_video_cols || height > (screen_info.orig_video_lines * vga_default_font_height)/ c->vc_font.height)
drivers/watchdog/da9062_wdt.c +0 -7
@@ -126,13 +126,6 @@ static int da9062_wdt_stop(struct watchdog_device *wdd)struct da9062_watchdog *wdt =watchdog_get_drvdata (wdd);int ret; - ret =da9062_reset_watchdog_timer (wdt); -if (ret) { -dev_err (wdt->hw->dev,"Failed to ping the watchdog (err = %d)\n" , - ret); -return ret; - } - ret = regmap_update_bits(wdt->hw->regmap, DA9062AA_CONTROL_D, DA9062AA_TWDSCALE_MASK,
fs/cifs/cifsacl.c +2 -2
@@ -480,7 +480,7 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) *pmode |= (S_IXUGO & (*pbits_to_set)); -cifs_dbg (NOISY ,"access flags 0x%x mode now 0x%x\n" , flags, *pmode); +cifs_dbg (NOISY ,"access flags 0x%x mode now %04o\n" , flags, *pmode);return ; }
@@ -509,7 +509,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use,if (mode &S_IXUGO ) *pace_flags |=SET_FILE_EXEC_RIGHTS ; -cifs_dbg (NOISY ,"mode: 0x%x, access flags now 0x%x\n" , +cifs_dbg (NOISY ,"mode: %04o, access flags now 0x%x\n" , mode, *pace_flags);return ; }
fs/cifs/connect.c +1 -1
@@ -3402,7 +3402,7 @@ void cifs_setup_cifs_sb(struct smb_vol *pvolume_info, cifs_sb->mnt_gid = pvolume_info->linux_gid; cifs_sb->mnt_file_mode = pvolume_info->file_mode; cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; -cifs_dbg (FYI ,"file mode: 0x%hx dir mode: 0x%hx\n" , +cifs_dbg (FYI ,"file mode: %04ho dir mode: %04ho\n" , cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode); cifs_sb->actimeo = pvolume_info->actimeo;
fs/cifs/inode.c +6 -2
@@ -1540,7 +1540,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, umode_t mode)struct TCP_Server_Info *server;char *full_path; -cifs_dbg (FYI ,"In cifs_mkdir, mode = 0x%hx inode = 0x%p\n" , +cifs_dbg (FYI ,"In cifs_mkdir, mode = %04ho inode = 0x%p\n" , mode, inode); cifs_sb =CIFS_SB (inode->i_sb);
@@ -1957,6 +1957,7 @@ int cifs_revalidate_dentry_attr(struct dentry *dentry)struct inode *inode =d_inode (dentry);struct super_block *sb = dentry->d_sb;char *full_path =NULL ; +int count =0 ;if (inode ==NULL )return -ENOENT ;
@@ -1978,15 +1979,18 @@ int cifs_revalidate_dentry_attr(struct dentry *dentry) full_path, inode, inode->i_count.counter, dentry, dentry->d_time, jiffies); +again:if (cifs_sb_master_tcon (CIFS_SB (sb))->unix_ext) rc =cifs_get_inode_info_unix (&inode, full_path, sb, xid);else rc =cifs_get_inode_info (&inode, full_path,NULL , sb, xid,NULL ); - +if (rc == -EAGAIN && count++ <10 ) + goto again; out:kfree (full_path);free_xid (xid); +return rc; }
fs/ecryptfs/keystore.c +2 -2
@@ -1280,7 +1280,7 @@ parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,printk (KERN_ERR "Enter w/ first byte != 0x%.2x\n" ,ECRYPTFS_TAG_1_PACKET_TYPE ); rc = -EINVAL ; - goto out_free; + goto out; }/* Released: wipe_auth_tok_list called in ecryptfs_parse_packet_set or * at end of function upon failure */
@@ -1330,7 +1330,7 @@ parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,printk (KERN_WARNING "Tag 1 packet contains key larger " "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES" ); rc = -EINVAL ; - goto out; + goto out_free; }memcpy ((*new_auth_tok)->session_key.encrypted_key, &data[(*packet_size)], (body_size - (ECRYPTFS_SIG_SIZE +2 )));
fs/ext4/balloc.c +11 -3
@@ -279,6 +279,7 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,ext4_group_t ngroups =ext4_get_groups_count (sb);struct ext4_group_desc *desc;struct ext4_sb_info *sbi =EXT4_SB (sb); +struct buffer_head *bh_p;if (block_group >= ngroups) { ext4_error(sb, "block_group >= groups_count - block_group = %u,"
@@ -289,7 +290,14 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, group_desc = block_group >>EXT4_DESC_PER_BLOCK_BITS (sb); offset = block_group & (EXT4_DESC_PER_BLOCK (sb) -1 ); -if (!sbi->s_group_desc[group_desc]) { + bh_p =sbi_array_rcu_deref (sbi, s_group_desc, group_desc); +/* +* sbi_array_rcu_deref returns with rcu unlocked, this is ok since +* the pointer being dereferenced won't be dereferenced again. By +* looking at the usage in add_new_gdb() the value isn't modified, +* just the pointer, and so it remains valid. +*/ +if (!bh_p) {ext4_error (sb,"Group descriptor not loaded - " "block_group = %u, group_desc = %u, desc = %u" , block_group, group_desc, offset);
@@ -297,10 +305,10 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, } desc = (struct ext4_group_desc *)( - (__u8 *)sbi->s_group_desc[group_desc]->b_data + + (__u8 *)bh_p->b_data + offset *EXT4_DESC_SIZE (sb));if (bh) - *bh = sbi->s_group_desc[group_desc]; + *bh = bh_p;return desc; }
fs/ext4/ext4.h +24 -6
@@ -1303,7 +1303,7 @@ struct ext4_sb_info {loff_t s_bitmap_maxbytes;/* max bytes for bitmap files */ struct buffer_head * s_sbh;/* Buffer containing the super block */ struct ext4_super_block *s_es;/* Pointer to the super block in the buffer */ -struct buffer_head **s_group_desc; +struct buffer_head *__rcu *s_group_desc;unsigned int s_mount_opt;unsigned int s_mount_opt2;unsigned int s_mount_flags;
@@ -1363,7 +1363,7 @@ struct ext4_sb_info {#endif /* for buddy allocator */ -struct ext4_group_info ***s_group_info; +struct ext4_group_info **__rcu *s_group_info;struct inode *s_buddy_cache;spinlock_t s_md_lock;unsigned short *s_mb_offsets;
@@ -1410,7 +1410,7 @@ struct ext4_sb_info {unsigned int s_extent_max_zeroout_kb;unsigned int s_log_groups_per_flex; -struct flex_groups *s_flex_groups; +struct flex_groups *__rcu *s_flex_groups;ext4_group_t s_flex_groups_allocated;/* workqueue for reserved extent conversions (buffered io) */
@@ -1491,6 +1491,23 @@ static inline void ext4_inode_aio_set(struct inode *inode, ext4_io_end_t *io) inode->i_private = io; } +/* +* Returns: sbi->field[index] +* Used to access an array element from the following sbi fields which require +* rcu protection to avoid dereferencing an invalid pointer due to reassignment +* - s_group_desc +* - s_group_info +* - s_flex_group +*/ +#define sbi_array_rcu_deref (sbi, field, index) \ +({ \ + typeof(*((sbi)->field)) _v; \ + rcu_read_lock(); \ + _v = ((typeof(_v)*)rcu_dereference((sbi)->field))[index]; \ + rcu_read_unlock(); \ + _v; \ +}) +/* * Inode dynamic state flags */
@@ -2555,6 +2572,7 @@ extern int ext4_generic_delete_entry(handle_t *handle,extern int ext4_empty_dir (struct inode *inode);/* resize.c */ +extern void ext4_kvfree_array_rcu (void *to_free);extern int ext4_group_add (struct super_block *sb,struct ext4_new_group_data *input); extern int ext4_group_extend(struct super_block *sb,
@@ -2795,13 +2813,13 @@ static inlinestruct ext4_group_info *ext4_get_group_info (struct super_block *sb,ext4_group_t group) { -struct ext4_group_info ***grp_info; +struct ext4_group_info **grp_info;long indexv, indexh;BUG_ON (group >=EXT4_SB (sb)->s_groups_count); - grp_info =EXT4_SB (sb)->s_group_info; indexv = group >> (EXT4_DESC_PER_BLOCK_BITS (sb)); indexh = group & ((EXT4_DESC_PER_BLOCK (sb)) -1 ); -return grp_info[indexv][indexh]; + grp_info =sbi_array_rcu_deref (EXT4_SB (sb), s_group_info, indexv); +return grp_info[indexh]; }/*
fs/ext4/ialloc.c +14 -9
@@ -331,11 +331,13 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)percpu_counter_inc (&sbi->s_freeinodes_counter);if (sbi->s_log_groups_per_flex) { -ext4_group_t f =ext4_flex_group (sbi, block_group); +struct flex_groups *fg; -atomic_inc (&sbi->s_flex_groups[f].free_inodes); + fg =sbi_array_rcu_deref (sbi, s_flex_groups, +ext4_flex_group (sbi, block_group)); +atomic_inc (&fg->free_inodes);if (is_directory) -atomic_dec (&sbi->s_flex_groups[f].used_dirs); +atomic_dec (&fg->used_dirs); }BUFFER_TRACE (bh2,"call ext4_handle_dirty_metadata" ); fatal =ext4_handle_dirty_metadata (handle,NULL , bh2);
@@ -376,12 +378,13 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, int flex_size, struct orlov_stats *stats) { struct ext4_group_desc *desc; -struct flex_groups *flex_group =EXT4_SB (sb)->s_flex_groups;if (flex_size >1 ) { - stats->free_inodes =atomic_read (&flex_group[g].free_inodes); - stats->free_clusters =atomic64_read (&flex_group[g].free_clusters); - stats->used_dirs =atomic_read (&flex_group[g].used_dirs); +struct flex_groups *fg =sbi_array_rcu_deref (EXT4_SB (sb), + s_flex_groups, g); + stats->free_inodes =atomic_read (&fg->free_inodes); + stats->free_clusters =atomic64_read (&fg->free_clusters); + stats->used_dirs =atomic_read (&fg->used_dirs);return ; }
@@ -981,7 +984,8 @@ got:if (sbi->s_log_groups_per_flex) {ext4_group_t f =ext4_flex_group (sbi, group); -atomic_inc (&sbi->s_flex_groups[f].used_dirs); +atomic_inc (&sbi_array_rcu_deref (sbi, s_flex_groups, + f)->used_dirs); } }if (ext4_has_group_desc_csum (sb)) {
@@ -1004,7 +1008,8 @@ got:if (sbi->s_log_groups_per_flex) { flex_group =ext4_flex_group (sbi, group); -atomic_dec (&sbi->s_flex_groups[flex_group].free_inodes); +atomic_dec (&sbi_array_rcu_deref (sbi, s_flex_groups, + flex_group)->free_inodes); } inode->i_ino = ino + group *EXT4_INODES_PER_GROUP (sb);
fs/ext4/mballoc.c +41 -20
141 lines not on this page · raw message
fs/ext4/resize.c +49 -13
126 lines not on this page · raw message
fs/ext4/super.c +72 -31
185 lines not on this page · raw message
fs/fat/inode.c +7 -12
@@ -653,6 +653,13 @@ static struct inode *fat_alloc_inode(struct super_block *sb)return NULL ;init_rwsem (&ei->truncate_lock); +/* Zeroing to allow iput() even if partial initialized inode. */ + ei->mmu_private =0 ; + ei->i_start =0 ; + ei->i_logstart =0 ; + ei->i_attrs =0 ; + ei->i_pos =0 ; +return &ei->vfs_inode; }
@@ -1276,16 +1283,6 @@ out:return 0 ; } -static void fat_dummy_inode_init (struct inode *inode) -{ -/* Initialize this dummy inode to work as no-op. */ -MSDOS_I (inode)->mmu_private =0 ; -MSDOS_I (inode)->i_start =0 ; -MSDOS_I (inode)->i_logstart =0 ; -MSDOS_I (inode)->i_attrs =0 ; -MSDOS_I (inode)->i_pos =0 ; -} -static int fat_read_root (struct inode *inode) {struct msdos_sb_info *sbi =MSDOS_SB (inode->i_sb);
@@ -1730,13 +1727,11 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, fat_inode =new_inode (sb);if (!fat_inode) goto out_fail; -fat_dummy_inode_init (fat_inode); sbi->fat_inode = fat_inode; fsinfo_inode =new_inode (sb);if (!fsinfo_inode) goto out_fail; -fat_dummy_inode_init (fsinfo_inode); fsinfo_inode->i_ino =MSDOS_FSINFO_INO ; sbi->fsinfo_inode = fsinfo_inode;insert_inode_hash (fsinfo_inode);
fs/fuse/dev.c +6 -6
@@ -2031,10 +2031,8 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, rem += pipe->bufs[(pipe->curbuf + idx) & (pipe->buffers -1 )].len; ret = -EINVAL ; -if (rem < len) { -pipe_unlock (pipe); - goto out; - } +if (rem < len) + goto out_free; rem = len;while (rem) {
@@ -2052,7 +2050,9 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, pipe->curbuf = (pipe->curbuf +1 ) & (pipe->buffers -1 ); pipe->nrbufs--; }else { - ibuf->ops->get (pipe, ibuf); +if (!pipe_buf_get (pipe, ibuf)) + goto out_free; + *obuf = *ibuf; obuf->flags &= ~PIPE_BUF_FLAG_GIFT ; obuf->len = rem;
@@ -2075,13 +2075,13 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe, ret =fuse_dev_do_write (fud, &cs, len);pipe_lock (pipe); +out_free:for (idx =0 ; idx < nbuf; idx++) {struct pipe_buffer *buf = &bufs[idx]; buf->ops->release (pipe, buf); }pipe_unlock (pipe); -out:kfree (bufs);return ret; }
fs/namei.c +1 -1
@@ -1358,7 +1358,7 @@ static int follow_dotdot_rcu(struct nameidata *nd) nd->path.dentry = parent; nd->seq = seq;if (unlikely (!path_connected (&nd->path))) -return -ENOENT ; +return -ECHILD ;break ; }else {struct mount *mnt =real_mount (nd->path.mnt);
fs/pipe.c +2 -2
@@ -178,9 +178,9 @@ EXPORT_SYMBOL(generic_pipe_buf_steal);* in the tee() system call, when we duplicate the buffers in one * pipe into another. */ -void generic_pipe_buf_get (struct pipe_inode_info *pipe,struct pipe_buffer *buf) +bool generic_pipe_buf_get (struct pipe_inode_info *pipe,struct pipe_buffer *buf) { -page_cache_get (buf->page); +return try_get_page (buf->page); }EXPORT_SYMBOL (generic_pipe_buf_get);
fs/splice.c +10 -2
@@ -1876,7 +1876,11 @@ retry:* Get a reference to this pipe buffer, * so we can copy the contents over. */ - ibuf->ops->get (ipipe, ibuf); +if (!pipe_buf_get (ipipe, ibuf)) { +if (ret ==0 ) + ret = -EFAULT ; +break ; + } *obuf = *ibuf;/*
@@ -1948,7 +1952,11 @@ static int link_pipe(struct pipe_inode_info *ipipe,* Get a reference to this pipe buffer, * so we can copy the contents over. */ - ibuf->ops->get (ipipe, ibuf); +if (!pipe_buf_get (ipipe, ibuf)) { +if (ret ==0 ) + ret = -EFAULT ; +break ; + } obuf = opipe->bufs + nbuf; *obuf = *ibuf;
include/linux/bitops.h +2 -1
@@ -3,7 +3,8 @@#include <asm/types.h> #include <linux/bits.h> -#define BITS_TO_LONGS (nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) +#define BITS_PER_TYPE (type) (sizeof(type) * BITS_PER_BYTE) +#define BITS_TO_LONGS (nr) DIV_ROUND_UP(nr, BITS_PER_TYPE(long))extern unsigned int __sw_hweight8 (unsigned int w);extern unsigned int __sw_hweight16 (unsigned int w);
include/linux/hid.h +1 -1
@@ -451,7 +451,7 @@ struct hid_report_enum { };#define HID_MIN_BUFFER_SIZE 64/* make sure there is at least a packet size of space */ -#define HID_MAX_BUFFER_SIZE 4096/* 4kb */ +#define HID_MAX_BUFFER_SIZE 8192/* 8kb */ #define HID_CONTROL_FIFO_SIZE 256/* to init devices with >100 reports */ #define HID_OUTPUT_FIFO_SIZE 64
include/linux/mm.h +22 -1
@@ -488,6 +488,15 @@ static inline void get_huge_page_tail(struct page *page)extern bool __get_page_tail (struct page *page); +static inline int page_ref_count (struct page *page) +{ +return atomic_read (&page->_count); +} + +/* 127: arbitrary random number, small enough to assemble well */ +#define page_ref_zero_or_close_to_overflow (page) \ + ((unsigned int) atomic_read(&page->_count) + 127u <= 127u) +static inline void get_page (struct page *page) {if (unlikely (PageTail (page)))
@@ -497,10 +506,22 @@ static inline void get_page(struct page *page)* Getting a normal page or the head of a compound page * requires to already have an elevated page->_count. */ -VM_BUG_ON_PAGE (atomic_read (&page->_count) <=0 , page); +VM_BUG_ON_PAGE (page_ref_zero_or_close_to_overflow (page), page);atomic_inc (&page->_count); } +static inline __must_check bool try_get_page (struct page *page) +{ +if (unlikely (PageTail (page))) +if (likely (__get_page_tail (page))) +return true; + +if (WARN_ON_ONCE (atomic_read (&page->_count) <=0 )) +return false; +atomic_inc (&page->_count); +return true; +} +static inline struct page *virt_to_head_page (const void *x) {struct page *page =virt_to_page (x);
include/linux/pipe_fs_i.h +15 -2
@@ -112,9 +112,22 @@ struct pipe_buf_operations {/* * Get a reference to the pipe buffer. */ -void (*get)(struct pipe_inode_info *,struct pipe_buffer *); +bool (*get)(struct pipe_inode_info *,struct pipe_buffer *); }; +/** +* pipe_buf_get - get a reference to a pipe_buffer +* @pipe: the pipe that the buffer belongs to +* @buf: the buffer to get a reference to +* +* Return: %true if the reference was successfully obtained. +*/ +static inline __must_check bool pipe_buf_get (struct pipe_inode_info *pipe, +struct pipe_buffer *buf) +{ +return buf->ops->get (pipe, buf); +} +/* Differs from PIPE_BUF in that PIPE_SIZE is the length of the actual memory allocation, whereas PIPE_BUF makes atomicity guarantees. */ #define PIPE_SIZE PAGE_SIZE
@@ -137,7 +150,7 @@ struct pipe_inode_info *alloc_pipe_info(void);void free_pipe_info (struct pipe_inode_info *);/* Generic pipe buffer ops functions */ -void generic_pipe_buf_get (struct pipe_inode_info *,struct pipe_buffer *); +bool generic_pipe_buf_get (struct pipe_inode_info *,struct pipe_buffer *);int generic_pipe_buf_confirm (struct pipe_inode_info *,struct pipe_buffer *);int generic_pipe_buf_steal (struct pipe_inode_info *,struct pipe_buffer *);void generic_pipe_buf_release (struct pipe_inode_info *,struct pipe_buffer *);
include/net/flow_dissector.h +9 -0
@@ -4,6 +4,7 @@#include <linux/types.h> #include <linux/in6.h> #include <linux/siphash.h> +#include <linux/string.h> #include <uapi/linux/if_ether.h> /**
@@ -185,4 +186,12 @@ static inline bool flow_keys_have_l4(struct flow_keys *keys)u32 flow_hash_from_keys (struct flow_keys *keys); +static inline void +flow_dissector_init_keys (struct flow_dissector_key_control *key_control, +struct flow_dissector_key_basic *key_basic) +{ +memset (key_control,0 ,sizeof (*key_control)); +memset (key_basic,0 ,sizeof (*key_basic)); +} +#endif
kernel/audit.c +21 -19
@@ -753,13 +753,11 @@ static void audit_log_feature_change(int which, u32 old_feature, u32 new_featureaudit_log_end (ab); } -static int audit_set_feature (struct sk_buff *skb) +static int audit_set_feature (struct audit_features *uaf) { -struct audit_features *uaf;int i;BUILD_BUG_ON (AUDIT_LAST_FEATURE +1 >ARRAY_SIZE (audit_feature_names)); - uaf =nlmsg_data (nlmsg_hdr (skb));/* if there is ever a version 2 we should handle that here */
@@ -815,6 +813,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) {u32 seq;void *data; +int data_len;int err;struct audit_buffer *ab;u16 msg_type = nlh->nlmsg_type;
@@ -838,6 +837,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) } seq = nlh->nlmsg_seq; data =nlmsg_data (nlh); + data_len =nlmsg_len (nlh);switch (msg_type) {case AUDIT_GET : {
@@ -859,7 +859,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)struct audit_status s;memset (&s,0 ,sizeof (s));/* guard against past and future API changes */ -memcpy (&s, data,min_t (size_t,sizeof (s),nlmsg_len (nlh))); +memcpy (&s, data,min_t (size_t,sizeof (s), data_len));if (s.mask &AUDIT_STATUS_ENABLED ) { err =audit_set_enabled (s.enabled);if (err <0 )
@@ -908,7 +908,9 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)return err;break ;case AUDIT_SET_FEATURE : - err =audit_set_feature (skb); +if (data_len <sizeof (struct audit_features )) +return -EINVAL ; + err =audit_set_feature (data);if (err)return err;break ;
@@ -920,6 +922,8 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) err =audit_filter_user (msg_type);if (err ==1 ) {/* match or error */ +char *str = data; + err =0 ;if (msg_type ==AUDIT_USER_TTY ) { err =tty_audit_push_current ();
@@ -928,19 +932,17 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) }mutex_unlock (&audit_cmd_mutex);audit_log_common_recv_msg (&ab, msg_type); -if (msg_type !=AUDIT_USER_TTY ) +if (msg_type !=AUDIT_USER_TTY ) { +/* ensure NULL termination */ + str[data_len -1 ] ='\0' ;audit_log_format (ab," msg='%.*s'" ,AUDIT_MESSAGE_TEXT_MAX , - (char *)data); -else { -int size; - + str); + }else {audit_log_format (ab," data=" ); - size =nlmsg_len (nlh); -if (size >0 && - ((unsigned char *)data)[size -1 ] =='\0' ) - size--; -audit_log_n_untrustedstring (ab, data, size); +if (data_len >0 && str[data_len -1 ] =='\0' ) + data_len--; +audit_log_n_untrustedstring (ab, str, data_len); }audit_set_portid (ab,NETLINK_CB (skb).portid);audit_log_end (ab);
@@ -949,7 +951,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)break ;case AUDIT_ADD_RULE :case AUDIT_DEL_RULE : -if (nlmsg_len (nlh) <sizeof (struct audit_rule_data )) +if (data_len <sizeof (struct audit_rule_data ))return -EINVAL ;if (audit_enabled ==AUDIT_LOCKED ) {audit_log_common_recv_msg (&ab,AUDIT_CONFIG_CHANGE );
@@ -958,7 +960,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)return -EPERM ; } err =audit_rule_change (msg_type,NETLINK_CB (skb).portid, - seq, data,nlmsg_len (nlh)); + seq, data, data_len);break ;case AUDIT_LIST_RULES : err =audit_list_rules_send (skb, seq);
@@ -972,7 +974,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)case AUDIT_MAKE_EQUIV : {void *bufp = data;u32 sizes[2 ]; -size_t msglen =nlmsg_len (nlh); +size_t msglen = data_len;char *old, *new; err = -EINVAL ;
@@ -1049,7 +1051,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)memset (&s,0 ,sizeof (s));/* guard against past and future API changes */ -memcpy (&s, data,min_t (size_t,sizeof (s),nlmsg_len (nlh))); +memcpy (&s, data,min_t (size_t,sizeof (s), data_len));/* check if new data is valid */ if ((s.enabled !=0 && s.enabled !=1 ) || (s.log_passwd !=0 && s.log_passwd !=1 ))
kernel/auditfilter.c +39 -32
154 lines not on this page · raw message
kernel/trace/trace.c +5 -1
@@ -5749,12 +5749,16 @@ static void buffer_pipe_buf_release(struct pipe_inode_info *pipe, buf->private =0 ; } -static void buffer_pipe_buf_get (struct pipe_inode_info *pipe, +static bool buffer_pipe_buf_get (struct pipe_inode_info *pipe,struct pipe_buffer *buf) {struct buffer_ref *ref = (struct buffer_ref *)buf->private; +if (ref->ref >INT_MAX /2 ) +return false; + ref->ref++; +return true; }/* Pipe buffer operations for a buffer. */
mm/gup.c +36 -15
117 lines not on this page · raw message
mm/hugetlb.c +15 -1
@@ -3886,6 +3886,7 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,unsigned long vaddr = *position;unsigned long remainder = *nr_pages;struct hstate *h =hstate_vma (vma); +int err = -EFAULT ;while (vaddr < vma->vm_end && remainder) {pte_t *pte;
@@ -3957,6 +3958,19 @@ long follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, pfn_offset = (vaddr & ~huge_page_mask (h)) >>PAGE_SHIFT ; page =pte_page (huge_ptep_get (pte)); + +/* +* Instead of doing 'try_get_page_foll()' below in the same_page +* loop, just check the count once here. +*/ +if (unlikely (page_count (page) <=0 )) { +if (pages) { +spin_unlock (ptl); + remainder =0 ; + err = -ENOMEM ; +break ; + } + } same_page:if (pages) { pages[i] =mem_map_offset (page, pfn_offset);
@@ -3983,7 +3997,7 @@ same_page: *nr_pages = remainder; *position = vaddr; -return i ? i : -EFAULT ; +return i ? i : err; } unsigned long hugetlb_change_protection(struct vm_area_struct *vma,
mm/internal.h +26 -2
@@ -81,7 +81,8 @@ static inline void __get_page_tail_foll(struct page *page,* speculative page access (like in * page_cache_get_speculative()) on tail pages. */ -VM_BUG_ON_PAGE (atomic_read (&compound_head (page)->_count) <=0 , page); +VM_BUG_ON_PAGE (page_ref_zero_or_close_to_overflow (compound_head (page)), + page);if (get_page_head)atomic_inc (&compound_head (page)->_count);get_huge_page_tail (page);
@@ -106,11 +107,34 @@ static inline void get_page_foll(struct page *page)* Getting a normal page or the head of a compound page * requires to already have an elevated page->_count. */ -VM_BUG_ON_PAGE (atomic_read (&page->_count) <=0 , page); +VM_BUG_ON_PAGE (page_ref_zero_or_close_to_overflow (page), page);atomic_inc (&page->_count); } } +static inline __must_check bool try_get_page_foll (struct page *page) +{ +if (unlikely (PageTail (page))) { +if (WARN_ON_ONCE (atomic_read (&compound_head (page)->_count) <=0 )) +return false; +/* +* This is safe only because +* __split_huge_page_refcount() can't run under +* get_page_foll() because we hold the proper PT lock. +*/ +__get_page_tail_foll (page, true); + }else { +/* +* Getting a normal page or the head of a compound page +* requires to already have an elevated page->_count. +*/ +if (WARN_ON_ONCE (atomic_read (&page->_count) <=0 )) +return false; +atomic_inc (&page->_count); + } +return true; +} +extern unsigned long highest_memmap_pfn;/*
net/core/fib_rules.c +1 -1
@@ -570,7 +570,7 @@ static int fib_nl_fill_rule(struct sk_buff *skb, struct fib_rule *rule, frh =nlmsg_data (nlh); frh->family = ops->family; - frh->table = rule->table; + frh->table = rule->table <256 ? rule->table :RT_TABLE_COMPAT ;if (nla_put_u32 (skb,FRA_TABLE , rule->table)) goto nla_put_failure;if (nla_put_u32 (skb,FRA_SUPPRESS_PREFIXLEN , rule->suppress_prefixlen))
net/ipv6/ip6_fib.c +4 -3
@@ -780,8 +780,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, found++;break ; } -if (rt_can_ecmp) - fallback_ins = fallback_ins ?: ins; + fallback_ins = fallback_ins ?: ins; goto next_iter; }
@@ -821,7 +820,9 @@ next_iter: }if (fallback_ins && !found) { -/* No ECMP-able route found, replace first non-ECMP one */ +/* No matching route with same ecmp-able-ness found, replace +* first matching route +*/ ins = fallback_ins; iter = *ins; found++;
net/ipv6/route.c +1 -0
@@ -2953,6 +2953,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg)*/ cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |NLM_F_REPLACE ); + cfg->fc_nlinfo.nlh->nlmsg_flags |=NLM_F_CREATE ; nhn++; }
net/mac80211/util.c +12 -6
@@ -939,16 +939,22 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, elem_parse_failed = true;break ;case WLAN_EID_VHT_OPERATION : -if (elen >=sizeof (struct ieee80211_vht_operation )) +if (elen >=sizeof (struct ieee80211_vht_operation )) { elems->vht_operation = (void *)pos; -else - elem_parse_failed = true; +if (calc_crc) + crc =crc32_be (crc, pos -2 , elen +2 ); +break ; + } + elem_parse_failed = true;break ;case WLAN_EID_OPMODE_NOTIF : -if (elen >0 ) +if (elen >0 ) { elems->opmode_notif = pos; -else - elem_parse_failed = true; +if (calc_crc) + crc =crc32_be (crc, pos -2 , elen +2 ); +break ; + } + elem_parse_failed = true;break ;case WLAN_EID_MESH_ID : elems->mesh_id = pos;
net/netlink/af_netlink.c +3 -2
@@ -1003,7 +1003,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,if (nlk->netlink_bind && groups) {int group; -for (group =0 ; group < nlk->ngroups; group++) { +/* nl_groups is a u32, so cap the maximum groups we can bind */ +for (group =0 ; group <BITS_PER_TYPE (u32); group++) {if (!test_bit (group, &groups))continue ; err = nlk->netlink_bind (net, group +1 );
@@ -1022,7 +1023,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, netlink_insert(sk, nladdr->nl_pid) :netlink_autobind (sock);if (err) { -netlink_undo_bind (nlk->ngroups, groups, sk); +netlink_undo_bind (BITS_PER_TYPE (u32), groups, sk);return err; } }
net/sched/cls_flower.c +1 -0
@@ -127,6 +127,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,struct fl_flow_key skb_key;struct fl_flow_key skb_mkey; +flow_dissector_init_keys (&skb_key.control, &skb_key.basic);fl_clear_masked_range (&skb_key, &head->mask); skb_key.indev_ifindex = skb->skb_iif;/* skb_flow_dissect() does not set n_proto in case an unknown protocol,
net/sctp/sm_statefuns.c +20 -7
@@ -177,6 +177,16 @@ sctp_chunk_length_valid(struct sctp_chunk *chunk,return 1 ; } +/* Check for format error in an ABORT chunk */ +static inline bool sctp_err_chunk_valid (struct sctp_chunk *chunk) +{ +struct sctp_errhdr *err; + +sctp_walk_errors (err, chunk->chunk_hdr); + +return (void *)err == (void *)chunk->chunk_end; +} +/********************************************************** * These are the state functions for handling chunk events. **********************************************************/
@@ -2159,6 +2169,9 @@ sctp_disposition_t sctp_sf_shutdown_pending_abort( sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))return sctp_sf_discard_chunk (net, ep, asoc, type, arg, commands); +if (!sctp_err_chunk_valid (chunk)) +return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +return __sctp_sf_do_9_1_abort (net, ep, asoc, type, arg, commands); }
@@ -2201,6 +2214,9 @@ sctp_disposition_t sctp_sf_shutdown_sent_abort(struct net *net, sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))return sctp_sf_discard_chunk (net, ep, asoc, type, arg, commands); +if (!sctp_err_chunk_valid (chunk)) +return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +/* Stop the T2-shutdown timer. */ sctp_add_cmd_sf (commands,SCTP_CMD_TIMER_STOP ,SCTP_TO (SCTP_EVENT_TIMEOUT_T2_SHUTDOWN ));
@@ -2466,6 +2482,9 @@ sctp_disposition_t sctp_sf_do_9_1_abort(struct net *net, sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest))return sctp_sf_discard_chunk (net, ep, asoc, type, arg, commands); +if (!sctp_err_chunk_valid (chunk)) +return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +return __sctp_sf_do_9_1_abort (net, ep, asoc, type, arg, commands); }
@@ -2482,15 +2501,9 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(struct net *net,/* See if we have an error cause code in the chunk. */ len =ntohs (chunk->chunk_hdr->length); -if (len >=sizeof (struct sctp_chunkhdr ) +sizeof (struct sctp_errhdr )) { - -sctp_errhdr_t *err; -sctp_walk_errors (err, chunk->chunk_hdr); -if ((void *)err != (void *)chunk->chunk_end) -return sctp_sf_pdiscard (net, ep, asoc, type, arg, commands); +if (len >=sizeof (struct sctp_chunkhdr ) +sizeof (struct sctp_errhdr )) error = ((sctp_errhdr_t *)chunk->skb->data)->cause; - }sctp_add_cmd_sf (commands,SCTP_CMD_SET_SK_ERR ,SCTP_ERROR (ECONNRESET ));/* ASSOC_FAILED will DELETE_TCB. */
net/wireless/ethtool.c +6 -2
@@ -6,9 +6,13 @@void cfg80211_get_drvinfo (struct net_device *dev,struct ethtool_drvinfo *info) {struct wireless_dev *wdev = dev->ieee80211_ptr; +struct device *pdev =wiphy_dev (wdev->wiphy); -strlcpy (info->driver,wiphy_dev (wdev->wiphy)->driver->name, -sizeof (info->driver)); +if (pdev->driver) +strlcpy (info->driver, pdev->driver->name, +sizeof (info->driver)); +else +strlcpy (info->driver,"N/A" ,sizeof (info->driver));strlcpy (info->version,init_utsname ()->release,sizeof (info->version));
net/wireless/nl80211.c +1 -0
@@ -330,6 +330,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { [NL80211_ATTR_CONTROL_PORT_ETHERTYPE] = { .type = NLA_U16 }, [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, + [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, [NL80211_ATTR_PID] = { .type = NLA_U32 },
sound/soc/codecs/pcm512x.c +5 -3
@@ -1439,13 +1439,15 @@ int pcm512x_probe(struct device *dev, struct regmap *regmap) } pcm512x->sclk =devm_clk_get (dev,NULL ); -if (PTR_ERR (pcm512x->sclk) == -EPROBE_DEFER ) -return -EPROBE_DEFER ; +if (PTR_ERR (pcm512x->sclk) == -EPROBE_DEFER ) { + ret = -EPROBE_DEFER ; + goto err; + }if (!IS_ERR (pcm512x->sclk)) { ret =clk_prepare_enable (pcm512x->sclk);if (ret !=0 ) {dev_err (dev,"Failed to enable SCLK: %d\n" , ret); -return ret; + goto err; } }
sound/soc/soc-dapm.c +1 -1
@@ -4317,7 +4317,7 @@ static void soc_dapm_shutdown_dapm(struct snd_soc_dapm_context *dapm)continue ;if (w->power) {dapm_seq_insert (w, &down_list, false); - w->power =0 ; + w->new_power =0 ; powerdown =1 ; } }
sound/soc/soc-pcm.c +8 -8
@@ -2866,16 +2866,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,ssize_t offset =0 ;/* FE state */ - offset +=snprintf (buf + offset, size - offset, + offset +=scnprintf (buf + offset, size - offset,"[%s - %s]\n" , fe->dai_link->name, stream ?"Capture" :"Playback" ); - offset +=snprintf (buf + offset, size - offset,"State: %s\n" , + offset +=scnprintf (buf + offset, size - offset,"State: %s\n" ,dpcm_state_string (fe->dpcm[stream].state));if ((fe->dpcm[stream].state >=SND_SOC_DPCM_STATE_HW_PARAMS ) && (fe->dpcm[stream].state <=SND_SOC_DPCM_STATE_STOP )) - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, "Hardware Params: " "Format = %s, Channels = %d, Rate = %d\n", snd_pcm_format_name(params_format(params)),
@@ -2883,10 +2883,10 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe, params_rate(params));/* BEs state */ - offset +=snprintf (buf + offset, size - offset,"Backends:\n" ); + offset +=scnprintf (buf + offset, size - offset,"Backends:\n" );if (list_empty (&fe->dpcm[stream].be_clients)) { - offset +=snprintf (buf + offset, size - offset, + offset +=scnprintf (buf + offset, size - offset," No active DSP links\n" ); goto out; }
@@ -2895,16 +2895,16 @@ static ssize_t dpcm_show_state(struct snd_soc_pcm_runtime *fe,struct snd_soc_pcm_runtime *be = dpcm->be; params = &dpcm->hw_params; - offset +=snprintf (buf + offset, size - offset, + offset +=scnprintf (buf + offset, size - offset,"- %s\n" , be->dai_link->name); - offset +=snprintf (buf + offset, size - offset, + offset +=scnprintf (buf + offset, size - offset," State: %s\n" ,dpcm_state_string (be->dpcm[stream].state));if ((be->dpcm[stream].state >=SND_SOC_DPCM_STATE_HW_PARAMS ) && (be->dpcm[stream].state <=SND_SOC_DPCM_STATE_STOP )) - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, " Hardware Params: " "Format = %s, Channels = %d, Rate = %d\n", snd_pcm_format_name(params_format(params)),
virt/kvm/kvm_main.c +6 -6
@@ -1865,12 +1865,12 @@ int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,if (slots->generation != ghc->generation)kvm_gfn_to_hva_cache_init (kvm, ghc, ghc->gpa, ghc->len); -if (unlikely (!ghc->memslot)) -return kvm_write_guest (kvm, ghc->gpa, data, len); -if (kvm_is_error_hva (ghc->hva))return -EFAULT ; +if (unlikely (!ghc->memslot)) +return kvm_write_guest (kvm, ghc->gpa, data, len); + r =__copy_to_user ((void __user *)ghc->hva, data, len);if (r)return -EFAULT ;
@@ -1891,12 +1891,12 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,if (slots->generation != ghc->generation)kvm_gfn_to_hva_cache_init (kvm, ghc, ghc->gpa, ghc->len); -if (unlikely (!ghc->memslot)) -return kvm_read_guest (kvm, ghc->gpa, data, len); -if (kvm_is_error_hva (ghc->hva))return -EFAULT ; +if (unlikely (!ghc->memslot)) +return kvm_read_guest (kvm, ghc->gpa, data, len); + r =__copy_from_user (data, (void __user *)ghc->hva, len);if (r)return -EFAULT ;