Linux 4.14.195
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.14.195 kernel.
All users of the 4.14 kernel series must upgrade.
The updated 4.14.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.14.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/alpha/include/asm/io.h | 8 +- arch/m68k/include/asm/m53xxacr.h | 6 - arch/powerpc/mm/fault.c | 55 +++++++++++------ arch/powerpc/platforms/pseries/ras.c | 1 drivers/clk/clk.c | 52 ++++++++++++---- drivers/cpufreq/intel_pstate.c | 1 drivers/gpu/drm/vgem/vgem_drv.c | 27 -------- drivers/input/mouse/psmouse-base.c | 2 drivers/media/pci/ttpci/budget-core.c | 11 ++- drivers/media/platform/davinci/vpss.c | 20 ++++-- drivers/net/bonding/bond_main.c | 42 +++++++++++-- drivers/net/dsa/b53/b53_common.c | 2 drivers/net/ethernet/freescale/fec_main.c | 4 - drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 2 drivers/net/ethernet/intel/i40e/i40e_common.c | 35 ++++++++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 3 drivers/net/hyperv/netvsc_drv.c | 2 drivers/rtc/rtc-goldfish.c | 1 drivers/scsi/libfc/fc_disc.c | 12 ++- drivers/scsi/ufs/ufs_quirks.h | 1 drivers/scsi/ufs/ufshcd.c | 2 drivers/spi/Kconfig | 3 drivers/spi/spi.c | 21 ++++++ drivers/vfio/vfio_iommu_type1.c | 71 ++++++++++++++++++++-- drivers/virtio/virtio_ring.c | 3 drivers/xen/preempt.c | 2 fs/btrfs/ctree.h | 2 fs/btrfs/export.c | 8 +- fs/btrfs/export.h | 5 + fs/btrfs/inode.c | 23 ++++--- fs/btrfs/super.c | 18 +++-- fs/btrfs/sysfs.c | 4 + fs/eventpoll.c | 19 +++-- fs/ext4/namei.c | 22 ++++-- fs/jbd2/journal.c | 4 - fs/jffs2/dir.c | 6 + fs/romfs/storage.c | 4 - fs/xfs/xfs_sysfs.h | 6 + fs/xfs/xfs_trans_dquot.c | 2 kernel/relay.c | 1 mm/hugetlb.c | 24 +++---- mm/khugepaged.c | 7 -- mm/page_alloc.c | 7 +- sound/soc/codecs/msm8916-wcd-analog.c | 4 - sound/soc/intel/atom/sst-mfld-platform-pcm.c | 5 - tools/perf/util/probe-finder.c | 2 virt/kvm/arm/mmu.c | 6 - 48 files changed, 399 insertions(+), 171 deletions(-)
Al Viro (1):
do_epoll_ctl(): clean the failure exits up a bit
Alex Williamson (1):
vfio/type1: Add proper error unwind for vfio_iommu_replay()
Charan Teja Reddy (1):
mm, page_alloc: fix core hung in free_pcppages_bulk()
Chris Wilson (1):
drm/vgem: Replace opencoded version of drm_gem_dumb_map_offset()
Christophe Leroy (1):
powerpc/mm: Only read faulting instruction when necessary in do_page_fault()
Chuhong Yuan (1):
media: budget-core: Improve exception handling in budget_register()
Cong Wang (1):
bonding: fix a potential double-unregister
Darrick J. Wong (1):
xfs: fix inode quota reservation checks
Dinghao Liu (1):
ASoC: intel: Fix memleak in sst_media_open
Doug Berger (1):
mm: include CMA pages in lowmem_reserve at boot
Eiichi Tsukata (1):
xfs: Fix UBSAN null-ptr-deref in xfs_sysfs_init
Eric Sandeen (1):
ext4: fix potential negative array index in do_split()
Evgeny Novikov (1):
media: vpss: clean up resources in init
Fugang Duan (1):
net: fec: correct the error path for regulator disable in probe
Greg Kroah-Hartman (1):
Linux 4.14.195
Greg Ungerer (1):
m68knommu: fix overwriting of bits in ColdFire V3 cache control
Grzegorz Szczurek (1):
i40e: Fix crash during removing i40e driver
Haiyang Zhang (1):
hv_netvsc: Fix the queue_mapping in netvsc_vf_xmit()
Huacai Chen (1):
rtc: goldfish: Enable interrupt in set_alarm() when necessary
Hugh Dickins (2):
khugepaged: khugepaged_test_exit() check mmget_still_valid()
khugepaged: adjust VM_BUG_ON_MM() in __khugepaged_enter()
Jan Kara (1):
ext4: fix checking of directory entry validity for inline directories
Jann Horn (1):
romfs: fix uninitialized memory leak in romfs_dev_read()
Jarod Wilson (1):
bonding: show saner speed for broadcast mode
Javed Hasan (1):
scsi: libfc: Free skb in fc_disc_gpn_id_resp() for valid cases
Jiri Wiesner (1):
bonding: fix active-backup failover for current ARP slave
Josef Bacik (2):
btrfs: don't show full path of bind mounts in subvol=
btrfs: sysfs: use NOFS for device creation
Juergen Gross (1):
xen: don't reschedule in preemption off sections
Luc Van Oostenryck (1):
alpha: fix annotation of io{read,write}{16,32}be()Lukas Wunner (1):
spi: Prevent adding devices below an unregistering controller
Mao Wenan (1):
virtio_ring: Avoid loop when vq is broken in virtqueue_poll
Marc Zyngier (1):
epoll: Keep a reference on files added to the check list
Marcos Paulo de Souza (1):
btrfs: export helpers for subvolume name/id resolution
Masami Hiramatsu (1):
perf probe: Fix memory leakage when the probe point is not found
Michael Ellerman (1):
powerpc: Allow 4224 bytes of stack expansion for the signal frame
Nikolay Borisov (1):
btrfs: Move free_pages_out label in inline extent handling branch in compress_file_range
Peter Xu (1):
mm/hugetlb: fix calculation of adjust_range_if_pmd_sharing_possible
Przemyslaw Patynowski (1):
i40e: Set RX_ONLY mode for unicast promiscuous on VLAN
Qu Wenruo (1):
btrfs: inode: fix NULL pointer dereference if inode doesn't need compression
Srinivas Kandagatla (1):
ASoC: msm8916-wcd-analog: fix register Interrupt offset
Srinivas Pandruvada (1):
cpufreq: intel_pstate: Fix cpuinfo_max_freq when MSR_TURBO_RATIO_LIMIT is 0
Stanley Chu (1):
scsi: ufs: Add DELAY_BEFORE_LPM quirk for Micron devices
Stephen Boyd (1):
clk: Evict unregistered clks from parent caches
Tom Rix (1):
net: dsa: b53: check for timeout
Vasant Hegde (1):
powerpc/pseries: Do not initiate shutdown when system is running on UPS
Wei Yongjun (1):
kernel/relay.c: fix memleak on destroy relay channel
Will Deacon (1):
KVM: arm/arm64: Don't reschedule in unmap_stage2_range()
Xiongfeng Wang (1):
Input: psmouse - add a newline when printing 'proto' by sysfs
Zhe Li (1):
jffs2: fix UAF problem
zhangyi (F) (1):
jbd2: add the missing unlock_buffer() in the error path of jbd2_write_superblock()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 194 +SUBLEVEL = 195 EXTRAVERSION = NAME = Petit Gorille
arch/alpha/include/asm/io.h +4 -4
@@ -493,10 +493,10 @@ extern inline void writeq(u64 b, volatile void __iomem *addr) }#endif -#define ioread16be (p) be16_to_cpu(ioread16(p)) -#define ioread32be (p) be32_to_cpu(ioread32(p)) -#define iowrite16be (v,p) iowrite16(cpu_to_be16(v), (p)) -#define iowrite32be (v,p) iowrite32(cpu_to_be32(v), (p)) +#define ioread16be (p) swab16(ioread16(p)) +#define ioread32be (p) swab32(ioread32(p)) +#define iowrite16be (v,p) iowrite16(swab16(v), (p)) +#define iowrite32be (v,p) iowrite32(swab32(v), (p))#define inb_p inb#define inw_p inw
arch/m68k/include/asm/m53xxacr.h +3 -3
@@ -89,9 +89,9 @@* coherency though in all cases. And for copyback caches we will need * to push cached data as well. */ -#define CACHE_INIT CACR_CINVA -#define CACHE_INVALIDATE CACR_CINVA -#define CACHE_INVALIDATED CACR_CINVA +#define CACHE_INIT (CACHE_MODE + CACR_CINVA - CACR_EC) +#define CACHE_INVALIDATE (CACHE_MODE + CACR_CINVA) +#define CACHE_INVALIDATED (CACHE_MODE + CACR_CINVA)#define ACR0_MODE ((CONFIG_RAMBASE & 0xff000000) + \ (0x000f0000) + \
arch/powerpc/mm/fault.c +38 -17
111 lines not on this page · raw message
arch/powerpc/platforms/pseries/ras.c +0 -1
@@ -115,7 +115,6 @@ static void handle_system_shutdown(char event_modifier)case EPOW_SHUTDOWN_ON_UPS :pr_emerg ("Loss of system power detected. System is running on" " UPS/battery. Check RTAS error log for details\n" ); -orderly_poweroff (true);break ;case EPOW_SHUTDOWN_LOSS_OF_CRITICAL_FUNCTIONS :
drivers/clk/clk.c +41 -11
76 lines not on this page · raw message
drivers/cpufreq/intel_pstate.c +1 -0
@@ -1378,6 +1378,7 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu)intel_pstate_get_hwp_max (cpu->cpu, &phy_max, ¤t_max); cpu->pstate.turbo_freq = phy_max * cpu->pstate.scaling; + cpu->pstate.turbo_pstate = phy_max; }else { cpu->pstate.turbo_freq = cpu->pstate.turbo_pstate * cpu->pstate.scaling; }
drivers/gpu/drm/vgem/vgem_drv.c +0 -27
@@ -220,32 +220,6 @@ static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev,return 0 ; } -static int vgem_gem_dumb_map (struct drm_file *file,struct drm_device *dev, -uint32_t handle,uint64_t *offset) -{ -struct drm_gem_object *obj; -int ret; - - obj =drm_gem_object_lookup (file, handle); -if (!obj) -return -ENOENT ; - -if (!obj->filp) { - ret = -EINVAL ; - goto unref; - } - - ret =drm_gem_create_mmap_offset (obj); -if (ret) - goto unref; - - *offset =drm_vma_node_offset_addr (&obj->vma_node); -unref: -drm_gem_object_put_unlocked (obj); - -return ret; -} -static struct drm_ioctl_desc vgem_ioctls[] = {DRM_IOCTL_DEF_DRV (VGEM_FENCE_ATTACH , vgem_fence_attach_ioctl,DRM_AUTH |DRM_RENDER_ALLOW ),DRM_IOCTL_DEF_DRV (VGEM_FENCE_SIGNAL , vgem_fence_signal_ioctl,DRM_AUTH |DRM_RENDER_ALLOW ),
@@ -439,7 +413,6 @@ static struct drm_driver vgem_driver = { .fops = &vgem_driver_fops, .dumb_create = vgem_gem_dumb_create, - .dumb_map_offset = vgem_gem_dumb_map, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
drivers/input/mouse/psmouse-base.c +1 -1
@@ -2012,7 +2012,7 @@ static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp) {int type = *((unsigned int *)kp->arg); -return sprintf (buffer,"%s" ,psmouse_protocol_by_type (type)->name); +return sprintf (buffer,"%s\n" ,psmouse_protocol_by_type (type)->name); }static int __init psmouse_init (void )
drivers/media/pci/ttpci/budget-core.c +8 -3
@@ -383,20 +383,25 @@ static int budget_register(struct budget *budget) ret = dvbdemux->dmx.add_frontend (&dvbdemux->dmx, &budget->hw_frontend);if (ret <0 ) -return ret; + goto err_release_dmx; budget->mem_frontend.source =DMX_MEMORY_FE ; ret = dvbdemux->dmx.add_frontend (&dvbdemux->dmx, &budget->mem_frontend);if (ret <0 ) -return ret; + goto err_release_dmx; ret = dvbdemux->dmx.connect_frontend (&dvbdemux->dmx, &budget->hw_frontend);if (ret <0 ) -return ret; + goto err_release_dmx;dvb_net_init (&budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);return 0 ; + +err_release_dmx: +dvb_dmxdev_release (&budget->dmxdev); +dvb_dmx_release (&budget->demux); +return ret; }static void budget_unregister (struct budget *budget)
drivers/media/platform/davinci/vpss.c +16 -4
@@ -514,19 +514,31 @@ static void vpss_exit(void)static int __init vpss_init (void ) { +int ret; +if (!request_mem_region (VPSS_CLK_CTRL ,4 ,"vpss_clock_control" ))return -EBUSY ; oper_cfg.vpss_regs_base2 =ioremap (VPSS_CLK_CTRL ,4 );if (unlikely (!oper_cfg.vpss_regs_base2)) { -release_mem_region (VPSS_CLK_CTRL ,4 ); -return -ENOMEM ; + ret = -ENOMEM ; + goto err_ioremap; }writel (VPSS_CLK_CTRL_VENCCLKEN | -VPSS_CLK_CTRL_DACCLKEN , oper_cfg.vpss_regs_base2); +VPSS_CLK_CTRL_DACCLKEN , oper_cfg.vpss_regs_base2); + + ret =platform_driver_register (&vpss_driver); +if (ret) + goto err_pd_register; + +return 0 ; -return platform_driver_register (&vpss_driver); +err_pd_register: +iounmap (oper_cfg.vpss_regs_base2); +err_ioremap: +release_mem_region (VPSS_CLK_CTRL ,4 ); +return ret; }subsys_initcall (vpss_init);module_exit (vpss_exit);
drivers/net/bonding/bond_main.c +36 -6
84 lines not on this page · raw message
drivers/net/dsa/b53/b53_common.c +2 -0
@@ -1160,6 +1160,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,return ret;switch (ret) { +case -ETIMEDOUT : +return ret;case -ENOSPC :dev_dbg (dev->dev,"{%pM,%.4d} no space left in ARL\n" , addr, vid);
drivers/net/ethernet/freescale/fec_main.c +2 -2
@@ -3536,11 +3536,11 @@ fec_probe(struct platform_device *pdev) failed_irq: failed_init:fec_ptp_stop (pdev); -if (fep->reg_phy) -regulator_disable (fep->reg_phy); failed_reset:pm_runtime_put_noidle (&pdev->dev);pm_runtime_disable (&pdev->dev); +if (fep->reg_phy) +regulator_disable (fep->reg_phy); failed_regulator:clk_disable_unprepare (fep->clk_ahb); failed_clk_ahb:
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +1 -1
@@ -1175,7 +1175,7 @@ struct i40e_aqc_set_vsi_promiscuous_modes {#define I40E_AQC_SET_VSI_PROMISC_BROADCAST 0x04#define I40E_AQC_SET_VSI_DEFAULT 0x08#define I40E_AQC_SET_VSI_PROMISC_VLAN 0x10 -#define I40E_AQC_SET_VSI_PROMISC_TX 0x8000 +#define I40E_AQC_SET_VSI_PROMISC_RX_ONLY 0x8000__le16 seid;#define I40E_AQC_VSI_PROM_CMD_SEID_MASK 0x3FF__le16 vlan_tag;
drivers/net/ethernet/intel/i40e/i40e_common.c +27 -8
@@ -1914,6 +1914,21 @@ i40e_status i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,return status; } +/** +* i40e_is_aq_api_ver_ge +* @aq: pointer to AdminQ info containing HW API version to compare +* @maj: API major value +* @min: API minor value +* +* Assert whether current HW API version is greater/equal than provided. +**/ +static bool i40e_is_aq_api_ver_ge (struct i40e_adminq_info *aq,u16 maj, +u16 min) +{ +return (aq->api_maj_ver > maj || + (aq->api_maj_ver == maj && aq->api_min_ver >= min)); +} +/** * i40e_aq_add_vsi * @hw: pointer to the hw struct
@@ -2039,18 +2054,16 @@ i40e_status i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,if (set) { flags |=I40E_AQC_SET_VSI_PROMISC_UNICAST ; -if (rx_only_promisc && - (((hw->aq.api_maj_ver ==1 ) && (hw->aq.api_min_ver >=5 )) || - (hw->aq.api_maj_ver >1 ))) - flags |=I40E_AQC_SET_VSI_PROMISC_TX ; +if (rx_only_promisc &&i40e_is_aq_api_ver_ge (&hw->aq,1 ,5 )) + flags |=I40E_AQC_SET_VSI_PROMISC_RX_ONLY ; } cmd->promiscuous_flags =cpu_to_le16 (flags); cmd->valid_flags =cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_UNICAST ); -if (((hw->aq.api_maj_ver >=1 ) && (hw->aq.api_min_ver >=5 )) || - (hw->aq.api_maj_ver >1 )) - cmd->valid_flags |=cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_TX ); +if (i40e_is_aq_api_ver_ge (&hw->aq,1 ,5 )) + cmd->valid_flags |= +cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_RX_ONLY ); cmd->seid =cpu_to_le16 (seid); status =i40e_asq_send_command (hw, &desc,NULL ,0 , cmd_details);
@@ -2147,11 +2160,17 @@ enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,i40e_fill_default_direct_cmd_desc (&desc, i40e_aqc_opc_set_vsi_promiscuous_modes); -if (enable) +if (enable) { flags |=I40E_AQC_SET_VSI_PROMISC_UNICAST ; +if (i40e_is_aq_api_ver_ge (&hw->aq,1 ,5 )) + flags |=I40E_AQC_SET_VSI_PROMISC_RX_ONLY ; + } cmd->promiscuous_flags =cpu_to_le16 (flags); cmd->valid_flags =cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_UNICAST ); +if (i40e_is_aq_api_ver_ge (&hw->aq,1 ,5 )) + cmd->valid_flags |= +cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_RX_ONLY ); cmd->seid =cpu_to_le16 (seid); cmd->vlan_tag =cpu_to_le16 (vid |I40E_AQC_SET_VSI_VLAN_VALID );
drivers/net/ethernet/intel/i40e/i40e_main.c +3 -0
@@ -11822,6 +11822,9 @@ static void i40e_remove(struct pci_dev *pdev)i40e_write_rx_ctl (hw,I40E_PFQF_HENA (0 ),0 );i40e_write_rx_ctl (hw,I40E_PFQF_HENA (1 ),0 ); +while (test_bit (__I40E_RESET_RECOVERY_PENDING, pf->state)) +usleep_range (1000 ,2000 ); +/* no more scheduling of any task */ set_bit (__I40E_SUSPENDED, pf->state);set_bit (__I40E_DOWN, pf->state);
drivers/net/hyperv/netvsc_drv.c +1 -1
@@ -500,7 +500,7 @@ static int netvsc_vf_xmit(struct net_device *net, struct net_device *vf_netdev,int rc; skb->dev = vf_netdev; - skb->queue_mapping =qdisc_skb_cb (skb)->slave_dev_queue_mapping; +skb_record_rx_queue (skb,qdisc_skb_cb (skb)->slave_dev_queue_mapping); rc =dev_queue_xmit (skb);if (likely (rc ==NET_XMIT_SUCCESS || rc ==NET_XMIT_CN )) {
drivers/rtc/rtc-goldfish.c +1 -0
@@ -87,6 +87,7 @@ static int goldfish_rtc_set_alarm(struct device *dev, rtc_alarm64 = rtc_alarm *NSEC_PER_SEC ;writel ((rtc_alarm64 >>32 ), base +TIMER_ALARM_HIGH );writel (rtc_alarm64, base +TIMER_ALARM_LOW ); +writel (1 , base +TIMER_IRQ_ENABLED ); }else {/* * if this function was called with enabled=0
drivers/scsi/libfc/fc_disc.c +9 -3
@@ -605,8 +605,12 @@ static void fc_disc_gpn_id_resp(struct fc_seq *sp, struct fc_frame *fp,if (PTR_ERR (fp) == -FC_EX_CLOSED ) goto out; -if (IS_ERR (fp)) - goto redisc; +if (IS_ERR (fp)) { +mutex_lock (&disc->disc_mutex); +fc_disc_restart (disc); +mutex_unlock (&disc->disc_mutex); + goto out; + } cp =fc_frame_payload_get (fp,sizeof (*cp));if (!cp)
@@ -633,7 +637,7 @@ static void fc_disc_gpn_id_resp(struct fc_seq *sp, struct fc_frame *fp, new_rdata->disc_id = disc->disc_id;fc_rport_login (new_rdata); } - goto out; + goto free_fp; } rdata->disc_id = disc->disc_id;mutex_unlock (&rdata->rp_mutex);
@@ -650,6 +654,8 @@ static void fc_disc_gpn_id_resp(struct fc_seq *sp, struct fc_frame *fp,fc_disc_restart (disc);mutex_unlock (&disc->disc_mutex); } +free_fp: +fc_frame_free (fp); out:kref_put (&rdata->kref, fc_rport_destroy);if (!IS_ERR (fp))
drivers/scsi/ufs/ufs_quirks.h +1 -0
@@ -21,6 +21,7 @@#define UFS_ANY_VENDOR 0xFFFF#define UFS_ANY_MODEL "ANY_MODEL" +#define UFS_VENDOR_MICRON 0x12C#define UFS_VENDOR_TOSHIBA 0x198#define UFS_VENDOR_SAMSUNG 0x1CE#define UFS_VENDOR_SKHYNIX 0x1AD
drivers/scsi/ufs/ufshcd.c +2 -0
@@ -189,6 +189,8 @@ ufs_get_desired_pm_lvl_for_dev_link_state(enum ufs_dev_pwr_mode dev_state,static struct ufs_dev_fix ufs_fixups[] = {/* UFS cards deviations table */ +UFS_FIX (UFS_VENDOR_MICRON ,UFS_ANY_MODEL , +UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM ),UFS_FIX (UFS_VENDOR_SAMSUNG ,UFS_ANY_MODEL ,UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM ),UFS_FIX (UFS_VENDOR_SAMSUNG ,UFS_ANY_MODEL ,UFS_DEVICE_NO_VCCQ ),
drivers/spi/Kconfig +3 -0
@@ -827,4 +827,7 @@ config SPI_SLAVE_SYSTEM_CONTROL endif # SPI_SLAVE +config SPI_DYNAMIC + def_bool ACPI || OF_DYNAMIC || SPI_SLAVE + endif # SPI
drivers/spi/spi.c +20 -1
@@ -428,6 +428,12 @@ static LIST_HEAD(spi_controller_list);*/ static DEFINE_MUTEX (board_lock); +/* +* Prevents addition of devices with same chip select and +* addition of devices below an unregistering controller. +*/ +static DEFINE_MUTEX (spi_add_lock); +/** * spi_alloc_device - Allocate a new SPI device * @ctlr: Controller to which device is connected
@@ -506,7 +512,6 @@ static int spi_dev_check(struct device *dev, void *data)*/ int spi_add_device (struct spi_device *spi) { -static DEFINE_MUTEX (spi_add_lock);struct spi_controller *ctlr = spi->controller;struct device *dev = ctlr->dev.parent;int status;
@@ -534,6 +539,13 @@ int spi_add_device(struct spi_device *spi) goto done; } +/* Controller may unregister concurrently */ +if (IS_ENABLED (CONFIG_SPI_DYNAMIC ) && + !device_is_registered (&ctlr->dev)) { + status = -ENODEV ; + goto done; + } +if (ctlr->cs_gpios) spi->cs_gpio = ctlr->cs_gpios[spi->chip_select];
@@ -2265,6 +2277,10 @@ void spi_unregister_controller(struct spi_controller *ctlr)struct spi_controller *found;int id = ctlr->bus_num; +/* Prevent addition of new devices, unregister existing ones */ +if (IS_ENABLED (CONFIG_SPI_DYNAMIC )) +mutex_lock (&spi_add_lock); +device_for_each_child (&ctlr->dev,NULL , __unregister);/* First make sure that this controller was ever added */
@@ -2285,6 +2301,9 @@ void spi_unregister_controller(struct spi_controller *ctlr)if (found == ctlr)idr_remove (&spi_master_idr, id);mutex_unlock (&board_lock); + +if (IS_ENABLED (CONFIG_SPI_DYNAMIC )) +mutex_unlock (&spi_add_lock); }EXPORT_SYMBOL_GPL (spi_unregister_controller);
drivers/vfio/vfio_iommu_type1.c +66 -5
106 lines not on this page · raw message
drivers/virtio/virtio_ring.c +3 -0
@@ -829,6 +829,9 @@ bool virtqueue_poll(struct virtqueue *_vq, unsigned last_used_idx) {struct vring_virtqueue *vq =to_vvq (_vq); +if (unlikely (vq->broken)) +return false; +virtio_mb (vq->weak_barriers);return (u16 )last_used_idx !=virtio16_to_cpu (_vq->vdev, vq->vring.used->idx); }
drivers/xen/preempt.c +1 -1
@@ -31,7 +31,7 @@ EXPORT_SYMBOL_GPL(xen_in_preemptible_hcall); asmlinkage __visible void xen_maybe_preempt_hcall(void) {if (unlikely (__this_cpu_read (xen_in_preemptible_hcall) - &&need_resched ())) { + &&need_resched () && !preempt_count ())) {/* * Clear flag as we may be rescheduled on a different * cpu.
fs/btrfs/ctree.h +2 -0
@@ -3262,6 +3262,8 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);int btrfs_parse_options (struct btrfs_fs_info *info,char *options,unsigned long new_flags);int btrfs_sync_fs (struct super_block *sb,int wait); +char *btrfs_get_subvol_name_from_objectid (struct btrfs_fs_info *fs_info, +u64 subvol_objectid); static inline __printf(2, 3) void btrfs_no_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...)
fs/btrfs/export.c +4 -4
@@ -56,9 +56,9 @@ static int btrfs_encode_fh(struct inode *inode, u32 *fh, int *max_len,return type; } -static struct dentry *btrfs_get_dentry (struct super_block *sb,u64 objectid, -u64 root_objectid,u32 generation, -int check_generation) +struct dentry *btrfs_get_dentry (struct super_block *sb,u64 objectid, +u64 root_objectid,u32 generation, +int check_generation) {struct btrfs_fs_info *fs_info =btrfs_sb (sb);struct btrfs_root *root;
@@ -151,7 +151,7 @@ static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh,return btrfs_get_dentry (sb, objectid, root_objectid, generation,1 ); } -static struct dentry *btrfs_get_parent (struct dentry *child) +struct dentry *btrfs_get_parent (struct dentry *child) {struct inode *dir =d_inode (child);struct btrfs_fs_info *fs_info =btrfs_sb (dir->i_sb);
fs/btrfs/export.h +5 -0
@@ -17,4 +17,9 @@ struct btrfs_fid {u64 parent_root_objectid; } __attribute__ ((packed)); +struct dentry *btrfs_get_dentry (struct super_block *sb,u64 objectid, +u64 root_objectid,u32 generation, +int check_generation); +struct dentry *btrfs_get_parent (struct dentry *child); +#endif
fs/btrfs/inode.c +15 -8
@@ -629,7 +629,21 @@ static noinline void compress_file_range(struct inode *inode,btrfs_free_reserved_data_space_noquota (inode, start, end - start +1 ); - goto free_pages_out; + +/* +* Ensure we only free the compressed pages if we have +* them allocated, as we can still reach here with +* inode_need_compress() == false. +*/ +if (pages) { +for (i =0 ; i < nr_pages; i++) { +WARN_ON (pages[i]->mapping); +put_page (pages[i]); + } +kfree (pages); + } + +return ; } }
@@ -708,13 +722,6 @@ static noinline void compress_file_range(struct inode *inode, *num_added +=1 ;return ; - -free_pages_out: -for (i =0 ; i < nr_pages; i++) { -WARN_ON (pages[i]->mapping); -put_page (pages[i]); - } -kfree (pages); }static void free_async_extent_pages (struct async_extent *async_extent)
fs/btrfs/super.c +12 -6
@@ -939,8 +939,8 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags,return error; } -static char *get_subvol_name_from_objectid (struct btrfs_fs_info *fs_info, -u64 subvol_objectid) +char *btrfs_get_subvol_name_from_objectid (struct btrfs_fs_info *fs_info, +u64 subvol_objectid) {struct btrfs_root *root = fs_info->tree_root;struct btrfs_root *fs_root;
@@ -1221,6 +1221,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) {struct btrfs_fs_info *info =btrfs_sb (dentry->d_sb);char *compress_type; +const char *subvol_name;if (btrfs_test_opt (info,DEGRADED ))seq_puts (seq,",degraded" );
@@ -1307,8 +1308,13 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)#endif seq_printf (seq,",subvolid=%llu" ,BTRFS_I (d_inode (dentry))->root->root_key.objectid); -seq_puts (seq,",subvol=" ); -seq_dentry (seq, dentry," \t\n\\" ); + subvol_name =btrfs_get_subvol_name_from_objectid (info, +BTRFS_I (d_inode (dentry))->root->root_key.objectid); +if (!IS_ERR (subvol_name)) { +seq_puts (seq,",subvol=" ); +seq_escape (seq, subvol_name," \t\n\\" ); +kfree (subvol_name); + }return 0 ; }
@@ -1427,8 +1433,8 @@ static struct dentry *mount_subvol(const char *subvol_name, u64 subvol_objectid, goto out; } } - subvol_name =get_subvol_name_from_objectid (btrfs_sb (mnt->mnt_sb), - subvol_objectid); + subvol_name =btrfs_get_subvol_name_from_objectid ( +btrfs_sb (mnt->mnt_sb), subvol_objectid);if (IS_ERR (subvol_name)) { root =ERR_CAST (subvol_name); subvol_name =NULL ;
fs/btrfs/sysfs.c +4 -0
@@ -25,6 +25,7 @@#include <linux/bug.h> #include <linux/genhd.h> #include <linux/debugfs.h> +#include <linux/sched/mm.h> #include "ctree.h" #include "disk-io.h"
@@ -749,7 +750,9 @@ int btrfs_sysfs_add_device_link(struct btrfs_fs_devices *fs_devices, {int error =0 ;struct btrfs_device *dev; +unsigned int nofs_flag; + nofs_flag =memalloc_nofs_save ();list_for_each_entry (dev, &fs_devices->devices, dev_list) {struct hd_struct *disk;struct kobject *disk_kobj;
@@ -768,6 +771,7 @@ int btrfs_sysfs_add_device_link(struct btrfs_fs_devices *fs_devices,if (error)break ; } +memalloc_nofs_restore (nofs_flag);return error; }
fs/eventpoll.c +11 -8
@@ -1900,9 +1900,11 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)* not already there, and calling reverse_path_check() * during ep_insert(). */ -if (list_empty (&epi->ffd.file->f_tfile_llink)) +if (list_empty (&epi->ffd.file->f_tfile_llink)) { +get_file (epi->ffd.file);list_add (&epi->ffd.file->f_tfile_llink, &tfile_check_list); + } } }mutex_unlock (&ep->mtx);
@@ -1946,6 +1948,7 @@ static void clear_tfile_check_list(void) file = list_first_entry(&tfile_check_list, struct file, f_tfile_llink);list_del_init (&file->f_tfile_llink); +fput (file); }INIT_LIST_HEAD (&tfile_check_list); }
@@ -2096,13 +2099,13 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,mutex_lock (&epmutex);if (is_file_epoll (tf.file)) { error = -ELOOP ; -if (ep_loop_check (ep, tf.file) !=0 ) { -clear_tfile_check_list (); +if (ep_loop_check (ep, tf.file) !=0 ) goto error_tgt_fput; - } - }else + }else { +get_file (tf.file);list_add (&tf.file->f_tfile_llink, &tfile_check_list); + }mutex_lock_nested (&ep->mtx,0 );if (is_file_epoll (tf.file)) { tep = tf.file->private_data;
@@ -2126,8 +2129,6 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, error =ep_insert (ep, &epds, tf.file, fd, full_check); }else error = -EEXIST ; -if (full_check) -clear_tfile_check_list ();break ;case EPOLL_CTL_DEL :if (epi)
@@ -2150,8 +2151,10 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,mutex_unlock (&ep->mtx); error_tgt_fput: -if (full_check) +if (full_check) { +clear_tfile_check_list ();mutex_unlock (&epmutex); + }fdput (tf); error_fput:
fs/ext4/namei.c +16 -6
@@ -1308,8 +1308,8 @@ int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size, ext4_match(fname, de)) {/* found a match - just to be sure, do * a full check */ -if (ext4_check_dir_entry (dir,NULL , de, bh, bh->b_data, - bh->b_size, offset)) +if (ext4_check_dir_entry (dir,NULL , de, bh, search_buf, + buf_size, offset))return -1 ; *res_dir = de;return 1 ;
@@ -1741,7 +1741,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, blocksize, hinfo, map); map -= count;dx_sort_map (map, count); -/* Split the existing block in the middle, size-wise */ +/* Ensure that neither split block is over half full */ size =0 ; move =0 ;for (i = count-1 ; i >=0 ; i--) {
@@ -1751,8 +1751,18 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, size += map[i].size; move++; } -/* map index at which we will split */ - split = count - move; +/* +* map index at which we will split +* +* If the sum of active entries didn't exceed half the block size, just +* split it in half by count; each resulting block will have at least +* half the space free. +*/ +if (i >0 ) + split = count - move; +else + split = count/2 ; + hash2 = map[split].hash; continued = hash2 == map[split -1 ].hash; dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n",
@@ -2353,7 +2363,7 @@ int ext4_generic_delete_entry(handle_t *handle, de = (struct ext4_dir_entry_2 *)entry_buf;while (i < buf_size - csum_size) {if (ext4_check_dir_entry (dir,NULL , de, bh, - bh->b_data, bh->b_size, i)) + entry_buf, buf_size, i))return -EFSCORRUPTED ;if (de == de_del) {if (pde)
fs/jbd2/journal.c +3 -1
@@ -1356,8 +1356,10 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags)int ret;/* Buffer got discarded which means block device got invalidated */ -if (!buffer_mapped (bh)) +if (!buffer_mapped (bh)) { +unlock_buffer (bh);return -EIO ; + }trace_jbd2_write_superblock (journal, write_flags);if (!(journal->j_flags &JBD2_BARRIER ))
fs/jffs2/dir.c +5 -1
@@ -590,10 +590,14 @@ static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)int ret;uint32_t now =get_seconds (); +mutex_lock (&f->sem);for (fd = f->dents ; fd; fd = fd->next) { -if (fd->ino) +if (fd->ino) { +mutex_unlock (&f->sem);return -ENOTEMPTY ; + } } +mutex_unlock (&f->sem); ret =jffs2_do_unlink (c, dir_f, dentry->d_name.name, dentry->d_name.len, f, now);
fs/romfs/storage.c +1 -3
@@ -221,10 +221,8 @@ int romfs_dev_read(struct super_block *sb, unsigned long pos,size_t limit; limit =romfs_maxsize (sb); -if (pos >= limit) +if (pos >= limit || buflen > limit - pos)return -EIO ; -if (buflen > limit - pos) - buflen = limit - pos;#ifdef CONFIG_ROMFS_ON_MTD if (sb->s_mtd)
fs/xfs/xfs_sysfs.h +4 -2
@@ -44,9 +44,11 @@ xfs_sysfs_init(struct xfs_kobj *parent_kobj, const char *name) { + struct kobject *parent; + + parent = parent_kobj ? &parent_kobj->kobject :NULL ;init_completion (&kobj->complete); -return kobject_init_and_add (&kobj->kobject, ktype, - &parent_kobj->kobject,"%s" , name); +return kobject_init_and_add (&kobj->kobject, ktype, parent,"%s" , name); } static inline void
fs/xfs/xfs_trans_dquot.c +1 -1
@@ -669,7 +669,7 @@ xfs_trans_dqresv( } }if (ninos >0 ) { - total_count =be64_to_cpu (dqp->q_core.d_icount) + ninos; + total_count = dqp->q_res_icount + ninos; timer =be32_to_cpu (dqp->q_core.d_itimer); warns =be16_to_cpu (dqp->q_core.d_iwarns); warnlimit = dqp->q_mount->m_quotainfo->qi_iwarnlimit;
kernel/relay.c +1 -0
@@ -196,6 +196,7 @@ static struct rchan_buf *relay_create_buf(struct rchan *chan)static void relay_destroy_channel (struct kref *kref) { struct rchan *chan = container_of(kref, struct rchan, kref); +free_percpu (chan->buf);kfree (chan); }
mm/hugetlb.c +10 -14
@@ -4575,25 +4575,21 @@ static bool vma_shareable(struct vm_area_struct *vma, unsigned long addr)void adjust_range_if_pmd_sharing_possible (struct vm_area_struct *vma,unsigned long *start,unsigned long *end) { -unsigned long check_addr = *start; +unsigned long a_start, a_end;if (!(vma->vm_flags &VM_MAYSHARE ))return ; -for (check_addr = *start; check_addr < *end; check_addr +=PUD_SIZE ) { -unsigned long a_start = check_addr &PUD_MASK ; -unsigned long a_end = a_start +PUD_SIZE ; +/* Extend the range to be PUD aligned for a worst case scenario */ + a_start =ALIGN_DOWN (*start,PUD_SIZE ); + a_end =ALIGN (*end,PUD_SIZE ); -/* -* If sharing is possible, adjust start/end if necessary. -*/ -if (range_in_vma (vma, a_start, a_end)) { -if (a_start < *start) - *start = a_start; -if (a_end > *end) - *end = a_end; - } - } +/* +* Intersect the range with the vma range, since pmd sharing won't be +* across vma after all +*/ + *start =max (vma->vm_start, a_start); + *end =min (vma->vm_end, a_end); }/*
mm/khugepaged.c +2 -5
@@ -394,7 +394,7 @@ static void insert_to_mm_slots_hash(struct mm_struct *mm,static inline int khugepaged_test_exit (struct mm_struct *mm) { -return atomic_read (&mm->mm_users) ==0 ; +return atomic_read (&mm->mm_users) ==0 || !mmget_still_valid (mm); }int __khugepaged_enter (struct mm_struct *mm)
@@ -407,7 +407,7 @@ int __khugepaged_enter(struct mm_struct *mm)return -ENOMEM ;/* __khugepaged_exit() must not run from under us */ -VM_BUG_ON_MM (khugepaged_test_exit (mm), mm); +VM_BUG_ON_MM (atomic_read (&mm->mm_users) ==0 , mm);if (unlikely (test_and_set_bit (MMF_VM_HUGEPAGE , &mm->flags))) {free_mm_slot (mm_slot);return 0 ;
@@ -1006,9 +1006,6 @@ static void collapse_huge_page(struct mm_struct *mm,* handled by the anon_vma lock + PG_lock. */ down_write (&mm->mmap_sem); - result =SCAN_ANY_PROCESS ; -if (!mmget_still_valid (mm)) - goto out; result =hugepage_vma_revalidate (mm, address, &vma);if (result) goto out;
mm/page_alloc.c +6 -1
@@ -1114,6 +1114,11 @@ static void free_pcppages_bulk(struct zone *zone, int count,spin_lock (&zone->lock); isolated_pageblocks =has_isolate_pageblock (zone); +/* +* Ensure proper count is passed which otherwise would stuck in the +* below while (list_empty(list)) loop. +*/ + count =min (pcp->count, count);while (count) {struct page *page;struct list_head *list;
@@ -7018,7 +7023,7 @@ int __meminit init_per_zone_wmark_min(void)return 0 ; } -core_initcall (init_per_zone_wmark_min) +postcore_initcall (init_per_zone_wmark_min)/* * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so
sound/soc/codecs/msm8916-wcd-analog.c +2 -2
@@ -16,8 +16,8 @@#define CDC_D_REVISION1 (0xf000)#define CDC_D_PERPH_SUBTYPE (0xf005) -#define CDC_D_INT_EN_SET (0x015) -#define CDC_D_INT_EN_CLR (0x016) +#define CDC_D_INT_EN_SET (0xf015) +#define CDC_D_INT_EN_CLR (0xf016)#define MBHC_SWITCH_INT BIT(7)#define MBHC_MIC_ELECTRICAL_INS_REM_DET BIT(6)#define MBHC_BUTTON_PRESS_DET BIT(5)
sound/soc/intel/atom/sst-mfld-platform-pcm.c +3 -2
@@ -339,7 +339,7 @@ static int sst_media_open(struct snd_pcm_substream *substream, ret_val =power_up_sst (stream);if (ret_val <0 ) -return ret_val; + goto out_power_up;/* Make sure, that the period size is always even */ snd_pcm_hw_constraint_step(substream->runtime, 0,
@@ -348,8 +348,9 @@ static int sst_media_open(struct snd_pcm_substream *substream,return snd_pcm_hw_constraint_integer (runtime,SNDRV_PCM_HW_PARAM_PERIODS ); out_ops: -kfree (stream);mutex_unlock (&sst_lock); +out_power_up: +kfree (stream);return ret_val; }
tools/perf/util/probe-finder.c +1 -1
@@ -1354,7 +1354,7 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, tf.ntevs =0 ; ret =debuginfo__find_probes (dbg, &tf.pf); -if (ret <0 ) { +if (ret <0 || tf.ntevs ==0 ) {for (i =0 ; i < tf.ntevs; i++)clear_probe_trace_event (&tf.tevs[i]);zfree (tevs);
virt/kvm/arm/mmu.c +0 -6
@@ -307,12 +307,6 @@ static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) next =stage2_pgd_addr_end (addr, end);if (!stage2_pgd_none (*pgd))unmap_stage2_puds (kvm, pgd, addr, next); -/* -* If the range is too large, release the kvm->mmu_lock -* to prevent starvation and lockup detector warnings. -*/ -if (next != end) -cond_resched_lock (&kvm->mmu_lock); }while (pgd++, addr = next, addr != end); }