Linux 4.14.244
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.14.244 kernel.
All users of the 4.14 kernel series must upgrade.
The updated 4.14.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.14.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/alpha/kernel/smp.c | 2 arch/arm/boot/dts/omap5-board-common.dtsi | 9 -- arch/mips/Makefile | 2 arch/mips/mti-malta/malta-platform.c | 3 arch/x86/events/perf_event.h | 3 drivers/acpi/acpica/nsrepair2.c | 7 - drivers/ata/libata-sff.c | 35 ++++++-- drivers/clk/clk-stm32f4.c | 10 +- drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 11 ++ drivers/media/v4l2-core/videobuf2-core.c | 13 +++ drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 3 drivers/net/ethernet/freescale/fec_main.c | 2 drivers/net/ethernet/natsemi/natsemi.c | 8 -- drivers/net/ethernet/neterion/vxge/vxge-main.c | 6 - drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | 2 drivers/net/ethernet/qlogic/qla3xxx.c | 6 - drivers/net/ethernet/xilinx/xilinx_emaclite.c | 5 - drivers/net/ppp/ppp_generic.c | 19 +++- drivers/net/usb/pegasus.c | 14 ++- drivers/net/usb/qmi_wwan.c | 76 +++++++++++++++++-- drivers/pcmcia/i82092.c | 1 drivers/scsi/sr.c | 2 drivers/spi/spi-meson-spicc.c | 2 drivers/staging/rtl8723bs/hal/sdio_ops.c | 2 drivers/tty/serial/8250/8250_port.c | 12 ++- drivers/usb/class/usbtmc.c | 8 -- drivers/usb/common/usb-otg-fsm.c | 6 + drivers/usb/gadget/function/f_hid.c | 44 +++++++++-- drivers/usb/host/ehci-pci.c | 3 drivers/usb/serial/ch341.c | 1 drivers/usb/serial/ftdi_sio.c | 1 drivers/usb/serial/ftdi_sio_ids.h | 3 drivers/usb/serial/option.c | 2 fs/ext4/namei.c | 2 fs/namespace.c | 42 +++++++--- fs/pipe.c | 19 ++++ fs/reiserfs/stree.c | 31 ++++++- fs/reiserfs/super.c | 8 ++ include/linux/usb/otg-fsm.h | 1 include/net/bluetooth/hci_core.h | 1 net/bluetooth/hci_core.c | 16 ++-- net/bluetooth/hci_sock.c | 49 ++++++++---- net/bluetooth/hci_sysfs.c | 3 scripts/tracing/draw_functrace.py | 6 - sound/core/seq/seq_ports.c | 39 ++++++--- 46 files changed, 399 insertions(+), 143 deletions(-)
Alex Xu (Hello71) (1):
pipe: increase minimum default pipe size to 2 pages
Christoph Hellwig (1):
libata: fix ata_pio_sector for CONFIG_HIGHMEM
Dan Carpenter (1):
bnx2x: fix an error code in bnx2x_nic_load()
Daniele Palmas (1):
USB: serial: option: add Telit FD980 composition 0x1056
Dario Binacchi (1):
clk: stm32f4: fix post divisor setup for I2S/SAI PLLs
David Bauer (1):
USB: serial: ftdi_sio: add device ID for Auto-M3 OP-COM v2
Dmitry Osipenko (1):
usb: otg-fsm: Fix hrtimer list corruption
Dongliang Mu (1):
spi: meson-spicc: fix memory leak in meson_spicc_remove
Fei Qin (1):
nfp: update ethtool reporting of pauseframe control
Greg Kroah-Hartman (1):
Linux 4.14.244
H. Nikolaus Schaller (2):
omap5-board-common: remove not physically existing vdds_1v8_main fixed-regulator
mips: Fix non-POSIX regexp
Hans Verkuil (1):
media: videobuf2-core: dequeue if start_streaming fails
Hui Su (1):
scripts/tracing: fix the bug that can't parse raw_trace_func
Johan Hovold (1):
media: rtl28xxu: fix zero-length control request
Letu Ren (1):
net/qla3xxx: fix schedule while atomic in ql_wait_for_drvr_lock and ql_adapter_reset
Li Manyi (1):
scsi: sr: Return correct event when media event code is 3
Like Xu (1):
perf/x86/amd: Don't touch the AMD64_EVENTSEL_HOSTONLY bit inside the guest
Longfang Liu (1):
USB:ehci:fix Kunpeng920 ehci hardware problem
Maciej W. Rozycki (2):
serial: 8250: Mask out floating 16/32-bit bus bits
MIPS: Malta: Do not byte-swap accesses to the CBUS UART
Maxim Devaev (2):
usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers
usb: gadget: f_hid: idle uses the highest byte for duration
Miklos Szeredi (1):
ovl: prevent private clone if bind mount is not allowed
Pali Rohár (1):
ppp: Fix generating ppp unit id when ifname is not specified
Pavel Skripkin (3):
net: pegasus: fix uninit-value in get_interrupt_interval
net: fec: fix use-after-free in fec_drv_remove
net: vxge: fix use-after-free in vxge_device_unregister
Phil Elwell (1):
usb: gadget: f_hid: fixed NULL pointer dereference
Prarit Bhargava (1):
alpha: Send stop IPI to send to online CPUs
Qiang.zhang (1):
USB: usbtmc: Fix RCU stall warning
Rafael J. Wysocki (1):
Revert "ACPICA: Fix memory leak caused by _CID repair function"
Reinhard Speyerer (1):
qmi_wwan: add network device usage statistics for qmimux devices
Shreyansh Chouhan (1):
reiserfs: check directory items on read from disk
Takashi Iwai (1):
ALSA: seq: Fix racy deletion of subscriber
Tetsuo Handa (1):
Bluetooth: defer cleanup of resources in hci_unregister_dev()
Theodore Ts'o (1):
ext4: fix potential htree corruption when growing large_dir directories
Wang Hai (1):
net: natsemi: Fix missing pci_disable_device() in probe and remove
Willy Tarreau (1):
USB: serial: ch341: fix character loss at high transfer rates
Xiangyang Zhang (1):
staging: rtl8723bs: Fix a resource leak in sd_int_dpc
Yu Kuai (1):
reiserfs: add check for root_inode in reiserfs_fill_super
YueHaibing (1):
net: xilinx_emaclite: Do not print real IOMEM pointer
Zheyu Ma (1):
pcmcia: i82092: fix a null pointer dereference bug
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 243 +SUBLEVEL = 244 EXTRAVERSION = NAME = Petit Gorille
arch/alpha/kernel/smp.c +1 -1
@@ -585,7 +585,7 @@ voidsmp_send_stop (void) {cpumask_t to_whom; -cpumask_copy (&to_whom, cpu_possible_mask); +cpumask_copy (&to_whom, cpu_online_mask);cpumask_clear_cpu (smp_processor_id (), &to_whom);#ifdef DEBUG_IPI_MSG if (hard_smp_processor_id () != boot_cpu_id)
arch/arm/boot/dts/omap5-board-common.dtsi +1 -8
@@ -29,14 +29,6 @@ regulator-max-microvolt = <5000000>; }; - vdds_1v8_main: fixedregulator-vdds_1v8_main { - compatible = "regulator-fixed"; - regulator-name = "vdds_1v8_main"; - vin-supply = <&smps7_reg>; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; - }; - vmmcsd_fixed: fixedregulator-mmcsd { compatible = "regulator-fixed"; regulator-name = "vmmcsd_fixed";
@@ -482,6 +474,7 @@ regulator-boot-on; }; + vdds_1v8_main: smps7_reg: smps7 { /* VDDS_1v8_OMAP over VDDS_1v8_MAIN */ regulator-name = "smps7";
arch/mips/Makefile +1 -1
@@ -314,7 +314,7 @@ LDFLAGS += -m $(ld-emul) ifdef CONFIG_MIPS CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ - egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ + egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \ sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') ifdef CONFIG_64BIT CHECKFLAGS += -m64
arch/mips/mti-malta/malta-platform.c +2 -1
@@ -47,7 +47,8 @@ static struct plat_serial8250_port uart8250_data[] = { .mapbase = 0x1f000900, /* The CBUS UART */ .irq = MIPS_CPU_IRQ_BASE + MIPSCPU_INT_MB2, .uartclk = 3686400, /* Twice the usual clk! */ - .iotype = UPIO_MEM32, + .iotype =IS_ENABLED (CONFIG_CPU_BIG_ENDIAN ) ? + UPIO_MEM32BE : UPIO_MEM32, .flags = CBUS_UART_FLAGS, .regshift = 3, },
arch/x86/events/perf_event.h +2 -1
@@ -792,9 +792,10 @@ void x86_pmu_stop(struct perf_event *event, int flags);static inline void x86_pmu_disable_event (struct perf_event *event) { +u64 disable_mask =__this_cpu_read (cpu_hw_events.perf_ctr_virt_mask);struct hw_perf_event *hwc = &event->hw; -wrmsrl (hwc->config_base, hwc->config); +wrmsrl (hwc->config_base, hwc->config & ~disable_mask); }void x86_pmu_enable_event (struct perf_event *event);
drivers/acpi/acpica/nsrepair2.c +0 -7
@@ -409,13 +409,6 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info, (*element_ptr)->common.reference_count = original_ref_count; - -/* -* The original_element holds a reference from the package object -* that represents _HID. Since a new element was created by _HID, -* remove the reference from the _CID package. -*/ -acpi_ut_remove_reference (original_element); } element_ptr++;
drivers/ata/libata-sff.c +27 -8
@@ -657,6 +657,20 @@ unsigned int ata_sff_data_xfer32(struct ata_queued_cmd *qc, unsigned char *buf, }EXPORT_SYMBOL_GPL (ata_sff_data_xfer32); +static void ata_pio_xfer (struct ata_queued_cmd *qc,struct page *page, +unsigned int offset,size_t xfer_size) +{ +bool do_write = (qc->tf.flags &ATA_TFLAG_WRITE ); +unsigned char *buf; + + buf =kmap_atomic (page); + qc->ap->ops->sff_data_xfer (qc, buf + offset, xfer_size, do_write); +kunmap_atomic (buf); + +if (!do_write && !PageSlab (page)) +flush_dcache_page (page); +} +/** * ata_sff_data_xfer_noirq - Transfer data by PIO * @qc: queued command
@@ -698,11 +712,9 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer_noirq);*/ static void ata_pio_sector (struct ata_queued_cmd *qc) { -int do_write = (qc->tf.flags &ATA_TFLAG_WRITE );struct ata_port *ap = qc->ap;struct page *page;unsigned int offset; -unsigned char *buf;if (!qc->cursg) { qc->curbytes = qc->nbytes;
@@ -720,13 +732,20 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)DPRINTK ("data %s\n" , qc->tf.flags &ATA_TFLAG_WRITE ?"write" :"read" ); -/* do the actual data transfer */ - buf =kmap_atomic (page); - ap->ops->sff_data_xfer (qc, buf + offset, qc->sect_size, do_write); -kunmap_atomic (buf); +/* +* Split the transfer when it splits a page boundary. Note that the +* split still has to be dword aligned like all ATA data transfers. +*/ +WARN_ON_ONCE (offset %4 ); +if (offset + qc->sect_size >PAGE_SIZE ) { +unsigned int split_len =PAGE_SIZE - offset; -if (!do_write && !PageSlab (page)) -flush_dcache_page (page); +ata_pio_xfer (qc, page, offset, split_len); +ata_pio_xfer (qc,nth_page (page,1 ),0 , + qc->sect_size - split_len); + }else { +ata_pio_xfer (qc, page, offset, qc->sect_size); + } qc->curbytes += qc->sect_size; qc->cursg_ofs += qc->sect_size;
drivers/clk/clk-stm32f4.c +5 -5
@@ -453,7 +453,7 @@ struct stm32f4_pll {struct stm32f4_pll_post_div_data {int idx; -u8 pll_num; +int pll_idx;const char *name;const char *parent;u8 flag;
@@ -484,13 +484,13 @@ static const struct clk_div_table post_divr_table[] = {#define MAX_POST_DIV 3static const struct stm32f4_pll_post_div_data post_div_data[MAX_POST_DIV ] = { - {CLK_I2SQ_PDIV ,PLL_I2S ,"plli2s-q-div" ,"plli2s-q" , + {CLK_I2SQ_PDIV ,PLL_VCO_I2S ,"plli2s-q-div" ,"plli2s-q" ,CLK_SET_RATE_PARENT ,STM32F4_RCC_DCKCFGR ,0 ,5 ,0 ,NULL }, - {CLK_SAIQ_PDIV ,PLL_SAI ,"pllsai-q-div" ,"pllsai-q" , + {CLK_SAIQ_PDIV ,PLL_VCO_SAI ,"pllsai-q-div" ,"pllsai-q" ,CLK_SET_RATE_PARENT ,STM32F4_RCC_DCKCFGR ,8 ,5 ,0 ,NULL }, - {NO_IDX ,PLL_SAI ,"pllsai-r-div" ,"pllsai-r" ,CLK_SET_RATE_PARENT , + {NO_IDX ,PLL_VCO_SAI ,"pllsai-r-div" ,"pllsai-r" ,CLK_SET_RATE_PARENT ,STM32F4_RCC_DCKCFGR ,16 ,2 ,0 , post_divr_table }, };
@@ -1489,7 +1489,7 @@ static void __init stm32f4_rcc_init(struct device_node *np) post_div->width, post_div->flag_div, post_div->div_table, - clks[post_div->pll_num], + clks[post_div->pll_idx], &stm32f4_clk_lock);if (post_div->idx !=NO_IDX )
drivers/media/usb/dvb-usb-v2/rtl28xxu.c +10 -1
@@ -50,7 +50,16 @@ static int rtl28xxu_ctrl_msg(struct dvb_usb_device *d, struct rtl28xxu_req *req) }else {/* read */ requesttype = (USB_TYPE_VENDOR |USB_DIR_IN ); - pipe =usb_rcvctrlpipe (d->udev,0 ); + +/* +* Zero-length transfers must use usb_sndctrlpipe() and +* rtl28xxu_identify_state() uses a zero-length i2c read +* command to determine the chip type. +*/ +if (req->size) + pipe =usb_rcvctrlpipe (d->udev,0 ); +else + pipe =usb_sndctrlpipe (d->udev,0 ); } ret = usb_control_msg(d->udev, pipe, 0, requesttype, req->value,
drivers/media/v4l2-core/videobuf2-core.c +12 -1
@@ -1371,6 +1371,7 @@ static int vb2_start_streaming(struct vb2_queue *q)int vb2_core_qbuf (struct vb2_queue *q,unsigned int index,void *pb) {struct vb2_buffer *vb; +enum vb2_buffer_state orig_state;int ret;if (q->error) {
@@ -1400,6 +1401,7 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb)* Add to the queued buffers list, a buffer will stay on it until * dequeued in dqbuf. */ + orig_state = vb->state;list_add_tail (&vb->queued_entry, &q->queued_list); q->queued_count++; q->waiting_for_buffers = false;
@@ -1430,8 +1432,17 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb)if (q->streaming && !q->start_streaming_called && q->queued_count >= q->min_buffers_needed) { ret =vb2_start_streaming (q); -if (ret) +if (ret) { +/* +* Since vb2_core_qbuf will return with an error, +* we should return it to state DEQUEUED since +* the error indicates that the buffer wasn't queued. +*/ +list_del (&vb->queued_entry); + q->queued_count--; + vb->state = orig_state;return ret; + } }dprintk (2 ,"qbuf of buffer %d succeeded\n" , vb->index);
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +2 -1
@@ -2667,7 +2667,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) }/* Allocated memory for FW statistics */ -if (bnx2x_alloc_fw_stats_mem (bp)) + rc =bnx2x_alloc_fw_stats_mem (bp); +if (rc)LOAD_ERROR_EXIT (bp, load_error0);/* request pf to initialize status blocks */
drivers/net/ethernet/freescale/fec_main.c +1 -1
@@ -3581,13 +3581,13 @@ fec_drv_remove(struct platform_device *pdev)if (of_phy_is_fixed_link (np))of_phy_deregister_fixed_link (np);of_node_put (fep->phy_node); -free_netdev (ndev);clk_disable_unprepare (fep->clk_ahb);clk_disable_unprepare (fep->clk_ipg);pm_runtime_put_noidle (&pdev->dev);pm_runtime_disable (&pdev->dev); +free_netdev (ndev);return 0 ; }
drivers/net/ethernet/natsemi/natsemi.c +2 -6
@@ -819,7 +819,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent)printk (version);#endif - i =pci_enable_device (pdev); + i =pcim_enable_device (pdev);if (i)return i;/* natsemi has a non-standard PM control register
@@ -852,7 +852,7 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) ioaddr =ioremap (iostart, iosize);if (!ioaddr) { i = -ENOMEM ; - goto err_ioremap; + goto err_pci_request_regions; }/* Work around the dropped serial bit. */
@@ -974,9 +974,6 @@ static int natsemi_probe1(struct pci_dev *pdev, const struct pci_device_id *ent) err_register_netdev:iounmap (ioaddr); - err_ioremap: -pci_release_regions (pdev); - err_pci_request_regions:free_netdev (dev);return i;
@@ -3244,7 +3241,6 @@ static void natsemi_remove1(struct pci_dev *pdev)NATSEMI_REMOVE_FILE (pdev, dspcfg_workaround);unregister_netdev (dev); -pci_release_regions (pdev);iounmap (ioaddr);free_netdev (dev); }
drivers/net/ethernet/neterion/vxge/vxge-main.c +3 -3
@@ -3537,13 +3537,13 @@ static void vxge_device_unregister(struct __vxge_hw_device *hldev)kfree (vdev->vpaths); -/* we are safe to free it now */ -free_netdev (dev); -vxge_debug_init (vdev->level_trace,"%s: ethernet device unregistered" , buf);vxge_debug_entryexit (vdev->level_trace,"%s: %s:%d Exiting..." , buf, __func__, __LINE__); + +/* we are safe to free it now */ +free_netdev (dev); }/*
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +2 -0
@@ -271,6 +271,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev,/* Init to unknowns */ ethtool_link_ksettings_add_link_mode (cmd, supported,FIBRE ); +ethtool_link_ksettings_add_link_mode (cmd, supported, Pause); +ethtool_link_ksettings_add_link_mode (cmd, advertising, Pause); cmd->base.port =PORT_OTHER ; cmd->base.speed =SPEED_UNKNOWN ; cmd->base.duplex =DUPLEX_UNKNOWN ;
drivers/net/ethernet/qlogic/qla3xxx.c +3 -3
@@ -155,7 +155,7 @@ static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev) "driver lock acquired\n");return 1 ; } -ssleep (1 ); +mdelay (1000 ); }while (++i <10 );netdev_err (qdev->ndev,"Timed out waiting for driver lock...\n" );
@@ -3291,7 +3291,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev)if ((value &ISP_CONTROL_SR ) ==0 )break ; -ssleep (1 ); +mdelay (1000 ); }while ((--max_wait_time));/*
@@ -3327,7 +3327,7 @@ static int ql_adapter_reset(struct ql3_adapter *qdev) ispControlStatus);if ((value &ISP_CONTROL_FSR ) ==0 )break ; -ssleep (1 ); +mdelay (1000 ); }while ((--max_wait_time)); }if (max_wait_time ==0 )
drivers/net/ethernet/xilinx/xilinx_emaclite.c +2 -3
@@ -1165,9 +1165,8 @@ static int xemaclite_of_probe(struct platform_device *ofdev) }dev_info (dev, -"Xilinx EmacLite at 0x%08X mapped to 0x%08X, irq=%d\n" , - (unsigned int __force )ndev->mem_start, - (unsigned int __force )lp->base_addr, ndev->irq); +"Xilinx EmacLite at 0x%08X mapped to 0x%p, irq=%d\n" , + (unsigned int __force )ndev->mem_start, lp->base_addr, ndev->irq);return 0 ; error:
drivers/net/ppp/ppp_generic.c +15 -4
@@ -286,7 +286,7 @@ static struct channel *ppp_find_channel(struct ppp_net *pn, int unit);static int ppp_connect_channel (struct channel *pch,int unit);static int ppp_disconnect_channel (struct channel *pch);static void ppp_destroy_channel (struct channel *pch); -static int unit_get (struct idr *p,void *ptr); +static int unit_get (struct idr *p,void *ptr,int min);static int unit_set (struct idr *p,void *ptr,int n);static void unit_put (struct idr *p,int n);static void *unit_find (struct idr *p,int n);
@@ -977,9 +977,20 @@ static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set)mutex_lock (&pn->all_ppp_mutex);if (unit <0 ) { - ret =unit_get (&pn->units_idr, ppp); + ret =unit_get (&pn->units_idr, ppp,0 );if (ret <0 ) goto err; +if (!ifname_is_set) { +while (1 ) { +snprintf (ppp->dev->name,IFNAMSIZ ,"ppp%i" , ret); +if (!__dev_get_by_name (ppp->ppp_net, ppp->dev->name)) +break ; +unit_put (&pn->units_idr, ret); + ret =unit_get (&pn->units_idr, ppp, ret +1 ); +if (ret <0 ) + goto err; + } + } }else {/* Caller asked for a specific unit number. Fail with -EEXIST * if unavailable. For backward compatibility, return -EEXIST
@@ -3266,9 +3277,9 @@ static int unit_set(struct idr *p, void *ptr, int n) }/* get new free unit number and associate pointer with it */ -static int unit_get (struct idr *p,void *ptr) +static int unit_get (struct idr *p,void *ptr,int min) { -return idr_alloc (p, ptr,0 ,0 ,GFP_KERNEL ); +return idr_alloc (p, ptr, min,0 ,GFP_KERNEL ); }/* put unit number back to a pool */
drivers/net/usb/pegasus.c +11 -3
@@ -750,12 +750,16 @@ static inline void disable_net_traffic(pegasus_t *pegasus)set_registers (pegasus, EthCtrl0,sizeof (tmp), &tmp); } -static inline void get_interrupt_interval (pegasus_t *pegasus) +static inline int get_interrupt_interval (pegasus_t *pegasus) {u16 data;u8 interval; +int ret; + + ret =read_eprom_word (pegasus,4 , &data); +if (ret <0 ) +return ret; -read_eprom_word (pegasus,4 , &data); interval = data >>8 ;if (pegasus->usb->speed !=USB_SPEED_HIGH ) {if (interval <0x80 ) {
@@ -770,6 +774,8 @@ static inline void get_interrupt_interval(pegasus_t *pegasus) } } pegasus->intr_interval = interval; + +return 0 ; }static void set_carrier (struct net_device *net)
@@ -1188,7 +1194,9 @@ static int pegasus_probe(struct usb_interface *intf, | NETIF_MSG_PROBE | NETIF_MSG_LINK); pegasus->features = usb_dev_id[dev_index].private; -get_interrupt_interval (pegasus); + res =get_interrupt_interval (pegasus); +if (res) + goto out2;if (reset_mac (pegasus)) {dev_err (&intf->dev,"can't reset MAC\n" ); res = -EIO ;
drivers/net/usb/qmi_wwan.c +71 -5
122 lines not on this page · raw message
drivers/pcmcia/i82092.c +1 -0
@@ -105,6 +105,7 @@ static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *ifor (i =0 ;i<socket_count;i++) { sockets[i].card_state =1 ;/* 1 = present but empty */ sockets[i].io_base =pci_resource_start (dev,0 ); + sockets[i].dev = dev; sockets[i].socket.features |=SS_CAP_PCCARD ; sockets[i].socket.map_size =0x1000 ; sockets[i].socket.irq_mask =0 ;
drivers/scsi/sr.c +1 -1
@@ -217,7 +217,7 @@ static unsigned int sr_get_events(struct scsi_device *sdev)else if (med->media_event_code ==2 )return DISK_EVENT_MEDIA_CHANGE ;else if (med->media_event_code ==3 ) -return DISK_EVENT_EJECT_REQUEST ; +return DISK_EVENT_MEDIA_CHANGE ;return 0 ; }
drivers/spi/spi-meson-spicc.c +2 -0
@@ -599,6 +599,8 @@ static int meson_spicc_remove(struct platform_device *pdev)clk_disable_unprepare (spicc->core); +spi_master_put (spicc->master); +return 0 ; }
drivers/staging/rtl8723bs/hal/sdio_ops.c +2 -0
@@ -1118,6 +1118,8 @@ void sd_int_dpc(struct adapter *padapter) }else {rtw_c2h_wk_cmd (padapter, (u8 *)c2h_evt); } + }else { +kfree (c2h_evt); } }else {/* Error handling for malloc fail */
drivers/tty/serial/8250/8250_port.c +9 -3
@@ -314,7 +314,11 @@ static const struct serial8250_config uart_config[] = {/* Uart divisor latch read */ static int default_serial_dl_read (struct uart_8250_port *up) { -return serial_in (up,UART_DLL ) |serial_in (up,UART_DLM ) <<8 ; +/* Assign these in pieces to truncate any bits above 7. */ +unsigned char dll =serial_in (up,UART_DLL ); +unsigned char dlm =serial_in (up,UART_DLM ); + +return dll | dlm <<8 ; }/* Uart divisor latch write */
@@ -1302,9 +1306,11 @@ static void autoconfig(struct uart_8250_port *up)serial_out (up,UART_LCR ,0 );serial_out (up,UART_FCR ,UART_FCR_ENABLE_FIFO ); - scratch =serial_in (up,UART_IIR ) >>6 ; -switch (scratch) { +/* Assign this as it is to truncate any bits above 7. */ + scratch =serial_in (up,UART_IIR ); + +switch (scratch >>6 ) {case 0 :autoconfig_8250 (up);break ;
drivers/usb/class/usbtmc.c +1 -7
@@ -1343,16 +1343,10 @@ static void usbtmc_interrupt(struct urb *urb)case -EOVERFLOW :dev_err (dev,"overflow with length %d, actual length is %d\n" , data->iin_wMaxPacketSize, urb->actual_length); -case -ECONNRESET : -case -ENOENT : -case -ESHUTDOWN : -case -EILSEQ : -case -ETIME : +default :/* urb terminated, clean up */ dev_dbg (dev,"urb terminated, status: %d\n" , status);return ; -default : -dev_err (dev,"unknown status received: %d\n" , status); } exit: rv =usb_submit_urb (urb,GFP_ATOMIC );
drivers/usb/common/usb-otg-fsm.c +5 -1
@@ -206,7 +206,11 @@ static void otg_start_hnp_polling(struct otg_fsm *fsm)if (!fsm->host_req_flag)return ; -INIT_DELAYED_WORK (&fsm->hnp_polling_work, otg_hnp_polling_work); +if (!fsm->hnp_work_inited) { +INIT_DELAYED_WORK (&fsm->hnp_polling_work, otg_hnp_polling_work); + fsm->hnp_work_inited = true; + } +schedule_delayed_work (&fsm->hnp_polling_work,msecs_to_jiffies (T_HOST_REQ_POLL )); }
drivers/usb/gadget/function/f_hid.c +38 -6
90 lines not on this page · raw message
drivers/usb/host/ehci-pci.c +3 -0
@@ -311,6 +311,9 @@ static int ehci_pci_setup(struct usb_hcd *hcd)if (pdev->vendor ==PCI_VENDOR_ID_STMICRO && pdev->device ==PCI_DEVICE_ID_STMICRO_USB_HOST ) ;/* ConneXT has no sbrn register */ +else if (pdev->vendor ==PCI_VENDOR_ID_HUAWEI + && pdev->device ==0xa239 ) + ;/* HUAWEI Kunpeng920 USB EHCI has no sbrn register */ else pci_read_config_byte (pdev,0x60 , &ehci->sbrn);
drivers/usb/serial/ch341.c +1 -0
@@ -628,6 +628,7 @@ static struct usb_serial_driver ch341_device = { .owner = THIS_MODULE, .name = "ch341-uart", }, + .bulk_in_size = 512, .id_table = id_table, .num_ports = 1, .open = ch341_open,
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -214,6 +214,7 @@ static const struct usb_device_id id_table_combined[] = { { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, { USB_DEVICE(FTDI_VID, FTDI_R2000KU_TRUE_RNG) }, { USB_DEVICE(FTDI_VID, FTDI_VARDAAN_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_AUTO_M3_OP_COM_V2_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0100_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0101_PID) }, { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0102_PID) },
drivers/usb/serial/ftdi_sio_ids.h +3 -0
@@ -159,6 +159,9 @@/* Vardaan Enterprises Serial Interface VEUSB422R3 */ #define FTDI_VARDAAN_PID 0xF070 +/* Auto-M3 Ltd. - OP-COM USB V2 - OBD interface Adapter */ +#define FTDI_AUTO_M3_OP_COM_V2_PID 0x4f50 +/* * Xsens Technologies BV products (http://www.xsens.com). */
drivers/usb/serial/option.c +2 -0
@@ -1206,6 +1206,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff), /* Telit FN980 (PCIe) */ .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ + .driver_info = NCTRL(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
fs/ext4/namei.c +1 -1
@@ -2295,7 +2295,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname, goto journal_error; err =ext4_handle_dirty_dx_node (handle, dir, frame->bh); -if (err) +if (restart || err) goto journal_error; }else {struct dx_root *dxroot;
fs/namespace.c +28 -14
67 lines not on this page · raw message
fs/pipe.c +17 -2
@@ -29,6 +29,21 @@#include "internal.h" +/* +* New pipe buffers will be restricted to this size while the user is exceeding +* their pipe buffer quota. The general pipe use case needs at least two +* buffers: one for data yet to be read, and one for new data. If this is less +* than two, then a write to a non-empty pipe may block even if the pipe is not +* full. This can occur with GNU make jobserver or similar uses of pipes as +* semaphores: multiple processes may be waiting to write tokens back to the +* pipe before reading tokens: https://lore.kernel.org/lkml/1628086770.5rn8p04n6j.none@localhost/. +* +* Users can reduce their pipe buffers with F_SETPIPE_SZ below this at their +* own risk, namely: pipe writes to non-full pipes may block until the pipe is +* emptied. +*/ +#define PIPE_MIN_DEF_BUFFERS 2 +/* * The max size that a non-root user is allowed to grow the pipe. Can * be set by root in /proc/sys/fs/pipe-max-size
@@ -654,8 +669,8 @@ struct pipe_inode_info *alloc_pipe_info(void) user_bufs =account_pipe_buffers (user,0 , pipe_bufs);if (too_many_pipe_buffers_soft (user_bufs) &&is_unprivileged_user ()) { - user_bufs =account_pipe_buffers (user, pipe_bufs,1 ); - pipe_bufs =1 ; + user_bufs =account_pipe_buffers (user, pipe_bufs,PIPE_MIN_DEF_BUFFERS ); + pipe_bufs =PIPE_MIN_DEF_BUFFERS ; }if (too_many_pipe_buffers_hard (user_bufs) &&is_unprivileged_user ())
fs/reiserfs/stree.c +26 -5
@@ -387,6 +387,24 @@ void pathrelse(struct treepath *search_path) search_path->path_length =ILLEGAL_PATH_ELEMENT_OFFSET ; } +static int has_valid_deh_location (struct buffer_head *bh,struct item_head *ih) +{ +struct reiserfs_de_head *deh; +int i; + + deh =B_I_DEH (bh, ih); +for (i =0 ; i <ih_entry_count (ih); i++) { +if (deh_location (&deh[i]) >ih_item_len (ih)) { +reiserfs_warning (NULL ,"reiserfs-5094" , +"directory entry location seems wrong %h" , + &deh[i]); +return 0 ; + } + } + +return 1 ; +} +static int is_leaf (char *buf,int blocksize,struct buffer_head *bh) {struct block_head *blkh;
@@ -454,11 +472,14 @@ static int is_leaf(char *buf, int blocksize, struct buffer_head *bh) "(second one): %h", ih);return 0 ; } -if (is_direntry_le_ih (ih) && (ih_item_len (ih) < (ih_entry_count (ih) *IH_SIZE ))) { -reiserfs_warning (NULL ,"reiserfs-5093" , -"item entry count seems wrong %h" , - ih); -return 0 ; +if (is_direntry_le_ih (ih)) { +if (ih_item_len (ih) < (ih_entry_count (ih) *IH_SIZE )) { +reiserfs_warning (NULL ,"reiserfs-5093" , +"item entry count seems wrong %h" , + ih); +return 0 ; + } +return has_valid_deh_location (bh, ih); } prev_location =ih_location (ih); }
fs/reiserfs/super.c +8 -0
@@ -2085,6 +2085,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)unlock_new_inode (root_inode); } +if (!S_ISDIR (root_inode->i_mode) || !inode_get_bytes (root_inode) || + !root_inode->i_size) { +SWARN (silent, s,"" ,"corrupt root inode, run fsck" ); +iput (root_inode); + errval = -EUCLEAN ; + goto error; + } + s->s_root =d_make_root (root_inode);if (!s->s_root) goto error;
include/linux/usb/otg-fsm.h +1 -0
@@ -195,6 +195,7 @@ struct otg_fsm {struct mutex lock;u8 *host_req_flag;struct delayed_work hnp_polling_work; +bool hnp_work_inited;bool state_changed; };
include/net/bluetooth/hci_core.h +1 -0
@@ -1030,6 +1030,7 @@ struct hci_dev *hci_alloc_dev(void);void hci_free_dev (struct hci_dev *hdev);int hci_register_dev (struct hci_dev *hdev);void hci_unregister_dev (struct hci_dev *hdev); +void hci_cleanup_dev (struct hci_dev *hdev);int hci_suspend_dev (struct hci_dev *hdev);int hci_resume_dev (struct hci_dev *hdev);int hci_reset_dev (struct hci_dev *hdev);
net/bluetooth/hci_core.c +8 -8
@@ -3181,14 +3181,10 @@ EXPORT_SYMBOL(hci_register_dev);/* Unregister HCI device */ void hci_unregister_dev (struct hci_dev *hdev) { -int id; -BT_DBG ("%p name %s bus %d" , hdev, hdev->name, hdev->bus);hci_dev_set_flag (hdev,HCI_UNREGISTER ); - id = hdev->id; -write_lock (&hci_dev_list_lock);list_del (&hdev->list);write_unlock (&hci_dev_list_lock);
@@ -3217,7 +3213,14 @@ void hci_unregister_dev(struct hci_dev *hdev) }device_del (&hdev->dev); +/* Actual cleanup is deferred until hci_cleanup_dev(). */ +hci_dev_put (hdev); +} +EXPORT_SYMBOL (hci_unregister_dev); +/* Cleanup HCI device */ +void hci_cleanup_dev (struct hci_dev *hdev) +{debugfs_remove_recursive (hdev->debugfs);kfree_const (hdev->hw_info);kfree_const (hdev->fw_info);
@@ -3239,11 +3242,8 @@ void hci_unregister_dev(struct hci_dev *hdev)hci_discovery_filter_clear (hdev);hci_dev_unlock (hdev); -hci_dev_put (hdev); - -ida_simple_remove (&hci_index_ida, id); +ida_simple_remove (&hci_index_ida, hdev->id); } -EXPORT_SYMBOL (hci_unregister_dev);/* Suspend HCI device */ int hci_suspend_dev (struct hci_dev *hdev)
net/bluetooth/hci_sock.c +33 -16
92 lines not on this page · raw message
net/bluetooth/hci_sysfs.c +3 -0
@@ -83,6 +83,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn)static void bt_host_release (struct device *dev) {struct hci_dev *hdev =to_hci_dev (dev); + +if (hci_dev_test_flag (hdev,HCI_UNREGISTER )) +hci_cleanup_dev (hdev);kfree (hdev);module_put (THIS_MODULE ); }
scripts/tracing/draw_functrace.py +3 -3
@@ -17,7 +17,7 @@ Usage: $ cat /sys/kernel/debug/tracing/trace_pipe > ~/raw_trace_func Wait some times but not too much, the script is a bit slow. Break the pipe (Ctrl + Z) - $ scripts/draw_functrace.py < raw_trace_func > draw_functrace + $ scripts/tracing/draw_functrace.py < ~/raw_trace_func > draw_functrace Then you have your drawn trace in draw_functrace """
@@ -103,10 +103,10 @@ def parseLine(line): line = line.strip() if line.startswith("#"): raise CommentLineException - m = re.match("[^]]+?\\] +([0-9.]+): (\\w+) <-(\\w+)", line) + m = re.match("[^]]+?\\] +([a-z.]+) +([0-9.]+): (\\w+) <-(\\w+)", line) if m is None: raise BrokenLineException - return (m.group(1), m.group(2), m.group(3)) + return (m.group(2), m.group(3), m.group(4)) def main():
sound/core/seq/seq_ports.c +27 -12
@@ -532,10 +532,11 @@ static int check_and_subscribe_port(struct snd_seq_client *client,return err; } -static void delete_and_unsubscribe_port (struct snd_seq_client *client, -struct snd_seq_client_port *port, -struct snd_seq_subscribers *subs, -bool is_src,bool ack) +/* called with grp->list_mutex held */ +static void __delete_and_unsubscribe_port (struct snd_seq_client *client, +struct snd_seq_client_port *port, +struct snd_seq_subscribers *subs, +bool is_src,bool ack) {struct snd_seq_port_subs_info *grp;struct list_head *list;
@@ -543,7 +544,6 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client, grp = is_src ? &port->c_src : &port->c_dest; list = is_src ? &subs->src_list : &subs->dest_list; -down_write (&grp->list_mutex);write_lock_irq (&grp->list_lock); empty =list_empty (list);if (!empty)
@@ -553,6 +553,18 @@ static void delete_and_unsubscribe_port(struct snd_seq_client *client,if (!empty)unsubscribe_port (client, port, grp, &subs->info, ack); +} + +static void delete_and_unsubscribe_port (struct snd_seq_client *client, +struct snd_seq_client_port *port, +struct snd_seq_subscribers *subs, +bool is_src,bool ack) +{ +struct snd_seq_port_subs_info *grp; + + grp = is_src ? &port->c_src : &port->c_dest; +down_write (&grp->list_mutex); +__delete_and_unsubscribe_port (client, port, subs, is_src, ack);up_write (&grp->list_mutex); }
@@ -608,27 +620,30 @@ int snd_seq_port_disconnect(struct snd_seq_client *connector,struct snd_seq_client_port *dest_port, struct snd_seq_port_subscribe *info) { - struct snd_seq_port_subs_info *src = &src_port->c_src; + struct snd_seq_port_subs_info *dest = &dest_port->c_dest;struct snd_seq_subscribers *subs;int err = -ENOENT ; -down_write (&src->list_mutex); +/* always start from deleting the dest port for avoiding concurrent +* deletions +*/ +down_write (&dest->list_mutex);/* look for the connection */ -list_for_each_entry (subs, &src->list_head, src_list) { +list_for_each_entry (subs, &dest->list_head, dest_list) {if (match_subs_info (info, &subs->info)) { -atomic_dec (&subs->ref_count);/* mark as not ready */ +__delete_and_unsubscribe_port (dest_client, dest_port, + subs, false, + connector->number != dest_client->number); err =0 ;break ; } } -up_write (&src->list_mutex); +up_write (&dest->list_mutex);if (err <0 )return err;delete_and_unsubscribe_port (src_client, src_port, subs, true, connector->number != src_client->number); -delete_and_unsubscribe_port (dest_client, dest_port, subs, false, - connector->number != dest_client->number);kfree (subs);return 0 ; }