Linux 4.4.229

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEE4n5dijQDou9mhzu83qZv95d3LNwFAl77n/QACgkQ3qZv95d3
 LNz32RAAv97sAOnMaLii5ZgJtLGAHaAm6yCXbFzlfZLS75CBWG4Fy+4hTuDhVOBj
 9rkRtpCDqzfvjmPZld9uSTyXSSxuPmKP0UpZTEC7Ctoz0wX1Q8SUNQQ+sPNj41Y0
 k5L9Aqm7TTalu0LYl9i1BZtriO2SY27fhMbt0rJdw1GGJHQBsfCNQxX+LGF3RQaO
 itCY4pwl1AXHc/lRfybxEmdzSOGBqFrKS0Hda0cneDXNRevhS24qWDVjWgjgC6Ha
 kMygBTbsHqF7H+GR6gDc2SUYoFR/cA2A7T6Q9YQsTJpaTtZsIqsys1WMemh4zwed
 ctomUTjGPVMTsn5llPF+E7oJQh91sQ/hu666zHtn9O0jOrnBYwiwHc5kKeP/zh6f
 TuaBzZhz7dCxTGA8psBbOnUVjG2xhgDW5ZSlyWaADVPeXWO6aFFl71pjrlZJ1ezP
 eq5+BcTxFyMLfxzEUie3mwkBtSGFFnhwkmNsX0m4EgdNPmcx6s8VDrTgFcgwu+4l
 FK1ImqIpkiNp+OGwcp3V7mYYqvhHGBS0sQHnBFXX6Kv1Za76+oEMOl4VIWOU+SvF
 zyX+GuFk0lMZVabHEPvcUnzaQ8KG9YRGPjBTZoXflDZ6hpCja5nsiUKAAX1nO/7Z
 CRCti3fCyhDaW4bv5eKPLvlQSpI+FCW3BBusKuBJq9HbxedPPlg=
 =8zJW
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEJDfLduVEy2qz2d/TmXOSYMtstxYFAl78vu4ACgkQmXOSYMts
 txYQZhAAmtKHaupyiLyYJUJB8eeHysmk5KQBjahBBRC8n51E1EF49eK19MibStOU
 /g6ETKcFRUXDGt8gMu1y2KhOrB8jq5hkjbyYpgKNXx8LNgOW3ZN1cysXCYKPefEI
 6JRZp8OmX7MP8H6jmzsvrxbLmaqSR2iweUQDmpEi4aC6WBVCBufhib3+Ydjo8UT8
 YKOf5Y2fNncBFe3p7gg4n/eqr2V83+/Dtgp0XmLt+ehE5Tp8WMpKNjP6ddPhIHnd
 uAcsz/jXU24+JykgV2KfixLwkQxSf+pkppijArNYS5XLG07MjRbB9W70qH1ZqcwY
 ignCZNbyjI+5EDwl3wMGosbQPyxhTYO2ozmlNx+ANs7t0yjMnY9A5vT9zIPDEfKI
 oSPgqgVDvdhsxG/eKGAk9qo97NX1W/dzmSOSAr5ubM7QeegwpxpKZNSTazP3MIar
 DU9jSFIODphe+GVVwdRxAXm0X4VjfFfXIV+74uT5RQsCb0YJwTz5PHeTDkjpYTXD
 EqK7iOCYKrEjDZ5QKZzos/5OxG13VeuwrZ8a2BZ+5L0mVO1bM3rBG5Cgwp6fQmpU
 fW2/uFygWMSWZ1iQkFBSoQfyadcraQTDPg/tlL1axkvEme6DOpqQcJckHogUX+S7
 bN8ayqgJIR9d1j7WhtQmPi36UzOb2kM4FnN4Ry3WrwnTlZUFFIY=
 =4FLF
 -----END PGP SIGNATURE-----

Merge 4.4.229 into kernel.lnx.4.4.r39-rel

Changes in 4.4.229: (135 commits)
        s390: fix syscall_get_error for compat processes
        clk: sunxi: Fix incorrect usage of round_down()
        i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
        clk: qcom: msm8916: Fix the address location of pll->config_reg
        ALSA: isa/wavefront: prevent out of bounds write in ioctl
        scsi: qla2xxx: Fix issue with adapter's stopping state
        i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
        usblp: poison URBs upon disconnect
        ps3disk: use the default segment boundary
        vfio/pci: fix memory leaks in alloc_perm_bits()
        mfd: wm8994: Fix driver operation if loaded as modules
        scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
        nfsd: Fix svc_xprt refcnt leak when setup callback client failed
        powerpc/crashkernel: Take "mem=" option into account
        yam: fix possible memory leak in yam_init_driver
        mksysmap: Fix the mismatch of '.L' symbols in System.map
        scsi: sr: Fix sr_probe() missing deallocate of device minor
        scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM
        ALSA: usb-audio: Improve frames size computation
        s390/qdio: put thinint indicator after early error
        tty: hvc: Fix data abort due to race in hvc_open
        staging: sm750fb: add missing case while setting FB_VISUAL
        i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
        serial: amba-pl011: Make sure we initialize the port.lock spinlock
        drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
        PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
        power: supply: smb347-charger: IRQSTAT_D is volatile
        scsi: mpt3sas: Fix double free warnings
        dlm: remove BUG() before panic()
        clk: ti: composite: fix memory leak
        tty: n_gsm: Fix SOF skipping
        tty: n_gsm: Fix waking up upper tty layer when room available
        powerpc/pseries/ras: Fix FWNMI_VALID off by one
        powerpc/ps3: Fix kexec shutdown hang
        vfio-pci: Mask cap zero
        usb/ohci-platform: Fix a warning when hibernating
        USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
        tty: n_gsm: Fix bogus i++ in gsm_data_kick
        clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
        watchdog: da9062: No need to ping manually before setting timeout
        usb: dwc2: gadget: move gadget resume after the core is in L0 state
        USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke
        usb: gadget: lpc32xx_udc: don't dereference ep pointer before null check
        usb: gadget: fix potential double-free in m66592_probe.
        net: sunrpc: Fix off-by-one issues in 'rpc_ntop6'
        ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
        openrisc: Fix issue with argument clobbering for clone/fork
        gfs2: Allow lock_nolock mount to specify jid=X
        scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
        lib/zlib: remove outdated and incorrect pre-increment optimization
        include/linux/bitops.h: avoid clang shift-count-overflow warnings
        elfnote: mark all .note sections SHF_ALLOC
        selftests/net: in timestamping, strncpy needs to preserve null byte
        scsi: acornscsi: Fix an error handling path in acornscsi_probe()
        usb/xhci-plat: Set PM runtime as active on resume
        usb/ehci-platform: Set PM runtime as active on resume
        perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events()
        bcache: fix potential deadlock problem in btree_gc_coalesce
        block: Fix use-after-free in blkdev_get()
        libata: Use per port sync for detach
        drm: encoder_slave: fix refcouting error for modules
        drm/dp_mst: Reformat drm_dp_check_act_status() a bit
        drm/qxl: Use correct notify port address when creating cursor ring
        selinux: fix double free
        ext4: fix partial cluster initialization when splitting extent
        drm/dp_mst: Increase ACT retry timeout to 3s
        sparc64: fix misuses of access_process_vm() in genregs32_[sg]et()
        block: nr_sects_write(): Disable preemption on seqcount write
        crypto: algboss - don't wait during notifier callback
        kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex
        powerpc/kprobes: Fixes for kprobe_lookup_name() on BE
        x86/kprobes: Avoid kretprobe recursion bug
        kretprobe: Prevent triggering kretprobe from within kprobe_flush_task
        e1000e: Do not wake up the system via WOL if device wakeup is disabled
        sched/rt, net: Use CONFIG_PREEMPTION.patch
        net: core: device_rename: Use rwsem instead of a seqcount
        net: Revert "pkt_sched: fq: use proper locking in fq_dump_stats()"
        scsi: scsi_devinfo: handle non-terminated strings
        l2tp: Allow duplicate session creation with UDP
        net: sched: export __netdev_watchdog_up()
        fix a braino in "sparc32: fix register window handling in genregs32_[gs]et()"
        net: fix memleak in register_netdevice()
        net: usb: ax88179_178a: fix packet alignment padding
        tg3: driver sleeps indefinitely when EEH errors exceed eeh_max_freezes
        ip_tunnel: fix use-after-free in ip_tunnel_lookup()
        tcp_cubic: fix spurious HYSTART_DELAY exit upon drop in min RTT
        ip6_gre: fix use-after-free in ip6gre_tunnel_lookup()
        tcp: grow window for OOO packets only for SACK flows
        sctp: Don't advertise IPv4 addresses if ipv6only is set on the socket
        net: Fix the arp error in some cases
        net: Do not clear the sock TX queue in sk_set_socket()
        net: core: reduce recursion limit value
        mld: fix memory leak in ipv6_mc_destroy_dev()
        USB: ohci-sm501: Add missed iounmap() in remove
        usb: dwc2: Postponed gadget registration to the udc class driver
        usb: add USB_QUIRK_DELAY_INIT for Logitech C922
        PCI: Disable MSI for HiSilicon Hip06/Hip07 Root Ports
        USB: ehci: reopen solution for Synopsys HC bug
        usb: host: ehci-exynos: Fix error check in exynos_ehci_probe()
        ALSA: usb-audio: add quirk for Denon DCD-1500RE
        xhci: Fix incorrect EP_STATE_MASK
        xhci: Fix enumeration issue when setting max packet size for FS devices.
        cdc-acm: Add DISABLE_ECHO quirk for Microchip/SMSC chip
        ALSA: usb-audio: uac1: Invalidate ctl on interrupt
        ALSA: usb-audio: allow clock source validity interrupts
        ALSA: usb-audio: Clean up mixer element list traverse
        ALSA: usb-audio: Fix OOB access of mixer element list
        xhci: Poll for U0 after disabling USB2 LPM
        cifs/smb3: Fix data inconsistent when punch hole
        cifs/smb3: Fix data inconsistent when zero file range
        efi/esrt: Fix reference count leak in esre_create_sysfs_entry.
        RDMA/mad: Fix possible memory leak in ib_mad_post_receive_mads()
        ARM: imx5: add missing put_device() call in imx_suspend_alloc_ocram()
        usb: gadget: udc: Potential Oops in error handling code
        netfilter: ipset: fix unaligned atomic access
        sched/core: Fix PI boosting between RT and DEADLINE tasks
        net: alx: fix race condition in alx_remove
        kbuild: improve cc-option to clean up all temporary files
        blktrace: break out of blktrace setup on concurrent calls
        ACPI: sysfs: Fix pm_profile_attr type
        KVM: X86: Fix MSR range of APIC registers in X2APIC mode
        mm/slab: use memzero_explicit() in kzfree()
        ocfs2: load global_inode_alloc
        ocfs2: fix value of OCFS2_INVALID_SLOT
        ocfs2: fix panic on nfs server over ocfs2
        arm64: perf: Report the PC value in REGS_ABI_32 mode
        tracing: Fix event trigger to accept redundant spaces
        drm/radeon: fix fb_div check in ni_init_smc_spll_table()
        sunrpc: fixed rollback in rpc_gssd_dummy_populate()
        SUNRPC: Properly set the @subbuf parameter of xdr_buf_subsegment()
        pNFS/flexfiles: Fix list corruption if the mirror count changes
        NFSv4 fix CLOSE not waiting for direct IO compeletion
        PCI: Disable MSI for HiSilicon Hip06/Hip07 only in Root Port mode
        ALSA: usb-audio: Fix invalid NULL check in snd_emuusb_set_samplerate()
        Linux 4.4.229

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>

Conflicts:
	drivers/usb/host/xhci-plat.c
This commit is contained in:
Nathan Chancellor 2020-07-01 09:50:53 -07:00
commit f2b8d41add
134 changed files with 687 additions and 367 deletions

View file

@ -1,6 +1,6 @@
VERSION = 4 VERSION = 4
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 228 SUBLEVEL = 229
EXTRAVERSION = EXTRAVERSION =
NAME = Blurry Fish Butt NAME = Blurry Fish Butt

View file

