Linux 4.19.107
Greg KH
maintainerI'm announcing the release of the 4.19.107 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
MAINTAINERS | 2 Makefile | 2 arch/powerpc/kernel/signal.c | 17 + arch/powerpc/kernel/signal_32.c | 28 +- arch/powerpc/kernel/signal_64.c | 22 - arch/s390/include/asm/page.h | 2 arch/x86/include/asm/kvm_host.h | 2 arch/x86/include/asm/msr-index.h | 2 arch/x86/kernel/cpu/amd.c | 14 + arch/x86/kernel/cpu/mcheck/mce_amd.c | 50 ++-- arch/x86/kvm/irq_comm.c | 2 arch/x86/kvm/lapic.c | 9 arch/x86/kvm/svm.c | 7 arch/x86/kvm/vmx.c | 112 +++++++-- drivers/ata/ahci.c | 7 drivers/ata/libata-core.c | 21 + drivers/block/floppy.c | 7 drivers/char/random.c | 5 drivers/dma/imx-sdma.c | 19 - drivers/gpu/drm/amd/amdgpu/soc15.c | 7 drivers/gpu/drm/nouveau/dispnv50/wndw.c | 2 drivers/infiniband/ulp/isert/ib_isert.c | 12 + drivers/iommu/qcom_iommu.c | 28 +- drivers/nvme/host/multipath.c | 1 drivers/staging/android/ashmem.c | 28 ++ drivers/staging/greybus/audio_manager.c | 2 drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | 4 drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c | 5 drivers/staging/rtl8723bs/os_dep/ioctl_linux.c | 4 drivers/staging/vt6656/dpc.c | 2 drivers/target/iscsi/iscsi_target.c | 16 - drivers/thunderbolt/switch.c | 7 drivers/tty/serdev/serdev-ttyport.c | 6 drivers/tty/serial/8250/8250_aspeed_vuart.c | 1 drivers/tty/serial/8250/8250_core.c | 5 drivers/tty/serial/8250/8250_of.c | 1 drivers/tty/serial/8250/8250_port.c | 4 drivers/tty/serial/atmel_serial.c | 3 drivers/tty/serial/imx.c | 2 drivers/tty/serial/qcom_geni_serial.c | 284 +++++++++++-------------- drivers/tty/tty_port.c | 5 drivers/tty/vt/selection.c | 9 drivers/tty/vt/vt.c | 15 + drivers/tty/vt/vt_ioctl.c | 17 - drivers/usb/core/config.c | 11 drivers/usb/core/hub.c | 20 + drivers/usb/core/hub.h | 1 drivers/usb/core/quirks.c | 40 +++ drivers/usb/core/usb.h | 3 drivers/usb/dwc2/gadget.c | 40 ++- drivers/usb/dwc3/gadget.c | 3 drivers/usb/gadget/composite.c | 8 drivers/usb/host/xhci-hub.c | 25 +- drivers/usb/host/xhci-mem.c | 71 ++++-- drivers/usb/host/xhci-pci.c | 10 drivers/usb/host/xhci-ring.c | 60 +++-- drivers/usb/host/xhci.h | 16 + drivers/usb/misc/iowarrior.c | 31 ++ drivers/usb/storage/uas.c | 23 +- drivers/xen/preempt.c | 4 fs/btrfs/disk-io.c | 2 fs/btrfs/inode.c | 16 + fs/btrfs/ordered-data.c | 7 fs/ecryptfs/crypto.c | 6 fs/ecryptfs/keystore.c | 2 fs/ecryptfs/messaging.c | 1 fs/ext4/balloc.c | 14 - fs/ext4/ext4.h | 39 ++- fs/ext4/ialloc.c | 23 +- fs/ext4/inode.c | 16 - fs/ext4/mballoc.c | 61 +++-- fs/ext4/migrate.c | 27 +- fs/ext4/namei.c | 1 fs/ext4/resize.c | 62 ++++- fs/ext4/super.c | 113 ++++++--- fs/jbd2/transaction.c | 8 include/linux/intel-svm.h | 2 include/linux/irqdomain.h | 2 include/linux/libata.h | 1 include/linux/tty.h | 2 include/linux/usb/quirks.h | 3 include/scsi/iscsi_proto.h | 1 include/sound/rawmidi.h | 6 ipc/sem.c | 6 kernel/bpf/offload.c | 2 kernel/irq/internals.h | 2 kernel/irq/manage.c | 18 - kernel/irq/proc.c | 22 + lib/stackdepot.c | 8 mm/memcontrol.c | 4 mm/vmscan.c | 9 net/netfilter/xt_hashlimit.c | 10 net/rxrpc/call_object.c | 22 + sound/core/seq/seq_clientmgr.c | 4 sound/core/seq/seq_queue.c | 29 +- sound/core/seq/seq_timer.c | 13 - sound/core/seq/seq_timer.h | 3 sound/hda/hdmi_chmap.c | 2 sound/pci/hda/hda_codec.c | 2 sound/pci/hda/hda_eld.c | 2 sound/pci/hda/hda_sysfs.c | 4 sound/pci/hda/patch_realtek.c | 2 sound/soc/sunxi/sun8i-codec.c | 3 103 files changed, 1169 insertions(+), 579 deletions(-)
Aditya Pakki (1):
ecryptfs: replace BUG_ON with error handling code
Alan Stern (1):
USB: hub: Don't record a connect-change event during reset-resume
Alex Deucher (1):
drm/amdgpu/soc15: fix xclk for raven
Alexander Potapenko (1):
lib/stackdepot.c: fix global out-of-bounds in stack_slabs
Andy Shevchenko (1):
serial: 8250: Check UPF_IRQ_SHARED in advance
Anurag Kumar Vulisha (1):
usb: dwc3: gadget: Check for IOC/LST bit in TRB->ctrl fields
Bart Van Assche (2):
scsi: Revert "RDMA/isert: Fix a recently introduced regression related to logout"
scsi: Revert "target: iscsi: Wait for all commands to finish before freeing a session"
Borislav Petkov (1):
x86/mce/amd: Publish the bank pointer only after setup has succeeded
Colin Ian King (1):
staging: rtl8723bs: fix copy of overlapping memory
Cong Wang (1):
netfilter: xt_hashlimit: limit the max size of hashtable
Dan Carpenter (1):
staging: greybus: use after free in gb_audio_manager_remove_all()
David Howells (1):
rxrpc: Fix call RCU cleanup using non-bh-safe locks
EJ Hsu (1):
usb: uas: fix a plug & unplug racing
Eric Biggers (2):
ext4: rename s_journal_flag_rwsem to s_writepages_rwsem
ext4: fix race between writepages and enabling EXT4_EXTENTS_FL
Eric Dumazet (1):
vt: vt_ioctl: fix race in VT_RESIZEX
Filipe Manana (1):
Btrfs: fix btrfs_wait_ordered_range() so that it waits for all ordered extents
Fugang Duan (1):
tty: serial: imx: setup the correct sg entry for tx dma
Gavin Shan (1):
mm/vmscan.c: don't round up scan size for online memory cgroup
Greg Kroah-Hartman (6):
USB: misc: iowarrior: add support for 2 OEMed devices
USB: misc: iowarrior: add support for the 28 and 28L devices
USB: misc: iowarrior: add support for the 100 device Revert "dmaengine: imx-sdma: Fix memory leak" Revert "char/random: silence a lockdep splat with printk()" Linux 4.19.107
Gustavo Luiz Duarte (1):
powerpc/tm: Fix clearing MSR[TS] in current when reclaiming on signal delivery
Hardik Gajjar (1):
USB: hub: Fix the broken detection of USB3 device in SMSC hub
Ioanna Alifieraki (1):
Revert "ipc,sem: remove uneeded sem_undo_list lock usage in exit_sem()"
Jack Pham (1):
usb: gadget: composite: Fix bMaxPower for SuperSpeedPlus
Jan Kara (1):
ext4: fix mount failure with quota configured as module
Jani Nikula (1):
MAINTAINERS: Update drm/i915 bug filing URL
Jiri Slaby (1):
vt: selection, handle pending signals in paste_selection
Joerg Roedel (1):
iommu/vt-d: Fix compile warning from intel-svm.h
Johan Hovold (3):
USB: core: add endpoint-blacklist quirk
USB: quirks: blacklist duplicate ep on Sound Devices USBPre2
serdev: ttyport: restore client ops on deregistration
Johannes Krude (1):
bpf, offload: Replace bitwise AND by logical AND in bpf_prog_offload_info_fill
Josef Bacik (3):
btrfs: fix bytes_may_use underflow in prealloc error condtition
btrfs: reset fs_root to NULL on error in open_ctree
btrfs: do not check delayed items are empty for single transaction cleanup
Kim Phillips (1):
x86/cpu/amd: Enable the fixed Instructions Retired counter IRPERF
Larry Finger (4):
staging: rtl8188eu: Fix potential security hole
staging: rtl8188eu: Fix potential overuse of kernel memory
staging: rtl8723bs: Fix potential security hole
staging: rtl8723bs: Fix potential overuse of kernel memory
Linus Torvalds (1):
floppy: check FDC index for errors before assigning it
Logan Gunthorpe (1):
nvme-multipath: Fix memory leak with ana_log_buf
Lyude Paul (1):
drm/nouveau/kms/gv100-: Re-set LUT after clearing for modesets
Malcolm Priestley (1):
staging: vt6656: fix sign of rx_dbm to bb_pre_ed_rssi.
Mathias Nyman (4):
xhci: Force Maximum Packet size for Full-speed bulk devices to valid range.
xhci: fix runtime pm enabling for quirky Intel hosts
xhci: Fix memory leak when caching protocol extended capability PSI tables - take 2
xhci: apply XHCI_PME_STUCK_QUIRK to Intel Comet Lake platforms
Miaohe Lin (2):
KVM: x86: don't notify userspace IOAPIC on edge-triggered interrupt EOI
KVM: apic: avoid calculating pending eoi from an uninitialized val
Mika Westerberg (1):
thunderbolt: Prevent crash if non-active NVMem file is read
Minas Harutyunyan (2):
usb: dwc2: Fix SET/CLEAR_FEATURE and GET_STATUS flows
usb: dwc2: Fix in ISOC request length checking
Nathan Chancellor (1):
s390/mm: Explicitly compare PAGE_DEFAULT_KEY against zero in storage_key_init_range
Nicolas Ferre (1):
tty/serial: atmel: manage shutdown in case of RS485 or ISO7816 mode
Nicolas Pitre (1):
vt: fix scrollback flushing on background consoles
Oliver Upton (2):
KVM: nVMX: Refactor IO bitmap checks into helper function
KVM: nVMX: Check IO instruction VM-exit conditions
Paolo Bonzini (1):
KVM: nVMX: Don't emulate instructions in guest mode
Peter Chen (1):
usb: host: xhci: update event ring dequeue pointer on purpose
Prabhakar Kushwaha (1):
ata: ahci: Add shutdown to freeze hardware resources of ahci
Qian Cai (1):
ext4: fix a data race in EXT4_I(inode)->i_disksize
Richard Dodd (1):
USB: Fix novation SourceControl XL after suspend
Robin Murphy (1):
iommu/qcom: Fix bogus detach logic
Ryan Case (5):
tty: serial: qcom_geni_serial: Fix UART hang
tty: serial: qcom_geni_serial: Remove interrupt storm
tty: serial: qcom_geni_serial: Remove use of *_relaxed() and mb()
tty: serial: qcom_geni_serial: Remove set_rfr_wm() and related variables
tty: serial: qcom_geni_serial: Remove xfer_mode variable
Samuel Holland (1):
ASoC: sun8i-codec: Fix setting DAI data format
Shijie Luo (1):
ext4: add cond_resched() to __ext4_find_entry()
Suraj Jitindar Singh (2):
ext4: fix potential race between s_group_info online resizing and access
ext4: fix potential race between s_flex_groups online resizing and access
Suren Baghdasaryan (1):
staging: android: ashmem: Disallow ashmem memory from being remapped
Takashi Iwai (6):
ALSA: hda: Use scnprintf() for printing texts for sysfs/procfs
ALSA: hda/realtek - Apply quirk for MSI GP63, too
ALSA: hda/realtek - Apply quirk for yet another MSI laptop
ALSA: rawmidi: Avoid bit fields for state flags
ALSA: seq: Avoid concurrent access to queue flags
ALSA: seq: Fix concurrent access to queue current tick/time
Theodore Ts'o (1):
ext4: fix potential race between online resizing and write operations
Thomas Gleixner (3):
x86/mce/amd: Fix kobject lifetime genirq/proc: Reject invalid affinity masks (again)
xen: Enable interrupts when calling _cond_resched()
Vasily Averin (1):
mm/memcontrol.c: lost css_put in memcg_expand_shrinker_maps()
Vitaly Kuznetsov (1):
KVM: nVMX: handle nested posted interrupts when apicv is disabled for L1
Wenwen Wang (2):
ecryptfs: fix a memory leak bug in parse_tag_1_packet()
ecryptfs: fix a memory leak bug in ecryptfs_init_messaging()
Zenghui Yu (1):
genirq/irqdomain: Make sure all irq domain flags are distinct
satya priya (1):
tty: serial: qcom_geni_serial: Fix RX cancel command failure
wangyan (1):
jbd2: fix ocfs2 corrupt when clearing block group bits
Greg KH
maintainerMAINTAINERS +1 -1
@@ -7340,7 +7340,7 @@ M: Joonas Lahtinen <[email protected]> M: Rodrigo Vivi <[email protected]> L: [email protected] W: https://01.org/linuxgraphics/ -B: https://01.org/linuxgraphics/documentation/how-report-bugs +B: https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs C: irc://chat.freenode.net/intel-gfx Q: http://patchwork.freedesktop.org/project/intel-gfx/ T: git git://anongit.freedesktop.org/drm-intel
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 106 +SUBLEVEL = 107 EXTRAVERSION = NAME = "People's Front"
arch/powerpc/kernel/signal.c +15 -2
@@ -200,14 +200,27 @@ unsigned long get_tm_stackpointer(struct task_struct *tsk)* normal/non-checkpointed stack pointer. */ +unsigned long ret = tsk->thread.regs->gpr[1 ]; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM BUG_ON (tsk != current);if (MSR_TM_ACTIVE (tsk->thread.regs->msr)) { +preempt_disable ();tm_reclaim_current (TM_CAUSE_SIGNAL );if (MSR_TM_TRANSACTIONAL (tsk->thread.regs->msr)) -return tsk->thread.ckpt_regs.gpr[1 ]; + ret = tsk->thread.ckpt_regs.gpr[1 ]; + +/* +* If we treclaim, we must clear the current thread's TM bits +* before re-enabling preemption. Otherwise we might be +* preempted and have the live MSR[TS] changed behind our back +* (tm_recheckpoint_new_task() would recheckpoint). Besides, we +* enter the signal handler in non-transactional state. +*/ + tsk->thread.regs->msr &= ~MSR_TS_MASK ; +preempt_enable (); }#endif -return tsk->thread.regs->gpr[1 ]; +return ret; }
arch/powerpc/kernel/signal_32.c +14 -14
@@ -493,19 +493,11 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,*/ static int save_tm_user_regs (struct pt_regs *regs,struct mcontext __user *frame, -struct mcontext __user *tm_frame,int sigret) +struct mcontext __user *tm_frame,int sigret, +unsigned long msr) { -unsigned long msr = regs->msr; -WARN_ON (tm_suspend_disabled); -/* Remove TM bits from thread's MSR. The MSR in the sigcontext -* just indicates to userland that we were doing a transaction, but we -* don't want to return in transactional state. This also ensures -* that flush_fp_to_thread won't set TIF_RESTORE_TM again. -*/ - regs->msr &= ~MSR_TS_MASK ; -/* Save both sets of general registers */ if (save_general_regs (¤t->thread.ckpt_regs, frame) ||save_general_regs (regs, tm_frame))
@@ -916,6 +908,10 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,int sigret;unsigned long tramp;struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +/* Save the thread's msr before get_tm_stackpointer() changes it */ +unsigned long msr = regs->msr; +#endif BUG_ON (tsk != current);
@@ -948,13 +944,13 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,#ifdef CONFIG_PPC_TRANSACTIONAL_MEM tm_frame = &rt_sf->uc_transact.uc_mcontext; -if (MSR_TM_ACTIVE (regs->msr)) { +if (MSR_TM_ACTIVE (msr)) {if (__put_user ((unsigned long )&rt_sf->uc_transact, &rt_sf->uc.uc_link) ||__put_user ((unsigned long )tm_frame, &rt_sf->uc_transact.uc_regs)) goto badframe; -if (save_tm_user_regs (regs, frame, tm_frame, sigret)) +if (save_tm_user_regs (regs, frame, tm_frame, sigret, msr)) goto badframe; }else
@@ -1365,6 +1361,10 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,int sigret;unsigned long tramp;struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +/* Save the thread's msr before get_tm_stackpointer() changes it */ +unsigned long msr = regs->msr; +#endif BUG_ON (tsk != current);
@@ -1398,9 +1398,9 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,#ifdef CONFIG_PPC_TRANSACTIONAL_MEM tm_mctx = &frame->mctx_transact; -if (MSR_TM_ACTIVE (regs->msr)) { +if (MSR_TM_ACTIVE (msr)) {if (save_tm_user_regs (regs, &frame->mctx, &frame->mctx_transact, - sigret)) + sigret, msr)) goto badframe; }else
arch/powerpc/kernel/signal_64.c +10 -12
@@ -196,7 +196,8 @@ static long setup_sigcontext(struct sigcontext __user *sc,static long setup_tm_sigcontexts (struct sigcontext __user *sc,struct sigcontext __user *tm_sc,struct task_struct *tsk, -int signr,sigset_t *set,unsigned long handler) +int signr,sigset_t *set,unsigned long handler, +unsigned long msr) {/* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the * process never used altivec yet (MSR_VEC is zero in pt_regs of
@@ -211,12 +212,11 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc,elf_vrreg_t __user *tm_v_regs =sigcontext_vmx_regs (tm_sc);#endif struct pt_regs *regs = tsk->thread.regs; -unsigned long msr = tsk->thread.regs->msr;long err =0 ;BUG_ON (tsk != current); -BUG_ON (!MSR_TM_ACTIVE (regs->msr)); +BUG_ON (!MSR_TM_ACTIVE (msr));WARN_ON (tm_suspend_disabled);
@@ -226,13 +226,6 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc,*/ msr |= tsk->thread.ckpt_regs.msr & (MSR_FP |MSR_VEC |MSR_VSX ); -/* Remove TM bits from thread's MSR. The MSR in the sigcontext -* just indicates to userland that we were doing a transaction, but we -* don't want to return in transactional state. This also ensures -* that flush_fp_to_thread won't set TIF_RESTORE_TM again. -*/ - regs->msr &= ~MSR_TS_MASK ; -#ifdef CONFIG_ALTIVEC err |=__put_user (v_regs, &sc->v_regs); err |=__put_user (tm_v_regs, &tm_sc->v_regs);
@@ -803,6 +796,10 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,unsigned long newsp =0 ;long err =0 ;struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +/* Save the thread's msr before get_tm_stackpointer() changes it */ +unsigned long msr = regs->msr; +#endif BUG_ON (tsk != current);
@@ -820,7 +817,7 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, err |=__put_user (0 , &frame->uc.uc_flags); err |=__save_altstack (&frame->uc.uc_stack, regs->gpr[1 ]);#ifdef CONFIG_PPC_TRANSACTIONAL_MEM -if (MSR_TM_ACTIVE (regs->msr)) { +if (MSR_TM_ACTIVE (msr)) {/* The ucontext_t passed to userland points to the second * ucontext_t (for transactional state) with its uc_link ptr. */
@@ -828,7 +825,8 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, err |=setup_tm_sigcontexts (&frame->uc.uc_mcontext, &frame->uc_transact.uc_mcontext, tsk, ksig->sig,NULL , - (unsigned long )ksig->ka.sa.sa_handler); + (unsigned long )ksig->ka.sa.sa_handler, + msr); } else#endif {
arch/s390/include/asm/page.h +1 -1
@@ -42,7 +42,7 @@ void __storage_key_init_range(unsigned long start, unsigned long end);static inline void storage_key_init_range (unsigned long start,unsigned long end) { -if (PAGE_DEFAULT_KEY ) +if (PAGE_DEFAULT_KEY !=0 )__storage_key_init_range (start, end); }
arch/x86/include/asm/kvm_host.h +1 -1
@@ -1040,7 +1040,7 @@ struct kvm_x86_ops {void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu,u64 *eoi_exit_bitmap);void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu);void (*set_apic_access_page_addr)(struct kvm_vcpu *vcpu,hpa_t hpa); -void (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu,int vector); +int (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu,int vector);int (*sync_pir_to_irr)(struct kvm_vcpu *vcpu);int (*set_tss_addr)(struct kvm *kvm,unsigned int addr);int (*set_identity_map_addr)(struct kvm *kvm,u64 ident_addr);
arch/x86/include/asm/msr-index.h +2 -0
@@ -455,6 +455,8 @@#define MSR_K7_HWCR 0xc0010015#define MSR_K7_HWCR_SMMLOCK_BIT 0#define MSR_K7_HWCR_SMMLOCK BIT_ULL(MSR_K7_HWCR_SMMLOCK_BIT) +#define MSR_K7_HWCR_IRPERF_EN_BIT 30 +#define MSR_K7_HWCR_IRPERF_EN BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT)#define MSR_K7_FID_VID_CTL 0xc0010041#define MSR_K7_FID_VID_STATUS 0xc0010042
arch/x86/kernel/cpu/amd.c +14 -0
@@ -25,6 +25,7 @@static const int amd_erratum_383[];static const int amd_erratum_400[]; +static const int amd_erratum_1054[];static bool cpu_has_amd_erratum (struct cpuinfo_x86 *cpu,const int *erratum);/*
@@ -983,6 +984,15 @@ static void init_amd(struct cpuinfo_x86 *c)/* AMD CPUs don't reset SS attributes on SYSRET, Xen does. */ if (!cpu_has (c,X86_FEATURE_XENPV ))set_cpu_bug (c,X86_BUG_SYSRET_SS_ATTRS ); + +/* +* Turn on the Instructions Retired free counter on machines not +* susceptible to erratum #1054 "Instructions Retired Performance +* Counter May Be Inaccurate". +*/ +if (cpu_has (c,X86_FEATURE_IRPERF ) && + !cpu_has_amd_erratum (c, amd_erratum_1054)) +msr_set_bit (MSR_K7_HWCR ,MSR_K7_HWCR_IRPERF_EN_BIT ); }#ifdef CONFIG_X86_32
@@ -1110,6 +1120,10 @@ static const int amd_erratum_400[] =static const int amd_erratum_383[] =AMD_OSVW_ERRATUM (3 ,AMD_MODEL_RANGE (0x10 ,0 ,0 ,0xff ,0xf )); +/* #1054: Instructions Retired Performance Counter May Be Inaccurate */ +static const int amd_erratum_1054[] = +AMD_OSVW_ERRATUM (0 ,AMD_MODEL_RANGE (0x17 ,0 ,0 ,0x2f ,0xf )); +static bool cpu_has_amd_erratum (struct cpuinfo_x86 *cpu,const int *erratum) {
arch/x86/kernel/cpu/mcheck/mce_amd.c +27 -23
105 lines not on this page · raw message
arch/x86/kvm/irq_comm.c +1 -1
@@ -427,7 +427,7 @@ void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,kvm_set_msi_irq (vcpu->kvm, entry, &irq); -if (irq.level &&kvm_apic_match_dest (vcpu,NULL ,0 , +if (irq.trig_mode &&kvm_apic_match_dest (vcpu,NULL ,0 , irq.dest_id, irq.dest_mode))__set_bit (irq.vector, ioapic_handled_vectors); }
arch/x86/kvm/lapic.c +4 -5
@@ -633,9 +633,11 @@ static inline bool pv_eoi_enabled(struct kvm_vcpu *vcpu)static bool pv_eoi_get_pending (struct kvm_vcpu *vcpu) {u8 val; -if (pv_eoi_get_user (vcpu, &val) <0 ) +if (pv_eoi_get_user (vcpu, &val) <0 ) {apic_debug ("Can't read EOI MSR value: 0x%llx\n" , (unsigned long long )vcpu->arch.pv_eoi.msr_val); +return false; + }return val &0x1 ; }
@@ -1060,11 +1062,8 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,apic_clear_vector (vector, apic->regs +APIC_TMR ); } -if (vcpu->arch.apicv_active) - kvm_x86_ops->deliver_posted_interrupt (vcpu, vector); -else { +if (kvm_x86_ops->deliver_posted_interrupt (vcpu, vector)) {kvm_lapic_set_irr (vector, apic); -kvm_make_request (KVM_REQ_EVENT , vcpu);kvm_vcpu_kick (vcpu); }
arch/x86/kvm/svm.c +6 -1
@@ -5140,8 +5140,11 @@ static void svm_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)return ; } -static void svm_deliver_avic_intr (struct kvm_vcpu *vcpu,int vec) +static int svm_deliver_avic_intr (struct kvm_vcpu *vcpu,int vec) { +if (!vcpu->arch.apicv_active) +return -1 ; +kvm_lapic_set_irr (vec, vcpu->arch.apic);smp_mb__after_atomic ();
@@ -5150,6 +5153,8 @@ static void svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) kvm_cpu_get_apicid(vcpu->cpu)); elsekvm_vcpu_wake_up (vcpu ); + +return 0 ; }static bool svm_dy_apicv_has_pending_interrupt (struct kvm_vcpu *vcpu)
arch/x86/kvm/vmx.c +88 -24
166 lines not on this page · raw message
drivers/ata/ahci.c +7 -0
@@ -96,6 +96,7 @@ enum board_ids {static int ahci_init_one (struct pci_dev *pdev,const struct pci_device_id *ent);static void ahci_remove_one (struct pci_dev *dev); +static void ahci_shutdown_one (struct pci_dev *dev);static int ahci_vt8251_hardreset (struct ata_link *link,unsigned int *class,unsigned long deadline); static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
@@ -609,6 +610,7 @@ static struct pci_driver ahci_pci_driver = { .id_table = ahci_pci_tbl, .probe = ahci_init_one, .remove = ahci_remove_one, + .shutdown = ahci_shutdown_one, .driver = { .pm = &ahci_pci_pm_ops, },
@@ -1897,6 +1899,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)return 0 ; } +static void ahci_shutdown_one (struct pci_dev *pdev) +{ +ata_pci_shutdown_one (pdev); +} +static void ahci_remove_one (struct pci_dev *pdev) {pm_runtime_get_noresume (&pdev->dev);
drivers/ata/libata-core.c +21 -0
@@ -6780,6 +6780,26 @@ void ata_pci_remove_one(struct pci_dev *pdev)ata_host_detach (host); } +void ata_pci_shutdown_one (struct pci_dev *pdev) +{ +struct ata_host *host =pci_get_drvdata (pdev); +int i; + +for (i =0 ; i < host->n_ports; i++) { +struct ata_port *ap = host->ports[i]; + + ap->pflags |=ATA_PFLAG_FROZEN ; + +/* Disable port interrupts */ +if (ap->ops->freeze) + ap->ops->freeze (ap); + +/* Stop the port DMA engines */ +if (ap->ops->port_stop) + ap->ops->port_stop (ap); + } +} +/* move to PCI subsystem */ int pci_test_config_bits (struct pci_dev *pdev,const struct pci_bits *bits) {
@@ -7400,6 +7420,7 @@ EXPORT_SYMBOL_GPL(ata_timing_cycle2mode);#ifdef CONFIG_PCI EXPORT_SYMBOL_GPL (pci_test_config_bits); +EXPORT_SYMBOL_GPL (ata_pci_shutdown_one);EXPORT_SYMBOL_GPL (ata_pci_remove_one);#ifdef CONFIG_PM EXPORT_SYMBOL_GPL (ata_pci_device_do_suspend);
drivers/block/floppy.c +5 -2
@@ -852,14 +852,17 @@ static void reset_fdc_info(int mode)/* selects the fdc and drive, and enables the fdc's input/dma. */ static void set_fdc (int drive) { +unsigned int new_fdc = fdc; +if (drive >=0 && drive <N_DRIVE ) { - fdc =FDC (drive); + new_fdc =FDC (drive); current_drive = drive; } -if (fdc !=1 && fdc !=0 ) { +if (new_fdc >=N_FDC ) {pr_info ("bad fdc value\n" );return ; } + fdc = new_fdc;set_dor (fdc, ~0 ,8 );#if N_FDC >1 set_dor (1 - fdc, ~8 ,0 );
drivers/char/random.c +2 -3
@@ -1609,9 +1609,8 @@ static void _warn_unseeded_randomness(const char *func_name, void *caller, print_once = true;#endif if (__ratelimit (&unseeded_warning)) -printk_deferred (KERN_NOTICE "random: %s called from %pS " -"with crng_init=%d\n" , func_name, caller, - crng_init); +pr_notice ("random: %s called from %pS with crng_init=%d\n" , + func_name, caller, crng_init); }/*
drivers/dma/imx-sdma.c +8 -11
@@ -738,8 +738,12 @@ static void sdma_start_desc(struct sdma_channel *sdmac)return ; } sdmac->desc = desc =to_sdma_desc (&vd->tx); - -list_del (&vd->node); +/* +* Do not delete the node in desc_issued list in cyclic mode, otherwise +* the desc allocated will never be freed in vchan_dma_desc_free_list +*/ +if (!(sdmac->flags &IMX_DMA_SG_LOOP )) +list_del (&vd->node); sdma->channel_control[channel].base_bd_ptr = desc->bd_phys; sdma->channel_control[channel].current_bd_ptr = desc->bd_phys;
@@ -1040,6 +1044,7 @@ static void sdma_channel_terminate_work(struct work_struct *work)spin_lock_irqsave (&sdmac->vc.lock, flags);vchan_get_all_descriptors (&sdmac->vc, &head); + sdmac->desc =NULL ;spin_unlock_irqrestore (&sdmac->vc.lock, flags);vchan_dma_desc_free_list (&sdmac->vc, &head); }
@@ -1047,19 +1052,11 @@ static void sdma_channel_terminate_work(struct work_struct *work)static int sdma_disable_channel_async (struct dma_chan *chan) {struct sdma_channel *sdmac =to_sdma_chan (chan); -unsigned long flags; - -spin_lock_irqsave (&sdmac->vc.lock, flags);sdma_disable_channel (chan); -if (sdmac->desc) { -vchan_terminate_vdesc (&sdmac->desc->vd); - sdmac->desc =NULL ; +if (sdmac->desc)schedule_work (&sdmac->terminate_worker); - } - -spin_unlock_irqrestore (&sdmac->vc.lock, flags);return 0 ; }
drivers/gpu/drm/amd/amdgpu/soc15.c +6 -1
@@ -205,7 +205,12 @@ static u32 soc15_get_config_memsize(struct amdgpu_device *adev)static u32 soc15_get_xclk (struct amdgpu_device *adev) { -return adev->clock.spll.reference_freq; +u32 reference_clock = adev->clock.spll.reference_freq; + +if (adev->asic_type ==CHIP_RAVEN ) +return reference_clock /4 ; + +return reference_clock; }
drivers/gpu/drm/nouveau/dispnv50/wndw.c +2 -0
@@ -405,6 +405,8 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state) asyw->clr.ntfy = armw->ntfy.handle !=0 ; asyw->clr.sema = armw->sema.handle !=0 ; asyw->clr.xlut = armw->xlut.handle !=0 ; +if (asyw->clr.xlut && asyw->visible) + asyw->set.xlut = asyw->xlut.handle !=0 ;if (wndw->func->image_clr) asyw->clr.image = armw->image.handle[0 ] !=0 ; }
drivers/infiniband/ulp/isert/ib_isert.c +12 -0
@@ -2584,6 +2584,17 @@ isert_wait4logout(struct isert_conn *isert_conn) } } +static void +isert_wait4cmds (struct iscsi_conn *conn) +{ +isert_info ("iscsi_conn %p\n" , conn); + +if (conn->sess) { +target_sess_cmd_list_set_waiting (conn->sess->se_sess); +target_wait_for_sess_cmds (conn->sess->se_sess); + } +} +/** * isert_put_unsol_pending_cmds() - Drop commands waiting for * unsolicitate dataout
@@ -2631,6 +2642,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)ib_drain_qp (isert_conn->qp);isert_put_unsol_pending_cmds (conn); +isert_wait4cmds (conn);isert_wait4logout (isert_conn);queue_work (isert_release_wq, &isert_conn->release_work);
drivers/iommu/qcom_iommu.c +12 -16
@@ -333,21 +333,19 @@ static void qcom_iommu_domain_free(struct iommu_domain *domain) {struct qcom_iommu_domain *qcom_domain =to_qcom_iommu_domain (domain); -if (WARN_ON (qcom_domain->iommu))/* forgot to detach? */ -return ; -iommu_put_dma_cookie (domain); -/* NOTE: unmap can be called after client device is powered off, -* for example, with GPUs or anything involving dma-buf. So we -* cannot rely on the device_link. Make sure the IOMMU is on to -* avoid unclocked accesses in the TLB inv path: -*/ -pm_runtime_get_sync (qcom_domain->iommu->dev); - -free_io_pgtable_ops (qcom_domain->pgtbl_ops); - -pm_runtime_put_sync (qcom_domain->iommu->dev); +if (qcom_domain->iommu) { +/* +* NOTE: unmap can be called after client device is powered +* off, for example, with GPUs or anything involving dma-buf. +* So we cannot rely on the device_link. Make sure the IOMMU +* is on to avoid unclocked accesses in the TLB inv path: +*/ +pm_runtime_get_sync (qcom_domain->iommu->dev); +free_io_pgtable_ops (qcom_domain->pgtbl_ops); +pm_runtime_put_sync (qcom_domain->iommu->dev); + }kfree (qcom_domain); }
@@ -392,7 +390,7 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *destruct qcom_iommu_domain *qcom_domain =to_qcom_iommu_domain (domain);unsigned i; -if (!qcom_domain->iommu) +if (WARN_ON (!qcom_domain->iommu))return ;pm_runtime_get_sync (qcom_iommu->dev);
@@ -405,8 +403,6 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *de ctx->domain =NULL ; }pm_runtime_put_sync (qcom_iommu->dev); - - qcom_domain->iommu =NULL ; } static int qcom_iommu_map(struct iommu_domain *domain, unsigned long iova,
drivers/nvme/host/multipath.c +1 -0
@@ -569,6 +569,7 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) }INIT_WORK (&ctrl->ana_work, nvme_ana_work); +kfree (ctrl->ana_log_buf); ctrl->ana_log_buf =kmalloc (ctrl->ana_log_size,GFP_KERNEL );if (!ctrl->ana_log_buf) { error = -ENOMEM ;
drivers/staging/android/ashmem.c +28 -0
@@ -350,8 +350,23 @@ static inline vm_flags_t calc_vm_may_flags(unsigned long prot)_calc_vm_trans (prot,PROT_EXEC ,VM_MAYEXEC ); } +static int ashmem_vmfile_mmap (struct file *file,struct vm_area_struct *vma) +{ +/* do not allow to mmap ashmem backing shmem file directly */ +return -EPERM ; +} + +static unsigned long +ashmem_vmfile_get_unmapped_area (struct file *file,unsigned long addr, +unsigned long len,unsigned long pgoff, +unsigned long flags) +{ +return current->mm->get_unmapped_area (file, addr, len, pgoff, flags); +} +static int ashmem_mmap (struct file *file,struct vm_area_struct *vma) { +static struct file_operations vmfile_fops;struct ashmem_area *asma = file->private_data;int ret =0 ;
@@ -392,6 +407,19 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) } vmfile->f_mode |=FMODE_LSEEK ; asma->file = vmfile; +/* +* override mmap operation of the vmfile so that it can't be +* remapped which would lead to creation of a new vma with no +* asma permission checks. Have to override get_unmapped_area +* as well to prevent VM_BUG_ON check for f_ops modification. +*/ +if (!vmfile_fops.mmap) { + vmfile_fops = *vmfile->f_op; + vmfile_fops.mmap = ashmem_vmfile_mmap; + vmfile_fops.get_unmapped_area = + ashmem_vmfile_get_unmapped_area; + } + vmfile->f_op = &vmfile_fops; }get_file (asma->file);
drivers/staging/greybus/audio_manager.c +1 -1
@@ -89,8 +89,8 @@ void gb_audio_manager_remove_all(void)list_for_each_entry_safe (module, next, &modules_list, list) {list_del (&module->list); -kobject_put (&module->kobj);ida_simple_remove (&module_id, module->id); +kobject_put (&module->kobj); } is_empty =list_empty (&modules_list);
drivers/staging/rtl8188eu/os_dep/ioctl_linux.c +2 -2
@@ -2026,7 +2026,7 @@ static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p)struct ieee_param *param;uint ret =0 ; -if (p->length <sizeof (struct ieee_param ) || !p->pointer) { +if (!p->pointer || p->length !=sizeof (struct ieee_param )) { ret = -EINVAL ; goto out; }
@@ -2819,7 +2819,7 @@ static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p) goto out; } -if (!p->pointer) { +if (!p->pointer || p->length !=sizeof (struct ieee_param )) { ret = -EINVAL ; goto out; }
drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c +2 -3
@@ -478,14 +478,13 @@ int rtl8723bs_xmit_thread(void *context)s32 ret;struct adapter *padapter;struct xmit_priv *pxmitpriv; -u8 thread_name[20 ] ="RTWHALXT" ; - +u8 thread_name[20 ]; ret = _SUCCESS; padapter = context; pxmitpriv = &padapter->xmitpriv; -rtw_sprintf (thread_name,20 ,"%s-" ADPT_FMT , thread_name,ADPT_ARG (padapter)); +rtw_sprintf (thread_name,20 ,"RTWHALXT-" ADPT_FMT ,ADPT_ARG (padapter));thread_enter (thread_name);DBG_871X ("start " FUNC_ADPT_FMT "\n" ,FUNC_ADPT_ARG (padapter));
drivers/staging/rtl8723bs/os_dep/ioctl_linux.c +2 -2
@@ -3400,7 +3400,7 @@ static int wpa_supplicant_ioctl(struct net_device *dev, struct iw_point *p)/* down(&ieee->wx_sem); */ -if (p->length <sizeof (struct ieee_param ) || !p->pointer) { +if (!p->pointer || p->length !=sizeof (struct ieee_param )) { ret = -EINVAL ; goto out; }
@@ -4236,7 +4236,7 @@ static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p)/* if (p->length < sizeof(struct ieee_param) || !p->pointer) { */ -if (!p->pointer) { +if (!p->pointer || p->length !=sizeof (*param)) { ret = -EINVAL ; goto out; }
drivers/staging/vt6656/dpc.c +1 -1
@@ -130,7 +130,7 @@ int vnt_rx_data(struct vnt_private *priv, struct vnt_rcb *ptr_rcb,vnt_rf_rssi_to_dbm (priv, *rssi, &rx_dbm); - priv->bb_pre_ed_rssi = (u8 )rx_dbm +1 ; + priv->bb_pre_ed_rssi = (u8)-rx_dbm +1 ; priv->current_rssi = priv->bb_pre_ed_rssi;skb_pull (skb,8 );
drivers/target/iscsi/iscsi_target.c +5 -11
@@ -1157,9 +1157,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, hdr->cmdsn,be32_to_cpu (hdr->data_length), payload_length, conn->cid); -if (target_get_sess_cmd (&cmd->se_cmd, true) <0 ) -return iscsit_add_reject_cmd (cmd, -ISCSI_REASON_WAITING_FOR_LOGOUT , buf); +target_get_sess_cmd (&cmd->se_cmd, true); cmd->sense_reason =transport_lookup_cmd_lun (&cmd->se_cmd,scsilun_to_int (&hdr->lun));
@@ -2000,9 +1998,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, conn->sess->se_sess,0 ,DMA_NONE , TCM_SIMPLE_TAG, cmd->sense_buffer + 2); -if (target_get_sess_cmd (&cmd->se_cmd, true) <0 ) -return iscsit_add_reject_cmd (cmd, -ISCSI_REASON_WAITING_FOR_LOGOUT , buf); +target_get_sess_cmd (&cmd->se_cmd, true);/* * TASK_REASSIGN for ERL=2 / connection stays inside of
@@ -4123,6 +4119,9 @@ int iscsit_close_connection(iscsit_stop_nopin_response_timer (conn);iscsit_stop_nopin_timer (conn); +if (conn->conn_transport->iscsit_wait_conn) + conn->conn_transport->iscsit_wait_conn (conn); +/* * During Connection recovery drop unacknowledged out of order * commands for this connection, and prepare the other commands
@@ -4205,11 +4204,6 @@ int iscsit_close_connection(* must wait until they have completed. */ iscsit_check_conn_usage_count (conn); -target_sess_cmd_list_set_waiting (sess->se_sess); -target_wait_for_sess_cmds (sess->se_sess); - -if (conn->conn_transport->iscsit_wait_conn) - conn->conn_transport->iscsit_wait_conn (conn);ahash_request_free (conn->conn_tx_hash);if (conn->conn_rx_hash) {
drivers/thunderbolt/switch.c +7 -0
@@ -264,6 +264,12 @@ static int tb_switch_nvm_read(void *priv, unsigned int offset, void *val,return ret; } +static int tb_switch_nvm_no_read (void *priv,unsigned int offset,void *val, +size_t bytes) +{ +return -EPERM ; +} +static int tb_switch_nvm_write (void *priv,unsigned int offset,void *val,size_t bytes) {
@@ -309,6 +315,7 @@ static struct nvmem_device *register_nvmem(struct tb_switch *sw, int id, config.read_only = true; }else { config.name ="nvm_non_active" ; + config.reg_read = tb_switch_nvm_no_read; config.reg_write = tb_switch_nvm_write; config.root_only = true; }
drivers/tty/serdev/serdev-ttyport.c +2 -4
@@ -265,7 +265,6 @@ struct device *serdev_tty_port_register(struct tty_port *port,struct device *parent, struct tty_driver *drv, int idx) { - const struct tty_port_client_operations *old_ops; struct serdev_controller *ctrl;struct serport *serport;int ret;
@@ -284,7 +283,6 @@ struct device *serdev_tty_port_register(struct tty_port *port, ctrl->ops = &ctrl_ops; - old_ops = port->client_ops; port->client_ops = &client_ops; port->client_data = ctrl;
@@ -297,7 +295,7 @@ struct device *serdev_tty_port_register(struct tty_port *port, err_reset_data: port->client_data =NULL ; - port->client_ops = old_ops; + port->client_ops = &tty_port_default_client_ops;serdev_controller_put (ctrl);return ERR_PTR (ret);
@@ -312,8 +310,8 @@ int serdev_tty_port_unregister(struct tty_port *port)return -ENODEV ;serdev_controller_remove (ctrl); - port->client_ops =NULL ; port->client_data =NULL ; + port->client_ops = &tty_port_default_client_ops;serdev_controller_put (ctrl);return 0 ;
drivers/tty/serial/8250/8250_aspeed_vuart.c +0 -1
@@ -375,7 +375,6 @@ static int aspeed_vuart_probe(struct platform_device *pdev) port.port.line = rc; port.port.irq =irq_of_parse_and_map (np,0 ); - port.port.irqflags =IRQF_SHARED ; port.port.handle_irq = aspeed_vuart_handle_irq; port.port.iotype =UPIO_MEM ; port.port.type =PORT_16550A ;
drivers/tty/serial/8250/8250_core.c +2 -3
@@ -177,7 +177,7 @@ static int serial_link_irq_chain(struct uart_8250_port *up)struct hlist_head *h;struct hlist_node *n;struct irq_info *i; -int ret, irq_flags = up->port.flags &UPF_SHARE_IRQ ?IRQF_SHARED :0 ; +int ret;mutex_lock (&hash_mutex);
@@ -212,9 +212,8 @@ static int serial_link_irq_chain(struct uart_8250_port *up)INIT_LIST_HEAD (&up->list); i->head = &up->list;spin_unlock_irq (&i->lock); - irq_flags |= up->port.irqflags; ret =request_irq (up->port.irq, serial8250_interrupt, - irq_flags, up->port.name, i); + up->port.irqflags, up->port.name, i);if (ret <0 )serial_do_unlink (i, up); }
drivers/tty/serial/8250/8250_of.c +0 -1
@@ -171,7 +171,6 @@ static int of_platform_serial_setup(struct platform_device *ofdev, port->type = type; port->uartclk = clk; - port->irqflags |=IRQF_SHARED ;if (of_property_read_bool (np,"no-loopback-test" )) port->flags |=UPF_SKIP_TEST ;
drivers/tty/serial/8250/8250_port.c +4 -0
@@ -2253,6 +2253,10 @@ int serial8250_do_startup(struct uart_port *port) } } +/* Check if we need to have shared IRQs */ +if (port->irq && (up->port.flags &UPF_SHARE_IRQ )) + up->port.irqflags |=IRQF_SHARED ; +if (port->irq && !(up->port.flags &UPF_NO_THRE_TEST )) {unsigned char iir1;/*
drivers/tty/serial/atmel_serial.c +2 -1
@@ -490,7 +490,8 @@ static void atmel_stop_tx(struct uart_port *port)atmel_uart_writel (port,ATMEL_US_IDR , atmel_port->tx_done_mask);if (atmel_uart_is_half_duplex (port)) -atmel_start_rx (port); +if (!atomic_read (&atmel_port->tasklet_shutdown)) +atmel_start_rx (port); }
drivers/tty/serial/imx.c +1 -1
@@ -608,7 +608,7 @@ static void imx_uart_dma_tx(struct imx_port *sport) sport->tx_bytes =uart_circ_chars_pending (xmit); -if (xmit->tail < xmit->head) { +if (xmit->tail < xmit->head || xmit->head ==0 ) { sport->dma_tx_nents =1 ;sg_init_one (sgl, xmit->buf + xmit->tail, sport->tx_bytes); }else {
drivers/tty/serial/qcom_geni_serial.c +128 -156
547 lines not on this page · raw message
drivers/tty/tty_port.c +3 -2
@@ -52,10 +52,11 @@ static void tty_port_default_wakeup(struct tty_port *port) } } -static const struct tty_port_client_operations default_client_ops = { +const struct tty_port_client_operations tty_port_default_client_ops = { .receive_buf = tty_port_default_receive_buf, .write_wakeup = tty_port_default_wakeup, }; +EXPORT_SYMBOL_GPL (tty_port_default_client_ops);void tty_port_init (struct tty_port *port) {
@@ -68,7 +69,7 @@ void tty_port_init(struct tty_port *port)spin_lock_init (&port->lock); port->close_delay = (50 *HZ ) /100 ; port->closing_wait = (3000 *HZ ) /100 ; - port->client_ops = &default_client_ops; + port->client_ops = &tty_port_default_client_ops;kref_init (&port->kref); }EXPORT_SYMBOL (tty_port_init);
drivers/tty/vt/selection.c +8 -1
@@ -27,6 +27,8 @@#include <linux/console.h> #include <linux/tty_flip.h> +#include <linux/sched/signal.h> +/* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */ #define isspace (c) ((c) == ' ')
@@ -337,6 +339,7 @@ int paste_selection(struct tty_struct *tty)unsigned int count;struct tty_ldisc *ld;DECLARE_WAITQUEUE (wait, current); +int ret =0 ;console_lock ();poke_blanked_console ();
@@ -350,6 +353,10 @@ int paste_selection(struct tty_struct *tty)add_wait_queue (&vc->paste_wait, &wait);while (sel_buffer && sel_buffer_lth > pasted) {set_current_state (TASK_INTERRUPTIBLE ); +if (signal_pending (current)) { + ret = -EINTR ; +break ; + }if (tty_throttled (tty)) {schedule ();continue ;
@@ -365,5 +372,5 @@ int paste_selection(struct tty_struct *tty)tty_buffer_unlock_exclusive (&vc->port);tty_ldisc_deref (ld); -return 0 ; +return ret; }
drivers/tty/vt/vt.c +13 -2
@@ -936,10 +936,21 @@ static void flush_scrollback(struct vc_data *vc)WARN_CONSOLE_UNLOCKED ();set_origin (vc); -if (vc->vc_sw->con_flush_scrollback) +if (vc->vc_sw->con_flush_scrollback) { vc->vc_sw->con_flush_scrollback (vc); -else + }else if (con_is_visible (vc)) { +/* +* When no con_flush_scrollback method is provided then the +* legacy way for flushing the scrollback buffer is to use +* a side effect of the con_switch method. We do it only on +* the foreground console as background consoles have no +* scrollback buffers in that case and we obviously don't +* want to switch to them. +*/ +hide_cursor (vc); vc->vc_sw->con_switch (vc); +set_cursor (vc); + } }/*
drivers/tty/vt/vt_ioctl.c +11 -6
@@ -876,15 +876,20 @@ int vt_ioctl(struct tty_struct *tty,return -EINVAL ;for (i =0 ; i <MAX_NR_CONSOLES ; i++) { +struct vc_data *vcp; +if (!vc_cons[i].d)continue ;console_lock (); -if (v.v_vlin) - vc_cons[i].d->vc_scan_lines = v.v_vlin; -if (v.v_clin) - vc_cons[i].d->vc_font.height = v.v_clin; - vc_cons[i].d->vc_resize_user =1 ; -vc_resize (vc_cons[i].d, v.v_cols, v.v_rows); + vcp = vc_cons[i].d; +if (vcp) { +if (v.v_vlin) + vcp->vc_scan_lines = v.v_vlin; +if (v.v_clin) + vcp->vc_font.height = v.v_clin; + vcp->vc_resize_user =1 ; +vc_resize (vcp, v.v_cols, v.v_rows); + }console_unlock (); }break ;
drivers/usb/core/config.c +11 -0
@@ -256,6 +256,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, struct usb_host_interface *ifp, int num_ep, unsigned char *buffer, int size) { + struct usb_device *udev = to_usb_device(ddev);unsigned char *buffer0 = buffer;struct usb_endpoint_descriptor *d;struct usb_host_endpoint *endpoint;
@@ -297,6 +298,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, goto skip_to_next_endpoint_or_interface_descriptor; } +/* Ignore blacklisted endpoints */ +if (udev->quirks &USB_QUIRK_ENDPOINT_BLACKLIST ) { +if (usb_endpoint_is_blacklisted (udev, ifp, d)) { +dev_warn (ddev,"config %d interface %d altsetting %d has a blacklisted endpoint with address 0x%X, skipping\n" , + cfgno, inum, asnum, + d->bEndpointAddress); + goto skip_to_next_endpoint_or_interface_descriptor; + } + } + endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints]; ++ifp->desc.bNumEndpoints;
drivers/usb/core/hub.c +15 -5
@@ -36,7 +36,9 @@#include "otg_whitelist.h" #define USB_VENDOR_GENESYS_LOGIC 0x05e3 +#define USB_VENDOR_SMSC 0x0424#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 +#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02#define USB_TP_TRANSMISSION_DELAY 40/* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535/* ns */
@@ -1190,11 +1192,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)#ifdef CONFIG_PM udev->reset_resume =1 ;#endif -/* Don't set the change_bits when the device -* was powered off. -*/ -if (test_bit (port1, hub->power_bits)) -set_bit (port1, hub->change_bits); }else {/* The power session is gone; tell hub_wq */
@@ -1700,6 +1697,10 @@ static void hub_disconnect(struct usb_interface *intf)kfree (hub->buffer);pm_suspend_ignore_children (&intf->dev, false); + +if (hub->quirk_disable_autosuspend) +usb_autopm_put_interface (intf); +kref_put (&hub->kref, hub_release); }
@@ -1830,6 +1831,11 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)if (id->driver_info &HUB_QUIRK_CHECK_PORT_AUTOSUSPEND ) hub->quirk_check_port_auto_suspend =1 ; +if (id->driver_info &HUB_QUIRK_DISABLE_AUTOSUSPEND ) { + hub->quirk_disable_autosuspend =1 ; +usb_autopm_get_interface (intf); + } +if (hub_configure (hub, &desc->endpoint[0 ].desc) >=0 )return 0 ;
@@ -5410,6 +5416,10 @@ static void hub_event(struct work_struct *work) }static const struct usb_device_id hub_id_table[] = { + { .match_flags =USB_DEVICE_ID_MATCH_VENDOR |USB_DEVICE_ID_MATCH_INT_CLASS , + .idVendor =USB_VENDOR_SMSC , + .bInterfaceClass =USB_CLASS_HUB , + .driver_info =HUB_QUIRK_DISABLE_AUTOSUSPEND }, { .match_flags =USB_DEVICE_ID_MATCH_VENDOR |USB_DEVICE_ID_MATCH_INT_CLASS , .idVendor =USB_VENDOR_GENESYS_LOGIC ,
drivers/usb/core/hub.h +1 -0
@@ -61,6 +61,7 @@ struct usb_hub { unsigned quiescing:1; unsigned disconnected:1; unsigned in_reset:1; + unsigned quirk_disable_autosuspend:1; unsigned quirk_check_port_auto_suspend:1;
drivers/usb/core/quirks.c +40 -0
@@ -354,6 +354,10 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x0904, 0x6103), .driver_info = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, + /* Sound Devices USBPre2 */ + { USB_DEVICE(0x0926, 0x0202), .driver_info = + USB_QUIRK_ENDPOINT_BLACKLIST }, + /* Keytouch QWERTY Panel keyboard */ { USB_DEVICE(0x0926, 0x3333), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
@@ -445,6 +449,9 @@ static const struct usb_device_id usb_quirk_list[] = {/* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, + /* novation SoundControl XL */ + { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME }, + { }/* terminating entry must be last */ };
@@ -472,6 +479,39 @@ static const struct usb_device_id usb_amd_resume_quirk_list[] = { { }/* terminating entry must be last */ }; +/* +* Entries for blacklisted endpoints that should be ignored when parsing +* configuration descriptors. +* +* Matched for devices with USB_QUIRK_ENDPOINT_BLACKLIST. +*/ +static const struct usb_device_id usb_endpoint_blacklist[] = { + {USB_DEVICE_INTERFACE_NUMBER (0x0926 ,0x0202 ,1 ), .driver_info =0x85 }, + { } +}; + +bool usb_endpoint_is_blacklisted (struct usb_device *udev, +struct usb_host_interface *intf, +struct usb_endpoint_descriptor *epd) +{ +const struct usb_device_id *id; +unsigned int address; + +for (id = usb_endpoint_blacklist; id->match_flags; ++id) { +if (!usb_match_device (udev, id)) +continue ; + +if (!usb_match_one_id_intf (udev, intf, id)) +continue ; + + address = id->driver_info; +if (address == epd->bEndpointAddress) +return true; + } + +return false; +} +static bool usb_match_any_interface (struct usb_device *udev,const struct usb_device_id *id) {
drivers/usb/core/usb.h +3 -0
@@ -37,6 +37,9 @@ extern void usb_authorize_interface(struct usb_interface *);extern void usb_detect_quirks (struct usb_device *udev);extern void usb_detect_interface_quirks (struct usb_device *udev);extern void usb_release_quirk_list (void ); +extern bool usb_endpoint_is_blacklisted (struct usb_device *udev, +struct usb_host_interface *intf, +struct usb_endpoint_descriptor *epd);extern int usb_remove_device (struct usb_device *udev); extern int usb_get_device_descriptor(struct usb_device *dev,
drivers/usb/dwc2/gadget.c +23 -17
@@ -1004,11 +1004,6 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg,else packets =1 ;/* send one packet if length is zero. */ -if (hs_ep->isochronous && length > (hs_ep->mc * hs_ep->ep.maxpacket)) { -dev_err (hsotg->dev,"req length > maxpacket*mc\n" ); -return ; - } -if (dir_in && index !=0 )if (hs_ep->isochronous) epsize =DXEPTSIZ_MC (packets);
@@ -1312,6 +1307,13 @@ static int dwc2_hsotg_ep_queue(struct usb_ep *ep, struct usb_request *req, req->actual =0 ; req->status = -EINPROGRESS ; +/* Don't queue ISOC request if length greater than mps*mc */ +if (hs_ep->isochronous && + req->length > (hs_ep->mc * hs_ep->ep.maxpacket)) { +dev_err (hs->dev,"req length > maxpacket*mc\n" ); +return -EINVAL ; + } +/* In DDMA mode for ISOC's don't queue request if length greater * than descriptor limits. */
@@ -1542,6 +1544,7 @@ static int dwc2_hsotg_process_req_status(struct dwc2_hsotg *hsotg,struct dwc2_hsotg_ep *ep0 = hsotg->eps_out[0 ];struct dwc2_hsotg_ep *ep;__le16 reply; +u16 status;int ret;dev_dbg (hsotg->dev,"%s: USB_REQ_GET_STATUS\n" , __func__);
@@ -1553,11 +1556,10 @@ static int dwc2_hsotg_process_req_status(struct dwc2_hsotg *hsotg,switch (ctrl->bRequestType &USB_RECIP_MASK ) {case USB_RECIP_DEVICE : -/* -* bit 0 => self powered -* bit 1 => remote wakeup -*/ - reply =cpu_to_le16 (0 ); + status =1 <<USB_DEVICE_SELF_POWERED ; + status |= hsotg->remote_wakeup_allowed << +USB_DEVICE_REMOTE_WAKEUP ; + reply =cpu_to_le16 (status);break ;case USB_RECIP_INTERFACE :
@@ -1668,7 +1670,10 @@ static int dwc2_hsotg_process_req_feature(struct dwc2_hsotg *hsotg,case USB_RECIP_DEVICE :switch (wValue) {case USB_DEVICE_REMOTE_WAKEUP : - hsotg->remote_wakeup_allowed =1 ; +if (set) + hsotg->remote_wakeup_allowed =1 ; +else + hsotg->remote_wakeup_allowed =0 ;break ;case USB_DEVICE_TEST_MODE :
@@ -1678,16 +1683,17 @@ static int dwc2_hsotg_process_req_feature(struct dwc2_hsotg *hsotg,return -EINVAL ; hsotg->test_mode = wIndex >>8 ; - ret =dwc2_hsotg_send_reply (hsotg, ep0,NULL ,0 ); -if (ret) { -dev_err (hsotg->dev, -"%s: failed to send reply\n" , __func__); -return ret; - }break ;default :return -ENOENT ; } + + ret =dwc2_hsotg_send_reply (hsotg, ep0,NULL ,0 ); +if (ret) { +dev_err (hsotg->dev, +"%s: failed to send reply\n" , __func__); +return ret; + }break ;case USB_RECIP_ENDPOINT :
drivers/usb/dwc3/gadget.c +2 -1
@@ -2224,7 +2224,8 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,if (event->status &DEPEVT_STATUS_SHORT && !chain)return 1 ; -if (event->status &DEPEVT_STATUS_IOC ) +if ((trb->ctrl &DWC3_TRB_CTRL_IOC ) || + (trb->ctrl &DWC3_TRB_CTRL_LST ))return 1 ;return 0 ;
drivers/usb/gadget/composite.c +3 -5
@@ -437,12 +437,10 @@ static u8 encode_bMaxPower(enum usb_device_speed speed, val =CONFIG_USB_GADGET_VBUS_DRAW ;if (!val)return 0 ; -switch (speed) { -case USB_SPEED_SUPER : -return DIV_ROUND_UP (val,8 ); -default : +if (speed <USB_SPEED_SUPER )return DIV_ROUND_UP (val,2 ); - } +else +return DIV_ROUND_UP (val,8 ); } static int config_buf(struct usb_configuration *config,
drivers/usb/host/xhci-hub.c +17 -8
@@ -55,6 +55,7 @@ static u8 usb_bos_descriptor [] = {static int xhci_create_usb3_bos_desc (struct xhci_hcd *xhci,char *buf,u16 wLength) { +struct xhci_port_cap *port_cap =NULL ;int i, ssa_count;u32 temp;u16 desc_size, ssp_cap_size, ssa_size =0 ;
@@ -64,16 +65,24 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, ssp_cap_size =sizeof (usb_bos_descriptor) - desc_size;/* does xhci support USB 3.1 Enhanced SuperSpeed */ -if (xhci->usb3_rhub.min_rev >=0x01 ) { +for (i =0 ; i < xhci->num_port_caps; i++) { +if (xhci->port_caps[i].maj_rev ==0x03 && + xhci->port_caps[i].min_rev >=0x01 ) { + usb3_1 = true; + port_cap = &xhci->port_caps[i]; +break ; + } + } + +if (usb3_1) {/* does xhci provide a PSI table for SSA speed attributes? */ -if (xhci->usb3_rhub.psi_count) { +if (port_cap->psi_count) {/* two SSA entries for each unique PSI ID, RX and TX */ - ssa_count = xhci->usb3_rhub.psi_uid_count *2 ; + ssa_count = port_cap->psi_uid_count *2 ; ssa_size = ssa_count *sizeof (u32); ssp_cap_size -=16 ;/* skip copying the default SSA */ } desc_size += ssp_cap_size; - usb3_1 = true; }memcpy (buf, &usb_bos_descriptor,min (desc_size, wLength));
@@ -99,7 +108,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, }/* If PSI table exists, add the custom speed attributes from it */ -if (usb3_1 && xhci->usb3_rhub.psi_count) { +if (usb3_1 && port_cap->psi_count) {u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp;int offset;
@@ -111,7 +120,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,/* attribute count SSAC bits 4:0 and ID count SSIC bits 8:5 */ bm_attrib = (ssa_count -1 ) &0x1f ; - bm_attrib |= (xhci->usb3_rhub.psi_uid_count -1 ) <<5 ; + bm_attrib |= (port_cap->psi_uid_count -1 ) <<5 ;put_unaligned_le32 (bm_attrib, &buf[ssp_cap_base +4 ]);if (wLength < desc_size + ssa_size)
@@ -124,8 +133,8 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,* USB 3.1 requires two SSA entries (RX and TX) for every link */ offset = desc_size; -for (i =0 ; i < xhci->usb3_rhub.psi_count; i++) { - psi = xhci->usb3_rhub.psi[i]; +for (i =0 ; i < port_cap->psi_count; i++) { + psi = port_cap->psi[i]; psi &= ~USB_SSP_SUBLINK_SPEED_RSVD ; psi_exp =XHCI_EXT_PORT_PSIE (psi); psi_mant =XHCI_EXT_PORT_PSIM (psi);
drivers/usb/host/xhci-mem.c +46 -25
121 lines not on this page · raw message
drivers/usb/host/xhci-pci.c +6 -4
@@ -41,6 +41,7 @@#define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI 0x1aa8#define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8#define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 +#define PCI_DEVICE_ID_INTEL_CML_XHCI 0xa3af#define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
@@ -179,7 +180,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) pdev->device ==PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI || pdev->device ==PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI || pdev->device ==PCI_DEVICE_ID_INTEL_APL_XHCI || - pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI)) { + pdev->device ==PCI_DEVICE_ID_INTEL_DNV_XHCI || + pdev->device == PCI_DEVICE_ID_INTEL_CML_XHCI)) { xhci->quirks |= XHCI_PME_STUCK_QUIRK; } if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
@@ -283,6 +285,9 @@ static int xhci_pci_setup(struct usb_hcd *hcd)if (!usb_hcd_is_primary_hcd (hcd))return 0 ; +if (xhci->quirks &XHCI_PME_STUCK_QUIRK ) +xhci_pme_acpi_rtd3_enable (pdev); +xhci_dbg (xhci,"Got SBRN %u\n" , (unsigned int ) xhci->sbrn);/* Find any debug ports */
@@ -340,9 +345,6 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) HCC_MAX_PSA(xhci->hcc_params) >= 4) xhci->shared_hcd->can_do_streams =1 ; -if (xhci->quirks &XHCI_PME_STUCK_QUIRK ) -xhci_pme_acpi_rtd3_enable (dev); -/* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ pm_runtime_put_noidle (&dev->dev);
drivers/usb/host/xhci-ring.c +43 -17
82 lines not on this page · raw message
drivers/usb/host/xhci.h +13 -3
@@ -1704,11 +1704,21 @@ static inline unsigned int hcd_index(struct usb_hcd *hcd)else return 1 ; } + +struct xhci_port_cap { +u32 *psi;/* array of protocol speed ID entries */ +u8 psi_count; +u8 psi_uid_count; +u8 maj_rev; +u8 min_rev; +}; +struct xhci_port {__le32 __iomem *addr;int hw_portnum;int hcd_portnum;struct xhci_hub *rhub; +struct xhci_port_cap *port_cap; }; struct xhci_hub {
@@ -1718,9 +1728,6 @@ struct xhci_hub {/* supported prococol extended capabiliy values */ u8 maj_rev;u8 min_rev; -u32 *psi;/* array of protocol speed ID entries */ -u8 psi_count; -u8 psi_uid_count; };/* There is one xhci_hcd structure per controller */
@@ -1882,6 +1889,9 @@ struct xhci_hcd {/* cached usb2 extened protocol capabilites */ u32 *ext_caps;unsigned int num_ext_caps; +/* cached extended protocol port capabilities */ +struct xhci_port_cap *port_caps; +unsigned int num_port_caps;/* Compliance Mode Recovery Data */ struct timer_list comp_mode_recovery_timer;u32 port_status_u0;
drivers/usb/misc/iowarrior.c +29 -2
@@ -33,6 +33,14 @@#define USB_DEVICE_ID_CODEMERCS_IOWPV2 0x1512/* full speed iowarrior */ #define USB_DEVICE_ID_CODEMERCS_IOW56 0x1503 +/* fuller speed iowarrior */ +#define USB_DEVICE_ID_CODEMERCS_IOW28 0x1504 +#define USB_DEVICE_ID_CODEMERCS_IOW28L 0x1505 +#define USB_DEVICE_ID_CODEMERCS_IOW100 0x1506 + +/* OEMed devices */ +#define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a +#define USB_DEVICE_ID_CODEMERCS_IOW56AM 0x158b/* Get a minor range for your devices from the usb maintainer */ #ifdef CONFIG_USB_DYNAMIC_MINORS
@@ -137,6 +145,11 @@ static const struct usb_device_id iowarrior_ids[] = { {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)}, {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)}, {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24SAG)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28L)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW100)}, {} /* Terminating entry */ };MODULE_DEVICE_TABLE (usb, iowarrior_ids);
@@ -361,6 +374,7 @@ static ssize_t iowarrior_write(struct file *file, }switch (dev->product_id) {case USB_DEVICE_ID_CODEMERCS_IOW24 : +case USB_DEVICE_ID_CODEMERCS_IOW24SAG :case USB_DEVICE_ID_CODEMERCS_IOWPV1 :case USB_DEVICE_ID_CODEMERCS_IOWPV2 :case USB_DEVICE_ID_CODEMERCS_IOW40 :
@@ -375,6 +389,10 @@ static ssize_t iowarrior_write(struct file *file, goto exit;break ;case USB_DEVICE_ID_CODEMERCS_IOW56 : +case USB_DEVICE_ID_CODEMERCS_IOW56AM : +case USB_DEVICE_ID_CODEMERCS_IOW28 : +case USB_DEVICE_ID_CODEMERCS_IOW28L : +case USB_DEVICE_ID_CODEMERCS_IOW100 :/* The IOW56 uses asynchronous IO and more urbs */ if (atomic_read (&dev->write_busy) ==MAX_WRITES_IN_FLIGHT ) {/* Wait until we are below the limit for submitted urbs */
@@ -499,6 +517,7 @@ static long iowarrior_ioctl(struct file *file, unsigned int cmd,switch (cmd) {case IOW_WRITE :if (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW24 || + dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW24SAG || dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOWPV1 || dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOWPV2 || dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW40 ) {
@@ -782,7 +801,11 @@ static int iowarrior_probe(struct usb_interface *interface, goto error; } -if (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56 ) { +if ((dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56 ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56AM ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW28 ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW28L ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW100 )) { res =usb_find_last_int_out_endpoint (iface_desc, &dev->int_out_endpoint);if (res) {
@@ -795,7 +818,11 @@ static int iowarrior_probe(struct usb_interface *interface,/* we have to check the report_size often, so remember it in the endianness suitable for our machine */ dev->report_size =usb_endpoint_maxp (dev->int_in_endpoint);if ((dev->interface->cur_altsetting->desc.bInterfaceNumber ==0 ) && - (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56 )) + ((dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56 ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56AM ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW28 ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW28L ) || + (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW100 )))/* IOWarrior56 has wMaxPacketSize different from report size */ dev->report_size =7 ;
drivers/usb/storage/uas.c +22 -1
@@ -45,6 +45,7 @@ struct uas_dev_info {struct scsi_cmnd *cmnd[MAX_CMNDS ];spinlock_t lock;struct work_struct work; +struct work_struct scan_work;/* for async scanning */ };enum {
@@ -114,6 +115,17 @@ static void uas_do_work(struct work_struct *work)spin_unlock_irqrestore (&devinfo->lock, flags); } +static void uas_scan_work (struct work_struct *work) +{ +struct uas_dev_info *devinfo = + container_of(work, struct uas_dev_info, scan_work); +struct Scsi_Host *shost =usb_get_intfdata (devinfo->intf); + +dev_dbg (&devinfo->intf->dev,"starting scan\n" ); +scsi_scan_host (shost); +dev_dbg (&devinfo->intf->dev,"scan complete\n" ); +} +static void uas_add_work (struct uas_cmd_info *cmdinfo) {struct scsi_pointer *scp = (void *)cmdinfo;
@@ -989,6 +1001,7 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)init_usb_anchor (&devinfo->data_urbs);spin_lock_init (&devinfo->lock);INIT_WORK (&devinfo->work, uas_do_work); +INIT_WORK (&devinfo->scan_work, uas_scan_work); result =uas_configure_endpoints (devinfo);if (result)
@@ -1005,7 +1018,9 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)if (result) goto free_streams; -scsi_scan_host (shost); +/* Submit the delayed_work for SCSI-device scanning */ +schedule_work (&devinfo->scan_work); +return result; free_streams:
@@ -1173,6 +1188,12 @@ static void uas_disconnect(struct usb_interface *intf)usb_kill_anchored_urbs (&devinfo->data_urbs);uas_zap_pending (devinfo,DID_NO_CONNECT ); +/* +* Prevent SCSI scanning (if it hasn't started yet) +* or wait for the SCSI-scanning routine to stop. +*/ +cancel_work_sync (&devinfo->scan_work); +scsi_remove_host (shost);uas_free_streams (devinfo);scsi_host_put (shost);
drivers/xen/preempt.c +3 -1
@@ -37,7 +37,9 @@ asmlinkage __visible void xen_maybe_preempt_hcall(void)* cpu. */ __this_cpu_write (xen_in_preemptible_hcall, false); -_cond_resched (); +local_irq_enable (); +cond_resched (); +local_irq_disable ();__this_cpu_write (xen_in_preemptible_hcall, true); } }
fs/btrfs/disk-io.c +1 -1
@@ -3153,6 +3153,7 @@ int open_ctree(struct super_block *sb,if (IS_ERR (fs_info->fs_root)) { err =PTR_ERR (fs_info->fs_root);btrfs_warn (fs_info,"failed to read fs tree: %d" , err); + fs_info->fs_root =NULL ; goto fail_qgroup; }
@@ -4468,7 +4469,6 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans,wake_up (&fs_info->transaction_wait);btrfs_destroy_delayed_inodes (fs_info); -btrfs_assert_delayed_root_empty (fs_info);btrfs_destroy_marked_extents (fs_info, &cur_trans->dirty_pages,EXTENT_DIRTY );
fs/btrfs/inode.c +13 -3
@@ -10348,6 +10348,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,struct btrfs_root *root =BTRFS_I (inode)->root;struct btrfs_key ins;u64 cur_offset = start; +u64 clear_offset = start;u64 i_size;u64 cur_bytes;u64 last_alloc = (u64)-1 ;
@@ -10382,6 +10383,15 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,btrfs_end_transaction (trans);break ; } + +/* +* We've reserved this space, and thus converted it from +* ->bytes_may_use to ->bytes_reserved. Any error that happens +* from here on out we will only need to clear our reservation +* for the remaining unreserved area, so advance our +* clear_offset by our extent size. +*/ + clear_offset += ins.offset;btrfs_dec_block_group_reservations (fs_info, ins.objectid); last_alloc = ins.offset;
@@ -10462,9 +10472,9 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,if (own_trans)btrfs_end_transaction (trans); } -if (cur_offset < end) -btrfs_free_reserved_data_space (inode,NULL , cur_offset, - end - cur_offset +1 ); +if (clear_offset < end) +btrfs_free_reserved_data_space (inode,NULL , clear_offset, + end - clear_offset +1 );return ret; }
fs/btrfs/ordered-data.c +6 -1
@@ -712,10 +712,15 @@ int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) }btrfs_start_ordered_extent (inode, ordered,1 ); end = ordered->file_offset; +/* +* If the ordered extent had an error save the error but don't +* exit without waiting first for all other ordered extents in +* the range to complete. +*/ if (test_bit (BTRFS_ORDERED_IOERR , &ordered->flags)) ret = -EIO ;btrfs_put_ordered_extent (ordered); -if (ret || end ==0 || end == start) +if (end ==0 || end == start)break ; end--; }
fs/ecryptfs/crypto.c +4 -2
@@ -325,8 +325,10 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,struct extent_crypt_result ecr;int rc =0 ; -BUG_ON (!crypt_stat || !crypt_stat->tfm - || !(crypt_stat->flags &ECRYPTFS_STRUCT_INITIALIZED )); +if (!crypt_stat || !crypt_stat->tfm + || !(crypt_stat->flags &ECRYPTFS_STRUCT_INITIALIZED )) +return -EINVAL ; +if (unlikely (ecryptfs_verbosity >0 )) {ecryptfs_printk (KERN_DEBUG ,"Key size [%zd]; key:\n" , crypt_stat->key_size);
fs/ecryptfs/keystore.c +1 -1
@@ -1318,7 +1318,7 @@ parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,printk (KERN_WARNING "Tag 1 packet contains key larger " "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n" ); rc = -EINVAL ; - goto out; + goto out_free; }memcpy ((*new_auth_tok)->session_key.encrypted_key, &data[(*packet_size)], (body_size - (ECRYPTFS_SIG_SIZE +2 )));
fs/ecryptfs/messaging.c +1 -0
@@ -392,6 +392,7 @@ int __init ecryptfs_init_messaging(void) * ecryptfs_message_buf_len), GFP_KERNEL);if (!ecryptfs_msg_ctx_arr) { +kfree (ecryptfs_daemon_hash); rc = -ENOMEM ; goto out; }
fs/ext4/balloc.c +11 -3
@@ -270,6 +270,7 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,ext4_group_t ngroups =ext4_get_groups_count (sb);struct ext4_group_desc *desc;struct ext4_sb_info *sbi =EXT4_SB (sb); +struct buffer_head *bh_p;if (block_group >= ngroups) { ext4_error(sb, "block_group >= groups_count - block_group = %u,"
@@ -280,7 +281,14 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, group_desc = block_group >>EXT4_DESC_PER_BLOCK_BITS (sb); offset = block_group & (EXT4_DESC_PER_BLOCK (sb) -1 ); -if (!sbi->s_group_desc[group_desc]) { + bh_p =sbi_array_rcu_deref (sbi, s_group_desc, group_desc); +/* +* sbi_array_rcu_deref returns with rcu unlocked, this is ok since +* the pointer being dereferenced won't be dereferenced again. By +* looking at the usage in add_new_gdb() the value isn't modified, +* just the pointer, and so it remains valid. +*/ +if (!bh_p) {ext4_error (sb,"Group descriptor not loaded - " "block_group = %u, group_desc = %u, desc = %u" , block_group, group_desc, offset);
@@ -288,10 +296,10 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb, } desc = (struct ext4_group_desc *)( - (__u8 *)sbi->s_group_desc[group_desc]->b_data + + (__u8 *)bh_p->b_data + offset *EXT4_DESC_SIZE (sb));if (bh) - *bh = sbi->s_group_desc[group_desc]; + *bh = bh_p;return desc; }
fs/ext4/ext4.h +30 -9
@@ -1372,7 +1372,7 @@ struct ext4_sb_info {loff_t s_bitmap_maxbytes;/* max bytes for bitmap files */ struct buffer_head * s_sbh;/* Buffer containing the super block */ struct ext4_super_block *s_es;/* Pointer to the super block in the buffer */ -struct buffer_head **s_group_desc; +struct buffer_head *__rcu *s_group_desc;unsigned int s_mount_opt;unsigned int s_mount_opt2;unsigned int s_mount_flags;
@@ -1430,7 +1430,7 @@ struct ext4_sb_info {#endif /* for buddy allocator */ -struct ext4_group_info ***s_group_info; +struct ext4_group_info **__rcu *s_group_info;struct inode *s_buddy_cache;spinlock_t s_md_lock;unsigned short *s_mb_offsets;
@@ -1480,7 +1480,7 @@ struct ext4_sb_info {unsigned int s_extent_max_zeroout_kb;unsigned int s_log_groups_per_flex; -struct flex_groups *s_flex_groups; +struct flex_groups *__rcu *s_flex_groups;ext4_group_t s_flex_groups_allocated;/* workqueue for reserved extent conversions (buffered io) */
@@ -1520,8 +1520,11 @@ struct ext4_sb_info {struct ratelimit_state s_warning_ratelimit_state;struct ratelimit_state s_msg_ratelimit_state; -/* Barrier between changing inodes' journal flags and writepages ops. */ -struct percpu_rw_semaphore s_journal_flag_rwsem; +/* +* Barrier between writepages ops and changing any inode's JOURNAL_DATA +* or EXTENTS flag. +*/ +struct percpu_rw_semaphore s_writepages_rwsem;struct dax_device *s_daxdev; };
@@ -1541,6 +1544,23 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) ino <= le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)); } +/* +* Returns: sbi->field[index] +* Used to access an array element from the following sbi fields which require +* rcu protection to avoid dereferencing an invalid pointer due to reassignment +* - s_group_desc +* - s_group_info +* - s_flex_group +*/ +#define sbi_array_rcu_deref (sbi, field, index) \ +({ \ + typeof(*((sbi)->field)) _v; \ + rcu_read_lock(); \ + _v = ((typeof(_v)*)rcu_dereference((sbi)->field))[index]; \ + rcu_read_unlock(); \ + _v; \ +}) +/* * Inode dynamic state flags */
@@ -2564,6 +2584,7 @@ extern int ext4_generic_delete_entry(handle_t *handle,extern bool ext4_empty_dir (struct inode *inode);/* resize.c */ +extern void ext4_kvfree_array_rcu (void *to_free);extern int ext4_group_add (struct super_block *sb,struct ext4_new_group_data *input); extern int ext4_group_extend(struct super_block *sb,
@@ -2811,13 +2832,13 @@ static inlinestruct ext4_group_info *ext4_get_group_info (struct super_block *sb,ext4_group_t group) { -struct ext4_group_info ***grp_info; +struct ext4_group_info **grp_info;long indexv, indexh;BUG_ON (group >=EXT4_SB (sb)->s_groups_count); - grp_info =EXT4_SB (sb)->s_group_info; indexv = group >> (EXT4_DESC_PER_BLOCK_BITS (sb)); indexh = group & ((EXT4_DESC_PER_BLOCK (sb)) -1 ); -return grp_info[indexv][indexh]; + grp_info =sbi_array_rcu_deref (EXT4_SB (sb), s_group_info, indexv); +return grp_info[indexh]; }/*
@@ -2867,7 +2888,7 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) !inode_is_locked(inode));down_write (&EXT4_I (inode)->i_data_sem);if (newsize >EXT4_I (inode)->i_disksize) -EXT4_I (inode)->i_disksize = newsize; +WRITE_ONCE (EXT4_I (inode)->i_disksize, newsize);up_write (&EXT4_I (inode)->i_data_sem); }
fs/ext4/ialloc.c +14 -9
@@ -330,11 +330,13 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)percpu_counter_inc (&sbi->s_freeinodes_counter);if (sbi->s_log_groups_per_flex) { -ext4_group_t f =ext4_flex_group (sbi, block_group); +struct flex_groups *fg; -atomic_inc (&sbi->s_flex_groups[f].free_inodes); + fg =sbi_array_rcu_deref (sbi, s_flex_groups, +ext4_flex_group (sbi, block_group)); +atomic_inc (&fg->free_inodes);if (is_directory) -atomic_dec (&sbi->s_flex_groups[f].used_dirs); +atomic_dec (&fg->used_dirs); }BUFFER_TRACE (bh2,"call ext4_handle_dirty_metadata" ); fatal =ext4_handle_dirty_metadata (handle,NULL , bh2);
@@ -370,12 +372,13 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g, int flex_size, struct orlov_stats *stats) { struct ext4_group_desc *desc; -struct flex_groups *flex_group =EXT4_SB (sb)->s_flex_groups;if (flex_size >1 ) { - stats->free_inodes =atomic_read (&flex_group[g].free_inodes); - stats->free_clusters =atomic64_read (&flex_group[g].free_clusters); - stats->used_dirs =atomic_read (&flex_group[g].used_dirs); +struct flex_groups *fg =sbi_array_rcu_deref (EXT4_SB (sb), + s_flex_groups, g); + stats->free_inodes =atomic_read (&fg->free_inodes); + stats->free_clusters =atomic64_read (&fg->free_clusters); + stats->used_dirs =atomic_read (&fg->used_dirs);return ; }
@@ -1056,7 +1059,8 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,if (sbi->s_log_groups_per_flex) {ext4_group_t f =ext4_flex_group (sbi, group); -atomic_inc (&sbi->s_flex_groups[f].used_dirs); +atomic_inc (&sbi_array_rcu_deref (sbi, s_flex_groups, + f)->used_dirs); } }if (ext4_has_group_desc_csum (sb)) {
@@ -1079,7 +1083,8 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,if (sbi->s_log_groups_per_flex) { flex_group =ext4_flex_group (sbi, group); -atomic_dec (&sbi->s_flex_groups[flex_group].free_inodes); +atomic_dec (&sbi_array_rcu_deref (sbi, s_flex_groups, + flex_group)->free_inodes); } inode->i_ino = ino + group *EXT4_INODES_PER_GROUP (sb);
fs/ext4/inode.c +8 -8
@@ -2569,7 +2569,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,* truncate are avoided by checking i_size under i_data_sem. */ disksize = ((loff_t )mpd->first_page) <<PAGE_SHIFT ; -if (disksize >EXT4_I (inode)->i_disksize) { +if (disksize >READ_ONCE (EXT4_I (inode)->i_disksize)) {int err2;loff_t i_size;
@@ -2730,7 +2730,7 @@ static int ext4_writepages(struct address_space *mapping,if (unlikely (ext4_forced_shutdown (EXT4_SB (inode->i_sb))))return -EIO ; -percpu_down_read (&sbi->s_journal_flag_rwsem); +percpu_down_read (&sbi->s_writepages_rwsem);trace_ext4_writepages (inode, wbc);/*
@@ -2950,7 +2950,7 @@ static int ext4_writepages(struct address_space *mapping, out_writepages:trace_ext4_writepages_result (inode, wbc, ret, nr_to_write - wbc->nr_to_write); -percpu_up_read (&sbi->s_journal_flag_rwsem); +percpu_up_read (&sbi->s_writepages_rwsem);return ret; }
@@ -2965,13 +2965,13 @@ static int ext4_dax_writepages(struct address_space *mapping,if (unlikely (ext4_forced_shutdown (EXT4_SB (inode->i_sb))))return -EIO ; -percpu_down_read (&sbi->s_journal_flag_rwsem); +percpu_down_read (&sbi->s_writepages_rwsem);trace_ext4_writepages (inode, wbc); ret =dax_writeback_mapping_range (mapping, inode->i_sb->s_bdev, wbc);trace_ext4_writepages_result (inode, wbc, ret, nr_to_write - wbc->nr_to_write); -percpu_up_read (&sbi->s_journal_flag_rwsem); +percpu_up_read (&sbi->s_writepages_rwsem);return ret; }
@@ -6207,7 +6207,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) } } -percpu_down_write (&sbi->s_journal_flag_rwsem); +percpu_down_write (&sbi->s_writepages_rwsem);jbd2_journal_lock_updates (journal);/*
@@ -6224,7 +6224,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) err =jbd2_journal_flush (journal);if (err <0 ) {jbd2_journal_unlock_updates (journal); -percpu_up_write (&sbi->s_journal_flag_rwsem); +percpu_up_write (&sbi->s_writepages_rwsem);return err; }ext4_clear_inode_flag (inode,EXT4_INODE_JOURNAL_DATA );
@@ -6232,7 +6232,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)ext4_set_aops (inode);jbd2_journal_unlock_updates (journal); -percpu_up_write (&sbi->s_journal_flag_rwsem); +percpu_up_write (&sbi->s_writepages_rwsem);if (val)up_write (&EXT4_I (inode)->i_mmap_sem);
fs/ext4/mballoc.c +41 -20
141 lines not on this page · raw message
fs/ext4/migrate.c +19 -8
@@ -427,6 +427,7 @@ static int free_ext_block(handle_t *handle, struct inode *inode)int ext4_ext_migrate (struct inode *inode) { +struct ext4_sb_info *sbi =EXT4_SB (inode->i_sb);handle_t *handle;int retval =0 , i;__le32 *i_data;
@@ -451,6 +452,8 @@ int ext4_ext_migrate(struct inode *inode)*/ return retval; +percpu_down_write (&sbi->s_writepages_rwsem); +/* * Worst case we can touch the allocation bitmaps, a bgd * block, and a block to link in the orphan list. We do need
@@ -461,7 +464,7 @@ int ext4_ext_migrate(struct inode *inode)if (IS_ERR (handle)) { retval =PTR_ERR (handle); -return retval; + goto out_unlock; } goal = (((inode->i_ino -1 ) /EXT4_INODES_PER_GROUP (inode->i_sb)) *EXT4_INODES_PER_GROUP (inode->i_sb)) +1 ;
@@ -472,7 +475,7 @@ int ext4_ext_migrate(struct inode *inode)if (IS_ERR (tmp_inode)) { retval =PTR_ERR (tmp_inode);ext4_journal_stop (handle); -return retval; + goto out_unlock; }i_size_write (tmp_inode,i_size_read (inode));/*
@@ -514,7 +517,7 @@ int ext4_ext_migrate(struct inode *inode)*/ ext4_orphan_del (NULL , tmp_inode); retval =PTR_ERR (handle); - goto out; + goto out_tmp_inode; } ei =EXT4_I (inode);
@@ -595,10 +598,11 @@ int ext4_ext_migrate(struct inode *inode)/* Reset the extent details */ ext4_ext_tree_init (handle, tmp_inode);ext4_journal_stop (handle); -out: +out_tmp_inode:unlock_new_inode (tmp_inode);iput (tmp_inode); - +out_unlock: +percpu_up_write (&sbi->s_writepages_rwsem);return retval; }
@@ -608,7 +612,8 @@ int ext4_ext_migrate(struct inode *inode)int ext4_ind_migrate (struct inode *inode) {struct ext4_extent_header *eh; -struct ext4_super_block *es =EXT4_SB (inode->i_sb)->s_es; +struct ext4_sb_info *sbi =EXT4_SB (inode->i_sb); +struct ext4_super_block *es = sbi->s_es;struct ext4_inode_info *ei =EXT4_I (inode);struct ext4_extent *ex;unsigned int i, len;
@@ -632,9 +637,13 @@ int ext4_ind_migrate(struct inode *inode)if (test_opt (inode->i_sb,DELALLOC ))ext4_alloc_da_blocks (inode); +percpu_down_write (&sbi->s_writepages_rwsem); + handle =ext4_journal_start (inode,EXT4_HT_MIGRATE ,1 ); -if (IS_ERR (handle)) -return PTR_ERR (handle); +if (IS_ERR (handle)) { + ret =PTR_ERR (handle); + goto out_unlock; + }down_write (&EXT4_I (inode)->i_data_sem); ret =ext4_ext_check_inode (inode);
@@ -669,5 +678,7 @@ int ext4_ind_migrate(struct inode *inode) errout:ext4_journal_stop (handle);up_write (&EXT4_I (inode)->i_data_sem); +out_unlock: +percpu_up_write (&sbi->s_writepages_rwsem);return ret; }
fs/ext4/namei.c +1 -0
@@ -1431,6 +1431,7 @@ static struct buffer_head * ext4_find_entry (struct inode *dir,/* * We deal with the read-ahead logic here. */ +cond_resched ();if (ra_ptr >= ra_max) {/* Refill the readahead buffer */ ra_ptr =0 ;
fs/ext4/resize.c +49 -13
29 lines not on this page · raw message
fs/ext4/super.c +77 -36
113 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.