Linux 4.9.235
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.235 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.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/arm64/boot/dts/qcom/msm8916-pins.dtsi | 2 arch/arm64/kvm/hyp/switch.c | 2 arch/mips/vdso/genvdso.c | 10 + arch/powerpc/perf/core-book3s.c | 4 arch/powerpc/platforms/cell/Kconfig | 1 drivers/base/core.c | 12 - drivers/base/power/main.c | 16 + drivers/edac/ie31200_edac.c | 50 +++++- drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 16 + drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 5 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 3 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 20 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 4 drivers/gpu/drm/nouveau/nouveau_fbcon.c | 4 drivers/gpu/drm/radeon/radeon_connectors.c | 20 +- drivers/hid/i2c-hid/i2c-hid-core.c | 22 +- drivers/hid/usbhid/hiddev.c | 4 drivers/i2c/busses/i2c-rcar.c | 1 drivers/iommu/iova.c | 4 drivers/md/dm-table.c | 10 - drivers/media/pci/ttpci/av7110.c | 5 drivers/media/platform/davinci/vpif_capture.c | 2 drivers/net/bonding/bond_main.c | 24 ++ drivers/net/ethernet/freescale/gianfar.c | 4 drivers/net/ipvlan/ipvlan_main.c | 25 ++- drivers/net/wireless/ath/ath10k/hw.h | 2 drivers/net/wireless/realtek/rtlwifi/usb.c | 5 drivers/pci/slot.c | 6 drivers/s390/cio/css.c | 5 drivers/scsi/fcoe/fcoe_ctlr.c | 2 drivers/scsi/lpfc/lpfc_vport.c | 26 --- drivers/scsi/scsi_transport_iscsi.c | 2 drivers/scsi/ufs/ufshcd.c | 11 - drivers/staging/media/cec/cec-api.c | 8 drivers/target/target_core_user.c | 9 - drivers/tty/serial/8250/8250_port.c | 9 - drivers/tty/serial/amba-pl011.c | 16 + drivers/tty/serial/samsung.c | 8 drivers/tty/vt/vt.c | 5 drivers/tty/vt/vt_ioctl.c | 12 + drivers/usb/core/quirks.c | 2 drivers/usb/gadget/function/f_ncm.c | 81 ++++++++- drivers/usb/gadget/function/f_tcm.c | 7 drivers/usb/gadget/u_f.h | 38 +++- drivers/usb/host/ohci-exynos.c | 5 drivers/usb/host/xhci-hub.c | 19 +- drivers/usb/misc/lvstest.c | 2 drivers/usb/misc/sisusbvga/sisusb.c | 2 drivers/usb/misc/yurex.c | 2 drivers/usb/storage/unusual_devs.h | 2 drivers/usb/storage/unusual_uas.h | 14 + drivers/video/console/fbcon.c | 25 ++- drivers/video/fbdev/omap2/omapfb/dss/dispc.c | 7 drivers/video/fbdev/omap2/omapfb/dss/dsi.c | 7 drivers/video/fbdev/omap2/omapfb/dss/dss.c | 7 drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c | 5 drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c | 5 drivers/video/fbdev/omap2/omapfb/dss/venc.c | 7 drivers/xen/events/events_base.c | 16 - fs/btrfs/disk-io.c | 1 fs/btrfs/free-space-cache.c | 2 fs/btrfs/tree-log.c | 10 - fs/buffer.c | 9 + fs/ceph/mds_client.c | 14 + fs/ext4/super.c | 7 fs/fs-writeback.c | 83 +++++----- fs/jbd2/transaction.c | 26 +++ include/linux/efi.h | 4 include/linux/fs.h | 8 include/linux/overflow.h | 73 ++++++++ include/trace/events/writeback.h | 13 - kernel/locking/lockdep_proc.c | 2 net/core/skbuff.c | 4 net/ipv6/ip6_tunnel.c | 10 + net/tipc/netlink_compat.c | 12 + sound/pci/cs46xx/cs46xx_lib.c | 2 sound/pci/cs46xx/dsp_spos_scb_lib.c | 2 sound/pci/hda/hda_codec.c | 2 sound/pci/hda/hda_generic.c | 2 sound/pci/hda/patch_sigmatel.c | 2 sound/pci/ice1712/prodigy192.c | 2 sound/pci/oxygen/xonar_dg.c | 2 sound/soc/tegra/tegra30_ahub.c | 4 sound/soc/tegra/tegra30_i2s.c | 4 sound/usb/quirks-table.h | 4 tools/testing/selftests/powerpc/pmu/ebb/back_to_back_ebbs_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/cycles_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/cycles_with_freeze_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/cycles_with_mmcr2_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/ebb.c | 2 tools/testing/selftests/powerpc/pmu/ebb/ebb_on_willing_child_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/lost_exception_test.c | 1 tools/testing/selftests/powerpc/pmu/ebb/multi_counter_test.c | 7 tools/testing/selftests/powerpc/pmu/ebb/multi_ebb_procs_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/pmae_handling_test.c | 2 tools/testing/selftests/powerpc/pmu/ebb/pmc56_overflow_test.c | 2 98 files changed, 709 insertions(+), 275 deletions(-)
Aditya Pakki (4):
drm/radeon: fix multiple reference count leak
omapfb: fix multiple reference count leaks due to pm_runtime_get_sync drm/nouveau/drm/noveau: fix reference count leak in nouveau_fbcon_open drm/nouveau: Fix reference count leak in nouveau_connector_detect
Adrian Hunter (1):
scsi: ufs: Improve interrupt handling for shared interrupts
Alan Stern (2):
USB: yurex: Fix bad gfp argument
usb: storage: Add unusual_uas entry for Sony PSZ drives
Andrey Konovalov (1):
efi: provide empty efi_enter_virtual_mode implementation
Andy Shevchenko (1):
USB: gadget: u_f: Unbreak offset calculation in VLAs
Arnd Bergmann (1):
powerpc/spufs: add CONFIG_COREDUMP dependency
Athira Rajeev (1):
powerpc/perf: Fix soft lockups due to missed interrupt accounting
Bodo Stroesser (1):
scsi: target: tcmu: Fix crash on ARM during cmd completion
Brooke Basile (2):
USB: gadget: u_f: add overflow checks to VLA macros
USB: gadget: f_ncm: add bounds checks to ncm_unwrap_ntb()
Changming Liu (1):
USB: sisusbvga: Fix a potential UB casued by left shifting a negative value
Chris Wilson (1):
locking/lockdep: Fix overflow in presentation of average lock-time
Christophe JAILLET (1):
usb: gadget: f_tcm: Fix some resource leaks in some error paths
Cong Wang (2):
bonding: fix a potential double-unregister
tipc: fix uninit skb->data in tipc_nl_compat_dumpit()
Cyril Roelandt (1):
USB: Ignore UAS for JMicron JMS567 ATA/ATAPI Bridge
David Brazdil (1):
KVM: arm64: Fix symbol dependency in __hyp_call_panic_nvhe
Desnes A. Nunes do Rosario (1):
selftests/powerpc: Purge extra count_pmc() calls of ebb selftests
Dick Kennedy (1):
scsi: lpfc: Fix shost refcount mismatch when deleting vport
Evgeny Novikov (2):
media: davinci: vpif_capture: fix potential double free
USB: lvtest: return proper error code in probe
Filipe Manana (1):
btrfs: fix space cache memory leak after transaction abort
George Kennedy (2):
fbcon: prevent user font height or width change from causing potential out-of-bounds access
vt_ioctl: change VT_RESIZEX ioctl to check for error return from vc_resize()
Greg Kroah-Hartman (1):
Linux 4.9.235
Hans Verkuil (1):
cec-api: prevent leaking memory through hole in structure
Hans de Goede (1):
HID: i2c-hid: Always sleep 60ms after I2C_HID_PWR_ON commands
Hector Martin (1):
ALSA: usb-audio: Update documentation comment for MS2109 quirk
Heikki Krogerus (1):
device property: Fix the secondary firmware node handling in set_primary_fwnode()
Jan Kara (3):
writeback: Protect inode->i_io_list with inode->i_lock
writeback: Avoid skipping inode writeback
writeback: Fix sync livelock due to b_dirty_time processing
Jarod Wilson (1):
bonding: show saner speed for broadcast mode
Jason Baron (1):
EDAC/ie31200: Fallback if host bridge device is already initialized
Javed Hasan (1):
scsi: fcoe: Memory leak fix in fcoe_sysfs_fcf_del()
Jia-Ju Bai (1):
media: pci: ttpci: av7110: fix possible buffer overflow caused by bad DMA value in debiirq()
Jing Xiangfeng (1):
scsi: iscsi: Do not put host in iscsi_set_flashnode_param()
Josef Bacik (1):
btrfs: check the right error variable in btrfs_del_dir_entries_in_log
Kai-Heng Feng (2):
xhci: Do warm-reset when both CAS and XDEV_RESUME are set
USB: quirks: Add no-lpm quirk for another Raydium touchscreen
Kees Cook (1):
overflow.h: Add allocation size calculation helpers
Lukas Czerner (1):
jbd2: make sure jh have b_transaction set in refile/unfile_buffer
Lukas Wunner (2):
serial: pl011: Fix oops on -EPROBE_DEFER
serial: pl011: Don't leak amba_ports entry on driver register error
Mahesh Bandewar (1):
ipvlan: fix device features
Mark Tomlinson (1):
gre6: Fix reception with IP6_TNL_F_RCV_DSCP_COPY
Miaohe Lin (1):
net: Fix potential wrong skb->protocol in skb_vlan_untag()
Navid Emamdoost (4):
drm/amdgpu: fix ref count leak in amdgpu_driver_open_kms drm/amd/display: fix ref count leak in amdgpu_drm_ioctl drm/amdgpu: fix ref count leak in amdgpu_display_crtc_set_config drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails
Peilin Ye (1):
HID: hiddev: Fix slab-out-of-bounds write in hiddev_ioctl_usage()
Peng Fan (1):
mips/vdso: Fix resource leaks in genvdso.c
Qiushi Wu (3):
ASoC: tegra: Fix reference count leaks. drm/amdkfd: Fix reference count leaks.
PCI: Fix pci_create_slot() reference count leak
Rafael J. Wysocki (1):
PM: sleep: core: Fix the handling of pending runtime resume requests
Randy Dunlap (1):
ALSA: pci: delete repeated words in comments
Reto Schneider (1):
rtlwifi: rtl8192cu: Prevent leaking urb
Robin Murphy (1):
iommu/iova: Don't BUG on invalid PFNs
Sergey Senozhatsky (1):
serial: 8250: change lock order in serial8250_do_startup()
Stanley Chu (1):
scsi: ufs: Fix possible infinite loop in ufshcd_hold
Stephan Gerhold (1):
arm64: dts: qcom: msm8916: Pull down PDM GPIOs during sleep
Sumera Priyadarsini (1):
net: gianfar: Add of_node_put() before goto statement
Tamseel Shams (1):
serial: samsung: Removes the IRQ not found warning
Tang Bin (1):
usb: host: ohci-exynos: Fix error handling in exynos_ohci_probe()
Tetsuo Handa (1):
vt: defer kfree() of vc_screenbuf in vc_do_resize()
Thinh Nguyen (1):
usb: uas: Add quirk for PNY Pro Elite
Thomas Gleixner (1):
XEN uses irqdesc::irq_data_common::handler_data to store a per interrupt XEN data pointer which contains XEN specific information.
Vineeth Vijayan (1):
s390/cio: add cond_resched() in the slow_eval_known_fn() loop
Wolfram Sang (1):
i2c: rcar: in slave mode, clear NACK earlier
Xianting Tian (1):
fs: prevent BUG_ON in submit_bh_wbc()
Xiubo Li (1):
ceph: fix potential mdsc use-after-free crash
Zhi Chen (1):
Revert "ath10k: fix DMA related firmware crashes on multiple devices"
zhangyi (F) (1):
jbd2: abort journal if free a async write error metadata buffer
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 234 +SUBLEVEL = 235 EXTRAVERSION = NAME = Roaring Lionus
arch/arm64/boot/dts/qcom/msm8916-pins.dtsi +1 -1
@@ -555,7 +555,7 @@ pins = "gpio63", "gpio64", "gpio65", "gpio66", "gpio67", "gpio68"; drive-strength = <2>; - bias-disable; + bias-pull-down; }; }; };
arch/arm64/kvm/hyp/switch.c +1 -1
@@ -412,7 +412,7 @@ static void __hyp_text __hyp_call_panic_nvhe(u64 spsr, u64 elr, u64 par,* making sure it is a kernel address and not a PC-relative * reference. */ - asmvolatile ("ldr %0, =__hyp_panic_string" :"=r" (str_va)); + asmvolatile ("ldr %0, =%1" :"=r" (str_va) :"S" (__hyp_panic_string)); __hyp_do_panic(str_va, spsr, elr,
arch/mips/vdso/genvdso.c +10 -0
@@ -126,6 +126,7 @@ static void *map_vdso(const char *path, size_t *_size)if (fstat (fd, &stat) !=0 ) {fprintf (stderr,"%s: Failed to stat '%s': %s\n" , program_name, path,strerror (errno)); +close (fd);return NULL ; }
@@ -134,6 +135,7 @@ static void *map_vdso(const char *path, size_t *_size)if (addr ==MAP_FAILED ) {fprintf (stderr,"%s: Failed to map '%s': %s\n" , program_name, path,strerror (errno)); +close (fd);return NULL ; }
@@ -143,6 +145,7 @@ static void *map_vdso(const char *path, size_t *_size)if (memcmp (ehdr->e_ident,ELFMAG ,SELFMAG ) !=0 ) {fprintf (stderr,"%s: '%s' is not an ELF file\n" , program_name, path); +close (fd);return NULL ; }
@@ -154,6 +157,7 @@ static void *map_vdso(const char *path, size_t *_size)default :fprintf (stderr,"%s: '%s' has invalid ELF class\n" , program_name, path); +close (fd);return NULL ; }
@@ -165,6 +169,7 @@ static void *map_vdso(const char *path, size_t *_size)default :fprintf (stderr,"%s: '%s' has invalid ELF data order\n" , program_name, path); +close (fd);return NULL ; }
@@ -172,15 +177,18 @@ static void *map_vdso(const char *path, size_t *_size)fprintf (stderr,"%s: '%s' has invalid ELF machine (expected EM_MIPS)\n" , program_name, path); +close (fd);return NULL ; }else if (swap_uint16 (ehdr->e_type) !=ET_DYN ) {fprintf (stderr,"%s: '%s' has invalid ELF type (expected ET_DYN)\n" , program_name, path); +close (fd);return NULL ; } *_size = stat.st_size; +close (fd);return addr; }
@@ -284,10 +292,12 @@ int main(int argc, char **argv)/* Calculate and write symbol offsets to <output file> */ if (!get_symbols (dbg_vdso_path, dbg_vdso)) {unlink (out_path); +fclose (out_file);return EXIT_FAILURE ; }fprintf (out_file,"};\n" ); +fclose (out_file);return EXIT_SUCCESS ; }
arch/powerpc/perf/core-book3s.c +4 -0
@@ -2042,6 +2042,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val,if (perf_event_overflow (event, &data, regs))power_pmu_stop (event,0 ); + }else if (period) { +/* Account for interrupt in case of invalid SIAR */ +if (perf_event_account_interrupt (event)) +power_pmu_stop (event,0 ); } }
arch/powerpc/platforms/cell/Kconfig +1 -0
@@ -45,6 +45,7 @@ config SPU_FS tristate "SPU file system" default m depends on PPC_CELL + depends on COREDUMP select SPU_BASE select MEMORY_HOTPLUG help
drivers/base/core.c +8 -4
@@ -2348,9 +2348,9 @@ static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)*/ void set_primary_fwnode (struct device *dev,struct fwnode_handle *fwnode) { -if (fwnode) { -struct fwnode_handle *fn = dev->fwnode; +struct fwnode_handle *fn = dev->fwnode; +if (fwnode) {if (fwnode_is_primary (fn)) fn = fn->secondary;
@@ -2360,8 +2360,12 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode) } dev->fwnode = fwnode; }else { - dev->fwnode =fwnode_is_primary (dev->fwnode) ? - dev->fwnode->secondary :NULL ; +if (fwnode_is_primary (fn)) { + dev->fwnode = fn->secondary; + fn->secondary =NULL ; + }else { + dev->fwnode =NULL ; + } } }EXPORT_SYMBOL_GPL (set_primary_fwnode);
drivers/base/power/main.c +10 -6
@@ -1366,13 +1366,17 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) }/* -* If a device configured to wake up the system from sleep states -* has been suspended at run time and there's a resume request pending -* for it, this is equivalent to the device signaling wakeup, so the -* system suspend operation should be aborted. +* Wait for possible runtime PM transitions of the device in progress +* to complete and if there's a runtime resume request pending for it, +* resume it before proceeding with invoking the system-wide suspend +* callbacks for it. +* +* If the system-wide suspend callbacks below change the configuration +* of the device, they must disable runtime PM for it or otherwise +* ensure that its runtime-resume callbacks will not be confused by that +* change in case they are invoked going forward. */ -if (pm_runtime_barrier (dev) &&device_may_wakeup (dev)) -pm_wakeup_event (dev,0 ); +pm_runtime_barrier (dev);if (pm_wakeup_pending ()) { dev->power.direct_complete = false;
drivers/edac/ie31200_edac.c +47 -3
88 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +12 -4
@@ -734,8 +734,10 @@ amdgpu_connector_lvds_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (encoder) {
@@ -872,8 +874,10 @@ amdgpu_connector_vga_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } } encoder =amdgpu_connector_best_single_encoder (connector);
@@ -996,8 +1000,10 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (!force &&amdgpu_connector_check_hpd_status_unchanged (connector)) {
@@ -1371,8 +1377,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (!force &&amdgpu_connector_check_hpd_status_unchanged (connector)) {
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +3 -2
@@ -268,7 +268,7 @@ int amdgpu_crtc_set_config(struct drm_mode_set *set) ret =pm_runtime_get_sync (dev->dev);if (ret <0 ) -return ret; + goto out; ret =drm_crtc_helper_set_config (set);
@@ -283,7 +283,7 @@ int amdgpu_crtc_set_config(struct drm_mode_set *set)take the current one */ if (active && !adev->have_disp_power_ref) { adev->have_disp_power_ref = true; -return ret; + goto out; }/* if we have no active crtcs, then drop the power ref we got before */
@@ -292,6 +292,7 @@ int amdgpu_crtc_set_config(struct drm_mode_set *set) adev->have_disp_power_ref = false; } +out:/* drop the power reference we got coming in here */ pm_runtime_put_autosuspend (dev->dev);return ret;
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +2 -1
@@ -633,11 +633,12 @@ long amdgpu_drm_ioctl(struct file *filp, dev = file_priv->minor->dev; ret =pm_runtime_get_sync (dev->dev);if (ret <0 ) -return ret; + goto out; ret =drm_ioctl (filp, cmd, arg);pm_runtime_mark_last_busy (dev->dev); +out:pm_runtime_put_autosuspend (dev->dev);return ret; }
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +2 -1
@@ -543,7 +543,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) r =pm_runtime_get_sync (dev->dev);if (r <0 ) -return r; + goto pm_put; fpriv =kzalloc (sizeof (*fpriv),GFP_KERNEL );if (unlikely (!fpriv)) {
@@ -566,6 +566,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) out_suspend:pm_runtime_mark_last_busy (dev->dev); +pm_put:pm_runtime_put_autosuspend (dev->dev);return r;
drivers/gpu/drm/amd/amdkfd/kfd_topology.c +15 -5
@@ -841,8 +841,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, ret =kobject_init_and_add (dev->kobj_node, &node_type, sys_props.kobj_nodes,"%d" , id); -if (ret <0 ) +if (ret <0 ) { +kobject_put (dev->kobj_node);return ret; + } dev->kobj_mem =kobject_create_and_add ("mem_banks" , dev->kobj_node);if (!dev->kobj_mem)
@@ -885,8 +887,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev,return -ENOMEM ; ret =kobject_init_and_add (mem->kobj, &mem_type, dev->kobj_mem,"%d" , i); -if (ret <0 ) +if (ret <0 ) { +kobject_put (mem->kobj);return ret; + } mem->attr.name ="properties" ; mem->attr.mode =KFD_SYSFS_FILE_MODE ;
@@ -904,8 +908,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev,return -ENOMEM ; ret =kobject_init_and_add (cache->kobj, &cache_type, dev->kobj_cache,"%d" , i); -if (ret <0 ) +if (ret <0 ) { +kobject_put (cache->kobj);return ret; + } cache->attr.name ="properties" ; cache->attr.mode =KFD_SYSFS_FILE_MODE ;
@@ -923,8 +929,10 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev,return -ENOMEM ; ret =kobject_init_and_add (iolink->kobj, &iolink_type, dev->kobj_iolink,"%d" , i); -if (ret <0 ) +if (ret <0 ) { +kobject_put (iolink->kobj);return ret; + } iolink->attr.name ="properties" ; iolink->attr.mode =KFD_SYSFS_FILE_MODE ;
@@ -976,8 +984,10 @@ static int kfd_topology_update_sysfs(void) ret =kobject_init_and_add (sys_props.kobj_topology, &sysprops_type, &kfd_device->kobj,"topology" ); -if (ret <0 ) +if (ret <0 ) { +kobject_put (sys_props.kobj_topology);return ret; + } sys_props.kobj_nodes =kobject_create_and_add ("nodes" , sys_props.kobj_topology);
drivers/gpu/drm/nouveau/nouveau_connector.c +3 -1
@@ -281,8 +281,10 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)pm_runtime_get_noresume (dev->dev); }else { ret =pm_runtime_get_sync (dev->dev); -if (ret <0 && ret != -EACCES ) +if (ret <0 && ret != -EACCES ) { +pm_runtime_put_autosuspend (dev->dev);return conn_status; + } } nv_encoder =nouveau_connector_ddc_detect (connector);
drivers/gpu/drm/nouveau/nouveau_fbcon.c +3 -1
@@ -183,8 +183,10 @@ nouveau_fbcon_open(struct fb_info *info, int user)struct nouveau_fbdev *fbcon = info->par;struct nouveau_drm *drm =nouveau_drm (fbcon->dev);int ret =pm_runtime_get_sync (drm->dev->dev); -if (ret <0 && ret != -EACCES ) +if (ret <0 && ret != -EACCES ) { +pm_runtime_put (drm->dev->dev);return ret; + }return 0 ; }
drivers/gpu/drm/radeon/radeon_connectors.c +15 -5
@@ -892,8 +892,10 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (encoder) {
@@ -1038,8 +1040,10 @@ radeon_vga_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } } encoder =radeon_best_single_encoder (connector);
@@ -1176,8 +1180,10 @@ radeon_tv_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } } encoder =radeon_best_single_encoder (connector);
@@ -1260,8 +1266,10 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (radeon_connector->detected_hpd_without_ddc) {
@@ -1701,8 +1709,10 @@ radeon_dp_detect(struct drm_connector *connector, bool force)if (!drm_kms_helper_is_poll_worker ()) { r =pm_runtime_get_sync (connector->dev->dev); -if (r <0 ) +if (r <0 ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } }if (!force &&radeon_check_hpd_status_unchanged (connector)) {
drivers/hid/i2c-hid/i2c-hid-core.c +13 -9
@@ -407,6 +407,19 @@ static int i2c_hid_set_power(struct i2c_client *client, int power_state)dev_err (&client->dev,"failed to change power setting.\n" ); set_pwr_exit: + +/* +* The HID over I2C specification states that if a DEVICE needs time +* after the PWR_ON request, it should utilise CLOCK stretching. +* However, it has been observered that the Windows driver provides a +* 1ms sleep between the PWR_ON and RESET requests. +* According to Goodix Windows even waits 60 ms after (other?) +* PWR_ON requests. Testing has confirmed that several devices +* will not work properly without a delay after a PWR_ON request. +*/ +if (!ret && power_state ==I2C_HID_PWR_ON ) +msleep (60 ); +return ret; }
@@ -428,15 +441,6 @@ static int i2c_hid_hwreset(struct i2c_client *client)if (ret) goto out_unlock; -/* -* The HID over I2C specification states that if a DEVICE needs time -* after the PWR_ON request, it should utilise CLOCK stretching. -* However, it has been observered that the Windows driver provides a -* 1ms sleep between the PWR_ON and RESET requests and that some devices -* rely on this. -*/ -usleep_range (1000 ,5000 ); -i2c_hid_dbg (ihid,"resetting...\n" ); ret =i2c_hid_command (client, &hid_reset_cmd,NULL ,0 );
drivers/hid/usbhid/hiddev.c +4 -0
@@ -554,12 +554,16 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,switch (cmd) {case HIDIOCGUSAGE : +if (uref->usage_index >= field->report_count) + goto inval; uref->value = field->value[uref->usage_index];if (copy_to_user (user_arg, uref,sizeof (*uref))) goto fault; goto goodreturn;case HIDIOCSUSAGE : +if (uref->usage_index >= field->report_count) + goto inval; field->value[uref->usage_index] = uref->value; goto goodreturn;
drivers/i2c/busses/i2c-rcar.c +1 -0
@@ -534,6 +534,7 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)/* master sent stop */ if (ssr_filtered &SSR ) {i2c_slave_event (priv->slave,I2C_SLAVE_STOP , &value); +rcar_i2c_write (priv,ICSCR ,SIE |SDBS );/* clear our NACK */ rcar_i2c_write (priv,ICSIER ,SAR );rcar_i2c_write (priv,ICSSR , ~SSR &0xff ); }
drivers/iommu/iova.c +3 -1
@@ -676,7 +676,9 @@ iova_magazine_free_pfns(struct iova_magazine *mag, struct iova_domain *iovad)for (i =0 ; i < mag->size; ++i) {struct iova *iova =private_find_iova (iovad, mag->pfns[i]); -BUG_ON (!iova); +if (WARN_ON (!iova)) +continue ; +private_free_iova (iovad, iova); }
drivers/md/dm-table.c +5 -5
@@ -510,14 +510,14 @@ static int adjoin(struct dm_table *table, struct dm_target *ti)* On the other hand, dm-switch needs to process bulk data using messages and * excessive use of GFP_NOIO could cause trouble. */ -static char **realloc_argv (unsigned *array_size,char **old_argv) +static char **realloc_argv (unsigned *size,char **old_argv) {char **argv;unsigned new_size;gfp_t gfp; -if (*array_size) { - new_size = *array_size *2 ; +if (*size) { + new_size = *size *2 ; gfp =GFP_KERNEL ; }else { new_size =8 ;
@@ -525,8 +525,8 @@ static char **realloc_argv(unsigned *array_size, char **old_argv) } argv =kmalloc (new_size *sizeof (*argv), gfp);if (argv) { -memcpy (argv, old_argv, *array_size *sizeof (*argv)); - *array_size = new_size; +memcpy (argv, old_argv, *size *sizeof (*argv)); + *size = new_size; }kfree (old_argv);
drivers/media/pci/ttpci/av7110.c +3 -2
@@ -426,14 +426,15 @@ static void debiirq(unsigned long cookie)case DATA_CI_GET : {u8 *data = av7110->debi_virt; +u8 data_0 = data[0 ]; -if ((data[0 ] <2 ) && data[2 ] ==0xff ) { +if (data_0 <2 && data[2 ] ==0xff ) {int flags =0 ;if (data[5 ] >0 ) flags |=CA_CI_MODULE_PRESENT ;if (data[5 ] >5 ) flags |=CA_CI_MODULE_READY ; - av7110->ci_slot[data[0 ]].flags = flags; + av7110->ci_slot[data_0].flags = flags; }else ci_get_data(&av7110->ci_rbuffer, av7110->debi_virt,
drivers/media/platform/davinci/vpif_capture.c +0 -2
@@ -1408,8 +1408,6 @@ static int vpif_probe_complete(void)/* Unregister video device */ video_unregister_device (&ch->video_dev); } -kfree (vpif_obj.sd); -v4l2_device_unregister (&vpif_obj.v4l2_dev);return err; }
drivers/net/bonding/bond_main.c +20 -4
@@ -1985,7 +1985,8 @@ static int bond_release_and_destroy(struct net_device *bond_dev,int ret; ret =bond_release (bond_dev, slave_dev); -if (ret ==0 && !bond_has_slaves (bond)) { +if (ret ==0 && !bond_has_slaves (bond) && + bond_dev->reg_state !=NETREG_UNREGISTERING ) { bond_dev->priv_flags |=IFF_DISABLE_NETPOLL ;netdev_info (bond_dev,"Destroying bond %s\n" , bond_dev->name);
@@ -4131,13 +4132,23 @@ static netdev_tx_t bond_start_xmit(struct sk_buff *skb, struct net_device *dev)return ret; } +static u32 bond_mode_bcast_speed (struct slave *slave,u32 speed) +{ +if (speed ==0 || speed ==SPEED_UNKNOWN ) + speed = slave->speed; +else + speed =min (speed, slave->speed); + +return speed; +} +static int bond_ethtool_get_settings (struct net_device *bond_dev,struct ethtool_cmd *ecmd) {struct bonding *bond =netdev_priv (bond_dev); -unsigned long speed =0 ;struct list_head *iter;struct slave *slave; +u32 speed =0 ; ecmd->duplex =DUPLEX_UNKNOWN ; ecmd->port =PORT_OTHER ;
@@ -4149,8 +4160,13 @@ static int bond_ethtool_get_settings(struct net_device *bond_dev,*/ bond_for_each_slave (bond, slave, iter) {if (bond_slave_can_tx (slave)) { -if (slave->speed !=SPEED_UNKNOWN ) - speed += slave->speed; +if (slave->speed !=SPEED_UNKNOWN ) { +if (BOND_MODE (bond) ==BOND_MODE_BROADCAST ) + speed =bond_mode_bcast_speed (slave, + speed); +else + speed += slave->speed; + }if (ecmd->duplex ==DUPLEX_UNKNOWN && slave->duplex !=DUPLEX_UNKNOWN ) ecmd->duplex = slave->duplex;
drivers/net/ethernet/freescale/gianfar.c +3 -1
@@ -844,8 +844,10 @@ static int gfar_of_init(struct platform_device *ofdev, struct net_device **pdev)continue ; err =gfar_parse_group (child, priv, model); -if (err) +if (err) { +of_node_put (child); goto err_grp_init; + } } }else {/* SQ_SG_MODE */ err =gfar_parse_group (np, priv, model);
drivers/net/ipvlan/ipvlan_main.c +21 -4
@@ -168,12 +168,21 @@ static void ipvlan_port_destroy(struct net_device *dev)kfree_rcu (port, rcu); } +#define IPVLAN_ALWAYS_ON_OFLOADS \ + (NETIF_F_SG | NETIF_F_HW_CSUM | \ + NETIF_F_GSO_ROBUST | NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ENCAP_ALL) + +#define IPVLAN_ALWAYS_ON \ + (IPVLAN_ALWAYS_ON_OFLOADS | NETIF_F_LLTX | NETIF_F_VLAN_CHALLENGED) +#define IPVLAN_FEATURES \ (NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ NETIF_F_GSO | NETIF_F_TSO | NETIF_F_UFO | NETIF_F_GSO_ROBUST | \ NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_GRO | NETIF_F_RXCSUM | \ NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_VLAN_STAG_FILTER) +/* NETIF_F_GSO_ENCAP_ALL NETIF_F_GSO_SOFTWARE Newly added */ +#define IPVLAN_STATE_MASK \ ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT))
@@ -186,7 +195,9 @@ static int ipvlan_init(struct net_device *dev) dev->state = (dev->state & ~IPVLAN_STATE_MASK ) | (phy_dev->state &IPVLAN_STATE_MASK ); dev->features = phy_dev->features &IPVLAN_FEATURES ; - dev->features |=NETIF_F_LLTX ; + dev->features |=IPVLAN_ALWAYS_ON ; + dev->vlan_features = phy_dev->vlan_features &IPVLAN_FEATURES ; + dev->vlan_features |=IPVLAN_ALWAYS_ON_OFLOADS ; dev->gso_max_size = phy_dev->gso_max_size; dev->gso_max_segs = phy_dev->gso_max_segs; dev->hard_header_len = phy_dev->hard_header_len;
@@ -274,7 +285,14 @@ static netdev_features_t ipvlan_fix_features(struct net_device *dev, {struct ipvl_dev *ipvlan =netdev_priv (dev); -return features & (ipvlan->sfeatures | ~IPVLAN_FEATURES ); + features |=NETIF_F_ALL_FOR_ALL ; + features &= (ipvlan->sfeatures | ~IPVLAN_FEATURES ); + features =netdev_increment_features (ipvlan->phy_dev->features, + features, features); + features |=IPVLAN_ALWAYS_ON ; + features &= (IPVLAN_FEATURES |IPVLAN_ALWAYS_ON ); + +return features; }static void ipvlan_change_rx_flags (struct net_device *dev,int change)
@@ -675,10 +693,9 @@ static int ipvlan_device_event(struct notifier_block *unused,case NETDEV_FEAT_CHANGE :list_for_each_entry (ipvlan, &port->ipvlans, pnode) { - ipvlan->dev->features = dev->features &IPVLAN_FEATURES ; ipvlan->dev->gso_max_size = dev->gso_max_size; ipvlan->dev->gso_max_segs = dev->gso_max_segs; -netdev_features_change (ipvlan->dev); +netdev_update_features (ipvlan->dev); }break ;
drivers/net/wireless/ath/ath10k/hw.h +1 -1
@@ -558,7 +558,7 @@ ath10k_rx_desc_get_l3_pad_bytes(struct ath10k_hw_params *hw,#define TARGET_10_4_TX_DBG_LOG_SIZE 1024#define TARGET_10_4_NUM_WDS_ENTRIES 32 -#define TARGET_10_4_DMA_BURST_SIZE 0 +#define TARGET_10_4_DMA_BURST_SIZE 1#define TARGET_10_4_MAC_AGGR_DELIM 0#define TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK 1#define TARGET_10_4_VOW_CONFIG 0
drivers/net/wireless/realtek/rtlwifi/usb.c +4 -1
@@ -752,8 +752,11 @@ static int _rtl_usb_receive(struct ieee80211_hw *hw)usb_anchor_urb (urb, &rtlusb->rx_submitted); err =usb_submit_urb (urb,GFP_KERNEL ); -if (err) +if (err) { +usb_unanchor_urb (urb); +usb_free_urb (urb); goto err_out; + }usb_free_urb (urb); }return 0 ;
drivers/pci/slot.c +4 -2
@@ -303,13 +303,16 @@ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr, slot_name =make_slot_name (name);if (!slot_name) { err = -ENOMEM ; +kfree (slot); goto err; } err =kobject_init_and_add (&slot->kobj, &pci_slot_ktype,NULL ,"%s" , slot_name); -if (err) +if (err) { +kobject_put (&slot->kobj); goto err; + }INIT_LIST_HEAD (&slot->list);list_add (&slot->list, &parent->slots);
@@ -328,7 +331,6 @@ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,mutex_unlock (&pci_slot_mutex);return slot; err: -kfree (slot); slot =ERR_PTR (err); goto out; }
drivers/s390/cio/css.c +5 -0
@@ -529,6 +529,11 @@ static int slow_eval_known_fn(struct subchannel *sch, void *data) rc =css_evaluate_known_subchannel (sch,1 );if (rc == -EAGAIN )css_schedule_eval (sch->schid); +/* +* The loop might take long time for platforms with lots of +* known devices. Allow scheduling here. +*/ +cond_resched (); }return 0 ; }
drivers/scsi/fcoe/fcoe_ctlr.c +1 -1
@@ -267,9 +267,9 @@ static void fcoe_sysfs_fcf_del(struct fcoe_fcf *new)WARN_ON (!fcf_dev); new->fcf_dev =NULL ;fcoe_fcf_device_delete (fcf_dev); -kfree (new);mutex_unlock (&cdev->lock); } +kfree (new); }/**
drivers/scsi/lpfc/lpfc_vport.c +8 -18
@@ -624,27 +624,16 @@ lpfc_vport_delete(struct fc_vport *fc_vport) vport->port_state < LPFC_VPORT_READY)return -EAGAIN ; } +/* -* This is a bit of a mess. We want to ensure the shost doesn't get -* torn down until we're done with the embedded lpfc_vport structure. -* -* Beyond holding a reference for this function, we also need a -* reference for outstanding I/O requests we schedule during delete -* processing. But once we scsi_remove_host() we can no longer obtain -* a reference through scsi_host_get(). -* -* So we take two references here. We release one reference at the -* bottom of the function -- after delinking the vport. And we -* release the other at the completion of the unreg_vpi that get's -* initiated after we've disposed of all other resources associated -* with the port. +* Take early refcount for outstanding I/O requests we schedule during +* delete processing for unreg_vpi. Always keep this before +* scsi_remove_host() as we can no longer obtain a reference through +* scsi_host_get() after scsi_host_remove as shost is set to SHOST_DEL. */ if (!scsi_host_get (shost))return VPORT_INVAL ; -if (!scsi_host_get (shost)) { -scsi_host_put (shost); -return VPORT_INVAL ; - } +lpfc_free_sysfs_attr (vport);lpfc_debugfs_terminate (vport);
@@ -792,8 +781,9 @@ lpfc_vport_delete(struct fc_vport *fc_vport)if (!(vport->vpi_state &LPFC_VPI_REGISTERED ) ||lpfc_mbx_unreg_vpi (vport))scsi_host_put (shost); - }else + }else {scsi_host_put (shost); + }lpfc_free_vpi (phba, vport->vpi); vport->work_port_events =0 ;
drivers/scsi/scsi_transport_iscsi.c +1 -1
@@ -3191,7 +3191,7 @@ static int iscsi_set_flashnode_param(struct iscsi_transport *transport,pr_err ("%s could not find host no %u\n" , __func__, ev->u.set_flashnode.host_no); err = -ENODEV ; - goto put_host; + goto exit_set_fnode; } idx = ev->u.set_flashnode.flashnode_idx;
drivers/scsi/ufs/ufshcd.c +7 -4
@@ -659,6 +659,7 @@ static void ufshcd_ungate_work(struct work_struct *work)int ufshcd_hold (struct ufs_hba *hba,bool async) {int rc =0 ; +bool flush_result;unsigned long flags;if (!ufshcd_is_clkgating_allowed (hba))
@@ -690,7 +691,9 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)break ; }spin_unlock_irqrestore (hba->host->host_lock, flags); -flush_work (&hba->clk_gating.ungate_work); + flush_result =flush_work (&hba->clk_gating.ungate_work); +if (hba->clk_gating.is_suspended && !flush_result) + goto out;spin_lock_irqsave (hba->host->host_lock, flags); goto start; }
@@ -4397,7 +4400,7 @@ static void ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)*/ static irqreturn_t ufshcd_intr (int irq,void *__hba) { -u32 intr_status, enabled_intr_status; +u32 intr_status, enabled_intr_status =0 ;irqreturn_t retval =IRQ_NONE ;struct ufs_hba *hba = __hba;int retries = hba->nutrs;
@@ -4411,7 +4414,7 @@ static irqreturn_t ufshcd_intr(int irq, void *__hba)* read, make sure we handle them by checking the interrupt status * again in a loop until we process all of the reqs before returning. */ - do { +while (intr_status && retries--) { enabled_intr_status = intr_status &ufshcd_readl (hba,REG_INTERRUPT_ENABLE );if (intr_status)
@@ -4422,7 +4425,7 @@ static irqreturn_t ufshcd_intr(int irq, void *__hba) } intr_status =ufshcd_readl (hba,REG_INTERRUPT_STATUS ); - }while (intr_status && --retries); + }spin_unlock (hba->host->host_lock);return retval;
drivers/staging/media/cec/cec-api.c +7 -1
@@ -141,7 +141,13 @@ static long cec_adap_g_log_addrs(struct cec_adapter *adap,struct cec_log_addrs log_addrs;mutex_lock (&adap->lock); - log_addrs = adap->log_addrs; +/* +* We use memcpy here instead of assignment since there is a +* hole at the end of struct cec_log_addrs that an assignment +* might ignore. So when we do copy_to_user() we could leak +* one byte of memory. +*/ +memcpy (&log_addrs, &adap->log_addrs,sizeof (log_addrs));if (!adap->is_configured)memset (log_addrs.log_addr,CEC_LOG_ADDR_INVALID ,sizeof (log_addrs.log_addr));
drivers/target/target_core_user.c +8 -1
@@ -666,7 +666,14 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev)struct tcmu_cmd_entry *entry = (void *) mb +CMDR_OFF + udev->cmdr_last_cleaned;struct tcmu_cmd *cmd; -tcmu_flush_dcache_range (entry,sizeof (*entry)); +/* +* Flush max. up to end of cmd ring since current entry might +* be a padding that is shorter than sizeof(*entry) +*/ +size_t ring_left =head_to_end (udev->cmdr_last_cleaned, + udev->cmdr_size); +tcmu_flush_dcache_range (entry, ring_left <sizeof (*entry) ? + ring_left :sizeof (*entry));if (tcmu_hdr_get_op (entry->hdr.len_op) ==TCMU_OP_PAD ) { UPDATE_HEAD(udev->cmdr_last_cleaned,
drivers/tty/serial/8250/8250_port.c +6 -3
@@ -2205,6 +2205,10 @@ int serial8250_do_startup(struct uart_port *port)if (port->irq) {unsigned char iir1; + +if (port->irqflags &IRQF_SHARED ) +disable_irq_nosync (port->irq); +/* * Test for UARTs that do not reassert THRE when the * transmitter is idle and the interrupt has already
@@ -2214,8 +2218,6 @@ int serial8250_do_startup(struct uart_port *port)* allow register changes to become visible. */ spin_lock_irqsave (&port->lock, flags); -if (up->port.irqflags &IRQF_SHARED ) -disable_irq_nosync (port->irq);wait_for_xmitr (up,UART_LSR_THRE );serial_port_out_sync (port,UART_IER ,UART_IER_THRI );
@@ -2227,9 +2229,10 @@ int serial8250_do_startup(struct uart_port *port) iir =serial_port_in (port,UART_IIR );serial_port_out (port,UART_IER ,0 ); +spin_unlock_irqrestore (&port->lock, flags); +if (port->irqflags &IRQF_SHARED )enable_irq (port->irq); -spin_unlock_irqrestore (&port->lock, flags);/* * If the interrupt is not reasserted, or we otherwise
drivers/tty/serial/amba-pl011.c +9 -7
@@ -2249,9 +2249,8 @@ pl011_console_write(struct console *co, const char *s, unsigned int count)clk_disable (uap->clk); } -static void __init -pl011_console_get_options (struct uart_amba_port *uap,int *baud, -int *parity,int *bits) +static void pl011_console_get_options (struct uart_amba_port *uap,int *baud, +int *parity,int *bits) {if (pl011_read (uap,REG_CR ) & UART01x_CR_UARTEN) {unsigned int lcr_h, ibrd, fbrd;
@@ -2284,7 +2283,7 @@ pl011_console_get_options(struct uart_amba_port *uap, int *baud, } } -static int __init pl011_console_setup (struct console *co,char *options) +static int pl011_console_setup (struct console *co,char *options) {struct uart_amba_port *uap;int baud =38400 ;
@@ -2352,8 +2351,8 @@ static int __init pl011_console_setup(struct console *co, char *options)* * Returns 0 if console matches; otherwise non-zero to use default matching */ -static int __init pl011_console_match (struct console *co,char *name,int idx, -char *options) +static int pl011_console_match (struct console *co,char *name,int idx, +char *options) {unsigned char iotype;resource_size_t addr;
@@ -2533,7 +2532,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,static int pl011_register_port (struct uart_amba_port *uap) { -int ret; +int ret, i;/* Ensure interrupts from this UART are masked and cleared */ pl011_write (0 , uap,REG_IMSC );
@@ -2544,6 +2543,9 @@ static int pl011_register_port(struct uart_amba_port *uap)if (ret <0 ) {dev_err (uap->port.dev,"Failed to register AMBA-PL011 driver\n" ); +for (i =0 ; i <ARRAY_SIZE (amba_ports); i++) +if (amba_ports[i] == uap) + amba_ports[i] =NULL ;return ret; } }
drivers/tty/serial/samsung.c +5 -3
@@ -1725,9 +1725,11 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, ourport->tx_irq = ret +1 ; } - ret =platform_get_irq (platdev,1 ); -if (ret >0 ) - ourport->tx_irq = ret; +if (!s3c24xx_serial_has_interrupt_mask (port)) { + ret =platform_get_irq (platdev,1 ); +if (ret >0 ) + ourport->tx_irq = ret; + }/* * DMA is currently supported only on DT platforms, if DMA properties * are specified.
drivers/tty/vt/vt.c +3 -2
@@ -868,7 +868,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,unsigned int old_rows, old_row_size;unsigned int new_cols, new_rows, new_row_size, new_screen_size;unsigned int user; -unsigned short *newscreen; +unsigned short *oldscreen, *newscreen;WARN_CONSOLE_UNLOCKED ();
@@ -950,10 +950,11 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,if (new_scr_end > new_origin)scr_memsetw ((void *)new_origin, vc->vc_video_erase_char, new_scr_end - new_origin); -kfree (vc->vc_screenbuf); + oldscreen = vc->vc_screenbuf; vc->vc_screenbuf = newscreen; vc->vc_screenbuf_size = new_screen_size;set_origin (vc); +kfree (oldscreen);/* do part of a reset_terminal() */ vc->vc_top =0 ;
drivers/tty/vt/vt_ioctl.c +11 -1
@@ -896,12 +896,22 @@ int vt_ioctl(struct tty_struct *tty,console_lock (); vcp = vc_cons[i].d;if (vcp) { +int ret; +int save_scan_lines = vcp->vc_scan_lines; +int save_font_height = vcp->vc_font.height; +if (v.v_vlin) vcp->vc_scan_lines = v.v_vlin;if (v.v_clin) vcp->vc_font.height = v.v_clin; vcp->vc_resize_user =1 ; -vc_resize (vcp, v.v_cols, v.v_rows); + ret =vc_resize (vcp, v.v_cols, v.v_rows); +if (ret) { + vcp->vc_scan_lines = save_scan_lines; + vcp->vc_font.height = save_font_height; +console_unlock (); +return ret; + } }console_unlock (); }
drivers/usb/core/quirks.c +2 -0
@@ -299,6 +299,8 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x2386, 0x3119), .driver_info = USB_QUIRK_NO_LPM }, + { USB_DEVICE(0x2386, 0x350e), .driver_info = USB_QUIRK_NO_LPM }, + /* DJI CineSSD */ { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
drivers/usb/gadget/function/f_ncm.c +69 -12
143 lines not on this page · raw message
drivers/usb/gadget/function/f_tcm.c +4 -3
@@ -751,12 +751,13 @@ static int uasp_alloc_stream_res(struct f_uas *fu, struct uas_stream *stream) goto err_sts;return 0 ; + err_sts: -usb_ep_free_request (fu->ep_status, stream->req_status); - stream->req_status =NULL ; -err_out:usb_ep_free_request (fu->ep_out, stream->req_out); stream->req_out =NULL ; +err_out: +usb_ep_free_request (fu->ep_in, stream->req_in); + stream->req_in =NULL ; out:return -ENOMEM ; }
drivers/usb/gadget/u_f.h +27 -11
@@ -17,6 +17,7 @@#define __U_F_H__#include <linux/usb/gadget.h> +#include <linux/overflow.h> /* Variable Length Array Macros **********************************************/ #define vla_group (groupname) size_t groupname##__next = 0
@@ -24,21 +25,36 @@#define vla_item (groupname, type, name, n) \ size_t groupname##_##name##__offset = ({ \ - size_t align_mask = __alignof__(type) - 1; \ - size_t offset = (groupname##__next + align_mask) & ~align_mask;\ - size_t size = (n) * sizeof(type); \ - groupname##__next = offset + size; \ + size_t offset = 0; \ + if (groupname##__next != SIZE_MAX) { \ + size_t align_mask = __alignof__(type) - 1; \ + size_t size = array_size(n, sizeof(type)); \ + offset = (groupname##__next + align_mask) & \ + ~align_mask; \ + if (check_add_overflow(offset, size, \ + &groupname##__next)) { \ + groupname##__next = SIZE_MAX; \ + offset = 0; \ + } \ + } \ offset; \ })#define vla_item_with_sz (groupname, type, name, n) \ - size_t groupname##_##name##__sz = (n) * sizeof(type); \ - size_t groupname##_##name##__offset = ({ \ - size_t align_mask = __alignof__(type) - 1; \ - size_t offset = (groupname##__next + align_mask) & ~align_mask;\ - size_t size = groupname##_##name##__sz; \ - groupname##__next = offset + size; \ - offset; \ + size_t groupname##_##name##__sz = array_size(n, sizeof(type)); \ + size_t groupname##_##name##__offset = ({ \ + size_t offset = 0; \ + if (groupname##__next != SIZE_MAX) { \ + size_t align_mask = __alignof__(type) - 1; \ + offset = (groupname##__next + align_mask) & \ + ~align_mask; \ + if (check_add_overflow(offset, groupname##_##name##__sz,\ + &groupname##__next)) { \ + groupname##__next = SIZE_MAX; \ + offset = 0; \ + } \ + } \ + offset; \ })#define vla_ptr (ptr, groupname, name) \
drivers/usb/host/ohci-exynos.c +2 -3
@@ -166,9 +166,8 @@ static int exynos_ohci_probe(struct platform_device *pdev) hcd->rsrc_len =resource_size (res); irq =platform_get_irq (pdev,0 ); -if (!irq) { -dev_err (&pdev->dev,"Failed to get IRQ\n" ); - err = -ENODEV ; +if (irq <0 ) { + err = irq; goto fail_io; }
drivers/usb/host/xhci-hub.c +10 -9
@@ -623,15 +623,6 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci, {u32 pls = status_reg &PORT_PLS_MASK ; -/* resume state is a xHCI internal state. -* Do not report it to usb core, instead, pretend to be U3, -* thus usb core knows it's not ready for transfer -*/ -if (pls ==XDEV_RESUME ) { - *status |=USB_SS_PORT_LS_U3 ; -return ; - } -/* When the CAS bit is set then warm reset * should be performed on port */
@@ -653,6 +644,16 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,*/ pls |=USB_PORT_STAT_CONNECTION ; }else { +/* +* Resume state is an xHCI internal state. Do not report it to +* usb core, instead, pretend to be U3, thus usb core knows +* it's not ready for transfer. +*/ +if (pls ==XDEV_RESUME ) { + *status |=USB_SS_PORT_LS_U3 ; +return ; + } +/* * If CAS bit isn't set but the Port is already at * Compliance Mode, fake a connection so the USB core
drivers/usb/misc/lvstest.c +1 -1
@@ -392,7 +392,7 @@ static int lvs_rh_probe(struct usb_interface *intf, USB_DT_SS_HUB_SIZE, USB_CTRL_GET_TIMEOUT);if (ret < (USB_DT_HUB_NONVAR_SIZE +2 )) {dev_err (&hdev->dev,"wrong root hub descriptor read %d\n" , ret); -return ret; +return ret <0 ? ret : -EINVAL ; }/* submit urb to poll interrupt endpoint */
drivers/usb/misc/sisusbvga/sisusb.c +1 -1
@@ -762,7 +762,7 @@ static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,u8 swap8, fromkern = kernbuffer ?1 :0 ;u16 swap16;u32 swap32, flag = (length >>28 ) &1 ; -char buf[4 ]; +u8 buf[4 ];/* if neither kernbuffer not userbuffer are given, assume * data in obuf
drivers/usb/misc/yurex.c +1 -1
@@ -502,7 +502,7 @@ static ssize_t yurex_write(struct file *file, const char __user *user_buffer,prepare_to_wait (&dev->waitq, &wait,TASK_INTERRUPTIBLE );dev_dbg (&dev->interface->dev,"%s - submit %c\n" , __func__, dev->cntl_buffer[0 ]); - retval =usb_submit_urb (dev->cntl_urb,GFP_KERNEL ); + retval =usb_submit_urb (dev->cntl_urb,GFP_ATOMIC );if (retval >=0 ) timeout =schedule_timeout (YUREX_WRITE_TIMEOUT );finish_wait (&dev->waitq, &wait);
drivers/usb/storage/unusual_devs.h +1 -1
@@ -2347,7 +2347,7 @@ UNUSUAL_DEV( 0x357d, 0x7788, 0x0114, 0x0114, "JMicron", "USB to ATA/ATAPI Bridge", USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_BROKEN_FUA ), + US_FL_BROKEN_FUA | US_FL_IGNORE_UAS ),/* Reported by Andrey Rahmatullin <[email protected]> */ UNUSUAL_DEV( 0x4102, 0x1020, 0x0100, 0x0100,
drivers/usb/storage/unusual_uas.h +14 -0
@@ -41,6 +41,13 @@* and don't forget to CC: the USB development list <[email protected]> */ +/* Reported-by: Till Dörges <[email protected]> */ +UNUSUAL_DEV (0x054c ,0x087d ,0x0000 ,0x9999 , +"Sony" , +"PSZ-HA*" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_NO_REPORT_OPCODES ), +/* Reported-by: Julian Groß <[email protected]> */ UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999, "LaCie",
@@ -156,6 +163,13 @@ UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_BROKEN_FUA), +/* Reported-by: Thinh Nguyen <[email protected]> */ +UNUSUAL_DEV (0x154b ,0xf00d ,0x0000 ,0x9999 , +"PNY" , +"Pro Elite SSD" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_NO_ATA_1X ), +/* Reported-by: Hans de Goede <[email protected]> */ UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, "VIA",
drivers/video/console/fbcon.c +23 -2
@@ -2116,6 +2116,9 @@ static void updatescrollmode(struct display *p, } } +#define PITCH (w) (((w) + 7) >> 3) +#define CALC_FONTSZ (h, p, c) ((h) * (p) * (c))/* size = height * pitch * charcount */ +static int fbcon_resize (struct vc_data *vc,unsigned int width,unsigned int height,unsigned int user) {
@@ -2125,6 +2128,24 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,struct fb_var_screeninfo var = info->var;int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh; +if (ops->p && ops->p->userfont &&FNTSIZE (vc->vc_font.data)) { +int size; +int pitch =PITCH (vc->vc_font.width); + +/* +* If user font, ensure that a possible change to user font +* height or width will not allow a font data out-of-bounds access. +* NOTE: must use original charcount in calculation as font +* charcount can change and cannot be used to determine the +* font data allocated size. +*/ +if (pitch <=0 ) +return -EINVAL ; + size =CALC_FONTSZ (vc->vc_font.height, pitch,FNTCHARCNT (vc->vc_font.data)); +if (size >FNTSIZE (vc->vc_font.data)) +return -EINVAL ; + } + virt_w =FBCON_SWAP (ops->rotate, width, height); virt_h =FBCON_SWAP (ops->rotate, height, width); virt_fw = FBCON_SWAP(ops->rotate, vc->vc_font.width,
@@ -2586,7 +2607,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigneint size;int i, csum;u8 *new_data, *data = font->data; -int pitch = (font->width+7 ) >>3 ; +int pitch =PITCH (font->width);/* Is there a reason why fbconsole couldn't handle any charcount >256? * If not this check should be changed to charcount < 256 */
@@ -2602,7 +2623,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigneif (fbcon_invalid_charcount (info, charcount))return -EINVAL ; - size = h * pitch * charcount; + size =CALC_FONTSZ (h, pitch, charcount); new_data =kmalloc (FONT_EXTRA_WORDS *sizeof (int ) + size,GFP_USER );
drivers/video/fbdev/omap2/omapfb/dss/dispc.c +5 -2
@@ -531,8 +531,11 @@ int dispc_runtime_get(void)DSSDBG ("dispc_runtime_get\n" ); r =pm_runtime_get_sync (&dispc.pdev->dev); -WARN_ON (r <0 ); -return r <0 ? r :0 ; +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&dispc.pdev->dev); +return r; + } +return 0 ; }EXPORT_SYMBOL (dispc_runtime_get);
drivers/video/fbdev/omap2/omapfb/dss/dsi.c +5 -2
@@ -1148,8 +1148,11 @@ static int dsi_runtime_get(struct platform_device *dsidev)DSSDBG ("dsi_runtime_get\n" ); r =pm_runtime_get_sync (&dsi->pdev->dev); -WARN_ON (r <0 ); -return r <0 ? r :0 ; +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&dsi->pdev->dev); +return r; + } +return 0 ; }static void dsi_runtime_put (struct platform_device *dsidev)
drivers/video/fbdev/omap2/omapfb/dss/dss.c +5 -2
@@ -778,8 +778,11 @@ int dss_runtime_get(void)DSSDBG ("dss_runtime_get\n" ); r =pm_runtime_get_sync (&dss.pdev->dev); -WARN_ON (r <0 ); -return r <0 ? r :0 ; +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&dss.pdev->dev); +return r; + } +return 0 ; }void dss_runtime_put (void )
drivers/video/fbdev/omap2/omapfb/dss/hdmi4.c +3 -2
@@ -50,9 +50,10 @@ static int hdmi_runtime_get(void)DSSDBG ("hdmi_runtime_get\n" ); r =pm_runtime_get_sync (&hdmi.pdev->dev); -WARN_ON (r <0 ); -if (r <0 ) +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&hdmi.pdev->dev);return r; + }return 0 ; }
drivers/video/fbdev/omap2/omapfb/dss/hdmi5.c +3 -2
@@ -54,9 +54,10 @@ static int hdmi_runtime_get(void)DSSDBG ("hdmi_runtime_get\n" ); r =pm_runtime_get_sync (&hdmi.pdev->dev); -WARN_ON (r <0 ); -if (r <0 ) +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&hdmi.pdev->dev);return r; + }return 0 ; }
drivers/video/fbdev/omap2/omapfb/dss/venc.c +5 -2
@@ -402,8 +402,11 @@ static int venc_runtime_get(void)DSSDBG ("venc_runtime_get\n" ); r =pm_runtime_get_sync (&venc.pdev->dev); -WARN_ON (r <0 ); -return r <0 ? r :0 ; +if (WARN_ON (r <0 )) { +pm_runtime_put_sync (&venc.pdev->dev); +return r; + } +return 0 ; }static void venc_runtime_put (void )
drivers/xen/events/events_base.c +8 -8
@@ -155,7 +155,7 @@ int get_evtchn_to_irq(unsigned evtchn)/* Get info for IRQ */ struct irq_info *info_for_irq (unsigned irq) { -return irq_get_handler_data (irq); +return irq_get_chip_data (irq); }/* Constructors for packed IRQ information. */
@@ -384,7 +384,7 @@ static void xen_irq_init(unsigned irq) info->type =IRQT_UNBOUND ; info->refcnt =-1 ; -irq_set_handler_data (irq, info); +irq_set_chip_data (irq, info);list_add_tail (&info->list, &xen_irq_list_head); }
@@ -433,14 +433,14 @@ static int __must_check xen_allocate_irq_gsi(unsigned gsi)static void xen_free_irq (unsigned irq) { -struct irq_info *info =irq_get_handler_data (irq); +struct irq_info *info =irq_get_chip_data (irq);if (WARN_ON (!info))return ;list_del (&info->list); -irq_set_handler_data (irq,NULL ); +irq_set_chip_data (irq,NULL );WARN_ON (info->refcnt >0 );
@@ -610,7 +610,7 @@ EXPORT_SYMBOL_GPL(xen_irq_from_gsi);static void __unbind_from_irq (unsigned int irq) {int evtchn =evtchn_from_irq (irq); -struct irq_info *info =irq_get_handler_data (irq); +struct irq_info *info =irq_get_chip_data (irq);if (info->refcnt >0 ) { info->refcnt--;
@@ -1114,7 +1114,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,void unbind_from_irqhandler (unsigned int irq,void *dev_id) { -struct irq_info *info =irq_get_handler_data (irq); +struct irq_info *info =irq_get_chip_data (irq);if (WARN_ON (!info))return ;
@@ -1148,7 +1148,7 @@ int evtchn_make_refcounted(unsigned int evtchn)if (irq ==-1 )return -ENOENT ; - info =irq_get_handler_data (irq); + info =irq_get_chip_data (irq);if (!info)return -ENOENT ;
@@ -1176,7 +1176,7 @@ int evtchn_get(unsigned int evtchn)if (irq ==-1 ) goto done; - info =irq_get_handler_data (irq); + info =irq_get_chip_data (irq);if (!info) goto done;
fs/btrfs/disk-io.c +1 -0
@@ -4432,6 +4432,7 @@ static void btrfs_cleanup_bg_io(struct btrfs_block_group_cache *cache) cache->io_ctl.inode =NULL ;iput (inode); } +ASSERT (cache->io_ctl.pages ==NULL );btrfs_put_block_group (cache); }
fs/btrfs/free-space-cache.c +1 -1
@@ -1165,7 +1165,6 @@ int btrfs_wait_cache_io(struct btrfs_root *root, ret =update_cache_item (trans, root, inode, path, offset, io_ctl->entries, io_ctl->bitmaps); out: -io_ctl_free (io_ctl);if (ret) {invalidate_inode_pages2 (inode->i_mapping);BTRFS_I (inode)->generation =0 ;
@@ -1314,6 +1313,7 @@ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode,* them out later */ io_ctl_drop_pages (io_ctl); +io_ctl_free (io_ctl);unlock_extent_cached (&BTRFS_I (inode)->io_tree,0 ,i_size_read (inode) -1 , &cached_state,GFP_NOFS );
fs/btrfs/tree-log.c +6 -4
@@ -3191,11 +3191,13 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,btrfs_free_path (path); out_unlock:mutex_unlock (&BTRFS_I (dir)->log_mutex); -if (ret == -ENOSPC ) { +if (err == -ENOSPC ) {btrfs_set_log_full_commit (root->fs_info, trans); - ret =0 ; - }else if (ret <0 ) -btrfs_abort_transaction (trans, ret); + err =0 ; + }else if (err <0 && err != -ENOENT ) { +/* ENOENT can be returned if the entry hasn't been fsynced yet */ +btrfs_abort_transaction (trans, err); + }btrfs_end_log_trans (root);
fs/buffer.c +9 -0
@@ -3203,6 +3203,15 @@ int __sync_dirty_buffer(struct buffer_head *bh, int op_flags)WARN_ON (atomic_read (&bh->b_count) <1 );lock_buffer (bh);if (test_clear_buffer_dirty (bh)) { +/* +* The bh should be mapped, but it might not be if the +* device was hot-removed. Not much we can do but fail the I/O. +*/ +if (!buffer_mapped (bh)) { +unlock_buffer (bh); +return -EIO ; + } +get_bh (bh); bh->b_end_io = end_buffer_write_sync; ret =submit_bh (REQ_OP_WRITE , op_flags, bh);
fs/ceph/mds_client.c +13 -1
@@ -3386,6 +3386,9 @@ static void delayed_work(struct work_struct *work)dout ("mdsc delayed_work\n" );ceph_check_delayed_caps (mdsc); +if (mdsc->stopping) +return ; +mutex_lock (&mdsc->mutex); renew_interval = mdsc->mdsmap->m_session_timeout >>2 ; renew_caps = time_after_eq(jiffies, HZ*renew_interval +
@@ -3717,7 +3720,16 @@ void ceph_mdsc_force_umount(struct ceph_mds_client *mdsc)static void ceph_mdsc_stop (struct ceph_mds_client *mdsc) {dout ("stop\n" ); -cancel_delayed_work_sync (&mdsc->delayed_work);/* cancel timer */ +/* +* Make sure the delayed work stopped before releasing +* the resources. +* +* Because the cancel_delayed_work_sync() will only +* guarantee that the work finishes executing. But the +* delayed work will re-arm itself again after that. +*/ +flush_delayed_work (&mdsc->delayed_work); +if (mdsc->mdsmap)ceph_mdsmap_destroy (mdsc->mdsmap);kfree (mdsc->sessions);
fs/ext4/super.c +0 -7
@@ -4680,13 +4680,6 @@ static int ext4_commit_super(struct super_block *sb, int sync)if (!sbh ||block_device_ejected (sb))return error; -/* -* The superblock bh should be mapped, but it might not be if the -* device was hot-removed. Not much we can do but fail the I/O. -*/ -if (!buffer_mapped (sbh)) -return error; -/* * If the file system is mounted read-only, don't update the * superblock write time. This avoids updating the superblock
fs/fs-writeback.c +46 -37
221 lines not on this page · raw message
fs/jbd2/transaction.c +26 -0
@@ -1896,6 +1896,9 @@ static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)*/ static void __jbd2_journal_unfile_buffer (struct journal_head *jh) { +J_ASSERT_JH (jh, jh->b_transaction !=NULL ); +J_ASSERT_JH (jh, jh->b_next_transaction ==NULL ); +__jbd2_journal_temp_unlink_buffer (jh); jh->b_transaction =NULL ;jbd2_journal_put_journal_head (jh);
@@ -1987,6 +1990,7 @@ int jbd2_journal_try_to_free_buffers(journal_t *journal, {struct buffer_head *head;struct buffer_head *bh; +bool has_write_io_error = false;int ret =0 ;J_ASSERT (PageLocked (page));
@@ -2011,11 +2015,26 @@ int jbd2_journal_try_to_free_buffers(journal_t *journal,jbd_unlock_bh_state (bh);if (buffer_jbd (bh)) goto busy; + +/* +* If we free a metadata buffer which has been failed to +* write out, the jbd2 checkpoint procedure will not detect +* this failure and may lead to filesystem inconsistency +* after cleanup journal tail. +*/ +if (buffer_write_io_error (bh)) { +pr_err ("JBD2: Error while async write back metadata bh %llu." , + (unsigned long long )bh->b_blocknr); + has_write_io_error = true; + } }while ((bh = bh->b_this_page) != head); ret =try_to_free_buffers (page); busy: +if (has_write_io_error) +jbd2_journal_abort (journal, -EIO ); +return ret; }
@@ -2443,6 +2462,13 @@ void __jbd2_journal_refile_buffer(struct journal_head *jh) was_dirty =test_clear_buffer_jbddirty (bh);__jbd2_journal_temp_unlink_buffer (jh); + +/* +* b_transaction must be set, otherwise the new b_transaction won't +* be holding jh reference +*/ +J_ASSERT_JH (jh, jh->b_transaction !=NULL ); +/* * We set b_transaction here because b_next_transaction will inherit * our jh reference and thus __jbd2_journal_file_buffer() must not
include/linux/efi.h +4 -0
@@ -910,7 +910,11 @@ extern void *efi_get_pal_addr (void);extern void efi_map_pal_code (void );extern void efi_memmap_walk (efi_freemem_callback_t callback,void *arg);extern void efi_gettimeofday (struct timespec64 *ts); +#ifdef CONFIG_EFI extern void efi_enter_virtual_mode (void );/* switch EFI to virtual mode, if possible */ +#else +static inline void efi_enter_virtual_mode (void ) {} +#endif #ifdef CONFIG_X86 extern void efi_late_init (void );extern void efi_free_boot_services (void );
include/linux/fs.h +6 -2
@@ -1954,6 +1954,10 @@ static inline bool HAS_UNMAPPED_ID(struct inode *inode)* wb stat updates to grab mapping->tree_lock. See * inode_switch_wb_work_fn() for details. * +* I_SYNC_QUEUED Inode is queued in b_io or b_more_io writeback lists. +* Used to detect that mark_inode_dirty() should not move +* inode between dirty lists. +* * Q: What is the difference between I_WILL_FREE and I_FREEING? */ #define I_DIRTY_SYNC (1 << 0)
@@ -1971,9 +1975,9 @@ static inline bool HAS_UNMAPPED_ID(struct inode *inode)#define I_DIO_WAKEUP (1 << __I_DIO_WAKEUP)#define I_LINKABLE (1 << 10)#define I_DIRTY_TIME (1 << 11) -#define __I_DIRTY_TIME_EXPIRED 12 -#define I_DIRTY_TIME_EXPIRED (1 << __I_DIRTY_TIME_EXPIRED) +#define I_DIRTY_TIME_EXPIRED (1 << 12)#define I_WB_SWITCH (1 << 13) +#define I_SYNC_QUEUED (1 << 17)#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)#define I_DIRTY_ALL (I_DIRTY | I_DIRTY_TIME)
include/linux/overflow.h +73 -0
77 lines not on this page · raw message
include/trace/events/writeback.h +6 -7
@@ -360,8 +360,9 @@ DEFINE_WBC_EVENT(wbc_writepage); TRACE_EVENT(writeback_queue_io, TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work, + unsigned long dirtied_before, int moved), - TP_ARGS(wb, work, moved), + TP_ARGS(wb, work, dirtied_before, moved), TP_STRUCT__entry( __array(char, name, 32) __field(unsigned long, older)
@@ -371,19 +372,17 @@ TRACE_EVENT(writeback_queue_io, __field(unsigned int, cgroup_ino) ),TP_fast_assign ( - unsigned long *older_than_this = work->older_than_this; strncpy(__entry->name, dev_name(wb->bdi->dev), 32); - __entry->older = older_than_this ? *older_than_this :0 ; - __entry->age = older_than_this ? - (jiffies - *older_than_this) *1000 /HZ :-1 ; + __entry->older = dirtied_before; + __entry->age = (jiffies - dirtied_before) *1000 /HZ ; __entry->moved = moved; __entry->reason = work->reason; __entry->cgroup_ino =__trace_wb_assign_cgroup (wb); ),TP_printk ("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup_ino=%u" , __entry->name, - __entry->older,/* older_than_this in jiffies */ - __entry->age,/* older_than_this in relative milliseconds */ + __entry->older,/* dirtied_before in jiffies */ + __entry->age,/* dirtied_before in relative milliseconds */ __entry->moved,__print_symbolic (__entry->reason,WB_WORK_REASON ), __entry->cgroup_ino
kernel/locking/lockdep_proc.c +1 -1
@@ -425,7 +425,7 @@ static void seq_lock_time(struct seq_file *m, struct lock_time *lt)seq_time (m, lt->min);seq_time (m, lt->max);seq_time (m, lt->total); -seq_time (m, lt->nr ?div_s64 (lt->total, lt->nr) :0 ); +seq_time (m, lt->nr ?div64_u64 (lt->total, lt->nr) :0 ); }static void seq_stats (struct seq_file *m,struct lock_stat_data *data)
net/core/skbuff.c +2 -2
@@ -4591,8 +4591,8 @@ struct sk_buff *skb_vlan_untag(struct sk_buff *skb) skb =skb_share_check (skb,GFP_ATOMIC );if (unlikely (!skb)) goto err_free; - -if (unlikely (!pskb_may_pull (skb,VLAN_HLEN ))) +/* We may access the two bytes after vlan_hdr in vlan_set_encap_proto(). */ +if (unlikely (!pskb_may_pull (skb,VLAN_HLEN +sizeof (unsigned short )))) goto err_free; vhdr = (struct vlan_hdr *)skb->data;
net/ipv6/ip6_tunnel.c +9 -1
@@ -871,7 +871,15 @@ int ip6_tnl_rcv(struct ip6_tnl *t, struct sk_buff *skb, struct metadata_dst *tun_dst, bool log_ecn_err) { - return __ip6_tnl_rcv(t, skb, tpi, NULL, ip6ip6_dscp_ecn_decapsulate, +int (*dscp_ecn_decapsulate)(const struct ip6_tnl *t, +const struct ipv6hdr *ipv6h, +struct sk_buff *skb); + + dscp_ecn_decapsulate = ip6ip6_dscp_ecn_decapsulate; +if (tpi->proto ==htons (ETH_P_IP )) + dscp_ecn_decapsulate = ip4ip6_dscp_ecn_decapsulate; + +return __ip6_tnl_rcv (t, skb, tpi,NULL , dscp_ecn_decapsulate, log_ecn_err); }EXPORT_SYMBOL (ip6_tnl_rcv);
net/tipc/netlink_compat.c +11 -1
@@ -250,8 +250,9 @@ static int __tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,static int tipc_nl_compat_dumpit (struct tipc_nl_compat_cmd_dump *cmd,struct tipc_nl_compat_msg *msg) { -int err; +struct nlmsghdr *nlh;struct sk_buff *arg; +int err;if (msg->req_type && (!msg->req_size || !TLV_CHECK_TYPE (msg->req, msg->req_type)))
@@ -280,6 +281,15 @@ static int tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,return -ENOMEM ; } + nlh =nlmsg_put (arg,0 ,0 , tipc_genl_family.id,0 ,NLM_F_MULTI ); +if (!nlh) { +kfree_skb (arg); +kfree_skb (msg->rep); + msg->rep =NULL ; +return -EMSGSIZE ; + } +nlmsg_end (arg, nlh); + err =__tipc_nl_compat_dumpit (cmd, msg, arg);if (err) {kfree_skb (msg->rep);
sound/pci/cs46xx/cs46xx_lib.c +1 -1
@@ -780,7 +780,7 @@ static void snd_cs46xx_set_capture_sample_rate(struct snd_cs46xx *chip, unsigned rate =48000 /9 ;/* -* We can not capture at at rate greater than the Input Rate (48000). +* We can not capture at a rate greater than the Input Rate (48000). * Return an error if an attempt is made to stray outside that limit. */ if (rate >48000 )
sound/pci/cs46xx/dsp_spos_scb_lib.c +1 -1
@@ -1742,7 +1742,7 @@ int cs46xx_iec958_pre_open (struct snd_cs46xx *chip)struct dsp_spos_instance * ins = chip->dsp_spos_instance;if ( ins->spdif_status_out &DSP_SPDIF_STATUS_OUTPUT_ENABLED ) { -/* remove AsynchFGTxSCB and and PCMSerialInput_II */ +/* remove AsynchFGTxSCB and PCMSerialInput_II */ cs46xx_dsp_disable_spdif_out (chip);/* save state */
sound/pci/hda/hda_codec.c +1 -1
@@ -3496,7 +3496,7 @@ EXPORT_SYMBOL_GPL(snd_hda_set_power_save);* @nid: NID to check / update * * Check whether the given NID is in the amp list. If it's in the list, -* check the current AMP status, and update the the power-status according +* check the current AMP status, and update the power-status according * to the mute status. * * This function is supposed to be set or called from the check_power_status
sound/pci/hda/hda_generic.c +1 -1
@@ -820,7 +820,7 @@ static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, } } -/* sync power of each widget in the the given path */ +/* sync power of each widget in the given path */ static hda_nid_t path_power_update (struct hda_codec *codec,struct nid_path *path,bool allow_powerdown)
sound/pci/hda/patch_sigmatel.c +1 -1
@@ -862,7 +862,7 @@ static int stac_auto_create_beep_ctls(struct hda_codec *codec,static struct snd_kcontrol_new beep_vol_ctl =HDA_CODEC_VOLUME (NULL ,0 ,0 ,0 ); -/* check for mute support for the the amp */ +/* check for mute support for the amp */ if ((caps &AC_AMPCAP_MUTE ) >>AC_AMPCAP_MUTE_SHIFT ) {const struct snd_kcontrol_new *temp;if (spec->anabeep_nid == nid)
sound/pci/ice1712/prodigy192.c +1 -1
@@ -31,7 +31,7 @@* Experimentally I found out that only a combination of * OCKS0=1, OCKS1=1 (128fs, 64fs output) and ice1724 - * VT1724_MT_I2S_MCLK_128X=0 (256fs input) yields correct -* sampling rate. That means the the FPGA doubles the +* sampling rate. That means that the FPGA doubles the * MCK01 rate. * * Copyright (c) 2003 Takashi Iwai <[email protected]>
sound/pci/oxygen/xonar_dg.c +1 -1
@@ -39,7 +39,7 @@* GPIO 4 <- headphone detect * GPIO 5 -> enable ADC analog circuit for the left channel * GPIO 6 -> enable ADC analog circuit for the right channel -* GPIO 7 -> switch green rear output jack between CS4245 and and the first +* GPIO 7 -> switch green rear output jack between CS4245 and the first * channel of CS4361 (mechanical relay) * GPIO 8 -> enable output to speakers *
sound/soc/tegra/tegra30_ahub.c +3 -1
@@ -656,8 +656,10 @@ static int tegra30_ahub_resume(struct device *dev)int ret; ret =pm_runtime_get_sync (dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put (dev);return ret; + } ret =regcache_sync (ahub->regmap_ahub); ret |=regcache_sync (ahub->regmap_apbif);pm_runtime_put (dev);
sound/soc/tegra/tegra30_i2s.c +3 -1
@@ -552,8 +552,10 @@ static int tegra30_i2s_resume(struct device *dev)int ret; ret =pm_runtime_get_sync (dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put (dev);return ret; + } ret =regcache_sync (i2s->regmap);pm_runtime_put (dev);
sound/usb/quirks-table.h +2 -2
@@ -3331,8 +3331,8 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),* they pretend to be 96kHz mono as a workaround for stereo being broken * by that... * -* They also have swapped L-R channels, but that's for userspace to deal -* with. +* They also have an issue with initial stream alignment that causes the +* channels to be swapped and out of phase, which is dealt with in quirks.c. */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
tools/testing/selftests/powerpc/pmu/ebb/back_to_back_ebbs_test.c +0 -2
@@ -91,8 +91,6 @@ int back_to_back_ebbs(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();event_close (&event);
tools/testing/selftests/powerpc/pmu/ebb/cycles_test.c +0 -2
@@ -42,8 +42,6 @@ int cycles(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();event_close (&event);
tools/testing/selftests/powerpc/pmu/ebb/cycles_with_freeze_test.c +0 -2
@@ -99,8 +99,6 @@ int cycles_with_freeze(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();printf ("EBBs while frozen %d\n" , ebbs_while_frozen);
tools/testing/selftests/powerpc/pmu/ebb/cycles_with_mmcr2_test.c +0 -2
@@ -71,8 +71,6 @@ int cycles_with_mmcr2(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();event_close (&event);
tools/testing/selftests/powerpc/pmu/ebb/ebb.c +0 -2
@@ -396,8 +396,6 @@ int ebb_child(union pipe read_pipe, union pipe write_pipe)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();event_close (&event);
tools/testing/selftests/powerpc/pmu/ebb/ebb_on_willing_child_test.c +0 -2
@@ -38,8 +38,6 @@ static int victim_child(union pipe read_pipe, union pipe write_pipe)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();FAIL_IF (ebb_state.stats.ebb_count ==0 );
tools/testing/selftests/powerpc/pmu/ebb/lost_exception_test.c +0 -1
@@ -75,7 +75,6 @@ static int test_body(void)ebb_freeze_pmcs ();ebb_global_disable (); -count_pmc (4 , sample_period);mtspr (SPRN_PMC4 ,0xdead );dump_summary_ebb_state ();
tools/testing/selftests/powerpc/pmu/ebb/multi_counter_test.c +0 -7
@@ -70,13 +70,6 @@ int multi_counter(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -count_pmc (2 , sample_period); -count_pmc (3 , sample_period); -count_pmc (4 , sample_period); -count_pmc (5 , sample_period); -count_pmc (6 , sample_period); -dump_ebb_state ();for (i =0 ; i <6 ; i++)
tools/testing/selftests/powerpc/pmu/ebb/multi_ebb_procs_test.c +0 -2
@@ -61,8 +61,6 @@ static int cycles_child(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_summary_ebb_state ();event_close (&event);
tools/testing/selftests/powerpc/pmu/ebb/pmae_handling_test.c +0 -2
@@ -82,8 +82,6 @@ static int test_body(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (1 , sample_period); -dump_ebb_state ();if (mmcr0_mismatch)
tools/testing/selftests/powerpc/pmu/ebb/pmc56_overflow_test.c +0 -2
@@ -76,8 +76,6 @@ int pmc56_overflow(void)ebb_global_disable ();ebb_freeze_pmcs (); -count_pmc (2 , sample_period); -dump_ebb_state ();printf ("PMC5/6 overflow %d\n" , pmc56_overflowed);