@ -301,14 +301,14 @@ static int __init imx_suspend_alloc_ocram(
if (!ocram_pool) { if (!ocram_pool) {
pr_warn("%s: ocram pool unavailable!\n", __func__); pr_warn("%s: ocram pool unavailable!\n", __func__);
ret = -ENODEV; ret = -ENODEV;
goto put_node; goto put_device;
} }
ocram_base = gen_pool_alloc(ocram_pool, size); ocram_base = gen_pool_alloc(ocram_pool, size);
if (!ocram_base) { if (!ocram_base) {
pr_warn("%s: unable to alloc ocram!\n", __func__); pr_warn("%s: unable to alloc ocram!\n", __func__);
ret = -ENOMEM; ret = -ENOMEM;
goto put_node; goto put_device;
} }
phys = gen_pool_virt_to_phys(ocram_pool, ocram_base); phys = gen_pool_virt_to_phys(ocram_pool, ocram_base);
@ -318,6 +318,8 @@ static int __init imx_suspend_alloc_ocram(
if (virt_out) if (virt_out)
*virt_out = virt; *virt_out = virt;
put_device:
put_device(&pdev->dev);
put_node: put_node:
of_node_put(node); of_node_put(node);

View file

@ -13,15 +13,34 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
return 0; return 0;
/* /*
* Compat (i.e. 32 bit) mode: * Our handling of compat tasks (PERF_SAMPLE_REGS_ABI_32) is weird, but
* - PC has been set in the pt_regs struct in kernel_entry, * we're stuck with it for ABI compatability reasons.
* - Handle SP and LR here. *
* For a 32-bit consumer inspecting a 32-bit task, then it will look at
* the first 16 registers (see arch/arm/include/uapi/asm/perf_regs.h).
* These correspond directly to a prefix of the registers saved in our
* 'struct pt_regs', with the exception of the PC, so we copy that down
* (x15 corresponds to SP_hyp in the architecture).
*
* So far, so good.
*
* The oddity arises when a 64-bit consumer looks at a 32-bit task and
* asks for registers beyond PERF_REG_ARM_MAX. In this case, we return
* SP_usr, LR_usr and PC in the positions where the AArch64 SP, LR and
* PC registers would normally live. The initial idea was to allow a
* 64-bit unwinder to unwind a 32-bit task and, although it's not clear
* how well that works in practice, somebody might be relying on it.
*
* At the time we make a sample, we don't know whether the consumer is
* 32-bit or 64-bit, so we have to cater for both possibilities.
*/ */
if (compat_user_mode(regs)) { if (compat_user_mode(regs)) {
if ((u32)idx == PERF_REG_ARM64_SP) if ((u32)idx == PERF_REG_ARM64_SP)
return regs->compat_sp; return regs->compat_sp;
if ((u32)idx == PERF_REG_ARM64_LR) if ((u32)idx == PERF_REG_ARM64_LR)
return regs->compat_lr; return regs->compat_lr;
if (idx == 15)
return regs->pc;
} }
if ((u32)idx == PERF_REG_ARM64_SP) if ((u32)idx == PERF_REG_ARM64_SP)

View file

@ -1092,13 +1092,13 @@ ENTRY(__sys_clone)
l.movhi r29,hi(sys_clone) l.movhi r29,hi(sys_clone)
l.ori r29,r29,lo(sys_clone) l.ori r29,r29,lo(sys_clone)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r7,r1,0 l.nop
ENTRY(__sys_fork) ENTRY(__sys_fork)
l.movhi r29,hi(sys_fork) l.movhi r29,hi(sys_fork)
l.ori r29,r29,lo(sys_fork) l.ori r29,r29,lo(sys_fork)
l.j _fork_save_extra_regs_and_call l.j _fork_save_extra_regs_and_call
l.addi r3,r1,0 l.nop
ENTRY(sys_rt_sigreturn) ENTRY(sys_rt_sigreturn)
l.j _sys_rt_sigreturn l.j _sys_rt_sigreturn

View file

@ -29,6 +29,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <linux/module.h>
#include <asm/probes.h> #include <asm/probes.h>
#include <asm/code-patching.h> #include <asm/code-patching.h>
@ -61,7 +62,7 @@ typedef ppc_opcode_t kprobe_opcode_t;
#define kprobe_lookup_name(name, addr) \ #define kprobe_lookup_name(name, addr) \
{ \ { \
char dot_name[MODULE_NAME_LEN + 1 + KSYM_NAME_LEN]; \ char dot_name[MODULE_NAME_LEN + 1 + KSYM_NAME_LEN]; \
char *modsym; \ const char *modsym; \
bool dot_appended = false; \ bool dot_appended = false; \
if ((modsym = strchr(name, ':')) != NULL) { \ if ((modsym = strchr(name, ':')) != NULL) { \
modsym++; \ modsym++; \

View file

@ -113,11 +113,12 @@ void machine_kexec(struct kimage *image)
void __init reserve_crashkernel(void) void __init reserve_crashkernel(void)
{ {
unsigned long long crash_size, crash_base; unsigned long long crash_size, crash_base, total_mem_sz;
int ret; int ret;
total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
/* use common parsing */ /* use common parsing */
ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(), ret = parse_crashkernel(boot_command_line, total_mem_sz,
&crash_size, &crash_base); &crash_size, &crash_base);
if (ret == 0 && crash_size > 0) { if (ret == 0 && crash_size > 0) {
crashk_res.start = crash_base; crashk_res.start = crash_base;
@ -176,6 +177,7 @@ void __init reserve_crashkernel(void)
/* Crash kernel trumps memory limit */ /* Crash kernel trumps memory limit */
if (memory_limit && memory_limit <= crashk_res.end) { if (memory_limit && memory_limit <= crashk_res.end) {
memory_limit = crashk_res.end + 1; memory_limit = crashk_res.end + 1;
total_mem_sz = memory_limit;
printk("Adjusted memory limit for crashkernel, now 0x%llx\n", printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
memory_limit); memory_limit);
} }
@ -184,7 +186,7 @@ void __init reserve_crashkernel(void)
"for crashkernel (System RAM: %ldMB)\n", "for crashkernel (System RAM: %ldMB)\n",
(unsigned long)(crash_size >> 20), (unsigned long)(crash_size >> 20),
(unsigned long)(crashk_res.start >> 20), (unsigned long)(crashk_res.start >> 20),
(unsigned long)(memblock_phys_mem_size() >> 20)); (unsigned long)(total_mem_sz >> 20));
if (!memblock_is_region_memory(crashk_res.start, crash_size) || if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
memblock_reserve(crashk_res.start, crash_size)) { memblock_reserve(crashk_res.start, crash_size)) {

View file

@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void)
{ {
int result; int result;
DBG("%s:%d: map.vas_id = %llu\n", __func__, __LINE__, map.vas_id);
if (map.vas_id) { if (map.vas_id) {
result = lv1_select_virtual_address_space(0); result = lv1_select_virtual_address_space(0);
BUG_ON(result); result += lv1_destruct_virtual_address_space(map.vas_id);
result = lv1_destruct_virtual_address_space(map.vas_id);
BUG_ON(result); if (result) {
lv1_panic(0);
}
map.vas_id = 0; map.vas_id = 0;
} }
} }
@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)
int result; int result;
if (!r->destroy) { if (!r->destroy) {
pr_info("%s:%d: Not destroying high region: %llxh %llxh\n",
__func__, __LINE__, r->base, r->size);
return; return;
} }
DBG("%s:%d: r->base = %llxh\n", __func__, __LINE__, r->base);
if (r->base) { if (r->base) {
result = lv1_release_memory(r->base); result = lv1_release_memory(r->base);
BUG_ON(result);
if (result) {
lv1_panic(0);
}
r->size = r->base = r->offset = 0; r->size = r->base = r->offset = 0;
map.total = map.rm.size; map.total = map.rm.size;
} }
ps3_mm_set_repository_highmem(NULL); ps3_mm_set_repository_highmem(NULL);
} }

View file

@ -265,10 +265,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)
/* /*
* Some versions of FWNMI place the buffer inside the 4kB page starting at * Some versions of FWNMI place the buffer inside the 4kB page starting at
* 0x7000. Other versions place it inside the rtas buffer. We check both. * 0x7000. Other versions place it inside the rtas buffer. We check both.
* Minimum size of the buffer is 16 bytes.
*/ */
#define VALID_FWNMI_BUFFER(A) \ #define VALID_FWNMI_BUFFER(A) \
((((A) >= 0x7000) && ((A) < 0x7ff0)) || \ ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \
(((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16)))) (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))
/* /*
* Get the error information for errors coming through the * Get the error information for errors coming through the

View file

@ -41,7 +41,17 @@ static inline void syscall_rollback(struct task_struct *task,
static inline long syscall_get_error(struct task_struct *task, static inline long syscall_get_error(struct task_struct *task,
struct pt_regs *regs) struct pt_regs *regs)
{ {
return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0; unsigned long error = regs->gprs[2];
#ifdef CONFIG_COMPAT
if (test_tsk_thread_flag(task, TIF_31BIT)) {
/*
* Sign-extend the value so (int)-EFOO becomes (long)-EFOO
* and will match correctly in comparisons.
*/
error = (long)(int)error;
}
#endif
return IS_ERR_VALUE(error) ? error : 0;
} }
static inline long syscall_get_return_value(struct task_struct *task, static inline long syscall_get_return_value(struct task_struct *task,

View file

@ -167,12 +167,17 @@ static int genregs32_set(struct task_struct *target,
if (ret || !count) if (ret || !count)
return ret; return ret;
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&regs->y, &regs->npc,
34 * sizeof(u32), 35 * sizeof(u32)); 34 * sizeof(u32), 35 * sizeof(u32));
if (ret || !count) if (ret || !count)
return ret; return ret;
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&regs->y,
35 * sizeof(u32), 36 * sizeof(u32));
if (ret || !count)
return ret;
return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf, return user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
35 * sizeof(u32), 38 * sizeof(u32)); 36 * sizeof(u32), 38 * sizeof(u32));
} }
static int fpregs32_get(struct task_struct *target, static int fpregs32_get(struct task_struct *target,

View file

@ -534,13 +534,8 @@ static int genregs32_get(struct task_struct *target,
&reg, sizeof(reg), 0) &reg, sizeof(reg), 0)
!= sizeof(reg)) != sizeof(reg))
return -EFAULT; return -EFAULT;
if (access_process_vm(target, if (put_user(reg, u++))
(unsigned long) u,
&reg, sizeof(reg), 1)
!= sizeof(reg))
return -EFAULT; return -EFAULT;
pos++;
u++;
} }
} }
} }
@ -639,11 +634,7 @@ static int genregs32_set(struct task_struct *target,
} }
} else { } else {
for (; count > 0 && pos < 32; count--) { for (; count > 0 && pos < 32; count--) {
if (access_process_vm(target, if (get_user(reg, u++))
(unsigned long)
u,
&reg, sizeof(reg), 0)
!= sizeof(reg))
return -EFAULT; return -EFAULT;
if (access_process_vm(target, if (access_process_vm(target,
(unsigned long) (unsigned long)

View file

@ -751,6 +751,13 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
void *frame_pointer; void *frame_pointer;
bool skipped = false; bool skipped = false;
/*
* Set a dummy kprobe for avoiding kretprobe recursion.
* Since kretprobe never run in kprobe handler, kprobe must not
* be running at this point.
*/
kprobe_busy_begin();
INIT_HLIST_HEAD(&empty_rp); INIT_HLIST_HEAD(&empty_rp);
kretprobe_hash_lock(current, &head, &flags); kretprobe_hash_lock(current, &head, &flags);
/* fixup registers */ /* fixup registers */
@ -826,10 +833,9 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
orig_ret_address = (unsigned long)ri->ret_addr; orig_ret_address = (unsigned long)ri->ret_addr;
if (ri->rp && ri->rp->handler) { if (ri->rp && ri->rp->handler) {
__this_cpu_write(current_kprobe, &ri->rp->kp); __this_cpu_write(current_kprobe, &ri->rp->kp);
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
ri->ret_addr = correct_ret_addr; ri->ret_addr = correct_ret_addr;
ri->rp->handler(ri, regs); ri->rp->handler(ri, regs);
__this_cpu_write(current_kprobe, NULL); __this_cpu_write(current_kprobe, &kprobe_busy);
} }
recycle_rp_inst(ri, &empty_rp); recycle_rp_inst(ri, &empty_rp);
@ -845,6 +851,8 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)
kretprobe_hash_unlock(current, &flags); kretprobe_hash_unlock(current, &flags);
kprobe_busy_end();
hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) { hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
hlist_del(&ri->hlist); hlist_del(&ri->hlist);
kfree(ri); kfree(ri);

View file

@ -2162,7 +2162,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
return kvm_mtrr_set_msr(vcpu, msr, data); return kvm_mtrr_set_msr(vcpu, msr, data);
case MSR_IA32_APICBASE: case MSR_IA32_APICBASE:
return kvm_set_apic_base(vcpu, msr_info); return kvm_set_apic_base(vcpu, msr_info);
case APIC_BASE_MSR ... APIC_BASE_MSR + 0x3ff: case APIC_BASE_MSR ... APIC_BASE_MSR + 0xff:
return kvm_x2apic_msr_write(vcpu, msr, data); return kvm_x2apic_msr_write(vcpu, msr, data);
case MSR_IA32_TSCDEADLINE: case MSR_IA32_TSCDEADLINE:
kvm_set_lapic_tscdeadline_msr(vcpu, data); kvm_set_lapic_tscdeadline_msr(vcpu, data);
@ -2432,7 +2432,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
case MSR_IA32_APICBASE: case MSR_IA32_APICBASE:
msr_info->data = kvm_get_apic_base(vcpu); msr_info->data = kvm_get_apic_base(vcpu);
break; break;
case APIC_BASE_MSR ... APIC_BASE_MSR + 0x3ff: case APIC_BASE_MSR ... APIC_BASE_MSR + 0xff:
return kvm_x2apic_msr_read(vcpu, msr_info->index, &msr_info->data); return kvm_x2apic_msr_read(vcpu, msr_info->index, &msr_info->data);
break; break;
case MSR_IA32_TSCDEADLINE: case MSR_IA32_TSCDEADLINE:

View file

@ -194,8 +194,6 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
if (IS_ERR(thread)) if (IS_ERR(thread))
goto err_put_larval; goto err_put_larval;
wait_for_completion_interruptible(&larval->completion);
return NOTIFY_STOP; return NOTIFY_STOP;
err_put_larval: err_put_larval:

View file

@ -776,13 +776,13 @@ static void __exit interrupt_stats_exit(void)
} }
static ssize_t static ssize_t
acpi_show_profile(struct device *dev, struct device_attribute *attr, acpi_show_profile(struct kobject *kobj, struct kobj_attribute *attr,
char *buf) char *buf)
{ {
return sprintf(buf, "%d\n", acpi_gbl_FADT.preferred_profile); return sprintf(buf, "%d\n", acpi_gbl_FADT.preferred_profile);
} }
static const struct device_attribute pm_profile_attr = static const struct kobj_attribute pm_profile_attr =
__ATTR(pm_profile, S_IRUGO, acpi_show_profile, NULL); __ATTR(pm_profile, S_IRUGO, acpi_show_profile, NULL);
static ssize_t hotplug_enabled_show(struct kobject *kobj, static ssize_t hotplug_enabled_show(struct kobject *kobj,

View file

@ -56,7 +56,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/async.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/glob.h> #include <linux/glob.h>
@ -6222,7 +6221,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
/* perform each probe asynchronously */ /* perform each probe asynchronously */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
async_schedule(async_port_probe, ap); ap->cookie = async_schedule(async_port_probe, ap);
} }
return 0; return 0;
@ -6355,11 +6354,11 @@ void ata_host_detach(struct ata_host *host)
{ {
int i; int i;
for (i = 0; i < host->n_ports; i++) {
/* Ensure ata_port probe has completed */ /* Ensure ata_port probe has completed */
async_synchronize_full(); async_synchronize_cookie(host->ports[i]->cookie + 1);
for (i = 0; i < host->n_ports; i++)
ata_port_detach(host->ports[i]); ata_port_detach(host->ports[i]);
}
/* the host is dead now, dissociate ACPI */ /* the host is dead now, dissociate ACPI */
ata_acpi_dissociate(host); ata_acpi_dissociate(host);

View file

@ -658,6 +658,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,
/* temporary section violation during probe() */ /* temporary section violation during probe() */
drv->probe = probe; drv->probe = probe;
retval = code = __platform_driver_register(drv, module); retval = code = __platform_driver_register(drv, module);
if (retval)
return retval;
/* /*
* Fixup that section violation, being paranoid about code scanning * Fixup that section violation, being paranoid about code scanning

View file

@ -464,7 +464,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
blk_queue_bounce_limit(queue, BLK_BOUNCE_HIGH); blk_queue_bounce_limit(queue, BLK_BOUNCE_HIGH);
blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9); blk_queue_max_hw_sectors(queue, dev->bounce_size >> 9);
blk_queue_segment_boundary(queue, -1UL);
blk_queue_dma_alignment(queue, dev->blk_size-1); blk_queue_dma_alignment(queue, dev->blk_size-1);
blk_queue_logical_block_size(queue, dev->blk_size); blk_queue_logical_block_size(queue, dev->blk_size);

View file

@ -270,7 +270,7 @@ static struct clk_pll gpll0 = {
.l_reg = 0x21004, .l_reg = 0x21004,
.m_reg = 0x21008, .m_reg = 0x21008,
.n_reg = 0x2100c, .n_reg = 0x2100c,
.config_reg = 0x21014, .config_reg = 0x21010,
.mode_reg = 0x21000, .mode_reg = 0x21000,
.status_reg = 0x2101c, .status_reg = 0x2101c,
.status_bit = 17, .status_bit = 17,
@ -297,7 +297,7 @@ static struct clk_pll gpll1 = {
.l_reg = 0x20004, .l_reg = 0x20004,
.m_reg = 0x20008, .m_reg = 0x20008,
.n_reg = 0x2000c, .n_reg = 0x2000c,
.config_reg = 0x20014, .config_reg = 0x20010,
.mode_reg = 0x20000, .mode_reg = 0x20000,
.status_reg = 0x2001c, .status_reg = 0x2001c,
.status_bit = 17, .status_bit = 17,
@ -324,7 +324,7 @@ static struct clk_pll gpll2 = {
.l_reg = 0x4a004, .l_reg = 0x4a004,
.m_reg = 0x4a008, .m_reg = 0x4a008,
.n_reg = 0x4a00c, .n_reg = 0x4a00c,
.config_reg = 0x4a014, .config_reg = 0x4a010,
.mode_reg = 0x4a000, .mode_reg = 0x4a000,
.status_reg = 0x4a01c, .status_reg = 0x4a01c,
.status_bit = 17, .status_bit = 17,
@ -351,7 +351,7 @@ static struct clk_pll bimc_pll = {
.l_reg = 0x23004, .l_reg = 0x23004,
.m_reg = 0x23008, .m_reg = 0x23008,
.n_reg = 0x2300c, .n_reg = 0x2300c,
.config_reg = 0x23014, .config_reg = 0x23010,
.mode_reg = 0x23000, .mode_reg = 0x23000,
.status_reg = 0x2301c, .status_reg = 0x2301c,
.status_bit = 17, .status_bit = 17,

View file

@ -1708,7 +1708,8 @@ static struct samsung_gate_clock peric_gate_clks[] __initdata = {
GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric", GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0), ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric", GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0), ENABLE_SCLK_PERIC, 6,
CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC, GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
5, CLK_SET_RATE_PARENT, 0), 5, CLK_SET_RATE_PARENT, 0),
GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC, GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,

View file

@ -311,7 +311,7 @@ static void sun6i_a31_get_pll1_factors(u32 *freq, u32 parent_rate,
* Round down the frequency to the closest multiple of either * Round down the frequency to the closest multiple of either
* 6 or 16 * 6 or 16
*/ */
u32 round_freq_6 = round_down(freq_mhz, 6); u32 round_freq_6 = rounddown(freq_mhz, 6);
u32 round_freq_16 = round_down(freq_mhz, 16); u32 round_freq_16 = round_down(freq_mhz, 16);
if (round_freq_6 > round_freq_16) if (round_freq_6 > round_freq_16)

View file

@ -228,6 +228,7 @@ cleanup:
if (!cclk->comp_clks[i]) if (!cclk->comp_clks[i])
continue; continue;
list_del(&cclk->comp_clks[i]->link); list_del(&cclk->comp_clks[i]->link);
kfree(cclk->comp_clks[i]->parent_names);
kfree(cclk->comp_clks[i]); kfree(cclk->comp_clks[i]);
} }

View file

@ -182,7 +182,7 @@ static int esre_create_sysfs_entry(void *esre, int entry_num)
rc = kobject_init_and_add(&entry->kobj, &esre1_ktype, NULL, rc = kobject_init_and_add(&entry->kobj, &esre1_ktype, NULL,
"%s", name); "%s", name);
if (rc) { if (rc) {
kfree(entry); kobject_put(&entry->kobj);
return rc; return rc;
} }
} }

View file

@ -29,6 +29,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <drm/drm_dp_mst_helper.h> #include <drm/drm_dp_mst_helper.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <linux/iopoll.h>
#include <drm/drm_fixed.h> #include <drm/drm_fixed.h>
@ -2647,6 +2648,17 @@ fail:
return ret; return ret;
} }
static int do_get_act_status(struct drm_dp_aux *aux)
{
int ret;
u8 status;
ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
if (ret < 0)
return ret;
return status;
}
/** /**
* drm_dp_check_act_status() - Check ACT handled status. * drm_dp_check_act_status() - Check ACT handled status.
@ -2656,33 +2668,29 @@ fail:
*/ */
int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr) int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
{ {
u8 status; /*
int ret; * There doesn't seem to be any recommended retry count or timeout in
int count = 0; * the MST specification. Since some hubs have been observed to take
* over 1 second to update their payload allocations under certain
* conditions, we use a rather large timeout value.
*/
const int timeout_ms = 3000;
int ret, status;
do { ret = readx_poll_timeout(do_get_act_status, mgr->aux, status,
ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); status & DP_PAYLOAD_ACT_HANDLED || status < 0,
200, timeout_ms * USEC_PER_MSEC);
if (ret < 0) { if (ret < 0 && status >= 0) {
DRM_DEBUG_KMS("failed to read payload table status %d\n", ret); DRM_DEBUG_KMS("Failed to get ACT after %dms, last status: %02x\n",
goto fail; timeout_ms, status);
return -EINVAL;
} else if (status < 0) {
DRM_DEBUG_KMS("Failed to read payload table status: %d\n",
status);
return status;
} }
if (status & DP_PAYLOAD_ACT_HANDLED)
break;
count++;
udelay(100);
} while (count < 30);
if (!(status & DP_PAYLOAD_ACT_HANDLED)) {
DRM_DEBUG_KMS("failed to get ACT bit %d after %d retries\n", status, count);
ret = -EINVAL;
goto fail;
}
return 0; return 0;
fail:
return ret;
} }
EXPORT_SYMBOL(drm_dp_check_act_status); EXPORT_SYMBOL(drm_dp_check_act_status);

