Linux 4.19.105
Greg KH
maintainerI'm announcing the release of the 4.19.105 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
------------
Makefile | 2 arch/arm/mach-npcm/Kconfig | 2 arch/arm64/kernel/cpufeature.c | 52 +++++++++++++-- arch/arm64/kernel/fpsimd.c | 20 +++++- arch/arm64/kernel/process.c | 7 ++ arch/arm64/kvm/hyp/switch.c | 10 ++- arch/s390/include/asm/timex.h | 2 arch/x86/events/amd/core.c | 1 arch/x86/events/intel/ds.c | 2 arch/x86/kvm/paging_tmpl.h | 2 arch/x86/kvm/vmx/vmx.c | 3 drivers/hwmon/pmbus/ltc2978.c | 4 - drivers/infiniband/core/security.c | 24 ++----- drivers/infiniband/core/uverbs_cmd.c | 15 ++-- drivers/infiniband/hw/hfi1/affinity.c | 2 drivers/infiniband/hw/hfi1/file_ops.c | 52 +++++++++------ drivers/infiniband/hw/hfi1/hfi.h | 5 + drivers/infiniband/hw/hfi1/user_exp_rcv.c | 5 - drivers/infiniband/hw/hfi1/user_sdma.c | 17 +++-- drivers/infiniband/sw/rdmavt/qp.c | 84 +++++++++++++++---------- drivers/infiniband/sw/rxe/rxe_comp.c | 8 +- drivers/input/mouse/synaptics.c | 4 - drivers/nvme/host/core.c | 2 fs/btrfs/disk-io.c | 1 fs/btrfs/extent_map.c | 11 +++ fs/btrfs/ref-verify.c | 5 + fs/btrfs/super.c | 2 fs/ext4/block_validity.c | 1 fs/ext4/dir.c | 14 ++-- fs/ext4/ext4.h | 5 + fs/ext4/inode.c | 12 +++ fs/ext4/mmp.c | 12 ++- fs/ext4/namei.c | 7 ++ fs/ext4/super.c | 32 ++++----- fs/jbd2/commit.c | 46 +++++++------ fs/jbd2/transaction.c | 10 +-- fs/nfs/nfs4proc.c | 2 sound/pci/hda/patch_realtek.c | 1 sound/usb/clock.c | 99 ++++++++++++++++++++---------- sound/usb/clock.h | 4 - sound/usb/format.c | 3 sound/usb/mixer.c | 12 +++ sound/usb/quirks.c | 1 43 files changed, 404 insertions(+), 201 deletions(-)
Alexander Tsoy (1):
ALSA: usb-audio: Add clock validity quirk for Denon MC7000/MCX8000
Andreas Dilger (1):
ext4: don't assume that mmp_nodename/bdevname have NUL
Arvind Sankar (1):
ALSA: usb-audio: Apply sample rate quirk for Audioengine D1
Avihai Horon (1):
RDMA/core: Fix invalid memory access in spec_filter_size
Benjamin Tissoires (1):
Input: synaptics - remove the LEN0049 dmi id from topbuttonpad list
David Sterba (2):
btrfs: print message when tree-log replay starts
btrfs: log message when rw remount is attempted with unclean tree-log
Filipe Manana (1):
Btrfs: fix race between using extent maps and merging them
Gaurav Agrawal (1):
Input: synaptics - enable SMBus on ThinkPad L470
Greg Kroah-Hartman (1):
Linux 4.19.105
Jan Kara (1):
ext4: fix checksum errors with indexed dirs
Kaike Wan (2):
IB/hfi1: Acquire lock to release TID entries when user file is closed IB/rdmavt: Reset all QPs when the device is shut down
Kamal Heib (1):
RDMA/hfi1: Fix memory leak in _dev_comp_vect_mappings_create
Kan Liang (1):
perf/x86/intel: Fix inaccurate period in context switch for auto-reload
Kim Phillips (1):
perf/x86/amd: Add missing L2 misses event spec to AMD Family 17h's event map
Krzysztof Kozlowski (1):
ARM: npcm: Bring back GPIOLIB support
Leon Romanovsky (1):
RDMA/core: Fix protection fault in get_pkey_idx_qp_list
Lyude Paul (1):
Input: synaptics - switch T470s to RMI4 by default
Mike Jones (1):
hwmon: (pmbus/ltc2978) Fix PMBus polling of MFR_COMMON definitions.
Mike Marciniszyn (1):
IB/hfi1: Close window for pq and request coliding
Nathan Chancellor (1):
s390/time: Fix clk type in get_tod_clock
Olga Kornievskaia (1):
NFSv4.1 make cachethis=no for writes
Saurav Girepunje (1):
ALSA: usb-audio: sound: usb: usb true/false for bool return type
Sean Christopherson (2):
KVM: nVMX: Use correct root level for nested EPT shadow page tables
KVM: x86/mmu: Fix struct guest_walker arrays for 5-level paging
Shijie Luo (1):
ext4: add cond_resched() to ext4_protect_reserved_inode
Suzuki K Poulose (2):
arm64: cpufeature: Set the FP/SIMD compat HWCAP bits properly
arm64: nofpsmid: Handle TIF_FOREIGN_FPSTATE flag cleanly
Takashi Iwai (2):
ALSA: usb-audio: Fix UAC2/3 effect unit parsing
ALSA: hda/realtek - Fix silent output on MSI-GL73
Theodore Ts'o (2):
ext4: fix support for inode sizes > 1024 bytes
ext4: improve explanation of a mount failure caused by a misconfigured kernel
Wenwen Wang (1):
btrfs: ref-verify: fix memory leaks
Will Deacon (1):
arm64: ssbs: Fix context-switch when SSBS is present on all CPUs
Yi Zhang (1):
nvme: fix the parameter order for nvme_get_log in nvme_get_fw_slot_info
Zhu Yanjun (1):
RDMA/rxe: Fix soft lockup problem due to using tasklets in softirq
zhangyi (F) (2):
jbd2: move the clearing of b_modified flag to the journal_unmap_buffer()
jbd2: do not clear the BH_Mapped flag when forgetting a metadata buffer
Greg KH
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 104 +SUBLEVEL = 105 EXTRAVERSION = NAME = "People's Front"
arch/arm/mach-npcm/Kconfig +1 -1
@@ -10,7 +10,7 @@ config ARCH_NPCM7XX depends on ARCH_MULTI_V7 select PINCTRL_NPCM7XX select NPCM7XX_TIMER - select ARCH_REQUIRE_GPIOLIB + select GPIOLIB select CACHE_L2X0 select ARM_GIC select HAVE_ARM_TWD if SMP
arch/arm64/kernel/cpufeature.c +45 -7
79 lines not on this page · raw message
arch/arm64/kernel/fpsimd.c +18 -2
@@ -218,6 +218,7 @@ static void sve_free(struct task_struct *task)static void task_fpsimd_load (void ) {WARN_ON (!in_softirq () && !irqs_disabled ()); +WARN_ON (!system_supports_fpsimd ());if (system_supports_sve () &&test_thread_flag (TIF_SVE )) sve_load_state(sve_pffr(¤t->thread),
@@ -238,6 +239,7 @@ void fpsimd_save(void)struct user_fpsimd_state *st =__this_cpu_read (fpsimd_last_state.st);/* set by fpsimd_bind_task_to_cpu() or fpsimd_bind_state_to_cpu() */ +WARN_ON (!system_supports_fpsimd ());WARN_ON (!in_softirq () && !irqs_disabled ());if (!test_thread_flag (TIF_FOREIGN_FPSTATE )) {
@@ -977,6 +979,7 @@ void fpsimd_bind_task_to_cpu(void)struct fpsimd_last_state_struct *last =this_cpu_ptr (&fpsimd_last_state); +WARN_ON (!system_supports_fpsimd ()); last->st = ¤t->thread.uw.fpsimd_state; current->thread.fpsimd_cpu =smp_processor_id ();
@@ -996,6 +999,7 @@ void fpsimd_bind_state_to_cpu(struct user_fpsimd_state *st)struct fpsimd_last_state_struct *last =this_cpu_ptr (&fpsimd_last_state); +WARN_ON (!system_supports_fpsimd ());WARN_ON (!in_softirq () && !irqs_disabled ()); last->st = st;
@@ -1008,8 +1012,19 @@ void fpsimd_bind_state_to_cpu(struct user_fpsimd_state *st)*/ void fpsimd_restore_current_state (void ) { -if (!system_supports_fpsimd ()) +/* +* For the tasks that were created before we detected the absence of +* FP/SIMD, the TIF_FOREIGN_FPSTATE could be set via fpsimd_thread_switch(), +* e.g, init. This could be then inherited by the children processes. +* If we later detect that the system doesn't support FP/SIMD, +* we must clear the flag for all the tasks to indicate that the +* FPSTATE is clean (as we can't have one) to avoid looping for ever in +* do_notify_resume(). +*/ +if (!system_supports_fpsimd ()) { +clear_thread_flag (TIF_FOREIGN_FPSTATE );return ; + }local_bh_disable ();
@@ -1028,7 +1043,7 @@ void fpsimd_restore_current_state(void)*/ void fpsimd_update_current_state (struct user_fpsimd_state const *state) { -if (!system_supports_fpsimd ()) +if (WARN_ON (!system_supports_fpsimd ()))return ;local_bh_disable ();
@@ -1055,6 +1070,7 @@ void fpsimd_flush_task_state(struct task_struct *t)void fpsimd_flush_cpu_state (void ) { +WARN_ON (!system_supports_fpsimd ());__this_cpu_write (fpsimd_last_state.st,NULL );set_thread_flag (TIF_FOREIGN_FPSTATE ); }
arch/arm64/kernel/process.c +7 -0
@@ -414,6 +414,13 @@ static void ssbs_thread_switch(struct task_struct *next)if (unlikely (next->flags &PF_KTHREAD ))return ; +/* +* If all CPUs implement the SSBS extension, then we just need to +* context-switch the PSTATE field. +*/ +if (cpu_have_feature (cpu_feature (SSBS ))) +return ; +/* If the mitigation is enabled, then we leave SSBS clear. */ if ((arm64_get_ssbd_state () ==ARM64_SSBD_FORCE_ENABLE ) ||test_tsk_thread_flag (next,TIF_SSBD ))
arch/arm64/kvm/hyp/switch.c +9 -1
@@ -37,7 +37,15 @@/* Check whether the FP regs were dirtied while in the host-side run loop: */ static bool __hyp_text update_fp_enabled(struct kvm_vcpu *vcpu) { -if (vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) +/* +* When the system doesn't support FP/SIMD, we cannot rely on +* the _TIF_FOREIGN_FPSTATE flag. However, we always inject an +* abort on the very first access to FP and thus we should never +* see KVM_ARM64_FP_ENABLED. For added safety, make sure we always +* trap the accesses. +*/ +if (!system_supports_fpsimd () || + vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) vcpu->arch.flags &= ~(KVM_ARM64_FP_ENABLED |KVM_ARM64_FP_HOST );
arch/s390/include/asm/timex.h +1 -1
@@ -155,7 +155,7 @@ static inline void get_tod_clock_ext(char *clk)static inline unsigned long long get_tod_clock (void ) { -unsigned char clk[STORE_CLOCK_EXT_SIZE ]; +char clk[STORE_CLOCK_EXT_SIZE ];get_tod_clock_ext (clk);return *((unsigned long long *)&clk[1 ]);
arch/x86/events/amd/core.c +1 -0
@@ -245,6 +245,7 @@ static const u64 amd_f17h_perfmon_event_map[PERF_COUNT_HW_MAX] = [PERF_COUNT_HW_CPU_CYCLES] = 0x0076, [PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0, [PERF_COUNT_HW_CACHE_REFERENCES] = 0xff60, + [PERF_COUNT_HW_CACHE_MISSES] = 0x0964, [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c2, [PERF_COUNT_HW_BRANCH_MISSES] = 0x00c3, [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 0x0287,
arch/x86/events/intel/ds.c +2 -0
@@ -1402,6 +1402,8 @@ intel_pmu_save_and_restart_reload(struct perf_event *event, int count) old = ((s64)(prev_raw_count << shift) >> shift);local64_add (new - old + count * period, &event->count); +local64_set (&hwc->period_left, -new); +perf_event_update_userpage (event);return 0 ;
arch/x86/kvm/paging_tmpl.h +1 -1
@@ -36,7 +36,7 @@#define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT#define PT_HAVE_ACCESSED_DIRTY (mmu) true#ifdef CONFIG_X86_64 -#define PT_MAX_FULL_LEVELS 4 +#define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL#define CMPXCHG cmpxchg#else #define CMPXCHG cmpxchg64
arch/x86/kvm/vmx/vmx.c +3 -0
@@ -2968,6 +2968,9 @@ void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)static int get_ept_level (struct kvm_vcpu *vcpu) { +/* Nested EPT currently only supports 4-level walks. */ +if (is_guest_mode (vcpu) &&nested_cpu_has_ept (get_vmcs12 (vcpu))) +return 4 ;if (cpu_has_vmx_ept_5levels () && (cpuid_maxphyaddr (vcpu) >48 ))return 5 ;return 4 ;
drivers/hwmon/pmbus/ltc2978.c +2 -2
@@ -89,8 +89,8 @@ enum chips { ltc2974, ltc2975, ltc2977, ltc2978, ltc2980, ltc3880, ltc3882,#define LTC_POLL_TIMEOUT 100/* in milli-seconds */ -#define LTC_NOT_BUSY BIT(5) -#define LTC_NOT_PENDING BIT(4) +#define LTC_NOT_BUSY BIT(6) +#define LTC_NOT_PENDING BIT(5)/* * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which
drivers/infiniband/core/security.c +9 -15
@@ -336,22 +336,16 @@ static struct ib_ports_pkeys *get_new_pps(const struct ib_qp *qp,if (!new_pps)return NULL ; -if (qp_attr_mask & (IB_QP_PKEY_INDEX |IB_QP_PORT )) { -if (!qp_pps) { - new_pps->main.port_num = qp_attr->port_num; - new_pps->main.pkey_index = qp_attr->pkey_index; - }else { - new_pps->main.port_num = (qp_attr_mask &IB_QP_PORT ) ? - qp_attr->port_num : - qp_pps->main.port_num; - - new_pps->main.pkey_index = - (qp_attr_mask &IB_QP_PKEY_INDEX ) ? - qp_attr->pkey_index : - qp_pps->main.pkey_index; - } +if (qp_attr_mask &IB_QP_PORT ) + new_pps->main.port_num = + (qp_pps) ? qp_pps->main.port_num : qp_attr->port_num; +if (qp_attr_mask &IB_QP_PKEY_INDEX ) + new_pps->main.pkey_index = (qp_pps) ? qp_pps->main.pkey_index : + qp_attr->pkey_index; +if ((qp_attr_mask &IB_QP_PKEY_INDEX ) && (qp_attr_mask &IB_QP_PORT )) new_pps->main.state =IB_PORT_PKEY_VALID ; - }else if (qp_pps) { + +if (!(qp_attr_mask & (IB_QP_PKEY_INDEX ||IB_QP_PORT )) && qp_pps) { new_pps->main.port_num = qp_pps->main.port_num; new_pps->main.pkey_index = qp_pps->main.pkey_index;if (qp_pps->main.state !=IB_PORT_PKEY_NOT_VALID )
drivers/infiniband/core/uverbs_cmd.c +7 -8
@@ -2914,12 +2914,6 @@ static int kern_spec_to_ib_spec_action(struct ib_uverbs_file *ufile,return 0 ; } -static size_t kern_spec_filter_sz (const struct ib_uverbs_flow_spec_hdr *spec) -{ -/* Returns user space filter size, includes padding */ -return (spec->size -sizeof (struct ib_uverbs_flow_spec_hdr )) /2 ; -} -static ssize_t spec_filter_size (const void *kern_spec_filter,u16 kern_filter_size,u16 ib_real_filter_sz) {
@@ -3063,11 +3057,16 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,static int kern_spec_to_ib_spec_filter (struct ib_uverbs_flow_spec *kern_spec,union ib_flow_spec *ib_spec) { -ssize_t kern_filter_sz; +size_t kern_filter_sz;void *kern_spec_mask;void *kern_spec_val; - kern_filter_sz =kern_spec_filter_sz (&kern_spec->hdr); +if (check_sub_overflow ((size_t )kern_spec->hdr.size, +sizeof (struct ib_uverbs_flow_spec_hdr ), + &kern_filter_sz)) +return -EINVAL ; + + kern_filter_sz /=2 ; kern_spec_val = (void *)kern_spec +sizeof (struct ib_uverbs_flow_spec_hdr );
drivers/infiniband/hw/hfi1/affinity.c +2 -0
@@ -478,6 +478,8 @@ static int _dev_comp_vect_mappings_create(struct hfi1_devdata *dd, rvt_get_ibdev_name(&(dd)->verbs_dev.rdi), i, cpu); } +free_cpumask_var (available_cpus); +free_cpumask_var (non_intr_cpus);return 0 ; fail:
drivers/infiniband/hw/hfi1/file_ops.c +32 -20
88 lines not on this page · raw message
drivers/infiniband/hw/hfi1/hfi.h +4 -1
@@ -1376,10 +1376,13 @@ struct mmu_rb_handler;/* Private data for file operations */ struct hfi1_filedata { +struct srcu_struct pq_srcu;struct hfi1_devdata *dd;struct hfi1_ctxtdata *uctxt;struct hfi1_user_sdma_comp_q *cq; -struct hfi1_user_sdma_pkt_q *pq; +/* update side lock for SRCU */ +spinlock_t pq_rcu_lock; +struct hfi1_user_sdma_pkt_q __rcu *pq;u16 subctxt;/* for cpu affinity; -1 if none */ int rec_cpu_num;
drivers/infiniband/hw/hfi1/user_exp_rcv.c +2 -3
@@ -90,9 +90,6 @@ int hfi1_user_exp_rcv_init(struct hfi1_filedata *fd,struct hfi1_devdata *dd = uctxt->dd;int ret =0 ; -spin_lock_init (&fd->tid_lock); -spin_lock_init (&fd->invalid_lock); - fd->entry_to_rb =kcalloc (uctxt->expected_count,sizeof (struct rb_node *),GFP_KERNEL );
@@ -165,10 +162,12 @@ void hfi1_user_exp_rcv_free(struct hfi1_filedata *fd)if (fd->handler) {hfi1_mmu_rb_unregister (fd->handler); }else { +mutex_lock (&uctxt->exp_mutex);if (!EXP_TID_SET_EMPTY (uctxt->tid_full_list))unlock_exp_tids (uctxt, &uctxt->tid_full_list, fd);if (!EXP_TID_SET_EMPTY (uctxt->tid_used_list))unlock_exp_tids (uctxt, &uctxt->tid_used_list, fd); +mutex_unlock (&uctxt->exp_mutex); }kfree (fd->invalid_tids);
drivers/infiniband/hw/hfi1/user_sdma.c +12 -5
@@ -179,7 +179,6 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt, pq =kzalloc (sizeof (*pq),GFP_KERNEL );if (!pq)return -ENOMEM ; - pq->dd = dd; pq->ctxt = uctxt->ctxt; pq->subctxt = fd->subctxt;
@@ -236,7 +235,7 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt, goto pq_mmu_fail; } - fd->pq = pq; +rcu_assign_pointer (fd->pq, pq); fd->cq = cq;return 0 ;
@@ -264,8 +263,14 @@ int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd,trace_hfi1_sdma_user_free_queues (uctxt->dd, uctxt->ctxt, fd->subctxt); - pq = fd->pq; +spin_lock (&fd->pq_rcu_lock); + pq =srcu_dereference_check (fd->pq, &fd->pq_srcu, +lockdep_is_held (&fd->pq_rcu_lock));if (pq) { +rcu_assign_pointer (fd->pq,NULL ); +spin_unlock (&fd->pq_rcu_lock); +synchronize_srcu (&fd->pq_srcu); +/* at this point there can be no more new requests */ if (pq->handler)hfi1_mmu_rb_unregister (pq->handler);iowait_sdma_drain (&pq->busy);
@@ -277,7 +282,8 @@ int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd,kfree (pq->req_in_use);kmem_cache_destroy (pq->txreq_cache);kfree (pq); - fd->pq =NULL ; + }else { +spin_unlock (&fd->pq_rcu_lock); }if (fd->cq) {vfree (fd->cq->comps);
@@ -321,7 +327,8 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd, {int ret =0 , i;struct hfi1_ctxtdata *uctxt = fd->uctxt; -struct hfi1_user_sdma_pkt_q *pq = fd->pq; +struct hfi1_user_sdma_pkt_q *pq = +srcu_dereference (fd->pq, &fd->pq_srcu);struct hfi1_user_sdma_comp_q *cq = fd->cq;struct hfi1_devdata *dd = pq->dd;unsigned long idx =0 ;
drivers/infiniband/sw/rdmavt/qp.c +51 -33
137 lines not on this page · raw message
drivers/infiniband/sw/rxe/rxe_comp.c +4 -4
@@ -329,7 +329,7 @@ static inline enum comp_state check_ack(struct rxe_qp *qp, qp->comp.psn = pkt->psn;if (qp->req.wait_psn) { qp->req.wait_psn =0 ; -rxe_run_task (&qp->req.task,1 ); +rxe_run_task (&qp->req.task,0 ); } }return COMPST_ERROR_RETRY ;
@@ -457,7 +457,7 @@ static void do_complete(struct rxe_qp *qp, struct rxe_send_wqe *wqe)*/ if (qp->req.wait_fence) { qp->req.wait_fence =0 ; -rxe_run_task (&qp->req.task,1 ); +rxe_run_task (&qp->req.task,0 ); } }
@@ -473,7 +473,7 @@ static inline enum comp_state complete_ack(struct rxe_qp *qp,if (qp->req.need_rd_atomic) { qp->comp.timeout_retry =0 ; qp->req.need_rd_atomic =0 ; -rxe_run_task (&qp->req.task,1 ); +rxe_run_task (&qp->req.task,0 ); } }
@@ -719,7 +719,7 @@ int rxe_completer(void *arg) RXE_CNT_COMP_RETRY); qp->req.need_retry =1 ; qp->comp.started_retry =1 ; -rxe_run_task (&qp->req.task,1 ); +rxe_run_task (&qp->req.task,0 ); }if (pkt) {
drivers/input/mouse/synaptics.c +3 -1
@@ -149,7 +149,6 @@ static const char * const topbuttonpad_pnp_ids[] = {"LEN0042" ,/* Yoga */ "LEN0045" ,"LEN0047" , -"LEN0049" ,"LEN2000" ,/* S540 */ "LEN2001" ,/* Edge E431 */ "LEN2002", /* Edge E531 */
@@ -169,9 +168,11 @@ static const char * const smbus_pnp_ids[] = {/* all of the topbuttonpad_pnp_ids are valid, we just add some extras */ "LEN0048" ,/* X1 Carbon 3 */ "LEN0046" ,/* X250 */ +"LEN0049" ,/* Yoga 11e */ "LEN004a" ,/* W541 */ "LEN005b" ,/* P50 */ "LEN005e" ,/* T560 */ +"LEN006c" ,/* T470s */ "LEN0071" ,/* T480 */ "LEN0072" ,/* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ "LEN0073", /* X1 Carbon G5 (Elantech) */
@@ -182,6 +183,7 @@ static const char * const smbus_pnp_ids[] = {"LEN0097" ,/* X280 -> ALPS trackpoint */ "LEN009b" ,/* T580 */ "LEN200f" ,/* T450s */ +"LEN2044" ,/* L470 */ "LEN2054" ,/* E480 */ "LEN2055" ,/* E580 */ "SYN3052", /* HP EliteBook 840 G4 */
drivers/nvme/host/core.c +1 -1
@@ -3449,7 +3449,7 @@ static void nvme_get_fw_slot_info(struct nvme_ctrl *ctrl)if (!log)return ; -if (nvme_get_log (ctrl,NVME_NSID_ALL ,0 ,NVME_LOG_FW_SLOT , log, +if (nvme_get_log (ctrl,NVME_NSID_ALL ,NVME_LOG_FW_SLOT ,0 , log,sizeof (*log),0 ))dev_warn (ctrl->device,"Get FW SLOT INFO log error\n" );kfree (log);
fs/btrfs/disk-io.c +1 -0
@@ -3117,6 +3117,7 @@ int open_ctree(struct super_block *sb,/* do not make disk changes in broken FS or nologreplay is given */ if (btrfs_super_log_root (disk_super) !=0 && !btrfs_test_opt (fs_info,NOLOGREPLAY )) { +btrfs_info (fs_info,"start tree-log replay" ); ret =btrfs_replay_log (fs_info, fs_devices);if (ret) { err = ret;
fs/btrfs/extent_map.c +11 -0
@@ -228,6 +228,17 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)struct extent_map *merge =NULL ;struct rb_node *rb; +/* +* We can't modify an extent map that is in the tree and that is being +* used by another task, as it can cause that other task to see it in +* inconsistent state during the merging. We always have 1 reference for +* the tree and 1 for this task (which is unpinning the extent map or +* clearing the logging flag), so anything > 2 means it's being used by +* other tasks too. +*/ +if (refcount_read (&em->refs) >2 ) +return ; +if (em->start !=0 ) { rb =rb_prev (&em->rb_node);if (rb)
fs/btrfs/ref-verify.c +5 -0
@@ -747,6 +747,7 @@ int btrfs_ref_tree_mod(struct btrfs_root *root, u64 bytenr, u64 num_bytes,*/ be =add_block_entry (root->fs_info, bytenr, num_bytes, ref_root);if (IS_ERR (be)) { +kfree (ref);kfree (ra); ret =PTR_ERR (be); goto out;
@@ -760,6 +761,8 @@ int btrfs_ref_tree_mod(struct btrfs_root *root, u64 bytenr, u64 num_bytes, "re-allocated a block that still has references to it!");dump_block_entry (fs_info, be);dump_ref_action (fs_info, ra); +kfree (ref); +kfree (ra); goto out_unlock; }
@@ -822,6 +825,7 @@ int btrfs_ref_tree_mod(struct btrfs_root *root, u64 bytenr, u64 num_bytes, "dropping a ref for a existing root that doesn't have a ref on the block");dump_block_entry (fs_info, be);dump_ref_action (fs_info, ra); +kfree (ref);kfree (ra); goto out_unlock; }
@@ -837,6 +841,7 @@ int btrfs_ref_tree_mod(struct btrfs_root *root, u64 bytenr, u64 num_bytes, "attempting to add another ref for an existing ref on a tree block");dump_block_entry (fs_info, be);dump_ref_action (fs_info, ra); +kfree (ref);kfree (ra); goto out_unlock; }
fs/btrfs/super.c +2 -0
@@ -1857,6 +1857,8 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) }if (btrfs_super_log_root (fs_info->super_copy) !=0 ) { +btrfs_warn (fs_info, +"mount required to replay tree-log, cannot remount read-write" ); ret = -EINVAL ; goto restore; }
fs/ext4/block_validity.c +1 -0
@@ -203,6 +203,7 @@ static int ext4_protect_reserved_inode(struct super_block *sb,return PTR_ERR (inode); num = (inode->i_size + sb->s_blocksize -1 ) >> sb->s_blocksize_bits;while (i < num) { +cond_resched (); map.m_lblk = i; map.m_len = num - i; n =ext4_map_blocks (NULL , inode, &map,0 );
fs/ext4/dir.c +8 -6
@@ -126,12 +126,14 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx)if (err !=ERR_BAD_DX_DIR ) {return err; } -/* -* We don't set the inode dirty flag since it's not -* critical that it get flushed back to the disk. -*/ -ext4_clear_inode_flag (file_inode (file), -EXT4_INODE_INDEX ); +/* Can we just clear INDEX flag to ignore htree information? */ +if (!ext4_has_metadata_csum (sb)) { +/* +* We don't set the inode dirty flag since it's not +* critical that it gets flushed back to the disk. +*/ +ext4_clear_inode_flag (inode,EXT4_INODE_INDEX ); + } }if (ext4_has_inline_data (inode)) {
fs/ext4/ext4.h +4 -1
@@ -2375,8 +2375,11 @@ void ext4_insert_dentry(struct inode *inode, struct ext4_filename *fname);static inline void ext4_update_dx_flag (struct inode *inode) { -if (!ext4_has_feature_dir_index (inode->i_sb)) +if (!ext4_has_feature_dir_index (inode->i_sb)) { +/* ext4_iget() should have caught this... */ +WARN_ON_ONCE (ext4_has_feature_metadata_csum (inode->i_sb));ext4_clear_inode_flag (inode,EXT4_INODE_INDEX ); + } }static const unsigned char ext4_filetype_table[] = {DT_UNKNOWN ,DT_REG ,DT_DIR ,DT_CHR ,DT_BLK ,DT_FIFO ,DT_SOCK ,DT_LNK
fs/ext4/inode.c +12 -0
@@ -4975,6 +4975,18 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ret = -EFSCORRUPTED ; goto bad_inode; } +/* +* If dir_index is not enabled but there's dir with INDEX flag set, +* we'd normally treat htree data as empty space. But with metadata +* checksumming that corrupts checksums so forbid that. +*/ +if (!ext4_has_feature_dir_index (sb) &&ext4_has_metadata_csum (sb) && +ext4_test_inode_flag (inode,EXT4_INODE_INDEX )) { +ext4_error_inode (inode, function, line,0 , +"iget: Dir with htree data on filesystem without dir_index feature." ); + ret = -EFSCORRUPTED ; + goto bad_inode; + } ei->i_disksize = inode->i_size;#ifdef CONFIG_QUOTA ei->i_reserved_quota =0 ;
fs/ext4/mmp.c +7 -5
@@ -120,10 +120,10 @@ void __dump_mmp_msg(struct super_block *sb, struct mmp_struct *mmp, {__ext4_warning (sb, function, line,"%s" , msg);__ext4_warning (sb, function, line, -"MMP failure info: last update time: %llu, last update " -"node: %s, last update device: %s" , - (long long unsigned int )le64_to_cpu (mmp->mmp_time), - mmp->mmp_nodename, mmp->mmp_bdevname); +"MMP failure info: last update time: %llu, last update node: %.*s, last update device: %.*s" , + (unsigned long long )le64_to_cpu (mmp->mmp_time), + (int )sizeof (mmp->mmp_nodename), mmp->mmp_nodename, + (int )sizeof (mmp->mmp_bdevname), mmp->mmp_bdevname); }/*
@@ -154,6 +154,7 @@ static int kmmpd(void *data) mmp_check_interval =max (EXT4_MMP_CHECK_MULT * mmp_update_interval,EXT4_MMP_MIN_CHECK_INTERVAL ); mmp->mmp_check_interval =cpu_to_le16 (mmp_check_interval); +BUILD_BUG_ON (sizeof (mmp->mmp_bdevname) <BDEVNAME_SIZE );bdevname (bh->b_bdev, mmp->mmp_bdevname); memcpy(mmp->mmp_nodename, init_utsname()->nodename,
@@ -375,7 +376,8 @@ int ext4_multi_mount_protect(struct super_block *sb,/* * Start a kernel thread to update the MMP block periodically. */ -EXT4_SB (sb)->s_mmp_tsk =kthread_run (kmmpd, mmpd_data,"kmmpd-%s" , +EXT4_SB (sb)->s_mmp_tsk =kthread_run (kmmpd, mmpd_data,"kmmpd-%.*s" , + (int )sizeof (mmp->mmp_bdevname),bdevname (bh->b_bdev, mmp->mmp_bdevname));if (IS_ERR (EXT4_SB (sb)->s_mmp_tsk)) {
fs/ext4/namei.c +7 -0
@@ -2085,6 +2085,13 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, retval =ext4_dx_add_entry (handle, &fname, dir, inode);if (!retval || (retval !=ERR_BAD_DX_DIR )) goto out; +/* Can we just ignore htree data? */ +if (ext4_has_metadata_csum (sb)) { +EXT4_ERROR_INODE (dir, +"Directory has corrupted htree index." ); + retval = -EFSCORRUPTED ; + goto out; + }ext4_clear_inode_flag (dir,EXT4_INODE_INDEX ); dx_fallback++;ext4_mark_inode_dirty (handle, dir);
fs/ext4/super.c +14 -18
@@ -2923,17 +2923,11 @@ static int ext4_feature_set_ok(struct super_block *sb, int readonly)return 0 ; } -#ifndef CONFIG_QUOTA -if (ext4_has_feature_quota (sb) && !readonly) { +#if !defined(CONFIG_QUOTA ) || !defined(CONFIG_QFMT_V2 ) +if (!readonly && (ext4_has_feature_quota (sb) || +ext4_has_feature_project (sb))) {ext4_msg (sb,KERN_ERR , -"Filesystem with quota feature cannot be mounted RDWR " -"without CONFIG_QUOTA" ); -return 0 ; - } -if (ext4_has_feature_project (sb) && !readonly) { -ext4_msg (sb,KERN_ERR , -"Filesystem with project quota feature cannot be mounted RDWR " -"without CONFIG_QUOTA" ); +"The kernel was not built with CONFIG_QUOTA and CONFIG_QFMT_V2" );return 0 ; }#endif /* CONFIG_QUOTA */
@@ -3727,6 +3721,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)*/ sbi->s_li_wait_mult =EXT4_DEF_LI_WAIT_MULT ; + blocksize =BLOCK_SIZE <<le32_to_cpu (es->s_log_block_size); +if (blocksize <EXT4_MIN_BLOCK_SIZE || + blocksize >EXT4_MAX_BLOCK_SIZE ) { +ext4_msg (sb,KERN_ERR , +"Unsupported filesystem blocksize %d (%d log_block_size)" , + blocksize,le32_to_cpu (es->s_log_block_size)); + goto failed_mount; + } +if (le32_to_cpu (es->s_rev_level) ==EXT4_GOOD_OLD_REV ) { sbi->s_inode_size =EXT4_GOOD_OLD_INODE_SIZE ; sbi->s_first_ino =EXT4_GOOD_OLD_FIRST_INO ;
@@ -3744,6 +3747,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)ext4_msg (sb,KERN_ERR ,"unsupported inode size: %d" , sbi->s_inode_size); +ext4_msg (sb,KERN_ERR ,"blocksize: %d" , blocksize); goto failed_mount; }/*
@@ -3907,14 +3911,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)if (!ext4_feature_set_ok (sb, (sb_rdonly (sb)))) goto failed_mount; - blocksize =BLOCK_SIZE <<le32_to_cpu (es->s_log_block_size); -if (blocksize <EXT4_MIN_BLOCK_SIZE || - blocksize >EXT4_MAX_BLOCK_SIZE ) { -ext4_msg (sb,KERN_ERR , -"Unsupported filesystem blocksize %d (%d log_block_size)" , - blocksize,le32_to_cpu (es->s_log_block_size)); - goto failed_mount; - }if (le32_to_cpu (es->s_log_block_size) > (EXT4_MAX_BLOCK_LOG_SIZE -EXT4_MIN_BLOCK_LOG_SIZE )) { ext4_msg(sb, KERN_ERR,
fs/jbd2/commit.c +25 -21
54 lines not on this page · raw message
fs/jbd2/transaction.c +6 -4
@@ -2228,14 +2228,16 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,return -EBUSY ; }/* -* OK, buffer won't be reachable after truncate. We just set -* j_next_transaction to the running transaction (if there is -* one) and mark buffer as freed so that commit code knows it -* should clear dirty bits when it is done with the buffer. +* OK, buffer won't be reachable after truncate. We just clear +* b_modified to not confuse transaction credit accounting, and +* set j_next_transaction to the running transaction (if there +* is one) and mark buffer as freed so that commit code knows +* it should clear dirty bits when it is done with the buffer. */ set_buffer_freed (bh);if (journal->j_running_transaction &&buffer_jbddirty (bh)) jh->b_next_transaction = journal->j_running_transaction; + jh->b_modified =0 ;jbd2_journal_put_journal_head (jh);spin_unlock (&journal->j_list_lock);jbd_unlock_bh_state (bh);
fs/nfs/nfs4proc.c +1 -1
@@ -5117,7 +5117,7 @@ static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr, hdr->timestamp = jiffies; msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE ]; -nfs4_init_sequence (&hdr->args.seq_args, &hdr->res.seq_res,1 ,0 ); +nfs4_init_sequence (&hdr->args.seq_args, &hdr->res.seq_res,0 ,0 );nfs4_state_protect_write (server->nfs_client, clnt, msg, hdr); }
sound/pci/hda/patch_realtek.c +1 -0
@@ -2442,6 +2442,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {SND_PCI_QUIRK (0x1071 ,0x8258 ,"Evesham Voyaeger" ,ALC882_FIXUP_EAPD ),SND_PCI_QUIRK (0x1458 ,0xa002 ,"Gigabyte EP45-DS3/Z87X-UD3H" ,ALC889_FIXUP_FRONT_HP_NO_PRESENCE ),SND_PCI_QUIRK (0x1458 ,0xa0b8 ,"Gigabyte AZ370-Gaming" ,ALC1220_FIXUP_GB_DUAL_CODECS ), +SND_PCI_QUIRK (0x1462 ,0x1276 ,"MSI-GL73" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1462 ,0x7350 ,"MSI-7350" ,ALC889_FIXUP_CD ),SND_PCI_QUIRK (0x1462 ,0xda57 ,"MSI Z270-Gaming" ,ALC1220_FIXUP_GB_DUAL_CODECS ), SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
sound/usb/clock.c +67 -32
221 lines not on this page · raw message
sound/usb/clock.h +2 -2
@@ -6,7 +6,7 @@ int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface,struct usb_host_interface *alts, struct audioformat *fmt, int rate); -int snd_usb_clock_find_source (struct snd_usb_audio *chip,int protocol, -int entity_id,bool validate); +int snd_usb_clock_find_source (struct snd_usb_audio *chip, +struct audioformat *fmt,bool validate);#endif /* __USBAUDIO_CLOCK_H */
sound/usb/format.c +1 -2
@@ -306,8 +306,7 @@ static int parse_audio_format_rates_v2v3(struct snd_usb_audio *chip,struct usb_device *dev = chip->dev;unsigned char tmp[2 ], *data;int nr_triplets, data_size, ret =0 ; -int clock =snd_usb_clock_find_source (chip, fp->protocol, - fp->clock, false); +int clock =snd_usb_clock_find_source (chip, fp, false);if (clock <0 ) { dev_err(&dev->dev,
sound/usb/mixer.c +10 -2
@@ -912,6 +912,15 @@ static int parse_term_proc_unit(struct mixer_build *state,return 0 ; } +static int parse_term_effect_unit (struct mixer_build *state, +struct usb_audio_term *term, +void *p1,int id) +{ + term->type =UAC3_EFFECT_UNIT <<16 ;/* virtual type */ + term->id = id; +return 0 ; +} +static int parse_term_uac2_clock_source (struct mixer_build *state,struct usb_audio_term *term,void *p1,int id)
@@ -996,8 +1005,7 @@ static int __check_input_term(struct mixer_build *state, int id, UAC3_PROCESSING_UNIT);case PTYPE (UAC_VERSION_2 ,UAC2_EFFECT_UNIT ):case PTYPE (UAC_VERSION_3 ,UAC3_EFFECT_UNIT ): -return parse_term_proc_unit (state, term, p1, id, -UAC3_EFFECT_UNIT ); +return parse_term_effect_unit (state, term, p1, id);case PTYPE (UAC_VERSION_1 ,UAC1_EXTENSION_UNIT ):case PTYPE (UAC_VERSION_2 ,UAC2_EXTENSION_UNIT_V2 ):case PTYPE (UAC_VERSION_3 ,UAC3_EXTENSION_UNIT ):
sound/usb/quirks.c +1 -0
@@ -1182,6 +1182,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)case USB_ID (0x1395 ,0x740a ):/* Sennheiser DECT */ case USB_ID (0x1901 ,0x0191 ):/* GE B850V3 CP2114 audio interface */ case USB_ID (0x21B4 ,0x0081 ):/* AudioQuest DragonFly */ +case USB_ID (0x2912 ,0x30c8 ):/* Audioengine D1 */ return true; }