Linux 4.4.235
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.235 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/mips/vdso/genvdso.c | 10 + arch/powerpc/platforms/cell/Kconfig | 1 arch/powerpc/platforms/pseries/ras.c | 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/usbhid/hiddev.c | 4 drivers/i2c/busses/i2c-rcar.c | 1 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 | 5 drivers/target/target_core_user.c | 9 - drivers/tty/serial/8250/8250_port.c | 9 - drivers/tty/serial/amba-pl011.c | 5 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/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/xen/events/events_base.c | 16 - fs/btrfs/tree-log.c | 10 - fs/ceph/mds_client.c | 14 + fs/fs-writeback.c | 83 +++++----- fs/jbd2/transaction.c | 26 +++ include/linux/fs.h | 8 include/trace/events/writeback.h | 13 - kernel/locking/lockdep_proc.c | 2 net/core/skbuff.c | 4 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 76 files changed, 444 insertions(+), 202 deletions(-)
Aditya Pakki (3):
drm/radeon: fix multiple reference count leak drm/nouveau/drm/noveau: fix reference count leak in nouveau_fbcon_open drm/nouveau: Fix reference count leak in nouveau_connector_detect
Alan Stern (2):
USB: yurex: Fix bad gfp argument
usb: storage: Add unusual_uas entry for Sony PSZ drives
Arnd Bergmann (1):
powerpc/spufs: add CONFIG_COREDUMP dependency
Bodo Stroesser (1):
scsi: target: tcmu: Fix crash on ARM during cmd completion
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
Cong Wang (2):
tipc: fix uninit skb->data in tipc_nl_compat_dumpit()
bonding: fix a potential double-unregister
Cyril Roelandt (1):
USB: Ignore UAS for JMicron JMS567 ATA/ATAPI Bridge
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
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.4.235
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
Lukas Czerner (1):
jbd2: make sure jh have b_transaction set in refile/unfile_buffer
Lukas Wunner (1):
serial: pl011: Don't leak amba_ports entry on driver register error
Mahesh Bandewar (1):
ipvlan: fix device features
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
Sergey Senozhatsky (1):
serial: 8250: change lock order in serial8250_do_startup()
Stanley Chu (1):
scsi: ufs: Fix possible infinite loop in ufshcd_hold
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.
Vasant Hegde (1):
powerpc/pseries: Do not initiate shutdown when system is running on UPS
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
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 = 4 -SUBLEVEL = 234 +SUBLEVEL = 235 EXTRAVERSION = NAME = Blurry Fish Butt
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/platforms/cell/Kconfig +1 -0
@@ -50,6 +50,7 @@ config SPU_FS tristate "SPU file system" default m depends on PPC_CELL + depends on COREDUMP select SPU_BASE select MEMORY_HOTPLUG help
arch/powerpc/platforms/pseries/ras.c +0 -1
@@ -90,7 +90,6 @@ static void handle_system_shutdown(char event_modifier)pr_emerg ("Loss of power reported by firmware, system is " "running on UPS/battery" );pr_emerg ("Check RTAS error log for details" ); -orderly_poweroff (true);break ;case EPOW_SHUTDOWN_LOSS_OF_CRITICAL_FUNCTIONS :
drivers/base/core.c +8 -4
@@ -2344,17 +2344,21 @@ 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; fwnode->secondary = fn; 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
@@ -1361,13 +1361,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) {
@@ -863,8 +865,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);
@@ -986,8 +990,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)) {
@@ -1360,8 +1366,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
@@ -296,7 +296,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);
@@ -311,7 +311,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 */
@@ -320,6 +320,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
@@ -443,11 +443,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
@@ -522,7 +522,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))
@@ -540,6 +540,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) file_priv->driver_priv = fpriv;pm_runtime_mark_last_busy (dev->dev); +pm_put:pm_runtime_put_autosuspend (dev->dev);return 0 ;
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
@@ -263,8 +263,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
@@ -184,8 +184,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
@@ -886,8 +886,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) {
@@ -1021,8 +1023,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);
@@ -1158,8 +1162,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);
@@ -1241,8 +1247,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) {
@@ -1681,8 +1689,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/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
@@ -393,6 +393,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/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
@@ -1417,8 +1417,6 @@ probe_out:/* 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
@@ -1940,7 +1940,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);
@@ -4057,13 +4058,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 ;
@@ -4075,8 +4086,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
@@ -845,8 +845,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
@@ -87,12 +87,21 @@ static void ipvlan_port_destroy(struct net_device *dev)static struct lock_class_key ipvlan_netdev_xmit_lock_key;static struct lock_class_key ipvlan_netdev_addr_lock_key; +#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_ALL_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))
@@ -117,7 +126,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->hard_header_len = phy_dev->hard_header_len;
@@ -201,7 +212,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)
@@ -590,9 +608,8 @@ 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; -netdev_features_change (ipvlan->dev); +netdev_update_features (ipvlan->dev); }break ;
drivers/net/wireless/ath/ath10k/hw.h +1 -1
@@ -429,7 +429,7 @@ enum ath10k_hw_rate_cck {#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
@@ -755,8 +755,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 @@ placeholder: 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 @@ out: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
@@ -264,9 +264,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
@@ -615,27 +615,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);
@@ -783,8 +772,9 @@ skip_logo: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
@@ -3192,7 +3192,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 +4 -1
@@ -575,6 +575,7 @@ unblock_reqs:int ufshcd_hold (struct ufs_hba *hba,bool async) {int rc =0 ; +bool flush_result;unsigned long flags;if (!ufshcd_is_clkgating_allowed (hba))
@@ -601,7 +602,9 @@ start: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; }
drivers/target/target_core_user.c +8 -1
@@ -590,7 +590,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
@@ -1902,6 +1902,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
@@ -1911,8 +1915,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 );
@@ -1924,9 +1926,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 +4 -1
@@ -2332,7 +2332,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 */ writew (0 , uap->port.membase +UART011_IMSC );
@@ -2343,6 +2343,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
@@ -1719,9 +1719,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
@@ -864,7 +864,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 ();
@@ -946,10 +946,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/host/ohci-exynos.c +2 -3
@@ -166,9 +166,8 @@ skip_phy: 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
@@ -599,15 +599,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 */
@@ -629,6 +620,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
@@ -396,7 +396,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
@@ -790,7 +790,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
@@ -510,7 +510,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
@@ -2213,7 +2213,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
@@ -40,6 +40,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",
@@ -155,6 +162,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
@@ -2117,6 +2117,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) {
@@ -2126,6 +2129,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,
@@ -2587,7 +2608,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 */
@@ -2603,7 +2624,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/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/tree-log.c +6 -4
@@ -3169,11 +3169,13 @@ fail: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, root, 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, root, err); + }btrfs_end_log_trans (root);
fs/ceph/mds_client.c +13 -1
@@ -3428,6 +3428,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 +
@@ -3752,7 +3755,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/fs-writeback.c +46 -37
221 lines not on this page · raw message
fs/jbd2/transaction.c +26 -0
@@ -1906,6 +1906,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);
@@ -1997,6 +2000,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));
@@ -2021,11 +2025,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; }
@@ -2453,6 +2472,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/fs.h +6 -2
@@ -1882,6 +1882,10 @@ struct super_operations {* 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)
@@ -1899,9 +1903,9 @@ struct super_operations {#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/trace/events/writeback.h +6 -7
@@ -390,8 +390,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)
@@ -401,19 +402,17 @@ TRACE_EVENT(writeback_queue_io,__dynamic_array (char, cgroup,__trace_wb_cgroup_size (wb)) ),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;__trace_wb_assign_cgroup (__get_str (cgroup), wb); ),TP_printk ("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup=%s" , __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 ), __get_str(cgroup)
kernel/locking/lockdep_proc.c +1 -1
@@ -423,7 +423,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
@@ -4370,8 +4370,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/tipc/netlink_compat.c +11 -1
@@ -250,8 +250,9 @@ err_out: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
@@ -837,7 +837,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
@@ -398,8 +398,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);