View file

@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev,
err = encoder_drv->encoder_init(client, dev, encoder); err = encoder_drv->encoder_init(client, dev, encoder);
if (err) if (err)
goto fail_unregister; goto fail_module_put;
if (info->platform_data) if (info->platform_data)
encoder->slave_funcs->set_config(&encoder->base, encoder->slave_funcs->set_config(&encoder->base,
@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,
return 0; return 0;
fail_module_put:
module_put(module);
fail_unregister: fail_unregister:
i2c_unregister_device(client); i2c_unregister_device(client);
module_put(module);
fail: fail:
return err; return err;
} }

View file

@ -199,7 +199,7 @@ static int qxl_device_init(struct qxl_device *qdev,
&(qdev->ram_header->cursor_ring_hdr), &(qdev->ram_header->cursor_ring_hdr),
sizeof(struct qxl_command), sizeof(struct qxl_command),
QXL_CURSOR_RING_SIZE, QXL_CURSOR_RING_SIZE,
qdev->io_base + QXL_IO_NOTIFY_CMD, qdev->io_base + QXL_IO_NOTIFY_CURSOR,
false, false,
&qdev->cursor_event); &qdev->cursor_event);

View file

@ -2128,7 +2128,7 @@ static int ni_init_smc_spll_table(struct radeon_device *rdev)
if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT)) if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT))
ret = -EINVAL; ret = -EINVAL;
if (clk_s & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT)) if (fb_div & ~(SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT))
ret = -EINVAL; ret = -EINVAL;
if (clk_v & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT)) if (clk_v & ~(SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_NISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT))

View file

@ -647,7 +647,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
} }
if (dev->vendor == PCI_VENDOR_ID_AMD && if (dev->vendor == PCI_VENDOR_ID_AMD &&
dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS) { (dev->device == PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ||
dev->device == PCI_DEVICE_ID_AMD_KERNCZ_SMBUS)) {
retval = piix4_setup_sb800(dev, id, 1); retval = piix4_setup_sb800(dev, id, 1);
} }

View file

@ -297,11 +297,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)
dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n", dev_err(dev, "IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n",
readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)), readl(_IBMR(i2c)), readl(_IDBR(i2c)), readl(_ICR(i2c)),
readl(_ISR(i2c))); readl(_ISR(i2c)));
dev_dbg(dev, "log: "); dev_err(dev, "log:");
for (i = 0; i < i2c->irqlogidx; i++) for (i = 0; i < i2c->irqlogidx; i++)
pr_debug("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); pr_cont(" [%03x:%05x]", i2c->isrlog[i], i2c->icrlog[i]);
pr_cont("\n");
pr_debug("\n");
} }
#else /* ifdef DEBUG */ #else /* ifdef DEBUG */
@ -691,11 +690,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c)
{ {
u32 icr; u32 icr;
/* /* Clear the START, STOP, ACK, TB and MA flags */
* Clear the STOP and ACK flags
*/
icr = readl(_ICR(i2c)); icr = readl(_ICR(i2c));
icr &= ~(ICR_STOP | ICR_ACKNAK); icr &= ~(ICR_START | ICR_STOP | ICR_ACKNAK | ICR_TB | ICR_MA);
writel(icr, _ICR(i2c)); writel(icr, _ICR(i2c));
} }

