Linux 4.9.247
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.247 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/include/asm/pgtable.h | 7 - arch/x86/events/intel/cstate.c | 6 - arch/x86/events/intel/rapl.c | 14 -- arch/x86/events/intel/uncore.c | 4 arch/x86/events/intel/uncore.h | 12 +- arch/x86/kernel/cpu/bugs.c | 4 arch/x86/xen/spinlock.c | 12 ++ drivers/dma/pl330.c | 2 drivers/dma/xilinx/xilinx_dma.c | 4 drivers/hid/hid-cypress.c | 44 ++++++++- drivers/hid/hid-ids.h | 2 drivers/hid/hid-sensor-hub.c | 3 drivers/infiniband/hw/mthca/mthca_cq.c | 10 +- drivers/input/serio/i8042.c | 12 ++ drivers/net/can/usb/gs_usb.c | 131 ++++++++++++++------------- drivers/net/ethernet/amazon/ena/ena_netdev.c | 17 +-- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 drivers/net/ethernet/ibm/ibmvnic.c | 3 drivers/nfc/s3fwrn5/i2c.c | 4 drivers/pci/bus.c | 6 - drivers/phy/tegra/xusb.c | 1 drivers/platform/x86/toshiba_acpi.c | 3 drivers/regulator/core.c | 9 + drivers/scsi/libiscsi.c | 23 +++- drivers/scsi/ufs/ufshcd.c | 6 - drivers/target/iscsi/iscsi_target.c | 17 ++- drivers/usb/core/config.c | 11 ++ drivers/usb/core/devio.c | 14 +- drivers/usb/core/quirks.c | 38 +++++++ drivers/usb/core/usb.h | 3 drivers/usb/gadget/function/f_midi.c | 10 +- drivers/usb/gadget/legacy/inode.c | 3 drivers/video/fbdev/hyperv_fb.c | 7 + fs/btrfs/inode.c | 41 ++++++-- fs/btrfs/qgroup.c | 2 fs/btrfs/tests/inode-tests.c | 1 fs/btrfs/volumes.c | 7 + fs/efivarfs/inode.c | 2 fs/efivarfs/super.c | 1 fs/proc/self.c | 7 + include/linux/usb/quirks.h | 3 include/scsi/libiscsi.h | 3 mm/huge_memory.c | 8 - net/batman-adv/log.c | 1 sound/pci/hda/patch_hdmi.c | 85 +++++++++-------- tools/perf/util/dwarf-aux.c | 8 + tools/perf/util/event.c | 7 - 48 files changed, 411 insertions(+), 212 deletions(-)
Alan Stern (2):
USB: core: Change %pK for __user pointers to %px
USB: core: Fix regression in Hercules audio card
Anand K Mistry (1):
x86/speculation: Fix prctl() when spectre_v2_user={seccomp,prctl},ibpb
Ard Biesheuvel (1):
efivarfs: revert "fix memory leak in efivarfs_create()"
Brian Masney (1):
x86/xen: don't unbind uninitialized lock_kicker_irq
Dexuan Cui (1):
video: hyperv_fb: Fix the cache type when mapping the VRAM
Filipe Manana (1):
btrfs: fix lockdep splat when reading qgroup config on mount
Frank Yang (1):
HID: cypress: Support Varmilo Keyboards' media hotkeys
Gerald Schaefer (1):
mm/userfaultfd: do not access vma->vm_mm after calling handle_userfault()
Greg Kroah-Hartman (1):
Linux 4.9.247
Hans de Goede (1):
Input: i8042 - allow insmod to succeed on devices without an i8042 controller
Igor Lubashev (1):
perf event: Check ref_reloc_sym before using it
Jens Axboe (1):
proc: don't allow async path resolution of /proc/self components
Johan Hovold (1):
USB: core: add endpoint-blacklist quirk
Kai Vehmanen (1):
ALSA: hda/hdmi: fix incorrect locking in hdmi_pcm_close
Kaixu Xia (1):
platform/x86: toshiba_acpi: Fix the wrong variable assignment
Krzysztof Kozlowski (1):
nfc: s3fwrn5: use signed integer for parsing GPIO numbers
Lee Duncan (1):
scsi: libiscsi: Fix NOP race condition
Lijun Pan (1):
ibmvnic: fix NULL pointer dereference in ibmvic_reset_crq
Marc Ferland (1):
dmaengine: xilinx_dma: use readl_poll_timeout_atomic variant
Marc Kleine-Budde (1):
can: gs_usb: fix endianess problem with candleLight firmware
Marc Zyngier (1):
phy: tegra: xusb: Fix dangling pointer on probe failure
Masami Hiramatsu (1):
perf probe: Fix to die_entrypc() returns error correctly
Michael Chan (1):
bnxt_en: Release PCI regions when DMA mask setup fails during probe.
Michał Mirosław (2):
regulator: avoid resolve_supply() infinite recursion
regulator: workaround self-referent regulators
Mike Christie (1):
scsi: target: iscsi: Fix cmd abort fabric stop race
Pablo Ceballos (1):
HID: hid-sensor-hub: Fix issue with devices with no report ID
Qu Wenruo (2):
btrfs: tree-checker: Enhance chunk checker to validate chunk profile
btrfs: inode: Verify inode mode to avoid NULL pointer dereference
Rajat Jain (1):
PCI: Add device even if driver attach failed
Sami Tolvanen (1):
perf/x86: fix sysfs type mismatches
Shay Agroskin (1):
net: ena: set initial DMA width to avoid intel iommu issue
Stanley Chu (1):
scsi: ufs: Fix race between shutdown and runtime resume flow
Sugar Zhang (1):
dmaengine: pl330: _prep_dma_memcpy: Fix wrong burst size
Taehee Yoo (1):
batman-adv: set .owner to THIS_MODULE
Takashi Iwai (1):
ALSA: hda/hdmi: Use single mutex unlock in error paths
Will Deacon (1):
arm64: pgtable: Fix pte_accessible()
Xiongfeng Wang (1):
IB/mthca: fix return value of error branch in mthca_init_cq()
Zhang Changzhong (1):
bnxt_en: fix error return code in bnxt_init_board()
Zhang Qilong (2):
usb: gadget: f_midi: Fix memleak in f_midi_alloc
usb: gadget: Fix memleak in gadgetfs_fill_super
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 246 +SUBLEVEL = 247 EXTRAVERSION = NAME = Roaring Lionus
arch/arm64/include/asm/pgtable.h +4 -3
@@ -85,8 +85,6 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];#define pte_valid (pte) (!!(pte_val(pte) & PTE_VALID))#define pte_valid_not_user (pte) \ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID) -#define pte_valid_young (pte) \ - ((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))#define pte_valid_user (pte) \ ((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
@@ -94,9 +92,12 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];* Could the pte be present in the TLB? We must check mm_tlb_flush_pending * so that we don't erroneously return false for pages that have been * remapped as PROT_NONE but are yet to be flushed from the TLB. +* Note that we can't make any assumptions based on the state of the access +* flag, since ptep_clear_flush_young() elides a DSB when invalidating the +* TLB. */ #define pte_accessible (mm, pte) \ - (mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid_young(pte)) + (mm_tlb_flush_pending(mm) ? pte_present(pte) : pte_valid(pte))/* * p??_access_permitted() is true for valid user mappings (subject to the
arch/x86/events/intel/cstate.c +3 -3
@@ -98,14 +98,14 @@MODULE_LICENSE ("GPL" );#define DEFINE_CSTATE_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __cstate_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ +static ssize_t __cstate_##_var##_show(struct device *dev, \ + struct device_attribute *attr, \ char *page) \ { \ BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ return sprintf(page, _format "\n"); \ } \ -static struct kobj_attribute format_attr_##_var = \ +static struct device_attribute format_attr_##_var = \ __ATTR(_name, 0444, __cstate_##_var##_show, NULL) static ssize_t cstate_get_attr_cpumask(struct device *dev,
arch/x86/events/intel/rapl.c +1 -13
@@ -115,18 +115,6 @@ static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {* any other bit is reserved */ #define RAPL_EVENT_MASK 0xFFULL - -#define DEFINE_RAPL_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __rapl_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ - char *page) \ -{ \ - BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ - return sprintf(page, _format "\n"); \ -} \ -static struct kobj_attribute format_attr_##_var = \ - __ATTR(_name, 0444, __rapl_##_var##_show, NULL) -#define RAPL_CNTR_WIDTH 32#define RAPL_EVENT_ATTR_STR (_name, v, str) \
@@ -548,7 +536,7 @@ static struct attribute_group rapl_pmu_events_group = { .attrs = NULL, /* patched at runtime */ }; -DEFINE_RAPL_FORMAT_ATTR (event, event,"config:0-7" ); +PMU_FORMAT_ATTR (event,"config:0-7" );static struct attribute *rapl_formats_attr[] = { &format_attr_event.attr,NULL ,
arch/x86/events/intel/uncore.c +2 -2
@@ -90,8 +90,8 @@ struct pci2phy_map *__find_pci2phy_map(int segment)return map; } -ssize_t uncore_event_show (struct kobject *kobj, -struct kobj_attribute *attr,char *buf) +ssize_t uncore_event_show (struct device *dev, +struct device_attribute *attr,char *buf) {struct uncore_event_desc *event = container_of(attr, struct uncore_event_desc, attr);
arch/x86/events/intel/uncore.h +6 -6
@@ -124,7 +124,7 @@ struct intel_uncore_box {#define UNCORE_BOX_FLAG_CTL_OFFS8 1/* event config registers are 8-byte apart */ struct uncore_event_desc { -struct kobj_attribute attr; +struct device_attribute attr;const char *config; };
@@ -136,8 +136,8 @@ struct pci2phy_map {struct pci2phy_map *__find_pci2phy_map (int segment); -ssize_t uncore_event_show (struct kobject *kobj, -struct kobj_attribute *attr,char *buf); +ssize_t uncore_event_show (struct device *dev, +struct device_attribute *attr,char *buf);#define INTEL_UNCORE_EVENT_DESC (_name, _config) \ { \
@@ -146,14 +146,14 @@ ssize_t uncore_event_show(struct kobject *kobj, }#define DEFINE_UNCORE_FORMAT_ATTR (_var, _name, _format) \ -static ssize_t __uncore_##_var##_show(struct kobject *kobj, \ - struct kobj_attribute *attr, \ +static ssize_t __uncore_##_var##_show(struct device *dev, \ + struct device_attribute *attr, \ char *page) \ { \ BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \ return sprintf(page, _format "\n"); \ } \ -static struct kobj_attribute format_attr_##_var = \ +static struct device_attribute format_attr_##_var = \ __ATTR(_name, 0444, __uncore_##_var##_show, NULL)static inline unsigned uncore_pci_box_ctl (struct intel_uncore_box *box)
arch/x86/kernel/cpu/bugs.c +2 -2
@@ -732,11 +732,13 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)if (boot_cpu_has (X86_FEATURE_IBPB )) {setup_force_cpu_cap (X86_FEATURE_USE_IBPB ); + spectre_v2_user_ibpb = mode;switch (cmd) {case SPECTRE_V2_USER_CMD_FORCE :case SPECTRE_V2_USER_CMD_PRCTL_IBPB :case SPECTRE_V2_USER_CMD_SECCOMP_IBPB :static_branch_enable (&switch_mm_always_ibpb); + spectre_v2_user_ibpb =SPECTRE_V2_USER_STRICT ;break ;case SPECTRE_V2_USER_CMD_PRCTL :case SPECTRE_V2_USER_CMD_AUTO :
@@ -750,8 +752,6 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)pr_info ("mitigation: Enabling %s Indirect Branch Prediction Barrier\n" ,static_key_enabled (&switch_mm_always_ibpb) ?"always-on" :"conditional" ); - - spectre_v2_user_ibpb = mode; }/*
arch/x86/xen/spinlock.c +11 -1
@@ -98,10 +98,20 @@ void xen_init_lock_cpu(int cpu)void xen_uninit_lock_cpu (int cpu) { +int irq; +if (!xen_pvspin)return ; -unbind_from_irqhandler (per_cpu (lock_kicker_irq, cpu),NULL ); +/* +* When booting the kernel with 'mitigations=auto,nosmt', the secondary +* CPUs are not activated, and lock_kicker_irq is not initialized. +*/ + irq =per_cpu (lock_kicker_irq, cpu); +if (irq ==-1 ) +return ; + +unbind_from_irqhandler (irq,NULL );per_cpu (lock_kicker_irq, cpu) =-1 ;kfree (per_cpu (irq_name, cpu));per_cpu (irq_name, cpu) =NULL ;
drivers/dma/pl330.c +1 -1
@@ -2682,7 +2682,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,* If burst size is smaller than bus width then make sure we only * transfer one at a time to avoid a burst stradling an MFIFO entry. */ -if (desc->rqcfg.brst_size *8 < pl330->pcfg.data_bus_width) +if (burst *8 < pl330->pcfg.data_bus_width) desc->rqcfg.brst_len =1 ; desc->bytes_requested = len;
drivers/dma/xilinx/xilinx_dma.c +2 -2
@@ -420,8 +420,8 @@ struct xilinx_dma_device {#define to_dma_tx_descriptor (tx) \ container_of(tx, struct xilinx_dma_tx_descriptor, async_tx)#define xilinx_dma_poll_timeout (chan, reg, val, cond, delay_us, timeout_us) \ - readl_poll_timeout(chan->xdev->regs + chan->ctrl_offset + reg, val, \ - cond, delay_us, timeout_us) + readl_poll_timeout_atomic(chan->xdev->regs + chan->ctrl_offset + reg, \ + val, cond, delay_us, timeout_us)/* IO accessors */ static inline u32 dma_read (struct xilinx_dma_chan *chan,u32 reg)
drivers/hid/hid-cypress.c +39 -5
70 lines not on this page · raw message
drivers/hid/hid-ids.h +2 -0
@@ -307,6 +307,8 @@#define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81#define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 +#define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1 0X07b1 +#define USB_VENDOR_ID_DATA_MODUL 0x7374#define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201
drivers/hid/hid-sensor-hub.c +2 -1
@@ -489,7 +489,8 @@ static int sensor_hub_raw_event(struct hid_device *hdev,return 1 ; ptr = raw_data; - ptr++;/* Skip report id */ +if (report->id) + ptr++;/* Skip report id */ spin_lock_irqsave (&pdata->lock, flags);
drivers/infiniband/hw/mthca/mthca_cq.c +6 -4
@@ -808,8 +808,10 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, } mailbox =mthca_alloc_mailbox (dev,GFP_KERNEL ); -if (IS_ERR (mailbox)) +if (IS_ERR (mailbox)) { + err =PTR_ERR (mailbox); goto err_out_arm; + } cq_context = mailbox->buf;
@@ -851,9 +853,9 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, }spin_lock_irq (&dev->cq_table.lock); -if (mthca_array_set (&dev->cq_table.cq, - cq->cqn & (dev->limits.num_cqs -1 ), - cq)) { + err =mthca_array_set (&dev->cq_table.cq, + cq->cqn & (dev->limits.num_cqs -1 ), cq); +if (err) {spin_unlock_irq (&dev->cq_table.lock); goto err_out_free_mr; }
drivers/input/serio/i8042.c +11 -1
@@ -125,6 +125,7 @@ module_param_named(unmask_kbd_data, i8042_unmask_kbd_data, bool, 0600);MODULE_PARM_DESC (unmask_kbd_data,"Unconditional enable (may reveal sensitive data) of normally sanitize-filtered kbd data traffic debug log [pre-condition: i8042.debug=1 enabled]" );#endif +static bool i8042_present;static bool i8042_bypass_aux_irq_test;static char i8042_kbd_firmware_id[128 ];static char i8042_aux_firmware_id[128 ];
@@ -343,6 +344,9 @@ int i8042_command(unsigned char *param, int command)unsigned long flags;int retval; +if (!i8042_present) +return -1 ; +spin_lock_irqsave (&i8042_lock, flags); retval =__i8042_command (param, command);spin_unlock_irqrestore (&i8042_lock, flags);
@@ -1597,12 +1601,15 @@ static int __init i8042_init(void) err =i8042_platform_init ();if (err) -return err; +return (err == -ENODEV ) ?0 : err; err =i8042_controller_check ();if (err) goto err_platform_exit; +/* Set this before creating the dev to allow i8042_command to work right away */ + i8042_present = true; + pdev =platform_create_bundle (&i8042_driver, i8042_probe,NULL ,0 ,NULL ,0 );if (IS_ERR (pdev)) { err =PTR_ERR (pdev);
@@ -1621,6 +1628,9 @@ static int __init i8042_init(void) static void __exit i8042_exit(void) { +if (!i8042_present) +return ; +platform_device_unregister (i8042_platform_device);platform_driver_unregister (&i8042_driver);i8042_platform_exit ();
drivers/net/can/usb/gs_usb.c +70 -61
265 lines not on this page · raw message
drivers/net/ethernet/amazon/ena/ena_netdev.c +8 -9
@@ -2345,16 +2345,9 @@ static int ena_device_init(struct ena_com_dev *ena_dev, struct pci_dev *pdev, goto err_mmio_read_less; } - rc =pci_set_dma_mask (pdev,DMA_BIT_MASK (dma_width)); + rc =dma_set_mask_and_coherent (dev,DMA_BIT_MASK (dma_width));if (rc) { -dev_err (dev,"pci_set_dma_mask failed 0x%x\n" , rc); - goto err_mmio_read_less; - } - - rc =pci_set_consistent_dma_mask (pdev,DMA_BIT_MASK (dma_width)); -if (rc) { -dev_err (dev,"err_pci_set_consistent_dma_mask failed 0x%x\n" , - rc); +dev_err (dev,"dma_set_mask_and_coherent failed %d\n" , rc); goto err_mmio_read_less; }
@@ -2894,6 +2887,12 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)return rc; } + rc =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (ENA_MAX_PHYS_ADDR_SIZE_BITS )); +if (rc) { +dev_err (&pdev->dev,"dma_set_mask_and_coherent failed %d\n" , rc); + goto err_disable_device; + } +pci_set_master (pdev); ena_dev =vzalloc (sizeof (*ena_dev));
drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 -1
@@ -6319,7 +6319,8 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)if (dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (64 )) !=0 &&dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (32 )) !=0 ) {dev_err (&pdev->dev,"System does not support DMA, aborting\n" ); - goto init_err_disable; + rc = -EIO ; + goto init_err_release; }pci_set_master (pdev);
drivers/net/ethernet/ibm/ibmvnic.c +3 -0
@@ -3525,6 +3525,9 @@ static int ibmvnic_reset_crq(struct ibmvnic_adapter *adapter) }while (rc ==H_BUSY ||H_IS_LONG_BUSY (rc));/* Clean out the queue */ +if (!crq->msgs) +return -EINVAL ; +memset (crq->msgs,0 ,PAGE_SIZE ); crq->cur =0 ;
drivers/nfc/s3fwrn5/i2c.c +2 -2
@@ -37,8 +37,8 @@ struct s3fwrn5_i2c_phy {struct i2c_client *i2c_dev;struct nci_dev *ndev; -unsigned int gpio_en; -unsigned int gpio_fw_wake; +int gpio_en; +int gpio_fw_wake;struct mutex mutex;
drivers/pci/bus.c +1 -5
@@ -324,12 +324,8 @@ void pci_bus_add_device(struct pci_dev *dev) dev->match_driver = true; retval =device_attach (&dev->dev); -if (retval <0 && retval != -EPROBE_DEFER ) { +if (retval <0 && retval != -EPROBE_DEFER )dev_warn (&dev->dev,"device attach failed (%d)\n" , retval); -pci_proc_detach_device (dev); -pci_remove_sysfs_dev_files (dev); -return ; - } dev->is_added =1 ; }
drivers/phy/tegra/xusb.c +1 -0
@@ -916,6 +916,7 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev) reset:reset_control_assert (padctl->rst); remove: +platform_set_drvdata (pdev,NULL ); soc->ops->remove (padctl);return err; }
drivers/platform/x86/toshiba_acpi.c +1 -2
@@ -1497,7 +1497,7 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,struct toshiba_acpi_dev *dev =PDE_DATA (file_inode (file));char *buffer;char *cmd; -int lcd_out, crt_out, tv_out; +int lcd_out =-1 , crt_out =-1 , tv_out =-1 ;int remain = count;int value;int ret;
@@ -1534,7 +1534,6 @@ static ssize_t video_proc_write(struct file *file, const char __user *buf,kfree (cmd); - lcd_out = crt_out = tv_out =-1 ; ret =get_video_status (dev, &video_out);if (!ret) {unsigned int new_video_out = video_out;
drivers/regulator/core.c +9 -0
@@ -1550,6 +1550,15 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) } } +if (r == rdev) { +dev_err (dev,"Supply for %s (%s) resolved to itself\n" , + rdev->desc->name, rdev->supply_name); +if (!have_full_constraints ()) +return -EINVAL ; + r = dummy_regulator_rdev; +get_device (&r->dev); + } +/* Recursively resolve the supply of the supply */ ret =regulator_resolve_supply (r);if (ret <0 ) {
drivers/scsi/libiscsi.c +15 -8
@@ -570,8 +570,8 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)if (conn->task == task) conn->task =NULL ; -if (conn->ping_task == task) - conn->ping_task =NULL ; +if (READ_ONCE (conn->ping_task) == task) +WRITE_ONCE (conn->ping_task,NULL );/* release get from queueing */ __iscsi_put_task (task);
@@ -780,6 +780,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, task->conn->session->age); } +if (unlikely (READ_ONCE (conn->ping_task) ==INVALID_SCSI_TASK )) +WRITE_ONCE (conn->ping_task, task); +if (!ihost->workq) {if (iscsi_prep_mgmt_task (conn, task)) goto free_task;
@@ -987,8 +990,11 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)struct iscsi_nopout hdr;struct iscsi_task *task; -if (!rhdr && conn->ping_task) -return -EINVAL ; +if (!rhdr) { +if (READ_ONCE (conn->ping_task)) +return -EINVAL ; +WRITE_ONCE (conn->ping_task,INVALID_SCSI_TASK ); + }memset (&hdr,0 ,sizeof (struct iscsi_nopout )); hdr.opcode =ISCSI_OP_NOOP_OUT |ISCSI_OP_IMMEDIATE ;
@@ -1003,11 +1009,12 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr) task =__iscsi_conn_send_pdu (conn, (struct iscsi_hdr *)&hdr,NULL ,0 );if (!task) { +if (!rhdr) +WRITE_ONCE (conn->ping_task,NULL );iscsi_conn_printk (KERN_ERR , conn,"Could not send nopout\n" );return -EIO ; }else if (!rhdr) {/* only track our nops */ - conn->ping_task = task; conn->last_ping = jiffies; }
@@ -1020,7 +1027,7 @@ static int iscsi_nop_out_rsp(struct iscsi_task *task,struct iscsi_conn *conn = task->conn;int rc =0 ; -if (conn->ping_task != task) { +if (READ_ONCE (conn->ping_task) != task) {/* * If this is not in response to one of our * nops then it must be from userspace.
@@ -1960,7 +1967,7 @@ static void iscsi_start_tx(struct iscsi_conn *conn)*/ static int iscsi_has_ping_timed_out (struct iscsi_conn *conn) { -if (conn->ping_task && +if (READ_ONCE (conn->ping_task) &&time_before_eq (conn->last_recv + (conn->recv_timeout *HZ ) + (conn->ping_timeout *HZ ), jiffies))return 1 ;
@@ -2095,7 +2102,7 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)* Checking the transport already or nop from a cmd timeout still * running */ -if (conn->ping_task) { +if (READ_ONCE (conn->ping_task)) { task->have_checked_conn = true; rc =BLK_EH_RESET_TIMER ; goto done;
drivers/scsi/ufs/ufshcd.c +1 -5
@@ -6521,11 +6521,7 @@ int ufshcd_shutdown(struct ufs_hba *hba)if (ufshcd_is_ufs_dev_poweroff (hba) &&ufshcd_is_link_off (hba)) goto out; -if (pm_runtime_suspended (hba->dev)) { - ret =ufshcd_runtime_resume (hba); -if (ret) - goto out; - } +pm_runtime_get_sync (hba->dev); ret =ufshcd_suspend (hba,UFS_SHUTDOWN_PM ); out:
drivers/target/iscsi/iscsi_target.c +13 -4
@@ -493,8 +493,7 @@ void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)bool scsi_cmd = (cmd->iscsi_opcode ==ISCSI_OP_SCSI_CMD );spin_lock_bh (&conn->cmd_lock); -if (!list_empty (&cmd->i_conn_node) && - !(cmd->se_cmd.transport_state &CMD_T_FABRIC_STOP )) +if (!list_empty (&cmd->i_conn_node))list_del_init (&cmd->i_conn_node);spin_unlock_bh (&conn->cmd_lock);
@@ -4093,12 +4092,22 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)spin_lock_bh (&conn->cmd_lock);list_splice_init (&conn->conn_cmd_list, &tmp_list); -list_for_each_entry (cmd, &tmp_list, i_conn_node) { +list_for_each_entry_safe (cmd, cmd_tmp, &tmp_list, i_conn_node) {struct se_cmd *se_cmd = &cmd->se_cmd;if (se_cmd->se_tfo !=NULL ) {spin_lock_irq (&se_cmd->t_state_lock); - se_cmd->transport_state |=CMD_T_FABRIC_STOP ; +if (se_cmd->transport_state &CMD_T_ABORTED ) { +/* +* LIO's abort path owns the cleanup for this, +* so put it back on the list and let +* aborted_task handle it. +*/ +list_move_tail (&cmd->i_conn_node, + &conn->conn_cmd_list); + }else { + se_cmd->transport_state |=CMD_T_FABRIC_STOP ; + }spin_unlock_irq (&se_cmd->t_state_lock); } }
drivers/usb/core/config.c +11 -0
@@ -251,6 +251,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, struct usb_host_interface *ifp, int num_ep, unsigned char *buffer, int size) { + struct usb_device *udev = to_usb_device(ddev);unsigned char *buffer0 = buffer;struct usb_endpoint_descriptor *d;struct usb_host_endpoint *endpoint;
@@ -292,6 +293,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, goto skip_to_next_endpoint_or_interface_descriptor; } +/* Ignore blacklisted endpoints */ +if (udev->quirks &USB_QUIRK_ENDPOINT_BLACKLIST ) { +if (usb_endpoint_is_blacklisted (udev, ifp, d)) { +dev_warn (ddev,"config %d interface %d altsetting %d has a blacklisted endpoint with address 0x%X, skipping\n" , + cfgno, inum, asnum, + d->bEndpointAddress); + goto skip_to_next_endpoint_or_interface_descriptor; + } + } + endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints]; ++ifp->desc.bNumEndpoints;
drivers/usb/core/devio.c +7 -7
@@ -477,11 +477,11 @@ static void snoop_urb(struct usb_device *udev,if (userurb) {/* Async */ if (when ==SUBMIT ) -dev_info (&udev->dev,"userurb %pK, ep%d %s-%s, " +dev_info (&udev->dev,"userurb %px, ep%d %s-%s, " "length %u\n" , userurb, ep, t, d, length);else -dev_info (&udev->dev,"userurb %pK, ep%d %s-%s, " +dev_info (&udev->dev,"userurb %px, ep%d %s-%s, " "actual_length %u status %d\n" , userurb, ep, t, d, length, timeout_or_status);
@@ -1945,7 +1945,7 @@ static int proc_reapurb(struct usb_dev_state *ps, void __user *arg)if (as) {int retval; -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl (as, (void __user *__user *)arg);free_async (as);return retval;
@@ -1962,7 +1962,7 @@ static int proc_reapurbnonblock(struct usb_dev_state *ps, void __user *arg) as =async_getcompleted (ps);if (as) { -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl (as, (void __user *__user *)arg);free_async (as); }else {
@@ -2094,7 +2094,7 @@ static int proc_reapurb_compat(struct usb_dev_state *ps, void __user *arg)if (as) {int retval; -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl_compat (as, (void __user *__user *)arg);free_async (as);return retval;
@@ -2111,7 +2111,7 @@ static int proc_reapurbnonblock_compat(struct usb_dev_state *ps, void __user *ar as =async_getcompleted (ps);if (as) { -snoop (&ps->dev->dev,"reap %pK\n" , as->userurb); +snoop (&ps->dev->dev,"reap %px\n" , as->userurb); retval =processcompl_compat (as, (void __user *__user *)arg);free_async (as); }else {
@@ -2540,7 +2540,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,#endif case USBDEVFS_DISCARDURB : -snoop (&dev->dev,"%s: DISCARDURB %pK\n" , __func__, p); +snoop (&dev->dev,"%s: DISCARDURB %px\n" , __func__, p); ret =proc_unlinkurb (ps, p);break ;
drivers/usb/core/quirks.c +38 -0
@@ -195,6 +195,10 @@ static const struct usb_device_id usb_quirk_list[] = {/* Guillemot Webcam Hercules Dualpix Exchange*/ { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME }, + /* Guillemot Hercules DJ Console audio card (BZ 208357) */ + { USB_DEVICE(0x06f8, 0xb000), .driver_info = + USB_QUIRK_ENDPOINT_BLACKLIST }, + /* Midiman M-Audio Keystation 88es */ { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
@@ -344,6 +348,40 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = { { }/* terminating entry must be last */ }; +/* +* Entries for blacklisted endpoints that should be ignored when parsing +* configuration descriptors. +* +* Matched for devices with USB_QUIRK_ENDPOINT_BLACKLIST. +*/ +static const struct usb_device_id usb_endpoint_blacklist[] = { + {USB_DEVICE_INTERFACE_NUMBER (0x06f8 ,0xb000 ,5 ), .driver_info =0x01 }, + {USB_DEVICE_INTERFACE_NUMBER (0x06f8 ,0xb000 ,5 ), .driver_info =0x81 }, + { } +}; + +bool usb_endpoint_is_blacklisted (struct usb_device *udev, +struct usb_host_interface *intf, +struct usb_endpoint_descriptor *epd) +{ +const struct usb_device_id *id; +unsigned int address; + +for (id = usb_endpoint_blacklist; id->match_flags; ++id) { +if (!usb_match_device (udev, id)) +continue ; + +if (!usb_match_one_id_intf (udev, intf, id)) +continue ; + + address = id->driver_info; +if (address == epd->bEndpointAddress) +return true; + } + +return false; +} +static bool usb_match_any_interface (struct usb_device *udev,const struct usb_device_id *id) {
drivers/usb/core/usb.h +3 -0
@@ -31,6 +31,9 @@ extern void usb_deauthorize_interface(struct usb_interface *);extern void usb_authorize_interface (struct usb_interface *);extern void usb_detect_quirks (struct usb_device *udev);extern void usb_detect_interface_quirks (struct usb_device *udev); +extern bool usb_endpoint_is_blacklisted (struct usb_device *udev, +struct usb_host_interface *intf, +struct usb_endpoint_descriptor *epd);extern int usb_remove_device (struct usb_device *udev); extern int usb_get_device_descriptor(struct usb_device *dev,
drivers/usb/gadget/function/f_midi.c +7 -3
@@ -1256,7 +1256,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) midi->id =kstrdup (opts->id,GFP_KERNEL );if (opts->id && !midi->id) { status = -ENOMEM ; - goto setup_fail; + goto midi_free; } midi->in_ports = opts->in_ports; midi->out_ports = opts->out_ports;
@@ -1267,7 +1267,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) status =kfifo_alloc (&midi->in_req_fifo, midi->qlen,GFP_KERNEL );if (status) - goto setup_fail; + goto midi_free;spin_lock_init (&midi->transmit_lock);
@@ -1283,9 +1283,13 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)return &midi->func; +midi_free: +if (midi) +kfree (midi->id); +kfree (midi); setup_fail:mutex_unlock (&opts->lock); -kfree (midi); +return ERR_PTR (status); }
drivers/usb/gadget/legacy/inode.c +3 -0
@@ -2045,6 +2045,9 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent)return 0 ; Enomem: +kfree (CHIP ); +CHIP =NULL ; +return -ENOMEM ; }
drivers/video/fbdev/hyperv_fb.c +6 -1
@@ -712,7 +712,12 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info) goto err1; } - fb_virt =ioremap (par->mem->start, screen_fb_size); +/* +* Map the VRAM cacheable for performance. This is also required for +* VM Connect to display properly for ARM64 Linux VM, as the host also +* maps the VRAM cacheable. +*/ + fb_virt =ioremap_cache (par->mem->start, screen_fb_size);if (!fb_virt) goto err2;
fs/btrfs/inode.c +33 -8
92 lines not on this page · raw message
fs/btrfs/qgroup.c +1 -1
@@ -461,13 +461,13 @@ int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info)break ; } out: +btrfs_free_path (path); fs_info->qgroup_flags |= flags;if (!(fs_info->qgroup_flags &BTRFS_QGROUP_STATUS_FLAG_ON ))clear_bit (BTRFS_FS_QUOTA_ENABLED , &fs_info->flags);else if (fs_info->qgroup_flags &BTRFS_QGROUP_STATUS_FLAG_RESCAN && ret >=0 ) ret =qgroup_rescan_init (fs_info, rescan_progress,0 ); -btrfs_free_path (path);if (ret <0 ) {ulist_free (fs_info->qgroup_ulist);
fs/btrfs/tests/inode-tests.c +1 -0
@@ -245,6 +245,7 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)return ret; } + inode->i_mode =S_IFREG ;BTRFS_I (inode)->location.type =BTRFS_INODE_ITEM_KEY ;BTRFS_I (inode)->location.objectid =BTRFS_FIRST_FREE_OBJECTID ;BTRFS_I (inode)->location.offset =0 ;
fs/btrfs/volumes.c +7 -0
@@ -6414,6 +6414,13 @@ static int btrfs_check_chunk_valid(struct btrfs_root *root,return -EIO ; } +if (!is_power_of_2 (type &BTRFS_BLOCK_GROUP_PROFILE_MASK ) && + (type &BTRFS_BLOCK_GROUP_PROFILE_MASK ) !=0 ) { +btrfs_err (root->fs_info, +"invalid chunk profile flag: 0x%llx, expect 0 or 1 bit set" , + type &BTRFS_BLOCK_GROUP_PROFILE_MASK ); +return -EUCLEAN ; + }if ((type &BTRFS_BLOCK_GROUP_TYPE_MASK ) ==0 ) {btrfs_err (root->fs_info,"missing chunk type flag: 0x%llx" , type);return -EIO ;
fs/efivarfs/inode.c +2 -0
@@ -10,6 +10,7 @@#include <linux/efi.h> #include <linux/fs.h> #include <linux/ctype.h> +#include <linux/kmemleak.h> #include <linux/slab.h> #include <linux/uuid.h>
@@ -104,6 +105,7 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry, var->var.VariableName[i] ='\0' ; inode->i_private = var; +kmemleak_ignore (var); err =efivar_entry_add (var, &efivarfs_list);if (err)
fs/efivarfs/super.c +0 -1
@@ -23,7 +23,6 @@ LIST_HEAD(efivarfs_list);static void efivarfs_evict_inode (struct inode *inode) {clear_inode (inode); -kfree (inode->i_private); }static const struct super_operations efivarfs_ops = {
fs/proc/self.c +7 -0
@@ -26,6 +26,13 @@ static const char *proc_self_get_link(struct dentry *dentry,pid_t tgid =task_tgid_nr_ns (current, ns);char *name; +/* +* Not currently supported. Once we can inherit all of struct pid, +* we can allow this. +*/ +if (current->flags &PF_KTHREAD ) +return ERR_PTR (-EOPNOTSUPP ); +if (!tgid)return ERR_PTR (-ENOENT );/* 11 for max length of signed int in decimal + NULL term */
include/linux/usb/quirks.h +3 -0
@@ -59,4 +59,7 @@/* Device needs a pause after every control message. */ #define USB_QUIRK_DELAY_CTRL_MSG BIT(13) +/* device has blacklisted endpoints */ +#define USB_QUIRK_ENDPOINT_BLACKLIST BIT(15) +#endif /* __LINUX_USB_QUIRKS_H */
include/scsi/libiscsi.h +3 -0
@@ -144,6 +144,9 @@ struct iscsi_task {void *dd_data;/* driver/transport data */ }; +/* invalid scsi_task pointer */ +#define INVALID_SCSI_TASK (struct iscsi_task *)-1l +static inline int iscsi_task_has_unsol_data (struct iscsi_task *task) {return task->unsol_r2t.data_length > task->unsol_r2t.sent;
mm/huge_memory.c +3 -5
@@ -661,7 +661,6 @@ int do_huge_pmd_anonymous_page(struct fault_env *fe) transparent_hugepage_use_zero_page()) {pgtable_t pgtable;struct page *zero_page; -bool set;int ret; pgtable =pte_alloc_one (vma->vm_mm, haddr);if (unlikely (!pgtable))
@@ -674,22 +673,21 @@ int do_huge_pmd_anonymous_page(struct fault_env *fe) } fe->ptl =pmd_lock (vma->vm_mm, fe->pmd); ret =0 ; - set = false;if (pmd_none (*fe->pmd)) {if (userfaultfd_missing (vma)) {spin_unlock (fe->ptl); +pte_free (vma->vm_mm, pgtable); ret =handle_userfault (fe,VM_UFFD_MISSING );VM_BUG_ON (ret &VM_FAULT_FALLBACK ); }else {set_huge_zero_page (pgtable, vma->vm_mm, vma, haddr, fe->pmd, zero_page);spin_unlock (fe->ptl); - set = true; } - }else + }else {spin_unlock (fe->ptl); -if (!set)pte_free (vma->vm_mm, pgtable); + }return ret; } gfp =alloc_hugepage_direct_gfpmask (vma);
net/batman-adv/log.c +1 -0
@@ -196,6 +196,7 @@ static const struct file_operations batadv_log_fops = { .read = batadv_log_read, .poll = batadv_log_poll, .llseek = no_llseek, + .owner = THIS_MODULE, };int batadv_debug_log_setup (struct batadv_priv *bat_priv)
sound/pci/hda/patch_hdmi.c +44 -41
199 lines not on this page · raw message
tools/perf/util/dwarf-aux.c +8 -0
@@ -329,6 +329,7 @@ bool die_is_func_def(Dwarf_Die *dw_die)int die_entrypc (Dwarf_Die *dw_die,Dwarf_Addr *addr) {Dwarf_Addr base, end; +Dwarf_Attribute attr;if (!addr)return -EINVAL ;
@@ -336,6 +337,13 @@ int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr)if (dwarf_entrypc (dw_die, addr) ==0 )return 0 ; +/* +* Since the dwarf_ranges() will return 0 if there is no +* DW_AT_ranges attribute, we should check it first. +*/ +if (!dwarf_attr (dw_die, DW_AT_ranges, &attr)) +return -ENOENT ; +return dwarf_ranges (dw_die,0 , &base, addr, &end) <0 ? -ENOENT :0 ; }
tools/perf/util/event.c +4 -3
@@ -682,11 +682,13 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,int err;union perf_event *event; -if (symbol_conf.kptr_restrict) -return -1 ;if (map ==NULL )return -1 ; + kmap =map__kmap (map); +if (!kmap->ref_reloc_sym) +return -1 ; +/* * We should get this from /sys/kernel/sections/.text, but till that is * available use this, and after it is use this as a fallback for older
@@ -710,7 +712,6 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, event->header.misc =PERF_RECORD_MISC_GUEST_KERNEL ; } - kmap =map__kmap (map); size =snprintf (event->mmap.filename,sizeof (event->mmap.filename),"%s%s" , mmap_name, kmap->ref_reloc_sym->name) +1 ; size =PERF_ALIGN (size,sizeof (u64));