View file

@ -2912,6 +2912,7 @@ static int ib_mad_post_receive_mads(struct ib_mad_qp_info *qp_info,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
if (unlikely(ib_dma_mapping_error(qp_info->port_priv->device, if (unlikely(ib_dma_mapping_error(qp_info->port_priv->device,
sg_list.addr))) { sg_list.addr))) {
kfree(mad_priv);
ret = -ENOMEM; ret = -ENOMEM;
break; break;
} }

View file

@ -1375,7 +1375,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__set_blocks(n1, n1->keys + n2->keys, if (__set_blocks(n1, n1->keys + n2->keys,
block_bytes(b->c)) > block_bytes(b->c)) >
btree_blocks(new_nodes[i])) btree_blocks(new_nodes[i]))
goto out_nocoalesce; goto out_unlock_nocoalesce;
keys = n2->keys; keys = n2->keys;
/* Take the key of the node we're getting rid of */ /* Take the key of the node we're getting rid of */
@ -1404,7 +1404,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
if (__bch_keylist_realloc(&keylist, if (__bch_keylist_realloc(&keylist,
bkey_u64s(&new_nodes[i]->key))) bkey_u64s(&new_nodes[i]->key)))
goto out_nocoalesce; goto out_unlock_nocoalesce;
bch_btree_node_write(new_nodes[i], &cl); bch_btree_node_write(new_nodes[i], &cl);
bch_keylist_add(&keylist, &new_nodes[i]->key); bch_keylist_add(&keylist, &new_nodes[i]->key);
@ -1450,6 +1450,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
/* Invalidated our iterator */ /* Invalidated our iterator */
return -EINTR; return -EINTR;
out_unlock_nocoalesce:
for (i = 0; i < nodes; i++)
mutex_unlock(&new_nodes[i]->write_lock);
out_nocoalesce: out_nocoalesce:
closure_sync(&cl); closure_sync(&cl);
bch_keylist_free(&keylist); bch_keylist_free(&keylist);

View file

@ -690,3 +690,4 @@ module_i2c_driver(wm8994_i2c_driver);
MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC"); MODULE_DESCRIPTION("Core support for the WM8994 audio CODEC");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
MODULE_SOFTDEP("pre: wm8994_regulator");

View file

@ -872,8 +872,12 @@ out_free_rings:
static void __alx_stop(struct alx_priv *alx) static void __alx_stop(struct alx_priv *alx)
{ {
alx_halt(alx);
alx_free_irq(alx); alx_free_irq(alx);
cancel_work_sync(&alx->link_check_wk);
cancel_work_sync(&alx->reset_wk);
alx_halt(alx);
alx_free_rings(alx); alx_free_rings(alx);
} }
@ -1406,9 +1410,6 @@ static void alx_remove(struct pci_dev *pdev)
struct alx_priv *alx = pci_get_drvdata(pdev); struct alx_priv *alx = pci_get_drvdata(pdev);
struct alx_hw *hw = &alx->hw; struct alx_hw *hw = &alx->hw;
cancel_work_sync(&alx->link_check_wk);
cancel_work_sync(&alx->reset_wk);
/* restore permanent mac address */ /* restore permanent mac address */
alx_set_macaddr(hw, hw->perm_addr); alx_set_macaddr(hw, hw->perm_addr);

View file

@ -18182,8 +18182,8 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
rtnl_lock(); rtnl_lock();
/* We probably don't have netdev yet */ /* Could be second call or maybe we don't have netdev yet */
if (!netdev || !netif_running(netdev)) if (!netdev || tp->pcierr_recovery || !netif_running(netdev))
goto done; goto done;
/* We needn't recover from permanent error */ /* We needn't recover from permanent error */

View file

@ -6270,11 +6270,17 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 ctrl, ctrl_ext, rctl, status; u32 ctrl, ctrl_ext, rctl, status, wufc;
/* Runtime suspend should only enable wakeup for link changes */
u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
int retval = 0; int retval = 0;
/* Runtime suspend should only enable wakeup for link changes */
if (runtime)
wufc = E1000_WUFC_LNKC;
else if (device_may_wakeup(&pdev->dev))
wufc = adapter->wol;
else
wufc = 0;
status = er32(STATUS); status = er32(STATUS);
if (status & E1000_STATUS_LU) if (status & E1000_STATUS_LU)
wufc &= ~E1000_WUFC_LNKC; wufc &= ~E1000_WUFC_LNKC;
@ -6332,7 +6338,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
} else if ((hw->mac.type == e1000_pch_lpt) || } else if ((hw->mac.type == e1000_pch_lpt) ||
(hw->mac.type == e1000_pch_spt)) { (hw->mac.type == e1000_pch_spt)) {
if (!(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC))) if (wufc && !(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC)))
/* ULP does not support wake from unicast, multicast /* ULP does not support wake from unicast, multicast
* or broadcast. * or broadcast.
*/ */

View file

@ -1160,6 +1160,7 @@ static int __init yam_init_driver(void)
err = register_netdev(dev); err = register_netdev(dev);
if (err) { if (err) {
printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name); printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
free_netdev(dev);
goto error; goto error;
} }
yam_devs[i] = dev; yam_devs[i] = dev;

View file

@ -1396,10 +1396,10 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
} }
if (pkt_cnt == 0) { if (pkt_cnt == 0) {
/* Skip IP alignment psudo header */
skb_pull(skb, 2);
skb->len = pkt_len; skb->len = pkt_len;
skb_set_tail_pointer(skb, pkt_len); /* Skip IP alignment pseudo header */
skb_pull(skb, 2);
skb_set_tail_pointer(skb, skb->len);
skb->truesize = pkt_len + sizeof(struct sk_buff); skb->truesize = pkt_len + sizeof(struct sk_buff);
ax88179_rx_checksum(skb, pkt_hdr); ax88179_rx_checksum(skb, pkt_hdr);
return 1; return 1;
@ -1408,8 +1408,9 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
ax_skb = skb_clone(skb, GFP_ATOMIC); ax_skb = skb_clone(skb, GFP_ATOMIC);
if (ax_skb) { if (ax_skb) {
ax_skb->len = pkt_len; ax_skb->len = pkt_len;
ax_skb->data = skb->data + 2; /* Skip IP alignment pseudo header */
skb_set_tail_pointer(ax_skb, pkt_len); skb_pull(ax_skb, 2);
skb_set_tail_pointer(ax_skb, ax_skb->len);
ax_skb->truesize = pkt_len + sizeof(struct sk_buff); ax_skb->truesize = pkt_len + sizeof(struct sk_buff);
ax88179_rx_checksum(ax_skb, pkt_hdr); ax88179_rx_checksum(ax_skb, pkt_hdr);
usbnet_skb_return(dev, ax_skb); usbnet_skb_return(dev, ax_skb);

View file

@ -388,16 +388,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
/* Setup initial capable state. Will be updated later */ /* Setup initial capable state. Will be updated later */
link->aspm_capable = link->aspm_support; link->aspm_capable = link->aspm_support;
/*
* If the downstream component has pci bridge function, don't
* do ASPM for now.
*/
list_for_each_entry(child, &linkbus->devices, bus_list) {
if (pci_pcie_type(child) == PCI_EXP_TYPE_PCI_BRIDGE) {
link->aspm_disable = ASPM_STATE_ALL;
break;
}
}
/* Get and check endpoint acceptable latencies */ /* Get and check endpoint acceptable latencies */
list_for_each_entry(child, &linkbus->devices, bus_list) { list_for_each_entry(child, &linkbus->devices, bus_list) {

View file

@ -1624,6 +1624,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, quir
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, quirk_pcie_mch); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7320_MCH, quirk_pcie_mch);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, quirk_pcie_mch); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7525_MCH, quirk_pcie_mch);
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch);
/* /*
* It's possible for the MSI to get corrupted if shpc and acpi * It's possible for the MSI to get corrupted if shpc and acpi

View file

@ -1141,6 +1141,7 @@ static bool smb347_volatile_reg(struct device *dev, unsigned int reg)
switch (reg) { switch (reg) {
case IRQSTAT_A: case IRQSTAT_A:
case IRQSTAT_C: case IRQSTAT_C:
case IRQSTAT_D:
case IRQSTAT_E: case IRQSTAT_E:
case IRQSTAT_F: case IRQSTAT_F:
case STAT_A: case STAT_A:

View file

@ -376,7 +376,6 @@ static inline int multicast_outbound(struct qdio_q *q)
extern u64 last_ai_time; extern u64 last_ai_time;
/* prototypes for thin interrupt */ /* prototypes for thin interrupt */
void qdio_setup_thinint(struct qdio_irq *irq_ptr);
int qdio_establish_thinint(struct qdio_irq *irq_ptr); int qdio_establish_thinint(struct qdio_irq *irq_ptr);
void qdio_shutdown_thinint(struct qdio_irq *irq_ptr); void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
void tiqdio_add_input_queues(struct qdio_irq *irq_ptr); void tiqdio_add_input_queues(struct qdio_irq *irq_ptr);

View file

@ -479,7 +479,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data)
setup_queues(irq_ptr, init_data); setup_queues(irq_ptr, init_data);
setup_qib(irq_ptr, init_data); setup_qib(irq_ptr, init_data);
qdio_setup_thinint(irq_ptr);
set_impl_params(irq_ptr, init_data->qib_param_field_format, set_impl_params(irq_ptr, init_data->qib_param_field_format,
init_data->qib_param_field, init_data->qib_param_field,
init_data->input_slib_elements, init_data->input_slib_elements,

View file

@ -268,17 +268,19 @@ int __init tiqdio_register_thinints(void)
int qdio_establish_thinint(struct qdio_irq *irq_ptr) int qdio_establish_thinint(struct qdio_irq *irq_ptr)
{ {
int rc;
if (!is_thinint_irq(irq_ptr)) if (!is_thinint_irq(irq_ptr))
return 0; return 0;
return set_subchannel_ind(irq_ptr, 0);
}
void qdio_setup_thinint(struct qdio_irq *irq_ptr)
{
if (!is_thinint_irq(irq_ptr))
return;
irq_ptr->dsci = get_indicator(); irq_ptr->dsci = get_indicator();
DBF_HEX(&irq_ptr->dsci, sizeof(void *)); DBF_HEX(&irq_ptr->dsci, sizeof(void *));
rc = set_subchannel_ind(irq_ptr, 0);
if (rc)
put_indicator(irq_ptr->dsci);
return rc;
} }
void qdio_shutdown_thinint(struct qdio_irq *irq_ptr) void qdio_shutdown_thinint(struct qdio_irq *irq_ptr)

View file

@ -2912,8 +2912,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); ashost->base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0);
ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); ashost->fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0);
if (!ashost->base || !ashost->fast) if (!ashost->base || !ashost->fast) {
ret = -ENOMEM;
goto out_put; goto out_put;
}
host->irq = ec->irq; host->irq = ec->irq;
ashost->host = host; ashost->host = host;

View file

@ -427,6 +427,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
int rc = 0; int rc = 0;
struct vio_dev *vdev = to_vio_dev(hostdata->dev); struct vio_dev *vdev = to_vio_dev(hostdata->dev);
set_adapter_info(hostdata);
/* Re-enable the CRQ */ /* Re-enable the CRQ */
do { do {
if (rc) if (rc)

View file

@ -319,7 +319,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset,
boot_kobj->kobj.kset = boot_kset->kset; boot_kobj->kobj.kset = boot_kset->kset;
if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype, if (kobject_init_and_add(&boot_kobj->kobj, &iscsi_boot_ktype,
NULL, name, index)) { NULL, name, index)) {
kfree(boot_kobj); kobject_put(&boot_kobj->kobj);
return NULL; return NULL;
} }
boot_kobj->data = data; boot_kobj->data = data;

View file

@ -7315,6 +7315,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
spin_lock_irq(shost->host_lock); spin_lock_irq(shost->host_lock);
if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) { if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) {
spin_unlock_irq(shost->host_lock); spin_unlock_irq(shost->host_lock);
if (newnode)
lpfc_nlp_put(ndlp);
goto dropit; goto dropit;
} }
spin_unlock_irq(shost->host_lock); spin_unlock_irq(shost->host_lock);

View file

@ -3136,7 +3136,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc)
ioc->scsi_lookup = NULL; ioc->scsi_lookup = NULL;
} }
kfree(ioc->hpr_lookup); kfree(ioc->hpr_lookup);
ioc->hpr_lookup = NULL;
kfree(ioc->internal_lookup); kfree(ioc->internal_lookup);
ioc->internal_lookup = NULL;
if (ioc->chain_lookup) { if (ioc->chain_lookup) {
for (i = 0; i < ioc->chain_depth; i++) { for (i = 0; i < ioc->chain_depth; i++) {
if (ioc->chain_lookup[i].chain_buffer) if (ioc->chain_lookup[i].chain_buffer)

View file

@ -827,6 +827,7 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
atomic_set(&tpg->lport_tpg_enabled, 0); atomic_set(&tpg->lport_tpg_enabled, 0);
qlt_stop_phase1(vha->vha_tgt.qla_tgt); qlt_stop_phase1(vha->vha_tgt.qla_tgt);
qlt_stop_phase2(vha->vha_tgt.qla_tgt);
} }
return count; return count;
@ -990,6 +991,7 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
atomic_set(&tpg->lport_tpg_enabled, 0); atomic_set(&tpg->lport_tpg_enabled, 0);
qlt_stop_phase1(vha->vha_tgt.qla_tgt); qlt_stop_phase1(vha->vha_tgt.qla_tgt);
qlt_stop_phase2(vha->vha_tgt.qla_tgt);
} }
return count; return count;

View file

@ -443,7 +443,8 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
/* /*
* vendor strings must be an exact match * vendor strings must be an exact match
*/ */
if (vmax != strlen(devinfo->vendor) || if (vmax != strnlen(devinfo->vendor,
sizeof(devinfo->vendor)) ||
memcmp(devinfo->vendor, vskip, vmax)) memcmp(devinfo->vendor, vskip, vmax))
continue; continue;
@ -451,7 +452,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
* @model specifies the full string, and * @model specifies the full string, and
* must be larger or equal to devinfo->model * must be larger or equal to devinfo->model
*/ */
mlen = strlen(devinfo->model); mlen = strnlen(devinfo->model, sizeof(devinfo->model));
if (mmax < mlen || memcmp(devinfo->model, mskip, mlen)) if (mmax < mlen || memcmp(devinfo->model, mskip, mlen))
continue; continue;
return devinfo; return devinfo;

View file

@ -746,7 +746,7 @@ static int sr_probe(struct device *dev)
cd->cdi.disk = disk; cd->cdi.disk = disk;
if (register_cdrom(&cd->cdi)) if (register_cdrom(&cd->cdi))
goto fail_put; goto fail_minor;
/* /*
* Initialize block layer runtime PM stuffs before the * Initialize block layer runtime PM stuffs before the
@ -764,6 +764,10 @@ static int sr_probe(struct device *dev)
return 0; return 0;
fail_minor:
spin_lock(&sr_index_lock);
clear_bit(minor, sr_index_bits);
spin_unlock(&sr_index_lock);
fail_put: fail_put:
put_disk(disk); put_disk(disk);
fail_free: fail_free:

View file

@ -894,6 +894,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index)
fix->visual = FB_VISUAL_PSEUDOCOLOR; fix->visual = FB_VISUAL_PSEUDOCOLOR;
break; break;
case 16: case 16:
case 24:
case 32: case 32:
fix->visual = FB_VISUAL_TRUECOLOR; fix->visual = FB_VISUAL_TRUECOLOR;
break; break;

View file

@ -89,6 +89,8 @@ static LIST_HEAD(hvc_structs);
*/ */
static DEFINE_SPINLOCK(hvc_structs_lock); static DEFINE_SPINLOCK(hvc_structs_lock);
/* Mutex to serialize hvc_open */
static DEFINE_MUTEX(hvc_open_mutex);
/* /*
* This value is used to assign a tty->index value to a hvc_struct based * This value is used to assign a tty->index value to a hvc_struct based
* upon order of exposure via hvc_probe(), when we can not match it to * upon order of exposure via hvc_probe(), when we can not match it to
@ -333,16 +335,24 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
*/ */
static int hvc_open(struct tty_struct *tty, struct file * filp) static int hvc_open(struct tty_struct *tty, struct file * filp)
{ {
struct hvc_struct *hp = tty->driver_data; struct hvc_struct *hp;
unsigned long flags; unsigned long flags;
int rc = 0; int rc = 0;
mutex_lock(&hvc_open_mutex);
hp = tty->driver_data;
if (!hp) {
rc = -EIO;
goto out;
}
spin_lock_irqsave(&hp->port.lock, flags); spin_lock_irqsave(&hp->port.lock, flags);
/* Check and then increment for fast path open. */ /* Check and then increment for fast path open. */
if (hp->port.count++ > 0) { if (hp->port.count++ > 0) {
spin_unlock_irqrestore(&hp->port.lock, flags); spin_unlock_irqrestore(&hp->port.lock, flags);
hvc_kick(); hvc_kick();
return 0; goto out;
} /* else count == 0 */ } /* else count == 0 */
spin_unlock_irqrestore(&hp->port.lock, flags); spin_unlock_irqrestore(&hp->port.lock, flags);
@ -371,6 +381,8 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
/* Force wakeup of the polling thread */ /* Force wakeup of the polling thread */
hvc_kick(); hvc_kick();
out:
mutex_unlock(&hvc_open_mutex);
return rc; return rc;
} }

View file

@ -681,11 +681,10 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
* FIXME: lock against link layer control transmissions * FIXME: lock against link layer control transmissions
*/ */
static void gsm_data_kick(struct gsm_mux *gsm) static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
{ {
struct gsm_msg *msg, *nmsg; struct gsm_msg *msg, *nmsg;
int len; int len;
int skip_sof = 0;
list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) { list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) {
if (gsm->constipated && msg->addr) if (gsm->constipated && msg->addr)
@ -707,18 +706,23 @@ static void gsm_data_kick(struct gsm_mux *gsm)
print_hex_dump_bytes("gsm_data_kick: ", print_hex_dump_bytes("gsm_data_kick: ",
DUMP_PREFIX_OFFSET, DUMP_PREFIX_OFFSET,
gsm->txframe, len); gsm->txframe, len);
if (gsm->output(gsm, gsm->txframe, len) < 0)
if (gsm->output(gsm, gsm->txframe + skip_sof,
len - skip_sof) < 0)
break; break;
/* FIXME: Can eliminate one SOF in many more cases */ /* FIXME: Can eliminate one SOF in many more cases */
gsm->tx_bytes -= msg->len; gsm->tx_bytes -= msg->len;
/* For a burst of frames skip the extra SOF within the
burst */
skip_sof = 1;
list_del(&msg->list); list_del(&msg->list);
kfree(msg); kfree(msg);
if (dlci) {
tty_port_tty_wakeup(&dlci->port);
} else {
int i = 0;
for (i = 0; i < NUM_DLCI; i++)
if (gsm->dlci[i])
tty_port_tty_wakeup(&gsm->dlci[i]->port);
}
} }
} }
@ -770,7 +774,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
/* Add to the actual output queue */ /* Add to the actual output queue */
list_add_tail(&msg->list, &gsm->tx_list); list_add_tail(&msg->list, &gsm->tx_list);
gsm->tx_bytes += msg->len; gsm->tx_bytes += msg->len;
gsm_data_kick(gsm); gsm_data_kick(gsm, dlci);
} }
/** /**
@ -1231,7 +1235,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
gsm_control_reply(gsm, CMD_FCON, NULL, 0); gsm_control_reply(gsm, CMD_FCON, NULL, 0);
/* Kick the link in case it is idling */ /* Kick the link in case it is idling */
spin_lock_irqsave(&gsm->tx_lock, flags); spin_lock_irqsave(&gsm->tx_lock, flags);
gsm_data_kick(gsm); gsm_data_kick(gsm, NULL);
spin_unlock_irqrestore(&gsm->tx_lock, flags); spin_unlock_irqrestore(&gsm->tx_lock, flags);
break; break;
case CMD_FCOFF: case CMD_FCOFF:
@ -2429,7 +2433,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty)
/* Queue poll */ /* Queue poll */
clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
spin_lock_irqsave(&gsm->tx_lock, flags); spin_lock_irqsave(&gsm->tx_lock, flags);
gsm_data_kick(gsm); gsm_data_kick(gsm, NULL);
if (gsm->tx_bytes < TX_THRESH_LO) { if (gsm->tx_bytes < TX_THRESH_LO) {
gsm_dlci_data_sweep(gsm); gsm_dlci_data_sweep(gsm);
} }

View file

@ -2322,6 +2322,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,
uap->port.fifosize = uap->fifosize; uap->port.fifosize = uap->fifosize;
uap->port.flags = UPF_BOOT_AUTOCONF; uap->port.flags = UPF_BOOT_AUTOCONF;
uap->port.line = index; uap->port.line = index;
spin_lock_init(&uap->port.lock);
amba_ports[index] = uap; amba_ports[index] = uap;

View file

@ -1684,6 +1684,8 @@ static int acm_reset_resume(struct usb_interface *intf)
static const struct usb_device_id acm_ids[] = { static const struct usb_device_id acm_ids[] = {
/* quirky and broken devices */ /* quirky and broken devices */
{ USB_DEVICE(0x0424, 0x274e), /* Microchip Technology, Inc. (formerly SMSC) */
.driver_info = DISABLE_ECHO, }, /* DISABLE ECHO in termios flag */
{ USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */ { USB_DEVICE(0x076d, 0x0006), /* Denso Cradle CU-321 */
.driver_info = NO_UNION_NORMAL, },/* has no union descriptor */ .driver_info = NO_UNION_NORMAL, },/* has no union descriptor */
{ USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */ { USB_DEVICE(0x17ef, 0x7000), /* Lenovo USB modem */

View file

@ -481,7 +481,8 @@ static int usblp_release(struct inode *inode, struct file *file)
usb_autopm_put_interface(usblp->intf); usb_autopm_put_interface(usblp->intf);
if (!usblp->present) /* finish cleanup from disconnect */ if (!usblp->present) /* finish cleanup from disconnect */
usblp_cleanup(usblp); usblp_cleanup(usblp); /* any URBs must be dead */
mutex_unlock(&usblp_mutex); mutex_unlock(&usblp_mutex);
return 0; return 0;
} }
@ -1397,9 +1398,11 @@ static void usblp_disconnect(struct usb_interface *intf)
usblp_unlink_urbs(usblp); usblp_unlink_urbs(usblp);
mutex_unlock(&usblp->mut); mutex_unlock(&usblp->mut);
usb_poison_anchored_urbs(&usblp->urbs);
if (!usblp->used) if (!usblp->used)
usblp_cleanup(usblp); usblp_cleanup(usblp);
mutex_unlock(&usblp_mutex); mutex_unlock(&usblp_mutex);
} }

View file

@ -73,11 +73,12 @@ static const struct usb_device_id usb_quirk_list[] = {
/* Logitech HD Webcam C270 */ /* Logitech HD Webcam C270 */
{ USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
/* Logitech HD Pro Webcams C920, C920-C, C925e and C930e */ /* Logitech HD Pro Webcams C920, C920-C, C922, C925e and C930e */
{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
{ USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT },
{ USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x085b), .driver_info = USB_QUIRK_DELAY_INIT },
{ USB_DEVICE(0x046d, 0x085c), .driver_info = USB_QUIRK_DELAY_INIT },
/* Logitech ConferenceCam CC3000e */ /* Logitech ConferenceCam CC3000e */
{ USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT }, { USB_DEVICE(0x046d, 0x0847), .driver_info = USB_QUIRK_DELAY_INIT },

View file

@ -363,10 +363,13 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
if (ret && (ret != -ENOTSUPP)) if (ret && (ret != -ENOTSUPP))
dev_err(hsotg->dev, "exit hibernation failed\n"); dev_err(hsotg->dev, "exit hibernation failed\n");
call_gadget(hsotg, resume);
}
/* Change to L0 state */ /* Change to L0 state */
hsotg->lx_state = DWC2_L0; hsotg->lx_state = DWC2_L0;
call_gadget(hsotg, resume);
} else {
/* Change to L0 state */
hsotg->lx_state = DWC2_L0;
}
} else { } else {
if (hsotg->core_params->hibernation) { if (hsotg->core_params->hibernation) {
dwc2_writel(GINTSTS_WKUPINT, hsotg->regs + GINTSTS); dwc2_writel(GINTSTS_WKUPINT, hsotg->regs + GINTSTS);

View file

@ -3656,12 +3656,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
epnum, 0); epnum, 0);
} }
ret = usb_add_gadget_udc(dev, &hsotg->gadget);
if (ret) {
dwc2_hsotg_ep_free_request(&hsotg->eps_out[0]->ep,
hsotg->ctrl_req);
return ret;
}
dwc2_hsotg_dump(hsotg); dwc2_hsotg_dump(hsotg);
return 0; return 0;

View file

@ -452,6 +452,17 @@ static int dwc2_driver_probe(struct platform_device *dev)
if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
dwc2_lowlevel_hw_disable(hsotg); dwc2_lowlevel_hw_disable(hsotg);
#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
/* Postponed adding a new gadget to the udc class driver list */
if (hsotg->gadget_enabled) {
retval = usb_add_gadget_udc(hsotg->dev, &hsotg->gadget);
if (retval) {
dwc2_hsotg_remove(hsotg);
goto error;
}
}
#endif /* CONFIG_USB_DWC2_PERIPHERAL || CONFIG_USB_DWC2_DUAL_ROLE */
return 0; return 0;
error: error:

View file

@ -1662,17 +1662,17 @@ static int lpc32xx_ep_enable(struct usb_ep *_ep,
const struct usb_endpoint_descriptor *desc) const struct usb_endpoint_descriptor *desc)
{ {
struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep);
struct lpc32xx_udc *udc = ep->udc; struct lpc32xx_udc *udc;
u16 maxpacket; u16 maxpacket;
u32 tmp; u32 tmp;
unsigned long flags; unsigned long flags;
/* Verify EP data */ /* Verify EP data */
if ((!_ep) || (!ep) || (!desc) || if ((!_ep) || (!ep) || (!desc) ||
(desc->bDescriptorType != USB_DT_ENDPOINT)) { (desc->bDescriptorType != USB_DT_ENDPOINT))
dev_dbg(udc->dev, "bad ep or descriptor\n");
return -EINVAL; return -EINVAL;
}
udc = ep->udc;
maxpacket = usb_endpoint_maxp(desc); maxpacket = usb_endpoint_maxp(desc);
if ((maxpacket == 0) || (maxpacket > ep->maxpacket)) { if ((maxpacket == 0) || (maxpacket > ep->maxpacket)) {
dev_dbg(udc->dev, "bad ep descriptor's packet size\n"); dev_dbg(udc->dev, "bad ep descriptor's packet size\n");
@ -1920,7 +1920,7 @@ static int lpc32xx_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value) static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value)
{ {
struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep);
struct lpc32xx_udc *udc = ep->udc; struct lpc32xx_udc *udc;
unsigned long flags; unsigned long flags;
if ((!ep) || (ep->hwep_num <= 1)) if ((!ep) || (ep->hwep_num <= 1))
@ -1930,6 +1930,7 @@ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value)
if (ep->is_in) if (ep->is_in)
return -EAGAIN; return -EAGAIN;
udc = ep->udc;
spin_lock_irqsave(&udc->lock, flags); spin_lock_irqsave(&udc->lock, flags);
if (value == 1) { if (value == 1) {

View file

@ -1684,7 +1684,7 @@ static int m66592_probe(struct platform_device *pdev)
err_add_udc: err_add_udc:
m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req); m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
m66592->ep0_req = NULL;
clean_up3: clean_up3:
if (m66592->pdata->on_chip) { if (m66592->pdata->on_chip) {
clk_disable(m66592->clk); clk_disable(m66592->clk);

View file

@ -2322,6 +2322,7 @@ static int mv_udc_probe(struct platform_device *pdev)
return 0; return 0;
err_create_workqueue: err_create_workqueue:
if (udc->qwork)
destroy_workqueue(udc->qwork); destroy_workqueue(udc->qwork);
err_destroy_dma: err_destroy_dma:
dma_pool_destroy(udc->dtd_pool); dma_pool_destroy(udc->dtd_pool);

View file

@ -269,10 +269,6 @@ static void s3c2410_udc_done(struct s3c2410_ep *ep,
static void s3c2410_udc_nuke(struct s3c2410_udc *udc, static void s3c2410_udc_nuke(struct s3c2410_udc *udc,
struct s3c2410_ep *ep, int status) struct s3c2410_ep *ep, int status)
{ {
/* Sanity check */
if (&ep->queue == NULL)
return;
while (!list_empty(&ep->queue)) { while (!list_empty(&ep->queue)) {
struct s3c2410_request *req; struct s3c2410_request *req;
req = list_entry(ep->queue.next, struct s3c2410_request, req = list_entry(ep->queue.next, struct s3c2410_request,

View file

@ -199,9 +199,8 @@ skip_phy:
hcd->rsrc_len = resource_size(res); hcd->rsrc_len = resource_size(res);
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (!irq) { if (irq < 0) {
dev_err(&pdev->dev, "Failed to get IRQ\n"); err = irq;
err = -ENODEV;
goto fail_io; goto fail_io;
} }

View file

@ -63,6 +63,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
} }
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq < 0)
return irq;
hcd = usb_create_hcd(&ehci_mxc_hc_driver, dev, dev_name(dev)); hcd = usb_create_hcd(&ehci_mxc_hc_driver, dev, dev_name(dev));
if (!hcd) if (!hcd)

View file

@ -229,6 +229,13 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
ehci_info(ehci, "applying MosChip frame-index workaround\n"); ehci_info(ehci, "applying MosChip frame-index workaround\n");
ehci->frame_index_bug = 1; ehci->frame_index_bug = 1;
break; break;
case PCI_VENDOR_ID_HUAWEI:
/* Synopsys HC bug */
if (pdev->device == 0xa239) {
ehci_info(ehci, "applying Synopsys HC workaround\n");
ehci->has_synopsys_hc_bug = 1;
}
break;
} }
/* optional debug port, normally in the first BAR */ /* optional debug port, normally in the first BAR */

View file

@ -375,6 +375,11 @@ static int ehci_platform_resume(struct device *dev)
} }
ehci_resume(hcd, priv->reset_on_resume); ehci_resume(hcd, priv->reset_on_resume);
pm_runtime_disable(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
return 0; return 0;
} }
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */

View file

@ -339,6 +339,11 @@ static int ohci_platform_resume(struct device *dev)
} }
ohci_resume(hcd, false); ohci_resume(hcd, false);
pm_runtime_disable(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
return 0; return 0;
} }
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */

View file

@ -196,6 +196,7 @@ static int ohci_hcd_sm501_drv_remove(struct platform_device *pdev)
struct resource *mem; struct resource *mem;
usb_remove_hcd(hcd); usb_remove_hcd(hcd);
iounmap(hcd->regs);
release_mem_region(hcd->rsrc_start, hcd->rsrc_len); release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
usb_put_hcd(hcd); usb_put_hcd(hcd);
dma_release_declared_memory(&pdev->dev); dma_release_declared_memory(&pdev->dev);

View file

@ -1385,6 +1385,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
xhci->devs[slot_id]->out_ctx, ep_index); xhci->devs[slot_id]->out_ctx, ep_index);
ep_ctx = xhci_get_ep_ctx(xhci, command->in_ctx, ep_index); ep_ctx = xhci_get_ep_ctx(xhci, command->in_ctx, ep_index);
ep_ctx->ep_info &= cpu_to_le32(~EP_STATE_MASK);/* must clear */
ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK); ep_ctx->ep_info2 &= cpu_to_le32(~MAX_PACKET_MASK);
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size)); ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet_size));
@ -4309,6 +4310,9 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd,
mutex_lock(hcd->bandwidth_mutex); mutex_lock(hcd->bandwidth_mutex);
xhci_change_max_exit_latency(xhci, udev, 0); xhci_change_max_exit_latency(xhci, udev, 0);
mutex_unlock(hcd->bandwidth_mutex); mutex_unlock(hcd->bandwidth_mutex);
readl_poll_timeout(port_array[port_num], pm_val,
(pm_val & PORT_PLS_MASK) == XDEV_U0,
100, 10000);
return 0; return 0;
} }
} }

View file

@ -706,7 +706,7 @@ struct xhci_ep_ctx {
* 4 - TRB error * 4 - TRB error
* 5-7 - reserved * 5-7 - reserved
*/ */
#define EP_STATE_MASK (0xf) #define EP_STATE_MASK (0x7)
#define EP_STATE_DISABLED 0 #define EP_STATE_DISABLED 0
#define EP_STATE_RUNNING 1 #define EP_STATE_RUNNING 1
#define EP_STATE_HALTED 2 #define EP_STATE_HALTED 2

View file

@ -1405,7 +1405,12 @@ static int vfio_cap_init(struct vfio_pci_device *vdev)
if (ret) if (ret)
return ret; return ret;
if (cap <= PCI_CAP_ID_MAX) { /*
* ID 0 is a NULL capability, conflicting with our fake
* PCI_CAP_ID_BASIC. As it has no content, consider it
* hidden for now.
*/
if (cap && cap <= PCI_CAP_ID_MAX) {
len = pci_cap_length[cap]; len = pci_cap_length[cap];
if (len == 0xFF) { /* Variable length */ if (len == 0xFF) { /* Variable length */
len = vfio_cap_len(vdev, cap, pos); len = vfio_cap_len(vdev, cap, pos);
@ -1644,9 +1649,12 @@ void vfio_config_free(struct vfio_pci_device *vdev)
vdev->vconfig = NULL; vdev->vconfig = NULL;
kfree(vdev->pci_config_map); kfree(vdev->pci_config_map);
vdev->pci_config_map = NULL; vdev->pci_config_map = NULL;
if (vdev->msi_perm) {
free_perm_bits(vdev->msi_perm);
kfree(vdev->msi_perm); kfree(vdev->msi_perm);
vdev->msi_perm = NULL; vdev->msi_perm = NULL;
} }
}
/* /*
* Find the remaining number of bytes in a dword that match the given * Find the remaining number of bytes in a dword that match the given

View file

@ -94,11 +94,6 @@ static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt,
unsigned int regval) unsigned int regval)
{ {
struct da9062 *chip = wdt->hw; struct da9062 *chip = wdt->hw;
int ret;
ret = da9062_reset_watchdog_timer(wdt);
if (ret)
return ret;
return regmap_update_bits(chip->regmap, return regmap_update_bits(chip->regmap,
DA9062AA_CONTROL_D, DA9062AA_CONTROL_D,

View file

@ -1203,11 +1203,9 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
*/ */
if (!for_part) { if (!for_part) {
ret = devcgroup_inode_permission(bdev->bd_inode, perm); ret = devcgroup_inode_permission(bdev->bd_inode, perm);
if (ret != 0) { if (ret != 0)
bdput(bdev);
return ret; return ret;
} }
}
restart: restart:
@ -1276,8 +1274,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
goto out_clear; goto out_clear;
BUG_ON(for_part); BUG_ON(for_part);
ret = __blkdev_get(whole, mode, 1); ret = __blkdev_get(whole, mode, 1);
if (ret) if (ret) {
bdput(whole);
goto out_clear; goto out_clear;
}
bdev->bd_contains = whole; bdev->bd_contains = whole;
bdev->bd_part = disk_get_part(disk, partno); bdev->bd_part = disk_get_part(disk, partno);
if (!(disk->flags & GENHD_FL_UP) || if (!(disk->flags & GENHD_FL_UP) ||
@ -1337,7 +1337,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
put_disk(disk); put_disk(disk);
module_put(owner); module_put(owner);
out: out:
bdput(bdev);
return ret; return ret;
} }
@ -1423,6 +1422,9 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
bdput(whole); bdput(whole);
} }
if (res)
bdput(bdev);
return res; return res;
} }
EXPORT_SYMBOL(blkdev_get); EXPORT_SYMBOL(blkdev_get);

View file

@ -1145,6 +1145,12 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
inode = d_inode(cfile->dentry); inode = d_inode(cfile->dentry);
cifsi = CIFS_I(inode); cifsi = CIFS_I(inode);
/*
* We zero the range through ioctl, so we need remove the page caches
* first, otherwise the data may be inconsistent with the server.
*/
truncate_pagecache_range(inode, offset, offset + len - 1);
/* if file not oplocked can't be sure whether asking to extend size */ /* if file not oplocked can't be sure whether asking to extend size */
if (!CIFS_CACHE_READ(cifsi)) if (!CIFS_CACHE_READ(cifsi))
if (keep_size == false) if (keep_size == false)
@ -1201,6 +1207,12 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse))
return -EOPNOTSUPP; return -EOPNOTSUPP;
/*
* We implement the punch hole through ioctl, so we need remove the page
* caches first, otherwise the data may be inconsistent with the server.
*/
truncate_pagecache_range(inode, offset, offset + len - 1);
cifs_dbg(FYI, "offset %lld len %lld", offset, len); cifs_dbg(FYI, "offset %lld len %lld", offset, len);
fsctl_buf.FileOffset = cpu_to_le64(offset); fsctl_buf.FileOffset = cpu_to_le64(offset);

View file

@ -92,7 +92,6 @@ do { \
__LINE__, __FILE__, #x, jiffies); \ __LINE__, __FILE__, #x, jiffies); \
{do} \ {do} \
printk("\n"); \ printk("\n"); \
BUG(); \
panic("DLM: Record message above and reboot.\n"); \ panic("DLM: Record message above and reboot.\n"); \
} \ } \
} }

View file

@ -2902,7 +2902,7 @@ again:
* in use to avoid freeing it when removing blocks. * in use to avoid freeing it when removing blocks.
*/ */
if (sbi->s_cluster_ratio > 1) { if (sbi->s_cluster_ratio > 1) {
pblk = ext4_ext_pblock(ex) + end - ee_block + 2; pblk = ext4_ext_pblock(ex) + end - ee_block + 1;
partial_cluster = partial_cluster =
-(long long) EXT4_B2C(sbi, pblk); -(long long) EXT4_B2C(sbi, pblk);
} }

View file

@ -916,7 +916,7 @@ fail:
} }
static const match_table_t nolock_tokens = { static const match_table_t nolock_tokens = {
{ Opt_jid, "jid=%d\n", }, { Opt_jid, "jid=%d", },
{ Opt_err, NULL }, { Opt_err, NULL },
}; };

View file

@ -385,8 +385,6 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq, bool write)
if (write) if (write)
nfs_zap_mapping(inode, inode->i_mapping); nfs_zap_mapping(inode, inode->i_mapping);
inode_dio_end(inode);
if (dreq->iocb) { if (dreq->iocb) {
long res = (long) dreq->error; long res = (long) dreq->error;
if (!res) if (!res)
@ -396,7 +394,10 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq, bool write)
complete_all(&dreq->completion); complete_all(&dreq->completion);
igrab(inode);
nfs_direct_req_release(dreq); nfs_direct_req_release(dreq);
inode_dio_end(inode);
iput(inode);
} }
static void nfs_direct_readpage_release(struct nfs_page *req) static void nfs_direct_readpage_release(struct nfs_page *req)
@ -537,8 +538,10 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
* generic layer handle the completion. * generic layer handle the completion.
*/ */
if (requested_bytes == 0) { if (requested_bytes == 0) {
inode_dio_end(inode); igrab(inode);
nfs_direct_req_release(dreq); nfs_direct_req_release(dreq);
inode_dio_end(inode);
iput(inode);
return result < 0 ? result : -EIO; return result < 0 ? result : -EIO;
} }
@ -939,8 +942,10 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
* generic layer handle the completion. * generic layer handle the completion.
*/ */
if (requested_bytes == 0) { if (requested_bytes == 0) {
inode_dio_end(inode); igrab(inode);
nfs_direct_req_release(dreq); nfs_direct_req_release(dreq);
inode_dio_end(inode);
iput(inode);
return result < 0 ? result : -EIO; return result < 0 ? result : -EIO;
} }

View file

@ -82,6 +82,7 @@ nfs_file_release(struct inode *inode, struct file *filp)
dprintk("NFS: release(%pD2)\n", filp); dprintk("NFS: release(%pD2)\n", filp);
nfs_inc_stats(inode, NFSIOS_VFSRELEASE); nfs_inc_stats(inode, NFSIOS_VFSRELEASE);
inode_dio_wait(inode);
nfs_file_clear_open_context(filp); nfs_file_clear_open_context(filp);
return 0; return 0;
} }

View file

@ -855,9 +855,8 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
goto out_mds; goto out_mds;
/* Use a direct mapping of ds_idx to pgio mirror_idx */ /* Use a direct mapping of ds_idx to pgio mirror_idx */
if (WARN_ON_ONCE(pgio->pg_mirror_count != if (pgio->pg_mirror_count != FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg))
FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg))) goto out_eagain;
goto out_mds;
for (i = 0; i < pgio->pg_mirror_count; i++) { for (i = 0; i < pgio->pg_mirror_count; i++) {
ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true); ds = nfs4_ff_layout_prepare_ds(pgio->pg_lseg, i, true);
@ -869,11 +868,15 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
} }
return; return;
out_eagain:
pnfs_generic_pg_cleanup(pgio);
pgio->pg_error = -EAGAIN;
return;
out_mds: out_mds:
pnfs_put_lseg(pgio->pg_lseg); pnfs_put_lseg(pgio->pg_lseg);
pgio->pg_lseg = NULL; pgio->pg_lseg = NULL;
nfs_pageio_reset_write_mds(pgio); nfs_pageio_reset_write_mds(pgio);
pgio->pg_error = -EAGAIN;
} }
static unsigned int static unsigned int

View file

@ -1096,6 +1096,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
err = setup_callback_client(clp, &conn, ses); err = setup_callback_client(clp, &conn, ses);
if (err) { if (err) {
nfsd4_mark_cb_down(clp, err); nfsd4_mark_cb_down(clp, err);
if (c)
svc_xprt_put(c->cn_xprt);
return; return;
} }
} }

View file

@ -304,7 +304,7 @@
#define OCFS2_MAX_SLOTS 255 #define OCFS2_MAX_SLOTS 255
/* Slot map indicator for an empty slot */ /* Slot map indicator for an empty slot */
#define OCFS2_INVALID_SLOT -1 #define OCFS2_INVALID_SLOT ((u16)-1)
#define OCFS2_VOL_UUID_LEN 16 #define OCFS2_VOL_UUID_LEN 16
#define OCFS2_MAX_VOL_LABEL_LEN 64 #define OCFS2_MAX_VOL_LABEL_LEN 64
@ -340,8 +340,8 @@ struct ocfs2_system_inode_info {
enum { enum {
BAD_BLOCK_SYSTEM_INODE = 0, BAD_BLOCK_SYSTEM_INODE = 0,
GLOBAL_INODE_ALLOC_SYSTEM_INODE, GLOBAL_INODE_ALLOC_SYSTEM_INODE,
#define OCFS2_FIRST_ONLINE_SYSTEM_INODE GLOBAL_INODE_ALLOC_SYSTEM_INODE
SLOT_MAP_SYSTEM_INODE, SLOT_MAP_SYSTEM_INODE,
#define OCFS2_FIRST_ONLINE_SYSTEM_INODE SLOT_MAP_SYSTEM_INODE
HEARTBEAT_SYSTEM_INODE, HEARTBEAT_SYSTEM_INODE,
GLOBAL_BITMAP_SYSTEM_INODE, GLOBAL_BITMAP_SYSTEM_INODE,
USER_QUOTA_SYSTEM_INODE, USER_QUOTA_SYSTEM_INODE,

View file

@ -2863,9 +2863,12 @@ int ocfs2_test_inode_bit(struct ocfs2_super *osb, u64 blkno, int *res)
goto bail; goto bail;
} }
inode_alloc_inode = if (suballoc_slot == (u16)OCFS2_INVALID_SLOT)
ocfs2_get_system_file_inode(osb, INODE_ALLOC_SYSTEM_INODE, inode_alloc_inode = ocfs2_get_system_file_inode(osb,
suballoc_slot); GLOBAL_INODE_ALLOC_SYSTEM_INODE, suballoc_slot);
else
inode_alloc_inode = ocfs2_get_system_file_inode(osb,
INODE_ALLOC_SYSTEM_INODE, suballoc_slot);
if (!inode_alloc_inode) { if (!inode_alloc_inode) {
/* the error code could be inaccurate, but we are not able to /* the error code could be inaccurate, but we are not able to
* get the correct one. */ * get the correct one. */

View file

@ -59,7 +59,7 @@ static inline int get_count_order(unsigned int count)
static __always_inline unsigned long hweight_long(unsigned long w) static __always_inline unsigned long hweight_long(unsigned long w)
{ {
return sizeof(w) == 4 ? hweight32(w) : hweight64(w); return sizeof(w) == 4 ? hweight32(w) : hweight64((__u64)w);
} }
/** /**

View file

@ -53,7 +53,7 @@
.popsection ; .popsection ;
#define ELFNOTE(name, type, desc) \ #define ELFNOTE(name, type, desc) \
ELFNOTE_START(name, type, "") \ ELFNOTE_START(name, type, "a") \
desc ; \ desc ; \
ELFNOTE_END ELFNOTE_END

View file

@ -727,9 +727,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part)
static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) static inline void part_nr_sects_write(struct hd_struct *part, sector_t size)
{ {
#if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) #if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP)
preempt_disable();
write_seqcount_begin(&part->nr_sects_seq); write_seqcount_begin(&part->nr_sects_seq);
part->nr_sects = size; part->nr_sects = size;
write_seqcount_end(&part->nr_sects_seq); write_seqcount_end(&part->nr_sects_seq);
preempt_enable();
#elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) #elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT)
preempt_disable(); preempt_disable();
part->nr_sects = size; part->nr_sects = size;

View file

@ -366,6 +366,10 @@ static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)
return this_cpu_ptr(&kprobe_ctlblk); return this_cpu_ptr(&kprobe_ctlblk);
} }
extern struct kprobe kprobe_busy;
void kprobe_busy_begin(void);
void kprobe_busy_end(void);
int register_kprobe(struct kprobe *p); int register_kprobe(struct kprobe *p);
void unregister_kprobe(struct kprobe *p); void unregister_kprobe(struct kprobe *p);
int register_kprobes(struct kprobe **kps, int num); int register_kprobes(struct kprobe **kps, int num);

View file

@ -38,6 +38,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/async.h>
/* /*
* Define if arch has non-standard setup. This is a _PCI_ standard * Define if arch has non-standard setup. This is a _PCI_ standard
@ -872,6 +873,8 @@ struct ata_port {
struct timer_list fastdrain_timer; struct timer_list fastdrain_timer;
unsigned long fastdrain_cnt; unsigned long fastdrain_cnt;
async_cookie_t cookie;
int em_message_type; int em_message_type;
void *private_data; void *private_data;

View file

@ -2496,6 +2496,8 @@
#define PCI_DEVICE_ID_KORENIX_JETCARDF2 0x1700 #define PCI_DEVICE_ID_KORENIX_JETCARDF2 0x1700
#define PCI_DEVICE_ID_KORENIX_JETCARDF3 0x17ff #define PCI_DEVICE_ID_KORENIX_JETCARDF3 0x17ff
#define PCI_VENDOR_ID_HUAWEI 0x19e5
#define PCI_VENDOR_ID_NETRONOME 0x19ee #define PCI_VENDOR_ID_NETRONOME 0x19ee
#define PCI_DEVICE_ID_NETRONOME_NFP3200 0x3200 #define PCI_DEVICE_ID_NETRONOME_NFP3200 0x3200
#define PCI_DEVICE_ID_NETRONOME_NFP3240 0x3240 #define PCI_DEVICE_ID_NETRONOME_NFP3240 0x3240

View file

@ -357,11 +357,13 @@ typedef enum {
ipv4_is_anycast_6to4(a)) ipv4_is_anycast_6to4(a))
/* Flags used for the bind address copy functions. */ /* Flags used for the bind address copy functions. */
#define SCTP_ADDR6_ALLOWED 0x00000001 /* IPv6 address is allowed by #define SCTP_ADDR4_ALLOWED 0x00000001 /* IPv4 address is allowed by
local sock family */ local sock family */
#define SCTP_ADDR4_PEERSUPP 0x00000002 /* IPv4 address is supported by #define SCTP_ADDR6_ALLOWED 0x00000002 /* IPv6 address is allowed by
local sock family */
#define SCTP_ADDR4_PEERSUPP 0x00000004 /* IPv4 address is supported by
peer */ peer */
#define SCTP_ADDR6_PEERSUPP 0x00000004 /* IPv6 address is supported by #define SCTP_ADDR6_PEERSUPP 0x00000008 /* IPv6 address is supported by
peer */ peer */
/* Reasons to retransmit. */ /* Reasons to retransmit. */

View file

@ -1682,7 +1682,6 @@ static inline int sk_tx_queue_get(const struct sock *sk)
static inline void sk_set_socket(struct sock *sk, struct socket *sock) static inline void sk_set_socket(struct sock *sk, struct socket *sock)
{ {
sk_tx_queue_clear(sk);
sk->sk_socket = sock; sk->sk_socket = sock;
} }

View file

@ -561,11 +561,12 @@ static void kprobe_optimizer(struct work_struct *work)
do_free_cleaned_kprobes(); do_free_cleaned_kprobes();
mutex_unlock(&module_mutex); mutex_unlock(&module_mutex);
mutex_unlock(&kprobe_mutex);
/* Step 5: Kick optimizer again if needed */ /* Step 5: Kick optimizer again if needed */
if (!list_empty(&optimizing_list) || !list_empty(&unoptimizing_list)) if (!list_empty(&optimizing_list) || !list_empty(&unoptimizing_list))
kick_kprobe_optimizer(); kick_kprobe_optimizer();
mutex_unlock(&kprobe_mutex);
} }
/* Wait for completing optimization and unoptimization */ /* Wait for completing optimization and unoptimization */
@ -1149,6 +1150,26 @@ __releases(hlist_lock)
} }
NOKPROBE_SYMBOL(kretprobe_table_unlock); NOKPROBE_SYMBOL(kretprobe_table_unlock);
struct kprobe kprobe_busy = {
.addr = (void *) get_kprobe,
};
void kprobe_busy_begin(void)
{
struct kprobe_ctlblk *kcb;
preempt_disable();
__this_cpu_write(current_kprobe, &kprobe_busy);
kcb = get_kprobe_ctlblk();
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
}
void kprobe_busy_end(void)
{
__this_cpu_write(current_kprobe, NULL);
preempt_enable();
}
/* /*
* This function is called from finish_task_switch when task tk becomes dead, * This function is called from finish_task_switch when task tk becomes dead,
* so that we can recycle any function-return probe instances associated * so that we can recycle any function-return probe instances associated
@ -1166,6 +1187,8 @@ void kprobe_flush_task(struct task_struct *tk)
/* Early boot. kretprobe_table_locks not yet initialized. */ /* Early boot. kretprobe_table_locks not yet initialized. */
return; return;
kprobe_busy_begin();
INIT_HLIST_HEAD(&empty_rp); INIT_HLIST_HEAD(&empty_rp);
hash = hash_ptr(tk, KPROBE_HASH_BITS); hash = hash_ptr(tk, KPROBE_HASH_BITS);
head = &kretprobe_inst_table[hash]; head = &kretprobe_inst_table[hash];
@ -1179,6 +1202,8 @@ void kprobe_flush_task(struct task_struct *tk)
hlist_del(&ri->hlist); hlist_del(&ri->hlist);
kfree(ri); kfree(ri);
} }
kprobe_busy_end();
} }
NOKPROBE_SYMBOL(kprobe_flush_task); NOKPROBE_SYMBOL(kprobe_flush_task);

View file

@ -3819,7 +3819,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
if (dl_prio(prio)) { if (dl_prio(prio)) {
struct task_struct *pi_task = rt_mutex_get_top_task(p); struct task_struct *pi_task = rt_mutex_get_top_task(p);
if (!dl_prio(p->normal_prio) || if (!dl_prio(p->normal_prio) ||
(pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { (pi_task && dl_prio(pi_task->prio) &&
dl_entity_preempt(&pi_task->dl, &p->dl))) {
p->dl.dl_boosted = 1; p->dl.dl_boosted = 1;
queue_flag |= ENQUEUE_REPLENISH; queue_flag |= ENQUEUE_REPLENISH;
} else } else

View file

@ -15,6 +15,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* *
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/blktrace_api.h> #include <linux/blktrace_api.h>
@ -481,6 +484,16 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
*/ */
strreplace(buts->name, '/', '_'); strreplace(buts->name, '/', '_');
/*
* bdev can be NULL, as with scsi-generic, this is a helpful as
* we can be.
*/
if (q->blk_trace) {
pr_warn("Concurrent blktraces are not allowed on %s\n",
buts->name);
return -EBUSY;
}
bt = kzalloc(sizeof(*bt), GFP_KERNEL); bt = kzalloc(sizeof(*bt), GFP_KERNEL);
if (!bt) if (!bt)
return -ENOMEM; return -ENOMEM;

View file

@ -204,11 +204,17 @@ static int event_trigger_regex_open(struct inode *inode, struct file *file)
static int trigger_process_regex(struct trace_event_file *file, char *buff) static int trigger_process_regex(struct trace_event_file *file, char *buff)
{ {
char *command, *next = buff; char *command, *next;
struct event_command *p; struct event_command *p;
int ret = -EINVAL; int ret = -EINVAL;
next = buff = skip_spaces(buff);
command = strsep(&next, ": \t"); command = strsep(&next, ": \t");
if (next) {
next = skip_spaces(next);
if (!*next)
next = NULL;
}
command = (command[0] != '!') ? command : command + 1; command = (command[0] != '!') ? command : command + 1;
mutex_lock(&trigger_cmd_mutex); mutex_lock(&trigger_cmd_mutex);
@ -615,8 +621,14 @@ event_trigger_callback(struct event_command *cmd_ops,
int ret; int ret;
/* separate the trigger from the filter (t:n [if filter]) */ /* separate the trigger from the filter (t:n [if filter]) */
if (param && isdigit(param[0])) if (param && isdigit(param[0])) {
trigger = strsep(&param, " \t"); trigger = strsep(&param, " \t");
if (param) {
param = skip_spaces(param);
if (!*param)
param = NULL;
}
}
trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
@ -1185,6 +1197,11 @@ event_enable_trigger_func(struct event_command *cmd_ops,
trigger = strsep(&param, " \t"); trigger = strsep(&param, " \t");
if (!trigger) if (!trigger)
return -EINVAL; return -EINVAL;
if (param) {
param = skip_spaces(param);
if (!*param)
param = NULL;
}
system = strsep(&trigger, ":"); system = strsep(&trigger, ":");
if (!trigger) if (!trigger)

View file

@ -10,17 +10,6 @@
#ifndef ASMINF #ifndef ASMINF
/* Allow machine dependent optimization for post-increment or pre-increment.
Based on testing to date,
Pre-increment preferred for:
- PowerPC G3 (Adler)
- MIPS R5000 (Randers-Pehrson)
Post-increment preferred for:
- none
No measurable difference:
- Pentium III (Anderson)
- M68060 (Nikl)
*/
union uu { union uu {
unsigned short us; unsigned short us;
unsigned char b[2]; unsigned char b[2];
@ -38,16 +27,6 @@ get_unaligned16(const unsigned short *p)
return mm.us; return mm.us;
} }
#ifdef POSTINC
# define OFF 0
# define PUP(a) *(a)++
# define UP_UNALIGNED(a) get_unaligned16((a)++)
#else
# define OFF 1
# define PUP(a) *++(a)
# define UP_UNALIGNED(a) get_unaligned16(++(a))
#endif
/* /*
Decode literal, length, and distance codes and write out the resulting Decode literal, length, and distance codes and write out the resulting
literal and match bytes until either not enough input or output is literal and match bytes until either not enough input or output is
@ -115,9 +94,9 @@ void inflate_fast(z_streamp strm, unsigned start)
/* copy state to local variables */ /* copy state to local variables */
state = (struct inflate_state *)strm->state; state = (struct inflate_state *)strm->state;
in = strm->next_in - OFF; in = strm->next_in;
last = in + (strm->avail_in - 5); last = in + (strm->avail_in - 5);
out = strm->next_out - OFF; out = strm->next_out;
beg = out - (start - strm->avail_out); beg = out - (start - strm->avail_out);
end = out + (strm->avail_out - 257); end = out + (strm->avail_out - 257);
#ifdef INFLATE_STRICT #ifdef INFLATE_STRICT
@ -138,9 +117,9 @@ void inflate_fast(z_streamp strm, unsigned start)
input data or output space */ input data or output space */
do { do {
if (bits < 15) { if (bits < 15) {
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
this = lcode[hold & lmask]; this = lcode[hold & lmask];
@ -150,14 +129,14 @@ void inflate_fast(z_streamp strm, unsigned start)
bits -= op; bits -= op;
op = (unsigned)(this.op); op = (unsigned)(this.op);
if (op == 0) { /* literal */ if (op == 0) { /* literal */
PUP(out) = (unsigned char)(this.val); *out++ = (unsigned char)(this.val);
} }
else if (op & 16) { /* length base */ else if (op & 16) { /* length base */
len = (unsigned)(this.val); len = (unsigned)(this.val);
op &= 15; /* number of extra bits */ op &= 15; /* number of extra bits */
if (op) { if (op) {
if (bits < op) { if (bits < op) {
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
len += (unsigned)hold & ((1U << op) - 1); len += (unsigned)hold & ((1U << op) - 1);
@ -165,9 +144,9 @@ void inflate_fast(z_streamp strm, unsigned start)
bits -= op; bits -= op;
} }
if (bits < 15) { if (bits < 15) {
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
this = dcode[hold & dmask]; this = dcode[hold & dmask];
@ -180,10 +159,10 @@ void inflate_fast(z_streamp strm, unsigned start)
dist = (unsigned)(this.val); dist = (unsigned)(this.val);
op &= 15; /* number of extra bits */ op &= 15; /* number of extra bits */
if (bits < op) { if (bits < op) {
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
if (bits < op) { if (bits < op) {
hold += (unsigned long)(PUP(in)) << bits; hold += (unsigned long)(*in++) << bits;
bits += 8; bits += 8;
} }
} }
@ -205,13 +184,13 @@ void inflate_fast(z_streamp strm, unsigned start)
state->mode = BAD; state->mode = BAD;
break; break;
} }
from = window - OFF; from = window;
if (write == 0) { /* very common case */ if (write == 0) { /* very common case */
from += wsize - op; from += wsize - op;
if (op < len) { /* some from window */ if (op < len) { /* some from window */
len -= op; len -= op;
do { do {
PUP(out) = PUP(from); *out++ = *from++;
} while (--op); } while (--op);
from = out - dist; /* rest from output */ from = out - dist; /* rest from output */
} }
@ -222,14 +201,14 @@ void inflate_fast(z_streamp strm, unsigned start)
if (op < len) { /* some from end of window */ if (op < len) { /* some from end of window */
len -= op; len -= op;
do { do {
PUP(out) = PUP(from); *out++ = *from++;
} while (--op); } while (--op);
from = window - OFF; from = window;
if (write < len) { /* some from start of window */ if (write < len) { /* some from start of window */
op = write; op = write;
len -= op; len -= op;
do { do {
PUP(out) = PUP(from); *out++ = *from++;
} while (--op); } while (--op);
from = out - dist; /* rest from output */ from = out - dist; /* rest from output */
} }
@ -240,21 +219,21 @@ void inflate_fast(z_streamp strm, unsigned start)
if (op < len) { /* some from window */ if (op < len) { /* some from window */
len -= op; len -= op;
do { do {
PUP(out) = PUP(from); *out++ = *from++;
} while (--op); } while (--op);
from = out - dist; /* rest from output */ from = out - dist; /* rest from output */
} }
} }
while (len > 2) { while (len > 2) {
PUP(out) = PUP(from); *out++ = *from++;
PUP(out) = PUP(from); *out++ = *from++;
PUP(out) = PUP(from); *out++ = *from++;
len -= 3; len -= 3;
} }
if (len) { if (len) {
PUP(out) = PUP(from); *out++ = *from++;
if (len > 1) if (len > 1)
PUP(out) = PUP(from); *out++ = *from++;
} }
} }
else { else {
@ -264,29 +243,29 @@ void inflate_fast(z_streamp strm, unsigned start)
from = out - dist; /* copy direct from output */ from = out - dist; /* copy direct from output */
/* minimum length is three */ /* minimum length is three */
/* Align out addr */ /* Align out addr */
if (!((long)(out - 1 + OFF) & 1)) { if (!((long)(out - 1) & 1)) {
PUP(out) = PUP(from); *out++ = *from++;
len--; len--;
} }
sout = (unsigned short *)(out - OFF); sout = (unsigned short *)(out);
if (dist > 2) { if (dist > 2) {
unsigned short *sfrom; unsigned short *sfrom;
sfrom = (unsigned short *)(from - OFF); sfrom = (unsigned short *)(from);
loops = len >> 1; loops = len >> 1;
do do
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
PUP(sout) = PUP(sfrom); *sout++ = *sfrom++;
#else #else
PUP(sout) = UP_UNALIGNED(sfrom); *sout++ = get_unaligned16(sfrom++);
#endif #endif
while (--loops); while (--loops);
out = (unsigned char *)sout + OFF; out = (unsigned char *)sout;
from = (unsigned char *)sfrom + OFF; from = (unsigned char *)sfrom;
} else { /* dist == 1 or dist == 2 */ } else { /* dist == 1 or dist == 2 */
unsigned short pat16; unsigned short pat16;
pat16 = *(sout-1+OFF); pat16 = *(sout-1);
if (dist == 1) { if (dist == 1) {
union uu mm; union uu mm;
/* copy one char pattern to both bytes */ /* copy one char pattern to both bytes */
@ -296,12 +275,12 @@ void inflate_fast(z_streamp strm, unsigned start)
} }
loops = len >> 1; loops = len >> 1;
do do
PUP(sout) = pat16; *sout++ = pat16;
while (--loops); while (--loops);
out = (unsigned char *)sout + OFF; out = (unsigned char *)sout;
} }
if (len & 1) if (len & 1)
PUP(out) = PUP(from); *out++ = *from++;
} }
} }
else if ((op & 64) == 0) { /* 2nd level distance code */ else if ((op & 64) == 0) { /* 2nd level distance code */
@ -336,8 +315,8 @@ void inflate_fast(z_streamp strm, unsigned start)
hold &= (1U << bits) - 1; hold &= (1U << bits) - 1;
/* update state and return */ /* update state and return */
strm->next_in = in + OFF; strm->next_in = in;
strm->next_out = out + OFF; strm->next_out = out;
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
strm->avail_out = (unsigned)(out < end ? strm->avail_out = (unsigned)(out < end ?
257 + (end - out) : 257 - (out - end)); 257 + (end - out) : 257 - (out - end));

View file

@ -1271,7 +1271,7 @@ void kzfree(const void *p)
if (unlikely(ZERO_OR_NULL_PTR(mem))) if (unlikely(ZERO_OR_NULL_PTR(mem)))
return; return;
ks = ksize(mem); ks = ksize(mem);
memset(mem, 0, ks); memzero_explicit(mem, ks);
kfree(mem); kfree(mem);
} }
EXPORT_SYMBOL(kzfree); EXPORT_SYMBOL(kzfree);

Some files were not shown because too many files have changed in this diff Show more