From 1215204a9485ca28762a4f8c95acf9a696036dd9 Mon Sep 17 00:00:00 2001 From: gaochao Date: Fri, 10 Feb 2023 02:29:10 +0000 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!658=20:?= =?UTF-8?q?=20LTS=205.10=20=E8=A1=A5=E4=B8=81=E5=8D=87=E7=BA=A7'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 8 +- README.OpenSource | 2 +- arch/arm/mm/dump.c | 2 +- arch/mips/sgi-ip27/ip27-xtalk.c | 74 ++--- arch/powerpc/boot/Makefile | 1 - arch/riscv/Makefile | 2 - arch/riscv/include/asm/io.h | 16 +- arch/riscv/kernel/sys_riscv.c | 3 + arch/riscv/mm/fault.c | 3 +- arch/sh/include/asm/sections.h | 2 +- arch/sh/kernel/machvec.c | 10 +- arch/um/kernel/um_arch.c | 2 +- arch/x86/kvm/emulate.c | 2 +- arch/x86/kvm/vmx/nested.c | 30 +- arch/x86/kvm/vmx/vmx.c | 12 +- drivers/firmware/efi/libstub/fdt.c | 8 + drivers/gpu/drm/i915/intel_pm.c | 8 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 3 +- drivers/gpu/drm/nouveau/nouveau_prime.c | 1 + drivers/gpu/drm/udl/udl_modeset.c | 3 + drivers/gpu/drm/virtio/virtgpu_vq.c | 2 +- drivers/hid/hid-multitouch.c | 8 +- drivers/hwmon/gsc-hwmon.c | 1 - drivers/iio/adc/ad7923.c | 4 +- drivers/iio/adc/ltc2497.c | 13 - drivers/iio/dac/ad5593r.c | 46 ++- drivers/iio/pressure/dps310.c | 262 +++++++----------- drivers/mmc/host/sdhci-sprd.c | 2 +- drivers/mtd/nand/raw/atmel/nand-controller.c | 1 - drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 2 - .../net/can/usb/kvaser_usb/kvaser_usb_core.c | 3 +- .../net/can/usb/kvaser_usb/kvaser_usb_hydra.c | 2 +- .../net/can/usb/kvaser_usb/kvaser_usb_leaf.c | 79 ------ drivers/nvme/host/pci.c | 3 +- drivers/pci/setup-res.c | 11 - drivers/platform/chrome/cros_ec_proto.c | 32 --- drivers/powercap/intel_rapl_common.c | 1 + drivers/regulator/qcom_rpm-regulator.c | 24 +- drivers/scsi/qedf/qedf_main.c | 21 -- drivers/staging/greybus/audio_helper.c | 11 + drivers/staging/media/sunxi/cedrus/cedrus.c | 4 +- drivers/thunderbolt/switch.c | 24 -- drivers/thunderbolt/tb.h | 1 - drivers/thunderbolt/tb_regs.h | 1 - drivers/thunderbolt/usb4.c | 20 -- drivers/usb/core/quirks.c | 4 - drivers/video/fbdev/stifb.c | 2 +- fs/btrfs/qgroup.c | 15 - fs/cifs/file.c | 9 - fs/cifs/smb2pdu.c | 7 +- fs/dlm/ast.c | 6 +- fs/dlm/lock.c | 16 +- fs/ext4/fast_commit.c | 40 ++- fs/ext4/file.c | 6 - fs/ext4/inode.c | 14 +- fs/ext4/namei.c | 2 +- fs/ext4/super.c | 19 +- fs/f2fs/checkpoint.c | 10 +- fs/f2fs/f2fs.h | 4 - fs/f2fs/gc.c | 10 +- fs/f2fs/recovery.c | 23 +- fs/f2fs/super.c | 4 +- fs/jbd2/commit.c | 2 +- fs/jbd2/journal.c | 10 +- fs/jbd2/recovery.c | 1 - fs/jbd2/transaction.c | 6 +- fs/quota/quota_tree.c | 38 --- fs/splice.c | 10 +- fs/userfaultfd.c | 4 +- include/linux/ring_buffer.h | 2 +- kernel/livepatch/transition.c | 18 +- kernel/trace/ftrace.c | 8 +- kernel/trace/ring_buffer.c | 87 +----- kernel/trace/trace.c | 23 -- mm/mmap.c | 5 +- net/mac80211/ieee80211_i.h | 2 + net/mac80211/mlme.c | 15 +- net/mac80211/util.c | 4 + scripts/selinux/install_policy.sh | 2 +- security/Kconfig.hardening | 63 ++--- sound/core/rawmidi.c | 2 + sound/core/sound_oss.c | 13 +- sound/pci/hda/patch_realtek.c | 11 +- sound/soc/codecs/wcd9335.c | 2 +- sound/soc/codecs/wcd934x.c | 2 +- sound/usb/endpoint.c | 6 +- 86 files changed, 347 insertions(+), 950 deletions(-) diff --git a/Makefile b/Makefile index 3de4fd1f343b..b2d238f73a30 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 149 +SUBLEVEL = 148 EXTRAVERSION = NAME = Dare mighty things @@ -818,12 +818,12 @@ endif # Initialize all stack variables with a zero value. ifdef CONFIG_INIT_STACK_ALL_ZERO +# Future support for zero initialization is still being debated, see +# https://bugs.llvm.org/show_bug.cgi?id=45497. These flags are subject to being +# renamed or dropped. KBUILD_CFLAGS += -ftrivial-auto-var-init=zero -ifdef CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER -# https://github.com/llvm/llvm-project/issues/44842 KBUILD_CFLAGS += -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang endif -endif DEBUG_CFLAGS := diff --git a/README.OpenSource b/README.OpenSource index dda74b727d4f..b8aa0b814bc3 100644 --- a/README.OpenSource +++ b/README.OpenSource @@ -3,7 +3,7 @@ "Name": "linux-5.10", "License": "GPL-2.0+", "License File": "COPYING", - "Version Number": "5.10.149", + "Version Number": "5.10.148", "Owner": "liuyu82@huawei.com", "Upstream URL": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/log/?h=linux-5.10.y", "Description": "linux kernel 5.10" diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c index 9b9023a92d46..c18d23a5e5f1 100644 --- a/arch/arm/mm/dump.c +++ b/arch/arm/mm/dump.c @@ -342,7 +342,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start) addr = start + i * PMD_SIZE; domain = get_domain_name(pmd); if (pmd_none(*pmd) || pmd_large(*pmd) || !pmd_present(*pmd)) - note_page(st, addr, 4, pmd_val(*pmd), domain); + note_page(st, addr, 3, pmd_val(*pmd), domain); else walk_pte(st, pmd, addr, domain); diff --git a/arch/mips/sgi-ip27/ip27-xtalk.c b/arch/mips/sgi-ip27/ip27-xtalk.c index 5143d1cf8984..000ede156bdc 100644 --- a/arch/mips/sgi-ip27/ip27-xtalk.c +++ b/arch/mips/sgi-ip27/ip27-xtalk.c @@ -27,18 +27,15 @@ static void bridge_platform_create(nasid_t nasid, int widget, int masterwid) { struct xtalk_bridge_platform_data *bd; struct sgi_w1_platform_data *wd; - struct platform_device *pdev_wd; - struct platform_device *pdev_bd; + struct platform_device *pdev; struct resource w1_res; unsigned long offset; offset = NODE_OFFSET(nasid); wd = kzalloc(sizeof(*wd), GFP_KERNEL); - if (!wd) { - pr_warn("xtalk:n%d/%x bridge create out of memory\n", nasid, widget); - return; - } + if (!wd) + goto no_mem; snprintf(wd->dev_id, sizeof(wd->dev_id), "bridge-%012lx", offset + (widget << SWIN_SIZE_BITS)); @@ -49,35 +46,22 @@ static void bridge_platform_create(nasid_t nasid, int widget, int masterwid) w1_res.end = w1_res.start + 3; w1_res.flags = IORESOURCE_MEM; - pdev_wd = platform_device_alloc("sgi_w1", PLATFORM_DEVID_AUTO); - if (!pdev_wd) { - pr_warn("xtalk:n%d/%x bridge create out of memory\n", nasid, widget); - goto err_kfree_wd; - } - if (platform_device_add_resources(pdev_wd, &w1_res, 1)) { - pr_warn("xtalk:n%d/%x bridge failed to add platform resources.\n", nasid, widget); - goto err_put_pdev_wd; - } - if (platform_device_add_data(pdev_wd, wd, sizeof(*wd))) { - pr_warn("xtalk:n%d/%x bridge failed to add platform data.\n", nasid, widget); - goto err_put_pdev_wd; - } - if (platform_device_add(pdev_wd)) { - pr_warn("xtalk:n%d/%x bridge failed to add platform device.\n", nasid, widget); - goto err_put_pdev_wd; + pdev = platform_device_alloc("sgi_w1", PLATFORM_DEVID_AUTO); + if (!pdev) { + kfree(wd); + goto no_mem; } - /* platform_device_add_data() duplicates the data */ - kfree(wd); + platform_device_add_resources(pdev, &w1_res, 1); + platform_device_add_data(pdev, wd, sizeof(*wd)); + platform_device_add(pdev); bd = kzalloc(sizeof(*bd), GFP_KERNEL); - if (!bd) { - pr_warn("xtalk:n%d/%x bridge create out of memory\n", nasid, widget); - goto err_unregister_pdev_wd; - } - pdev_bd = platform_device_alloc("xtalk-bridge", PLATFORM_DEVID_AUTO); - if (!pdev_bd) { - pr_warn("xtalk:n%d/%x bridge create out of memory\n", nasid, widget); - goto err_kfree_bd; + if (!bd) + goto no_mem; + pdev = platform_device_alloc("xtalk-bridge", PLATFORM_DEVID_AUTO); + if (!pdev) { + kfree(bd); + goto no_mem; } @@ -98,31 +82,13 @@ static void bridge_platform_create(nasid_t nasid, int widget, int masterwid) bd->io.flags = IORESOURCE_IO; bd->io_offset = offset; - if (platform_device_add_data(pdev_bd, bd, sizeof(*bd))) { - pr_warn("xtalk:n%d/%x bridge failed to add platform data.\n", nasid, widget); - goto err_put_pdev_bd; - } - if (platform_device_add(pdev_bd)) { - pr_warn("xtalk:n%d/%x bridge failed to add platform device.\n", nasid, widget); - goto err_put_pdev_bd; - } - /* platform_device_add_data() duplicates the data */ - kfree(bd); + platform_device_add_data(pdev, bd, sizeof(*bd)); + platform_device_add(pdev); pr_info("xtalk:n%d/%x bridge widget\n", nasid, widget); return; -err_put_pdev_bd: - platform_device_put(pdev_bd); -err_kfree_bd: - kfree(bd); -err_unregister_pdev_wd: - platform_device_unregister(pdev_wd); - return; -err_put_pdev_wd: - platform_device_put(pdev_wd); -err_kfree_wd: - kfree(wd); - return; +no_mem: + pr_warn("xtalk:n%d/%x bridge create out of memory\n", nasid, widget); } static int probe_one_port(nasid_t nasid, int widget, int masterwid) diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 8b78eba755f9..e4b364b5da9e 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -30,7 +30,6 @@ endif BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -O2 -msoft-float -mno-altivec -mno-vsx \ - $(call cc-option,-mno-spe) $(call cc-option,-mspe=no) \ -pipe -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ $(LINUXINCLUDE) diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 1bb1bf1141cc..3d3016092b31 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -37,7 +37,6 @@ else endif ifeq ($(CONFIG_LD_IS_LLD),y) -ifeq ($(shell test $(CONFIG_LLD_VERSION) -lt 150000; echo $$?),0) KBUILD_CFLAGS += -mno-relax KBUILD_AFLAGS += -mno-relax ifneq ($(LLVM_IAS),1) @@ -45,7 +44,6 @@ ifneq ($(LLVM_IAS),1) KBUILD_AFLAGS += -Wa,-mno-relax endif endif -endif # ISA string setting riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima diff --git a/arch/riscv/include/asm/io.h b/arch/riscv/include/asm/io.h index 391dd869db64..c025a746a148 100644 --- a/arch/riscv/include/asm/io.h +++ b/arch/riscv/include/asm/io.h @@ -114,9 +114,9 @@ __io_reads_ins(reads, u32, l, __io_br(), __io_ar(addr)) __io_reads_ins(ins, u8, b, __io_pbr(), __io_par(addr)) __io_reads_ins(ins, u16, w, __io_pbr(), __io_par(addr)) __io_reads_ins(ins, u32, l, __io_pbr(), __io_par(addr)) -#define insb(addr, buffer, count) __insb(PCI_IOBASE + (addr), buffer, count) -#define insw(addr, buffer, count) __insw(PCI_IOBASE + (addr), buffer, count) -#define insl(addr, buffer, count) __insl(PCI_IOBASE + (addr), buffer, count) +#define insb(addr, buffer, count) __insb((void __iomem *)(long)addr, buffer, count) +#define insw(addr, buffer, count) __insw((void __iomem *)(long)addr, buffer, count) +#define insl(addr, buffer, count) __insl((void __iomem *)(long)addr, buffer, count) __io_writes_outs(writes, u8, b, __io_bw(), __io_aw()) __io_writes_outs(writes, u16, w, __io_bw(), __io_aw()) @@ -128,22 +128,22 @@ __io_writes_outs(writes, u32, l, __io_bw(), __io_aw()) __io_writes_outs(outs, u8, b, __io_pbw(), __io_paw()) __io_writes_outs(outs, u16, w, __io_pbw(), __io_paw()) __io_writes_outs(outs, u32, l, __io_pbw(), __io_paw()) -#define outsb(addr, buffer, count) __outsb(PCI_IOBASE + (addr), buffer, count) -#define outsw(addr, buffer, count) __outsw(PCI_IOBASE + (addr), buffer, count) -#define outsl(addr, buffer, count) __outsl(PCI_IOBASE + (addr), buffer, count) +#define outsb(addr, buffer, count) __outsb((void __iomem *)(long)addr, buffer, count) +#define outsw(addr, buffer, count) __outsw((void __iomem *)(long)addr, buffer, count) +#define outsl(addr, buffer, count) __outsl((void __iomem *)(long)addr, buffer, count) #ifdef CONFIG_64BIT __io_reads_ins(reads, u64, q, __io_br(), __io_ar(addr)) #define readsq(addr, buffer, count) __readsq(addr, buffer, count) __io_reads_ins(ins, u64, q, __io_pbr(), __io_par(addr)) -#define insq(addr, buffer, count) __insq(PCI_IOBASE + (addr), buffer, count) +#define insq(addr, buffer, count) __insq((void __iomem *)addr, buffer, count) __io_writes_outs(writes, u64, q, __io_bw(), __io_aw()) #define writesq(addr, buffer, count) __writesq(addr, buffer, count) __io_writes_outs(outs, u64, q, __io_pbr(), __io_paw()) -#define outsq(addr, buffer, count) __outsq(PCI_IOBASE + (addr), buffer, count) +#define outsq(addr, buffer, count) __outsq((void __iomem *)addr, buffer, count) #endif #include diff --git a/arch/riscv/kernel/sys_riscv.c b/arch/riscv/kernel/sys_riscv.c index bb402685057a..8a7880b9c433 100644 --- a/arch/riscv/kernel/sys_riscv.c +++ b/arch/riscv/kernel/sys_riscv.c @@ -18,6 +18,9 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len, if (unlikely(offset & (~PAGE_MASK >> page_shift_offset))) return -EINVAL; + if (unlikely((prot & PROT_WRITE) && !(prot & PROT_READ))) + return -EINVAL; + return ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> (PAGE_SHIFT - page_shift_offset)); } diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c index 8f84bbe0ac33..3c8b9e433c67 100644 --- a/arch/riscv/mm/fault.c +++ b/arch/riscv/mm/fault.c @@ -167,8 +167,7 @@ static inline bool access_error(unsigned long cause, struct vm_area_struct *vma) } break; case EXC_LOAD_PAGE_FAULT: - /* Write implies read */ - if (!(vma->vm_flags & (VM_READ | VM_WRITE))) { + if (!(vma->vm_flags & VM_READ)) { return true; } break; diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h index 0cb0ca149ac3..8edb824049b9 100644 --- a/arch/sh/include/asm/sections.h +++ b/arch/sh/include/asm/sections.h @@ -4,7 +4,7 @@ #include -extern char __machvec_start[], __machvec_end[]; +extern long __machvec_start, __machvec_end; extern char __uncached_start, __uncached_end; extern char __start_eh_frame[], __stop_eh_frame[]; diff --git a/arch/sh/kernel/machvec.c b/arch/sh/kernel/machvec.c index 57efaf5b82ae..d606679a211e 100644 --- a/arch/sh/kernel/machvec.c +++ b/arch/sh/kernel/machvec.c @@ -20,8 +20,8 @@ #define MV_NAME_SIZE 32 #define for_each_mv(mv) \ - for ((mv) = (struct sh_machine_vector *)__machvec_start; \ - (mv) && (unsigned long)(mv) < (unsigned long)__machvec_end; \ + for ((mv) = (struct sh_machine_vector *)&__machvec_start; \ + (mv) && (unsigned long)(mv) < (unsigned long)&__machvec_end; \ (mv)++) static struct sh_machine_vector * __init get_mv_byname(const char *name) @@ -87,8 +87,8 @@ void __init sh_mv_setup(void) if (!machvec_selected) { unsigned long machvec_size; - machvec_size = ((unsigned long)__machvec_end - - (unsigned long)__machvec_start); + machvec_size = ((unsigned long)&__machvec_end - + (unsigned long)&__machvec_start); /* * Sanity check for machvec section alignment. Ensure @@ -102,7 +102,7 @@ void __init sh_mv_setup(void) * vector (usually the only one) from .machvec.init. */ if (machvec_size >= sizeof(struct sh_machine_vector)) - sh_mv = *(struct sh_machine_vector *)__machvec_start; + sh_mv = *(struct sh_machine_vector *)&__machvec_start; } pr_notice("Booting machvec: %s\n", get_system_type()); diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 00c6dce14bd2..52e2e2a3e4ae 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -77,7 +77,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) static void *c_start(struct seq_file *m, loff_t *pos) { - return *pos < nr_cpu_ids ? cpu_data + *pos : NULL; + return *pos < NR_CPUS ? cpu_data + *pos : NULL; } static void *c_next(struct seq_file *m, void *v, loff_t *pos) diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 52a881d24070..2aa41d682bb2 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -2039,7 +2039,7 @@ static int em_pop_sreg(struct x86_emulate_ctxt *ctxt) if (rc != X86EMUL_CONTINUE) return rc; - if (seg == VCPU_SREG_SS) + if (ctxt->modrm_reg == VCPU_SREG_SS) ctxt->interruptibility = KVM_X86_SHADOW_INT_MOV_SS; if (ctxt->op_bytes > 2) rsp_increment(ctxt, ctxt->op_bytes - 2); diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 65b97254a7ec..42d9345b10c3 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -3776,16 +3776,7 @@ static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu, u32 intr_info = nr | INTR_INFO_VALID_MASK; if (vcpu->arch.exception.has_error_code) { - /* - * Intel CPUs do not generate error codes with bits 31:16 set, - * and more importantly VMX disallows setting bits 31:16 in the - * injected error code for VM-Entry. Drop the bits to mimic - * hardware and avoid inducing failure on nested VM-Entry if L1 - * chooses to inject the exception back to L2. AMD CPUs _do_ - * generate "full" 32-bit error codes, so KVM allows userspace - * to inject exception error codes with bits 31:16 set. - */ - vmcs12->vm_exit_intr_error_code = (u16)vcpu->arch.exception.error_code; + vmcs12->vm_exit_intr_error_code = vcpu->arch.exception.error_code; intr_info |= INTR_INFO_DELIVER_CODE_MASK; } @@ -4192,6 +4183,14 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, nested_vmx_abort(vcpu, VMX_ABORT_SAVE_GUEST_MSR_FAIL); } + + /* + * Drop what we picked up for L2 via vmx_complete_interrupts. It is + * preserved above and would only end up incorrectly in L1. + */ + vcpu->arch.nmi_injected = false; + kvm_clear_exception_queue(vcpu); + kvm_clear_interrupt_queue(vcpu); } /* @@ -4531,17 +4530,6 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason, WARN_ON_ONCE(nested_early_check); } - /* - * Drop events/exceptions that were queued for re-injection to L2 - * (picked up via vmx_complete_interrupts()), as well as exceptions - * that were pending for L2. Note, this must NOT be hoisted above - * prepare_vmcs12(), events/exceptions queued for re-injection need to - * be captured in vmcs12 (see vmcs12_save_pending_event()). - */ - vcpu->arch.nmi_injected = false; - kvm_clear_exception_queue(vcpu); - kvm_clear_interrupt_queue(vcpu); - vmx_switch_vmcs(vcpu, &vmx->vmcs01); /* diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 7fe780db83c6..07b6c6e634b5 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -1739,17 +1739,7 @@ static void vmx_queue_exception(struct kvm_vcpu *vcpu) kvm_deliver_exception_payload(vcpu); if (has_error_code) { - /* - * Despite the error code being architecturally defined as 32 - * bits, and the VMCS field being 32 bits, Intel CPUs and thus - * VMX don't actually supporting setting bits 31:16. Hardware - * will (should) never provide a bogus error code, but AMD CPUs - * do generate error codes with bits 31:16 set, and so KVM's - * ABI lets userspace shove in arbitrary 32-bit values. Drop - * the upper bits to avoid VM-Fail, losing information that - * does't really exist is preferable to killing the VM. - */ - vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, (u16)error_code); + vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); intr_info |= INTR_INFO_DELIVER_CODE_MASK; } diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c index d48b0de05b62..368cd60000ee 100644 --- a/drivers/firmware/efi/libstub/fdt.c +++ b/drivers/firmware/efi/libstub/fdt.c @@ -281,6 +281,14 @@ efi_status_t allocate_new_fdt_and_exit_boot(void *handle, goto fail; } + /* + * Now that we have done our final memory allocation (and free) + * we can get the memory map key needed for exit_boot_services(). + */ + status = efi_get_memory_map(&map); + if (status != EFI_SUCCESS) + goto fail_free_new_fdt; + status = update_fdt((void *)fdt_addr, fdt_size, (void *)*new_fdt_addr, MAX_FDT_SIZE, cmdline_ptr, initrd_addr, initrd_size); diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1b5e8d3e45a9..2f2dc029668b 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -5145,14 +5145,10 @@ skl_compute_wm_params(const struct intel_crtc_state *crtc_state, wp->y_tiled = modifier == I915_FORMAT_MOD_Y_TILED || modifier == I915_FORMAT_MOD_Yf_TILED || modifier == I915_FORMAT_MOD_Y_TILED_CCS || - modifier == I915_FORMAT_MOD_Yf_TILED_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS; + modifier == I915_FORMAT_MOD_Yf_TILED_CCS; wp->x_tiled = modifier == I915_FORMAT_MOD_X_TILED; wp->rc_surface = modifier == I915_FORMAT_MOD_Y_TILED_CCS || - modifier == I915_FORMAT_MOD_Yf_TILED_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS || - modifier == I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS; + modifier == I915_FORMAT_MOD_Yf_TILED_CCS; wp->is_planar = intel_format_info_is_yuv_semiplanar(format, modifier); wp->width = width; diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 9542fc63e796..4c992fd5bd68 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c @@ -500,8 +500,7 @@ nouveau_connector_set_encoder(struct drm_connector *connector, connector->interlace_allowed = nv_encoder->caps.dp_interlace; else - connector->interlace_allowed = - drm->client.device.info.family < NV_DEVICE_INFO_V0_VOLTA; + connector->interlace_allowed = true; connector->doublescan_allowed = true; } else if (nv_encoder->dcb->type == DCB_OUTPUT_LVDS || diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c index f08bda533bd9..5f5b87f99546 100644 --- a/drivers/gpu/drm/nouveau/nouveau_prime.c +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c @@ -89,6 +89,7 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev, ret = nouveau_bo_init(nvbo, size, align, NOUVEAU_GEM_DOMAIN_GART, sg, robj); if (ret) { + nouveau_bo_ref(NULL, &nvbo); obj = ERR_PTR(ret); goto unlock; } diff --git a/drivers/gpu/drm/udl/udl_modeset.c b/drivers/gpu/drm/udl/udl_modeset.c index 209b5ceba3e0..edcfd8c120c4 100644 --- a/drivers/gpu/drm/udl/udl_modeset.c +++ b/drivers/gpu/drm/udl/udl_modeset.c @@ -400,6 +400,9 @@ udl_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe, udl_handle_damage(fb, 0, 0, fb->width, fb->height); + if (!crtc_state->mode_changed) + return; + /* enable display */ udl_crtc_write_mode_to_hw(crtc); } diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c index e98a29d243c0..5e40fa0f5e8f 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -601,7 +601,7 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev, bool use_dma_api = !virtio_has_dma_quirk(vgdev->vdev); struct virtio_gpu_object_shmem *shmem = to_virtio_gpu_shmem(bo); - if (virtio_gpu_is_shmem(bo) && use_dma_api) + if (use_dma_api) dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, shmem->pages, DMA_TO_DEVICE); diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index a78ce16d4782..d686917cc3b1 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c @@ -1155,7 +1155,7 @@ static void mt_touch_report(struct hid_device *hid, int contact_count = -1; /* sticky fingers release in progress, abort */ - if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) + if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) return; scantime = *app->scantime; @@ -1236,7 +1236,7 @@ static void mt_touch_report(struct hid_device *hid, del_timer(&td->release_timer); } - clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); + clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); } static int mt_touch_input_configured(struct hid_device *hdev, @@ -1671,11 +1671,11 @@ static void mt_expired_timeout(struct timer_list *t) * An input report came in just before we release the sticky fingers, * it will take care of the sticky fingers. */ - if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) + if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) return; if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags)) mt_release_contacts(hdev); - clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); + clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); } static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) diff --git a/drivers/hwmon/gsc-hwmon.c b/drivers/hwmon/gsc-hwmon.c index f29ce49294da..1fe37418ff46 100644 --- a/drivers/hwmon/gsc-hwmon.c +++ b/drivers/hwmon/gsc-hwmon.c @@ -267,7 +267,6 @@ gsc_hwmon_get_devtree_pdata(struct device *dev) pdata->nchannels = nchannels; /* fan controller base address */ - of_node_get(dev->parent->of_node); fan = of_find_compatible_node(dev->parent->of_node, NULL, "gw,gsc-fan"); if (fan && of_property_read_u32(fan, "reg", &pdata->fan_base)) { dev_err(dev, "fan node without base\n"); diff --git a/drivers/iio/adc/ad7923.c b/drivers/iio/adc/ad7923.c index 96eeda433ad6..8c1e866f72e8 100644 --- a/drivers/iio/adc/ad7923.c +++ b/drivers/iio/adc/ad7923.c @@ -93,7 +93,6 @@ enum ad7923_id { .sign = 'u', \ .realbits = (bits), \ .storagebits = 16, \ - .shift = 12 - (bits), \ .endianness = IIO_BE, \ }, \ } @@ -275,8 +274,7 @@ static int ad7923_read_raw(struct iio_dev *indio_dev, return ret; if (chan->address == EXTRACT(ret, 12, 4)) - *val = EXTRACT(ret, chan->scan_type.shift, - chan->scan_type.realbits); + *val = EXTRACT(ret, 0, 12); else return -EIO; diff --git a/drivers/iio/adc/ltc2497.c b/drivers/iio/adc/ltc2497.c index 61f373fab9a1..1adddf5a88a9 100644 --- a/drivers/iio/adc/ltc2497.c +++ b/drivers/iio/adc/ltc2497.c @@ -41,19 +41,6 @@ static int ltc2497_result_and_measure(struct ltc2497core_driverdata *ddata, } *val = (be32_to_cpu(st->buf) >> 14) - (1 << 17); - - /* - * The part started a new conversion at the end of the above i2c - * transfer, so if the address didn't change since the last call - * everything is fine and we can return early. - * If not (which should only happen when some sort of bulk - * conversion is implemented) we have to program the new - * address. Note that this probably fails as the conversion that - * was triggered above is like not complete yet and the two - * operations have to be done in a single transfer. - */ - if (ddata->addr_prev == address) - return 0; } ret = i2c_smbus_write_byte(st->client, diff --git a/drivers/iio/dac/ad5593r.c b/drivers/iio/dac/ad5593r.c index 4cc855c78121..5b4df36fdc2a 100644 --- a/drivers/iio/dac/ad5593r.c +++ b/drivers/iio/dac/ad5593r.c @@ -13,8 +13,6 @@ #include #include -#include - #define AD5593R_MODE_CONF (0 << 4) #define AD5593R_MODE_DAC_WRITE (1 << 4) #define AD5593R_MODE_ADC_READBACK (4 << 4) @@ -22,24 +20,6 @@ #define AD5593R_MODE_GPIO_READBACK (6 << 4) #define AD5593R_MODE_REG_READBACK (7 << 4) -static int ad5593r_read_word(struct i2c_client *i2c, u8 reg, u16 *value) -{ - int ret; - u8 buf[2]; - - ret = i2c_smbus_write_byte(i2c, reg); - if (ret < 0) - return ret; - - ret = i2c_master_recv(i2c, buf, sizeof(buf)); - if (ret < 0) - return ret; - - *value = get_unaligned_be16(buf); - - return 0; -} - static int ad5593r_write_dac(struct ad5592r_state *st, unsigned chan, u16 value) { struct i2c_client *i2c = to_i2c_client(st->dev); @@ -58,7 +38,13 @@ static int ad5593r_read_adc(struct ad5592r_state *st, unsigned chan, u16 *value) if (val < 0) return (int) val; - return ad5593r_read_word(i2c, AD5593R_MODE_ADC_READBACK, value); + val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_ADC_READBACK); + if (val < 0) + return (int) val; + + *value = (u16) val; + + return 0; } static int ad5593r_reg_write(struct ad5592r_state *st, u8 reg, u16 value) @@ -72,19 +58,25 @@ static int ad5593r_reg_write(struct ad5592r_state *st, u8 reg, u16 value) static int ad5593r_reg_read(struct ad5592r_state *st, u8 reg, u16 *value) { struct i2c_client *i2c = to_i2c_client(st->dev); + s32 val; + + val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_REG_READBACK | reg); + if (val < 0) + return (int) val; - return ad5593r_read_word(i2c, AD5593R_MODE_REG_READBACK | reg, value); + *value = (u16) val; + + return 0; } static int ad5593r_gpio_read(struct ad5592r_state *st, u8 *value) { struct i2c_client *i2c = to_i2c_client(st->dev); - u16 val; - int ret; + s32 val; - ret = ad5593r_read_word(i2c, AD5593R_MODE_GPIO_READBACK, &val); - if (ret) - return ret; + val = i2c_smbus_read_word_swapped(i2c, AD5593R_MODE_GPIO_READBACK); + if (val < 0) + return (int) val; *value = (u8) val; diff --git a/drivers/iio/pressure/dps310.c b/drivers/iio/pressure/dps310.c index cf8b92fae1b3..0730380ceb69 100644 --- a/drivers/iio/pressure/dps310.c +++ b/drivers/iio/pressure/dps310.c @@ -89,7 +89,6 @@ struct dps310_data { s32 c00, c10, c20, c30, c01, c11, c21; s32 pressure_raw; s32 temp_raw; - bool timeout_recovery_failed; }; static const struct iio_chan_spec dps310_channels[] = { @@ -160,102 +159,6 @@ static int dps310_get_coefs(struct dps310_data *data) return 0; } -/* - * Some versions of the chip will read temperatures in the ~60C range when - * it's actually ~20C. This is the manufacturer recommended workaround - * to correct the issue. The registers used below are undocumented. - */ -static int dps310_temp_workaround(struct dps310_data *data) -{ - int rc; - int reg; - - rc = regmap_read(data->regmap, 0x32, ®); - if (rc) - return rc; - - /* - * If bit 1 is set then the device is okay, and the workaround does not - * need to be applied - */ - if (reg & BIT(1)) - return 0; - - rc = regmap_write(data->regmap, 0x0e, 0xA5); - if (rc) - return rc; - - rc = regmap_write(data->regmap, 0x0f, 0x96); - if (rc) - return rc; - - rc = regmap_write(data->regmap, 0x62, 0x02); - if (rc) - return rc; - - rc = regmap_write(data->regmap, 0x0e, 0x00); - if (rc) - return rc; - - return regmap_write(data->regmap, 0x0f, 0x00); -} - -static int dps310_startup(struct dps310_data *data) -{ - int rc; - int ready; - - /* - * Set up pressure sensor in single sample, one measurement per second - * mode - */ - rc = regmap_write(data->regmap, DPS310_PRS_CFG, 0); - if (rc) - return rc; - - /* - * Set up external (MEMS) temperature sensor in single sample, one - * measurement per second mode - */ - rc = regmap_write(data->regmap, DPS310_TMP_CFG, DPS310_TMP_EXT); - if (rc) - return rc; - - /* Temp and pressure shifts are disabled when PRC <= 8 */ - rc = regmap_write_bits(data->regmap, DPS310_CFG_REG, - DPS310_PRS_SHIFT_EN | DPS310_TMP_SHIFT_EN, 0); - if (rc) - return rc; - - /* MEAS_CFG doesn't update correctly unless first written with 0 */ - rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG, - DPS310_MEAS_CTRL_BITS, 0); - if (rc) - return rc; - - /* Turn on temperature and pressure measurement in the background */ - rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG, - DPS310_MEAS_CTRL_BITS, DPS310_PRS_EN | - DPS310_TEMP_EN | DPS310_BACKGROUND); - if (rc) - return rc; - - /* - * Calibration coefficients required for reporting temperature. - * They are available 40ms after the device has started - */ - rc = regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, - ready & DPS310_COEF_RDY, 10000, 40000); - if (rc) - return rc; - - rc = dps310_get_coefs(data); - if (rc) - return rc; - - return dps310_temp_workaround(data); -} - static int dps310_get_pres_precision(struct dps310_data *data) { int rc; @@ -394,69 +297,11 @@ static int dps310_get_temp_k(struct dps310_data *data) return scale_factors[ilog2(rc)]; } -static int dps310_reset_wait(struct dps310_data *data) -{ - int rc; - - rc = regmap_write(data->regmap, DPS310_RESET, DPS310_RESET_MAGIC); - if (rc) - return rc; - - /* Wait for device chip access: 2.5ms in specification */ - usleep_range(2500, 12000); - return 0; -} - -static int dps310_reset_reinit(struct dps310_data *data) -{ - int rc; - - rc = dps310_reset_wait(data); - if (rc) - return rc; - - return dps310_startup(data); -} - -static int dps310_ready_status(struct dps310_data *data, int ready_bit, int timeout) -{ - int sleep = DPS310_POLL_SLEEP_US(timeout); - int ready; - - return regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, ready & ready_bit, - sleep, timeout); -} - -static int dps310_ready(struct dps310_data *data, int ready_bit, int timeout) -{ - int rc; - - rc = dps310_ready_status(data, ready_bit, timeout); - if (rc) { - if (rc == -ETIMEDOUT && !data->timeout_recovery_failed) { - /* Reset and reinitialize the chip. */ - if (dps310_reset_reinit(data)) { - data->timeout_recovery_failed = true; - } else { - /* Try again to get sensor ready status. */ - if (dps310_ready_status(data, ready_bit, timeout)) - data->timeout_recovery_failed = true; - else - return 0; - } - } - - return rc; - } - - data->timeout_recovery_failed = false; - return 0; -} - static int dps310_read_pres_raw(struct dps310_data *data) { int rc; int rate; + int ready; int timeout; s32 raw; u8 val[3]; @@ -468,7 +313,9 @@ static int dps310_read_pres_raw(struct dps310_data *data) timeout = DPS310_POLL_TIMEOUT_US(rate); /* Poll for sensor readiness; base the timeout upon the sample rate. */ - rc = dps310_ready(data, DPS310_PRS_RDY, timeout); + rc = regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, + ready & DPS310_PRS_RDY, + DPS310_POLL_SLEEP_US(timeout), timeout); if (rc) goto done; @@ -505,6 +352,7 @@ static int dps310_read_temp_raw(struct dps310_data *data) { int rc; int rate; + int ready; int timeout; if (mutex_lock_interruptible(&data->lock)) @@ -514,8 +362,10 @@ static int dps310_read_temp_raw(struct dps310_data *data) timeout = DPS310_POLL_TIMEOUT_US(rate); /* Poll for sensor readiness; base the timeout upon the sample rate. */ - rc = dps310_ready(data, DPS310_TMP_RDY, timeout); - if (rc) + rc = regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, + ready & DPS310_TMP_RDY, + DPS310_POLL_SLEEP_US(timeout), timeout); + if (rc < 0) goto done; rc = dps310_read_temp_ready(data); @@ -810,7 +660,7 @@ static void dps310_reset(void *action_data) { struct dps310_data *data = action_data; - dps310_reset_wait(data); + regmap_write(data->regmap, DPS310_RESET, DPS310_RESET_MAGIC); } static const struct regmap_config dps310_regmap_config = { @@ -827,12 +677,52 @@ static const struct iio_info dps310_info = { .write_raw = dps310_write_raw, }; +/* + * Some verions of chip will read temperatures in the ~60C range when + * its actually ~20C. This is the manufacturer recommended workaround + * to correct the issue. The registers used below are undocumented. + */ +static int dps310_temp_workaround(struct dps310_data *data) +{ + int rc; + int reg; + + rc = regmap_read(data->regmap, 0x32, ®); + if (rc < 0) + return rc; + + /* + * If bit 1 is set then the device is okay, and the workaround does not + * need to be applied + */ + if (reg & BIT(1)) + return 0; + + rc = regmap_write(data->regmap, 0x0e, 0xA5); + if (rc < 0) + return rc; + + rc = regmap_write(data->regmap, 0x0f, 0x96); + if (rc < 0) + return rc; + + rc = regmap_write(data->regmap, 0x62, 0x02); + if (rc < 0) + return rc; + + rc = regmap_write(data->regmap, 0x0e, 0x00); + if (rc < 0) + return rc; + + return regmap_write(data->regmap, 0x0f, 0x00); +} + static int dps310_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct dps310_data *data; struct iio_dev *iio; - int rc; + int rc, ready; iio = devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!iio) @@ -857,8 +747,54 @@ static int dps310_probe(struct i2c_client *client, if (rc) return rc; - rc = dps310_startup(data); - if (rc) + /* + * Set up pressure sensor in single sample, one measurement per second + * mode + */ + rc = regmap_write(data->regmap, DPS310_PRS_CFG, 0); + + /* + * Set up external (MEMS) temperature sensor in single sample, one + * measurement per second mode + */ + rc = regmap_write(data->regmap, DPS310_TMP_CFG, DPS310_TMP_EXT); + if (rc < 0) + return rc; + + /* Temp and pressure shifts are disabled when PRC <= 8 */ + rc = regmap_write_bits(data->regmap, DPS310_CFG_REG, + DPS310_PRS_SHIFT_EN | DPS310_TMP_SHIFT_EN, 0); + if (rc < 0) + return rc; + + /* MEAS_CFG doesn't update correctly unless first written with 0 */ + rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG, + DPS310_MEAS_CTRL_BITS, 0); + if (rc < 0) + return rc; + + /* Turn on temperature and pressure measurement in the background */ + rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG, + DPS310_MEAS_CTRL_BITS, DPS310_PRS_EN | + DPS310_TEMP_EN | DPS310_BACKGROUND); + if (rc < 0) + return rc; + + /* + * Calibration coefficients required for reporting temperature. + * They are available 40ms after the device has started + */ + rc = regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, + ready & DPS310_COEF_RDY, 10000, 40000); + if (rc < 0) + return rc; + + rc = dps310_get_coefs(data); + if (rc < 0) + return rc; + + rc = dps310_temp_workaround(data); + if (rc < 0) return rc; rc = devm_iio_device_register(&client->dev, iio); diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c index 8575f4537e57..9cd8862e6cbd 100644 --- a/drivers/mmc/host/sdhci-sprd.c +++ b/drivers/mmc/host/sdhci-sprd.c @@ -296,7 +296,7 @@ static unsigned int sdhci_sprd_get_max_clock(struct sdhci_host *host) static unsigned int sdhci_sprd_get_min_clock(struct sdhci_host *host) { - return 100000; + return 400000; } static void sdhci_sprd_set_uhs_signaling(struct sdhci_host *host, diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c index 0d84f8156d8e..2228c34f3dea 100644 --- a/drivers/mtd/nand/raw/atmel/nand-controller.c +++ b/drivers/mtd/nand/raw/atmel/nand-controller.c @@ -405,7 +405,6 @@ static int atmel_nand_dma_transfer(struct atmel_nand_controller *nc, dma_async_issue_pending(nc->dmac); wait_for_completion(&finished); - dma_unmap_single(nc->dev, buf_dma, len, dir); return 0; diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb.h b/drivers/net/can/usb/kvaser_usb/kvaser_usb.h index 62958f04a2f2..61e67986b625 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb.h +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb.h @@ -178,8 +178,6 @@ struct kvaser_usb_dev_cfg { extern const struct kvaser_usb_dev_ops kvaser_usb_hydra_dev_ops; extern const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops; -void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv); - int kvaser_usb_recv_cmd(const struct kvaser_usb *dev, void *cmd, int len, int *actual_len); diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c index 7491f85e85b3..416763fd1f11 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c @@ -453,7 +453,7 @@ static void kvaser_usb_reset_tx_urb_contexts(struct kvaser_usb_net_priv *priv) /* This method might sleep. Do not call it in the atomic context * of URB completions. */ -void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv) +static void kvaser_usb_unlink_tx_urbs(struct kvaser_usb_net_priv *priv) { usb_kill_anchored_urbs(&priv->tx_submitted); kvaser_usb_reset_tx_urb_contexts(priv); @@ -690,7 +690,6 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel) init_usb_anchor(&priv->tx_submitted); init_completion(&priv->start_comp); init_completion(&priv->stop_comp); - init_completion(&priv->flush_comp); priv->can.ctrlmode_supported = 0; priv->dev = dev; diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c index 5d642458bac5..01d4a731b579 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c @@ -1886,7 +1886,7 @@ static int kvaser_usb_hydra_flush_queue(struct kvaser_usb_net_priv *priv) { int err; - reinit_completion(&priv->flush_comp); + init_completion(&priv->flush_comp); err = kvaser_usb_hydra_send_simple_cmd(priv->dev, CMD_FLUSH_QUEUE, priv->channel); diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c index 78d52a5e8fd5..5e281249ad5f 100644 --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c @@ -309,38 +309,6 @@ struct kvaser_cmd { } u; } __packed; -#define CMD_SIZE_ANY 0xff -#define kvaser_fsize(field) sizeof_field(struct kvaser_cmd, field) - -static const u8 kvaser_usb_leaf_cmd_sizes_leaf[] = { - [CMD_START_CHIP_REPLY] = kvaser_fsize(u.simple), - [CMD_STOP_CHIP_REPLY] = kvaser_fsize(u.simple), - [CMD_GET_CARD_INFO_REPLY] = kvaser_fsize(u.cardinfo), - [CMD_TX_ACKNOWLEDGE] = kvaser_fsize(u.tx_acknowledge_header), - [CMD_GET_SOFTWARE_INFO_REPLY] = kvaser_fsize(u.leaf.softinfo), - [CMD_RX_STD_MESSAGE] = kvaser_fsize(u.leaf.rx_can), - [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.leaf.rx_can), - [CMD_LEAF_LOG_MESSAGE] = kvaser_fsize(u.leaf.log_message), - [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.leaf.chip_state_event), - [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.leaf.error_event), - /* ignored events: */ - [CMD_FLUSH_QUEUE_REPLY] = CMD_SIZE_ANY, -}; - -static const u8 kvaser_usb_leaf_cmd_sizes_usbcan[] = { - [CMD_START_CHIP_REPLY] = kvaser_fsize(u.simple), - [CMD_STOP_CHIP_REPLY] = kvaser_fsize(u.simple), - [CMD_GET_CARD_INFO_REPLY] = kvaser_fsize(u.cardinfo), - [CMD_TX_ACKNOWLEDGE] = kvaser_fsize(u.tx_acknowledge_header), - [CMD_GET_SOFTWARE_INFO_REPLY] = kvaser_fsize(u.usbcan.softinfo), - [CMD_RX_STD_MESSAGE] = kvaser_fsize(u.usbcan.rx_can), - [CMD_RX_EXT_MESSAGE] = kvaser_fsize(u.usbcan.rx_can), - [CMD_CHIP_STATE_EVENT] = kvaser_fsize(u.usbcan.chip_state_event), - [CMD_CAN_ERROR_EVENT] = kvaser_fsize(u.usbcan.error_event), - /* ignored events: */ - [CMD_USBCAN_CLOCK_OVERFLOW_EVENT] = CMD_SIZE_ANY, -}; - /* Summary of a kvaser error event, for a unified Leaf/Usbcan error * handling. Some discrepancies between the two families exist: * @@ -428,43 +396,6 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_32mhz = { .bittiming_const = &kvaser_usb_flexc_bittiming_const, }; -static int kvaser_usb_leaf_verify_size(const struct kvaser_usb *dev, - const struct kvaser_cmd *cmd) -{ - /* buffer size >= cmd->len ensured by caller */ - u8 min_size = 0; - - switch (dev->driver_info->family) { - case KVASER_LEAF: - if (cmd->id < ARRAY_SIZE(kvaser_usb_leaf_cmd_sizes_leaf)) - min_size = kvaser_usb_leaf_cmd_sizes_leaf[cmd->id]; - break; - case KVASER_USBCAN: - if (cmd->id < ARRAY_SIZE(kvaser_usb_leaf_cmd_sizes_usbcan)) - min_size = kvaser_usb_leaf_cmd_sizes_usbcan[cmd->id]; - break; - } - - if (min_size == CMD_SIZE_ANY) - return 0; - - if (min_size) { - min_size += CMD_HEADER_LEN; - if (cmd->len >= min_size) - return 0; - - dev_err_ratelimited(&dev->intf->dev, - "Received command %u too short (size %u, needed %u)", - cmd->id, cmd->len, min_size); - return -EIO; - } - - dev_warn_ratelimited(&dev->intf->dev, - "Unhandled command (%d, size %d)\n", - cmd->id, cmd->len); - return -EINVAL; -} - static void * kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv, const struct sk_buff *skb, int *frame_len, @@ -572,9 +503,6 @@ static int kvaser_usb_leaf_wait_cmd(const struct kvaser_usb *dev, u8 id, end: kfree(buf); - if (err == 0) - err = kvaser_usb_leaf_verify_size(dev, cmd); - return err; } @@ -1209,9 +1137,6 @@ static void kvaser_usb_leaf_stop_chip_reply(const struct kvaser_usb *dev, static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, const struct kvaser_cmd *cmd) { - if (kvaser_usb_leaf_verify_size(dev, cmd) < 0) - return; - switch (cmd->id) { case CMD_START_CHIP_REPLY: kvaser_usb_leaf_start_chip_reply(dev, cmd); @@ -1430,13 +1355,9 @@ static int kvaser_usb_leaf_set_mode(struct net_device *netdev, switch (mode) { case CAN_MODE_START: - kvaser_usb_unlink_tx_urbs(priv); - err = kvaser_usb_leaf_simple_cmd_async(priv, CMD_START_CHIP); if (err) return err; - - priv->can.state = CAN_STATE_ERROR_ACTIVE; break; default: return -EOPNOTSUPP; diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index dc44f94c5a1d..48873d68b41c 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2624,8 +2624,6 @@ static void nvme_reset_work(struct work_struct *work) if (result) goto out_unlock; - dma_set_min_align_mask(dev->dev, NVME_CTRL_PAGE_SIZE - 1); - /* * Limit the max command size to prevent iod->sg allocations going * over a single page. @@ -2638,6 +2636,7 @@ static void nvme_reset_work(struct work_struct *work) * Don't limit the IOMMU merged segment size. */ dma_set_max_seg_size(dev->dev, 0xffffffff); + dma_set_min_align_mask(dev->dev, NVME_CTRL_PAGE_SIZE - 1); mutex_unlock(&dev->shutdown_lock); diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 875d50c16f19..7f1acb3918d0 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -210,17 +210,6 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev, root = pci_find_parent_resource(dev, res); if (!root) { - /* - * If dev is behind a bridge, accesses will only reach it - * if res is inside the relevant bridge window. - */ - if (pci_upstream_bridge(dev)) - return -ENXIO; - - /* - * On the root bus, assume the host bridge will forward - * everything. - */ if (res->flags & IORESOURCE_IO) root = &ioport_resource; else diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index 8ffbf92ec1e0..3a2a78ff3330 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -748,7 +748,6 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev, u8 event_type; u32 host_event; int ret; - u32 ver_mask; /* * Default value for wake_event. @@ -770,37 +769,6 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev, return get_keyboard_state_event(ec_dev); ret = get_next_event(ec_dev); - /* - * -ENOPROTOOPT is returned when EC returns EC_RES_INVALID_VERSION. - * This can occur when EC based device (e.g. Fingerprint MCU) jumps to - * the RO image which doesn't support newer version of the command. In - * this case we will attempt to update maximum supported version of the - * EC_CMD_GET_NEXT_EVENT. - */ - if (ret == -ENOPROTOOPT) { - dev_dbg(ec_dev->dev, - "GET_NEXT_EVENT returned invalid version error.\n"); - ret = cros_ec_get_host_command_version_mask(ec_dev, - EC_CMD_GET_NEXT_EVENT, - &ver_mask); - if (ret < 0 || ver_mask == 0) - /* - * Do not change the MKBP supported version if we can't - * obtain supported version correctly. Please note that - * calling EC_CMD_GET_NEXT_EVENT returned - * EC_RES_INVALID_VERSION which means that the command - * is present. - */ - return -ENOPROTOOPT; - - ec_dev->mkbp_event_supported = fls(ver_mask); - dev_dbg(ec_dev->dev, "MKBP support version changed to %u\n", - ec_dev->mkbp_event_supported - 1); - - /* Try to get next event with new MKBP support version set. */ - ret = get_next_event(ec_dev); - } - if (ret <= 0) return ret; diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c index a13a07f475d2..70d6d52bc1e2 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -979,6 +979,7 @@ static const struct rapl_defaults rapl_defaults_spr_server = { .check_unit = rapl_check_unit_core, .set_floor_freq = set_floor_freq_default, .compute_time_window = rapl_compute_time_window_core, + .dram_domain_energy_unit = 15300, .psys_domain_energy_unit = 1000000000, }; diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c index 3c41b71a1f52..7f9d66ac37ff 100644 --- a/drivers/regulator/qcom_rpm-regulator.c +++ b/drivers/regulator/qcom_rpm-regulator.c @@ -802,12 +802,6 @@ static const struct rpm_regulator_data rpm_pm8018_regulators[] = { }; static const struct rpm_regulator_data rpm_pm8058_regulators[] = { - { "s0", QCOM_RPM_PM8058_SMPS0, &pm8058_smps, "vdd_s0" }, - { "s1", QCOM_RPM_PM8058_SMPS1, &pm8058_smps, "vdd_s1" }, - { "s2", QCOM_RPM_PM8058_SMPS2, &pm8058_smps, "vdd_s2" }, - { "s3", QCOM_RPM_PM8058_SMPS3, &pm8058_smps, "vdd_s3" }, - { "s4", QCOM_RPM_PM8058_SMPS4, &pm8058_smps, "vdd_s4" }, - { "l0", QCOM_RPM_PM8058_LDO0, &pm8058_nldo, "vdd_l0_l1_lvs" }, { "l1", QCOM_RPM_PM8058_LDO1, &pm8058_nldo, "vdd_l0_l1_lvs" }, { "l2", QCOM_RPM_PM8058_LDO2, &pm8058_pldo, "vdd_l2_l11_l12" }, @@ -835,6 +829,12 @@ static const struct rpm_regulator_data rpm_pm8058_regulators[] = { { "l24", QCOM_RPM_PM8058_LDO24, &pm8058_nldo, "vdd_l23_l24_l25" }, { "l25", QCOM_RPM_PM8058_LDO25, &pm8058_nldo, "vdd_l23_l24_l25" }, + { "s0", QCOM_RPM_PM8058_SMPS0, &pm8058_smps, "vdd_s0" }, + { "s1", QCOM_RPM_PM8058_SMPS1, &pm8058_smps, "vdd_s1" }, + { "s2", QCOM_RPM_PM8058_SMPS2, &pm8058_smps, "vdd_s2" }, + { "s3", QCOM_RPM_PM8058_SMPS3, &pm8058_smps, "vdd_s3" }, + { "s4", QCOM_RPM_PM8058_SMPS4, &pm8058_smps, "vdd_s4" }, + { "lvs0", QCOM_RPM_PM8058_LVS0, &pm8058_switch, "vdd_l0_l1_lvs" }, { "lvs1", QCOM_RPM_PM8058_LVS1, &pm8058_switch, "vdd_l0_l1_lvs" }, @@ -843,12 +843,6 @@ static const struct rpm_regulator_data rpm_pm8058_regulators[] = { }; static const struct rpm_regulator_data rpm_pm8901_regulators[] = { - { "s0", QCOM_RPM_PM8901_SMPS0, &pm8901_ftsmps, "vdd_s0" }, - { "s1", QCOM_RPM_PM8901_SMPS1, &pm8901_ftsmps, "vdd_s1" }, - { "s2", QCOM_RPM_PM8901_SMPS2, &pm8901_ftsmps, "vdd_s2" }, - { "s3", QCOM_RPM_PM8901_SMPS3, &pm8901_ftsmps, "vdd_s3" }, - { "s4", QCOM_RPM_PM8901_SMPS4, &pm8901_ftsmps, "vdd_s4" }, - { "l0", QCOM_RPM_PM8901_LDO0, &pm8901_nldo, "vdd_l0" }, { "l1", QCOM_RPM_PM8901_LDO1, &pm8901_pldo, "vdd_l1" }, { "l2", QCOM_RPM_PM8901_LDO2, &pm8901_pldo, "vdd_l2" }, @@ -857,6 +851,12 @@ static const struct rpm_regulator_data rpm_pm8901_regulators[] = { { "l5", QCOM_RPM_PM8901_LDO5, &pm8901_pldo, "vdd_l5" }, { "l6", QCOM_RPM_PM8901_LDO6, &pm8901_pldo, "vdd_l6" }, + { "s0", QCOM_RPM_PM8901_SMPS0, &pm8901_ftsmps, "vdd_s0" }, + { "s1", QCOM_RPM_PM8901_SMPS1, &pm8901_ftsmps, "vdd_s1" }, + { "s2", QCOM_RPM_PM8901_SMPS2, &pm8901_ftsmps, "vdd_s2" }, + { "s3", QCOM_RPM_PM8901_SMPS3, &pm8901_ftsmps, "vdd_s3" }, + { "s4", QCOM_RPM_PM8901_SMPS4, &pm8901_ftsmps, "vdd_s4" }, + { "lvs0", QCOM_RPM_PM8901_LVS0, &pm8901_switch, "lvs0_in" }, { "lvs1", QCOM_RPM_PM8901_LVS1, &pm8901_switch, "lvs1_in" }, { "lvs2", QCOM_RPM_PM8901_LVS2, &pm8901_switch, "lvs2_in" }, diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c index f48ef47546f4..de5b6453827c 100644 --- a/drivers/scsi/qedf/qedf_main.c +++ b/drivers/scsi/qedf/qedf_main.c @@ -1917,27 +1917,6 @@ static int qedf_vport_create(struct fc_vport *vport, bool disabled) fc_vport_setlink(vn_port); } - /* Set symbolic node name */ - if (base_qedf->pdev->device == QL45xxx) - snprintf(fc_host_symbolic_name(vn_port->host), 256, - "Marvell FastLinQ 45xxx FCoE v%s", QEDF_VERSION); - - if (base_qedf->pdev->device == QL41xxx) - snprintf(fc_host_symbolic_name(vn_port->host), 256, - "Marvell FastLinQ 41xxx FCoE v%s", QEDF_VERSION); - - /* Set supported speed */ - fc_host_supported_speeds(vn_port->host) = n_port->link_supported_speeds; - - /* Set speed */ - vn_port->link_speed = n_port->link_speed; - - /* Set port type */ - fc_host_port_type(vn_port->host) = FC_PORTTYPE_NPIV; - - /* Set maxframe size */ - fc_host_maxframe_size(vn_port->host) = n_port->mfs; - QEDF_INFO(&(base_qedf->dbg_ctx), QEDF_LOG_NPIV, "vn_port=%p.\n", vn_port); diff --git a/drivers/staging/greybus/audio_helper.c b/drivers/staging/greybus/audio_helper.c index 08443f4aa045..a9576f92efaa 100644 --- a/drivers/staging/greybus/audio_helper.c +++ b/drivers/staging/greybus/audio_helper.c @@ -3,6 +3,7 @@ * Greybus Audio Sound SoC helper APIs */ +#include #include #include #include @@ -115,6 +116,10 @@ int gbaudio_dapm_free_controls(struct snd_soc_dapm_context *dapm, { int i; struct snd_soc_dapm_widget *w, *next_w; +#ifdef CONFIG_DEBUG_FS + struct dentry *parent = dapm->debugfs_dapm; + struct dentry *debugfs_w = NULL; +#endif mutex_lock(&dapm->card->dapm_mutex); for (i = 0; i < num; i++) { @@ -134,6 +139,12 @@ int gbaudio_dapm_free_controls(struct snd_soc_dapm_context *dapm, continue; } widget++; +#ifdef CONFIG_DEBUG_FS + if (!parent) + debugfs_w = debugfs_lookup(w->name, parent); + debugfs_remove(debugfs_w); + debugfs_w = NULL; +#endif gbaudio_dapm_free_widget(w); } mutex_unlock(&dapm->card->dapm_mutex); diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c index 28de90edf4cc..1dd833757c4e 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c @@ -399,8 +399,6 @@ static int cedrus_probe(struct platform_device *pdev) if (!dev) return -ENOMEM; - platform_set_drvdata(pdev, dev); - dev->vfd = cedrus_video_device; dev->dev = &pdev->dev; dev->pdev = pdev; @@ -471,6 +469,8 @@ static int cedrus_probe(struct platform_device *pdev) goto err_m2m_mc; } + platform_set_drvdata(pdev, dev); + return 0; err_m2m_mc: diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index e881b72833dc..65f99d744654 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c @@ -2413,26 +2413,6 @@ void tb_switch_unconfigure_link(struct tb_switch *sw) tb_lc_unconfigure_port(down); } -static int tb_switch_port_hotplug_enable(struct tb_switch *sw) -{ - struct tb_port *port; - - if (tb_switch_is_icm(sw)) - return 0; - - tb_switch_for_each_port(sw, port) { - int res; - - if (!port->cap_usb4) - continue; - - res = usb4_port_hotplug_enable(port); - if (res) - return res; - } - return 0; -} - /** * tb_switch_add() - Add a switch to the domain * @sw: Switch to add @@ -2500,10 +2480,6 @@ int tb_switch_add(struct tb_switch *sw) return ret; } - ret = tb_switch_port_hotplug_enable(sw); - if (ret) - return ret; - ret = device_add(&sw->dev); if (ret) { dev_err(&sw->dev, "failed to add device: %d\n", ret); diff --git a/drivers/thunderbolt/tb.h b/drivers/thunderbolt/tb.h index 266f3bf8ff5c..8ea360b0ff77 100644 --- a/drivers/thunderbolt/tb.h +++ b/drivers/thunderbolt/tb.h @@ -979,7 +979,6 @@ struct tb_port *usb4_switch_map_usb3_down(struct tb_switch *sw, const struct tb_port *port); int usb4_port_unlock(struct tb_port *port); -int usb4_port_hotplug_enable(struct tb_port *port); int usb4_port_configure(struct tb_port *port); void usb4_port_unconfigure(struct tb_port *port); int usb4_port_configure_xdomain(struct tb_port *port); diff --git a/drivers/thunderbolt/tb_regs.h b/drivers/thunderbolt/tb_regs.h index 26868e2f9d0b..e7d9529822fa 100644 --- a/drivers/thunderbolt/tb_regs.h +++ b/drivers/thunderbolt/tb_regs.h @@ -285,7 +285,6 @@ struct tb_regs_port_header { #define ADP_CS_5 0x05 #define ADP_CS_5_LCA_MASK GENMASK(28, 22) #define ADP_CS_5_LCA_SHIFT 22 -#define ADP_CS_5_DHP BIT(31) /* TMU adapter registers */ #define TMU_ADP_CS_3 0x03 diff --git a/drivers/thunderbolt/usb4.c b/drivers/thunderbolt/usb4.c index 0b3a77ade04d..c05ec6fad77f 100644 --- a/drivers/thunderbolt/usb4.c +++ b/drivers/thunderbolt/usb4.c @@ -854,26 +854,6 @@ int usb4_port_unlock(struct tb_port *port) return tb_port_write(port, &val, TB_CFG_PORT, ADP_CS_4, 1); } -/** - * usb4_port_hotplug_enable() - Enables hotplug for a port - * @port: USB4 port to operate on - * - * Enables hot plug events on a given port. This is only intended - * to be used on lane, DP-IN, and DP-OUT adapters. - */ -int usb4_port_hotplug_enable(struct tb_port *port) -{ - int ret; - u32 val; - - ret = tb_port_read(port, &val, TB_CFG_PORT, ADP_CS_5, 1); - if (ret) - return ret; - - val &= ~ADP_CS_5_DHP; - return tb_port_write(port, &val, TB_CFG_PORT, ADP_CS_5, 1); -} - static int usb4_port_set_configured(struct tb_port *port, bool configured) { int ret; diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 03473e20e218..f03ee889ecc7 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -438,10 +438,6 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x1532, 0x0116), .driver_info = USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL }, - /* Lenovo ThinkPad OneLink+ Dock twin hub controllers (VIA Labs VL812) */ - { USB_DEVICE(0x17ef, 0x1018), .driver_info = USB_QUIRK_RESET_RESUME }, - { USB_DEVICE(0x17ef, 0x1019), .driver_info = USB_QUIRK_RESET_RESUME }, - /* Lenovo USB-C to Ethernet Adapter RTL8153-04 */ { USB_DEVICE(0x17ef, 0x720c), .driver_info = USB_QUIRK_NO_LPM }, diff --git a/drivers/video/fbdev/stifb.c b/drivers/video/fbdev/stifb.c index b0470f4f595e..002f265d8db5 100644 --- a/drivers/video/fbdev/stifb.c +++ b/drivers/video/fbdev/stifb.c @@ -1257,7 +1257,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref) /* limit fbsize to max visible screen size */ if (fix->smem_len > yres*fix->line_length) - fix->smem_len = ALIGN(yres*fix->line_length, 4*1024*1024); + fix->smem_len = yres*fix->line_length; fix->accel = FB_ACCEL_NONE; diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 36da77534076..a02e38fb696c 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c @@ -1158,21 +1158,6 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info) fs_info->qgroup_rescan_running = true; btrfs_queue_work(fs_info->qgroup_rescan_workers, &fs_info->qgroup_rescan_work); - } else { - /* - * We have set both BTRFS_FS_QUOTA_ENABLED and - * BTRFS_QGROUP_STATUS_FLAG_ON, so we can only fail with - * -EINPROGRESS. That can happen because someone started the - * rescan worker by calling quota rescan ioctl before we - * attempted to initialize the rescan worker. Failure due to - * quotas disabled in the meanwhile is not possible, because - * we are holding a write lock on fs_info->subvol_sem, which - * is also acquired when disabling quotas. - * Ignore such error, and any other error would need to undo - * everything we did in the transaction we just committed. - */ - ASSERT(ret == -EINPROGRESS); - ret = 0; } out_free_path: diff --git a/fs/cifs/file.c b/fs/cifs/file.c index a648146e49cf..fafb69d338c2 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -3936,15 +3936,6 @@ static ssize_t __cifs_readv( len = ctx->len; } - if (direct) { - rc = filemap_write_and_wait_range(file->f_inode->i_mapping, - offset, offset + len - 1); - if (rc) { - kref_put(&ctx->refcount, cifs_aio_ctx_release); - return -EAGAIN; - } - } - /* grab a lock here due to read response handlers can access ctx */ mutex_lock(&ctx->aio_mutex); diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c index 0c4a2474e75b..7ee8abd1f79b 100644 --- a/fs/cifs/smb2pdu.c +++ b/fs/cifs/smb2pdu.c @@ -1075,9 +1075,9 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) pneg_inbuf->Dialects[0] = cpu_to_le16(server->vals->protocol_id); pneg_inbuf->DialectCount = cpu_to_le16(1); - /* structure is big enough for 4 dialects, sending only 1 */ + /* structure is big enough for 3 dialects, sending only 1 */ inbuflen = sizeof(*pneg_inbuf) - - sizeof(pneg_inbuf->Dialects[0]) * 3; + sizeof(pneg_inbuf->Dialects[0]) * 2; } rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, @@ -2294,7 +2294,7 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len) unsigned int acelen, acl_size, ace_count; unsigned int owner_offset = 0; unsigned int group_offset = 0; - struct smb3_acl acl = {}; + struct smb3_acl acl; *len = roundup(sizeof(struct crt_sd_ctxt) + (sizeof(struct cifs_ace) * 4), 8); @@ -2367,7 +2367,6 @@ create_sd_buf(umode_t mode, bool set_owner, unsigned int *len) acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */ acl.AclSize = cpu_to_le16(acl_size); acl.AceCount = cpu_to_le16(ace_count); - /* acl.Sbz1 and Sbz2 MBZ so are not set here, but initialized above */ memcpy(aclptr, &acl, sizeof(struct smb3_acl)); buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd); diff --git a/fs/dlm/ast.c b/fs/dlm/ast.c index ca06069e95c8..283c7b94edda 100644 --- a/fs/dlm/ast.c +++ b/fs/dlm/ast.c @@ -198,13 +198,13 @@ void dlm_add_cb(struct dlm_lkb *lkb, uint32_t flags, int mode, int status, if (!prev_seq) { kref_get(&lkb->lkb_ref); - mutex_lock(&ls->ls_cb_mutex); if (test_bit(LSFL_CB_DELAY, &ls->ls_flags)) { + mutex_lock(&ls->ls_cb_mutex); list_add(&lkb->lkb_cb_list, &ls->ls_cb_delay); + mutex_unlock(&ls->ls_cb_mutex); } else { queue_work(ls->ls_callback_wq, &lkb->lkb_cb_work); } - mutex_unlock(&ls->ls_cb_mutex); } out: mutex_unlock(&lkb->lkb_cb_mutex); @@ -284,9 +284,7 @@ void dlm_callback_stop(struct dlm_ls *ls) void dlm_callback_suspend(struct dlm_ls *ls) { - mutex_lock(&ls->ls_cb_mutex); set_bit(LSFL_CB_DELAY, &ls->ls_flags); - mutex_unlock(&ls->ls_cb_mutex); if (ls->ls_callback_wq) flush_workqueue(ls->ls_callback_wq); diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index dde9afb6747b..eaa28d654e9f 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c @@ -2888,24 +2888,24 @@ static int set_unlock_args(uint32_t flags, void *astarg, struct dlm_args *args) static int validate_lock_args(struct dlm_ls *ls, struct dlm_lkb *lkb, struct dlm_args *args) { - int rv = -EBUSY; + int rv = -EINVAL; if (args->flags & DLM_LKF_CONVERT) { - if (lkb->lkb_status != DLM_LKSTS_GRANTED) + if (lkb->lkb_flags & DLM_IFL_MSTCPY) goto out; - if (lkb->lkb_wait_type) + if (args->flags & DLM_LKF_QUECVT && + !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1]) goto out; - if (is_overlap(lkb)) + rv = -EBUSY; + if (lkb->lkb_status != DLM_LKSTS_GRANTED) goto out; - rv = -EINVAL; - if (lkb->lkb_flags & DLM_IFL_MSTCPY) + if (lkb->lkb_wait_type) goto out; - if (args->flags & DLM_LKF_QUECVT && - !__quecvt_compat_matrix[lkb->lkb_grmode+1][args->mode+1]) + if (is_overlap(lkb)) goto out; } diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c index 41dcf21558c4..501e60713010 100644 --- a/fs/ext4/fast_commit.c +++ b/fs/ext4/fast_commit.c @@ -766,25 +766,22 @@ static int ext4_fc_write_inode(struct inode *inode, u32 *crc) tl.fc_tag = cpu_to_le16(EXT4_FC_TAG_INODE); tl.fc_len = cpu_to_le16(inode_len + sizeof(fc_inode.fc_ino)); - ret = -ECANCELED; dst = ext4_fc_reserve_space(inode->i_sb, sizeof(tl) + inode_len + sizeof(fc_inode.fc_ino), crc); if (!dst) - goto err; + return -ECANCELED; if (!ext4_fc_memcpy(inode->i_sb, dst, &tl, sizeof(tl), crc)) - goto err; + return -ECANCELED; dst += sizeof(tl); if (!ext4_fc_memcpy(inode->i_sb, dst, &fc_inode, sizeof(fc_inode), crc)) - goto err; + return -ECANCELED; dst += sizeof(fc_inode); if (!ext4_fc_memcpy(inode->i_sb, dst, (u8 *)ext4_raw_inode(&iloc), inode_len, crc)) - goto err; - ret = 0; -err: - brelse(iloc.bh); - return ret; + return -ECANCELED; + + return 0; } /* @@ -1391,15 +1388,13 @@ static int ext4_fc_record_modified_inode(struct super_block *sb, int ino) if (state->fc_modified_inodes[i] == ino) return 0; if (state->fc_modified_inodes_used == state->fc_modified_inodes_size) { - int *fc_modified_inodes; - - fc_modified_inodes = krealloc(state->fc_modified_inodes, + state->fc_modified_inodes = krealloc( + state->fc_modified_inodes, sizeof(int) * (state->fc_modified_inodes_size + EXT4_FC_REPLAY_REALLOC_INCREMENT), GFP_KERNEL); - if (!fc_modified_inodes) + if (!state->fc_modified_inodes) return -ENOMEM; - state->fc_modified_inodes = fc_modified_inodes; state->fc_modified_inodes_size += EXT4_FC_REPLAY_REALLOC_INCREMENT; } @@ -1584,18 +1579,15 @@ int ext4_fc_record_regions(struct super_block *sb, int ino, if (replay && state->fc_regions_used != state->fc_regions_valid) state->fc_regions_used = state->fc_regions_valid; if (state->fc_regions_used == state->fc_regions_size) { - struct ext4_fc_alloc_region *fc_regions; - - fc_regions = krealloc(state->fc_regions, - sizeof(struct ext4_fc_alloc_region) * - (state->fc_regions_size + - EXT4_FC_REPLAY_REALLOC_INCREMENT), - GFP_KERNEL); - if (!fc_regions) - return -ENOMEM; state->fc_regions_size += EXT4_FC_REPLAY_REALLOC_INCREMENT; - state->fc_regions = fc_regions; + state->fc_regions = krealloc( + state->fc_regions, + state->fc_regions_size * + sizeof(struct ext4_fc_alloc_region), + GFP_KERNEL); + if (!state->fc_regions) + return -ENOMEM; } region = &state->fc_regions[state->fc_regions_used++]; region->ino = ino; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 904d0bd91160..3b09ddbe8970 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -529,12 +529,6 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from) ret = -EAGAIN; goto out; } - /* - * Make sure inline data cannot be created anymore since we are going - * to allocate blocks for DIO. We know the inode does not have any - * inline data now because ext4_dio_supported() checked for that. - */ - ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); offset = iocb->ki_pos; count = ret; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index a1c81a3ca6aa..6b12475828b6 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1175,13 +1175,6 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping, page = grab_cache_page_write_begin(mapping, index, flags); if (!page) return -ENOMEM; - /* - * The same as page allocation, we prealloc buffer heads before - * starting the handle. - */ - if (!page_has_buffers(page)) - create_empty_buffers(page, inode->i_sb->s_blocksize, 0); - unlock_page(page); retry_journal: @@ -5753,12 +5746,7 @@ int ext4_mark_iloc_dirty(handle_t *handle, } ext4_fc_track_inode(handle, inode); - /* - * ea_inodes are using i_version for storing reference count, don't - * mess with it - */ - if (IS_I_VERSION(inode) && - !(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) + if (IS_I_VERSION(inode)) inode_inc_iversion(inode); /* the do_update_inode consumes one bh->b_count */ diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index d298dd08c9b1..a8531750a6a7 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -125,7 +125,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode, struct ext4_dir_entry *dirent; int is_dx_block = 0; - if (block >= inode->i_size >> inode->i_blkbits) { + if (block >= inode->i_size) { ext4_error_inode(inode, func, line, block, "Attempting to read directory block (%u) that is past i_size (%llu)", block, inode->i_size); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index de12e438260b..abc1a9709751 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -189,12 +189,19 @@ int ext4_read_bh(struct buffer_head *bh, int op_flags, bh_end_io_t *end_io) int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait) { - lock_buffer(bh); - if (!wait) { + if (trylock_buffer(bh)) { + if (wait) + return ext4_read_bh(bh, op_flags, NULL); ext4_read_bh_nowait(bh, op_flags, NULL); return 0; } - return ext4_read_bh(bh, op_flags, NULL); + if (wait) { + wait_on_buffer(bh); + if (buffer_uptodate(bh)) + return 0; + return -EIO; + } + return 0; } /* @@ -241,8 +248,7 @@ void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block) struct buffer_head *bh = sb_getblk_gfp(sb, block, 0); if (likely(bh)) { - if (trylock_buffer(bh)) - ext4_read_bh_nowait(bh, REQ_RAHEAD, NULL); + ext4_read_bh_lock(bh, REQ_RAHEAD, false); brelse(bh); } } @@ -3514,7 +3520,6 @@ static int ext4_lazyinit_thread(void *arg) unsigned long next_wakeup, cur; BUG_ON(NULL == eli); - set_freezable(); cont_thread: while (true) { @@ -6299,7 +6304,7 @@ static int ext4_write_info(struct super_block *sb, int type) handle_t *handle; /* Data block + inode block */ - handle = ext4_journal_start_sb(sb, EXT4_HT_QUOTA, 2); + handle = ext4_journal_start(d_inode(sb->s_root), EXT4_HT_QUOTA, 2); if (IS_ERR(handle)) return PTR_ERR(handle); ret = dquot_commit_info(sb, type); diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 0653c54873b5..1c49b9959b32 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -136,7 +136,7 @@ static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr, unsigned int segno, offset; bool exist; - if (type == DATA_GENERIC) + if (type != DATA_GENERIC_ENHANCE && type != DATA_GENERIC_ENHANCE_READ) return true; segno = GET_SEGNO(sbi, blkaddr); @@ -144,13 +144,6 @@ static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr, se = get_seg_entry(sbi, segno); exist = f2fs_test_bit(offset, se->cur_valid_map); - if (exist && type == DATA_GENERIC_ENHANCE_UPDATE) { - f2fs_err(sbi, "Inconsistent error blkaddr:%u, sit bitmap:%d", - blkaddr, exist); - set_sbi_flag(sbi, SBI_NEED_FSCK); - return exist; - } - if (!exist && type == DATA_GENERIC_ENHANCE) { f2fs_err(sbi, "Inconsistent error blkaddr:%u, sit bitmap:%d", blkaddr, exist); @@ -188,7 +181,6 @@ bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi, case DATA_GENERIC: case DATA_GENERIC_ENHANCE: case DATA_GENERIC_ENHANCE_READ: - case DATA_GENERIC_ENHANCE_UPDATE: if (unlikely(blkaddr >= MAX_BLKADDR(sbi) || blkaddr < MAIN_BLKADDR(sbi))) { f2fs_warn(sbi, "access invalid blkaddr:%u", diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 79d63e729bd1..99fcf484fd1a 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -236,10 +236,6 @@ enum { * condition of read on truncated area * by extent_cache */ - DATA_GENERIC_ENHANCE_UPDATE, /* - * strong check on range and segment - * bitmap for update case - */ META_GENERIC, }; diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index fcabf8b9267e..7a7307167395 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -995,7 +995,7 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, { struct page *node_page; nid_t nid; - unsigned int ofs_in_node, max_addrs; + unsigned int ofs_in_node; block_t source_blkaddr; nid = le32_to_cpu(sum->nid); @@ -1021,14 +1021,6 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, return false; } - max_addrs = IS_INODE(node_page) ? DEF_ADDRS_PER_INODE : - DEF_ADDRS_PER_BLOCK; - if (ofs_in_node >= max_addrs) { - f2fs_err(sbi, "Inconsistent ofs_in_node:%u in summary, ino:%u, nid:%u, max:%u", - ofs_in_node, dni->ino, dni->nid, max_addrs); - return false; - } - *nofs = ofs_of_node(node_page); source_blkaddr = data_blkaddr(NULL, node_page, ofs_in_node); f2fs_put_page(node_page, 1); diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index c3c527afdd07..72ce13111679 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -437,7 +437,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi, struct dnode_of_data tdn = *dn; nid_t ino, nid; struct inode *inode; - unsigned int offset, ofs_in_node, max_addrs; + unsigned int offset; block_t bidx; int i; @@ -463,24 +463,15 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi, got_it: /* Use the locked dnode page and inode */ nid = le32_to_cpu(sum.nid); - ofs_in_node = le16_to_cpu(sum.ofs_in_node); - - max_addrs = ADDRS_PER_PAGE(dn->node_page, dn->inode); - if (ofs_in_node >= max_addrs) { - f2fs_err(sbi, "Inconsistent ofs_in_node:%u in summary, ino:%lu, nid:%u, max:%u", - ofs_in_node, dn->inode->i_ino, nid, max_addrs); - return -EFSCORRUPTED; - } - if (dn->inode->i_ino == nid) { tdn.nid = nid; if (!dn->inode_page_locked) lock_page(dn->inode_page); tdn.node_page = dn->inode_page; - tdn.ofs_in_node = ofs_in_node; + tdn.ofs_in_node = le16_to_cpu(sum.ofs_in_node); goto truncate_out; } else if (dn->nid == nid) { - tdn.ofs_in_node = ofs_in_node; + tdn.ofs_in_node = le16_to_cpu(sum.ofs_in_node); goto truncate_out; } @@ -670,14 +661,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, goto err; } - if (f2fs_is_valid_blkaddr(sbi, dest, - DATA_GENERIC_ENHANCE_UPDATE)) { - f2fs_err(sbi, "Inconsistent dest blkaddr:%u, ino:%lu, ofs:%u", - dest, inode->i_ino, dn.ofs_in_node); - err = -EFSCORRUPTED; - goto err; - } - /* write dummy data page */ f2fs_replace_block(sbi, &dn, src, dest, ni.version, false, false); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 77e27960bbc7..f6c3f2eba82b 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -284,10 +284,10 @@ static int f2fs_sb_read_encoding(const struct f2fs_super_block *sb, static inline void limit_reserve_root(struct f2fs_sb_info *sbi) { - block_t limit = min((sbi->user_block_count >> 3), + block_t limit = min((sbi->user_block_count << 1) / 1000, sbi->user_block_count - sbi->reserved_blocks); - /* limit is 12.5% */ + /* limit is 0.2% */ if (test_opt(sbi, RESERVE_ROOT) && F2FS_OPTION(sbi).root_reserved_blocks > limit) { F2FS_OPTION(sbi).root_reserved_blocks = limit; diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index fa24b407a9dc..98cfa73cb165 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -581,7 +581,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) journal->j_running_transaction = NULL; start_time = ktime_get(); commit_transaction->t_log_start = journal->j_head; - wake_up_all(&journal->j_wait_transaction_locked); + wake_up(&journal->j_wait_transaction_locked); write_unlock(&journal->j_state_lock); jbd_debug(3, "JBD2: commit phase 2a\n"); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 4a9f6efcd071..aae412b0bfae 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -924,16 +924,10 @@ int jbd2_fc_wait_bufs(journal_t *journal, int num_blks) for (i = j_fc_off - 1; i >= j_fc_off - num_blks; i--) { bh = journal->j_fc_wbuf[i]; wait_on_buffer(bh); - /* - * Update j_fc_off so jbd2_fc_release_bufs can release remain - * buffer head. - */ - if (unlikely(!buffer_uptodate(bh))) { - journal->j_fc_off = i + 1; - return -EIO; - } put_bh(bh); journal->j_fc_wbuf[i] = NULL; + if (unlikely(!buffer_uptodate(bh))) + return -EIO; } return 0; diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c index 1ae1697fe99b..1e07dfac4d81 100644 --- a/fs/jbd2/recovery.c +++ b/fs/jbd2/recovery.c @@ -256,7 +256,6 @@ static int fc_do_one_pass(journal_t *journal, err = journal->j_fc_replay_callback(journal, bh, pass, next_fc_block - journal->j_fc_first, expected_commit_id); - brelse(bh); next_fc_block++; if (err < 0 || err == JBD2_FC_REPLAY_STOP) break; diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 9f776bdba269..cefee2dead54 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -173,7 +173,7 @@ static void wait_transaction_locked(journal_t *journal) int need_to_start; tid_t tid = journal->j_running_transaction->t_tid; - prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait, + prepare_to_wait(&journal->j_wait_transaction_locked, &wait, TASK_UNINTERRUPTIBLE); need_to_start = !tid_geq(journal->j_commit_request, tid); read_unlock(&journal->j_state_lock); @@ -199,7 +199,7 @@ static void wait_transaction_switching(journal_t *journal) read_unlock(&journal->j_state_lock); return; } - prepare_to_wait_exclusive(&journal->j_wait_transaction_locked, &wait, + prepare_to_wait(&journal->j_wait_transaction_locked, &wait, TASK_UNINTERRUPTIBLE); read_unlock(&journal->j_state_lock); /* @@ -894,7 +894,7 @@ void jbd2_journal_unlock_updates (journal_t *journal) write_lock(&journal->j_state_lock); --journal->j_barrier_count; write_unlock(&journal->j_state_lock); - wake_up_all(&journal->j_wait_transaction_locked); + wake_up(&journal->j_wait_transaction_locked); } static void warn_dirty_buffer(struct buffer_head *bh) diff --git a/fs/quota/quota_tree.c b/fs/quota/quota_tree.c index 07948f6ac84e..1a188fbdf34e 100644 --- a/fs/quota/quota_tree.c +++ b/fs/quota/quota_tree.c @@ -80,35 +80,6 @@ static ssize_t write_blk(struct qtree_mem_dqinfo *info, uint blk, char *buf) return ret; } -static inline int do_check_range(struct super_block *sb, const char *val_name, - uint val, uint min_val, uint max_val) -{ - if (val < min_val || val > max_val) { - quota_error(sb, "Getting %s %u out of range %u-%u", - val_name, val, min_val, max_val); - return -EUCLEAN; - } - - return 0; -} - -static int check_dquot_block_header(struct qtree_mem_dqinfo *info, - struct qt_disk_dqdbheader *dh) -{ - int err = 0; - - err = do_check_range(info->dqi_sb, "dqdh_next_free", - le32_to_cpu(dh->dqdh_next_free), 0, - info->dqi_blocks - 1); - if (err) - return err; - err = do_check_range(info->dqi_sb, "dqdh_prev_free", - le32_to_cpu(dh->dqdh_prev_free), 0, - info->dqi_blocks - 1); - - return err; -} - /* Remove empty block from list and return it */ static int get_free_dqblk(struct qtree_mem_dqinfo *info) { @@ -123,9 +94,6 @@ static int get_free_dqblk(struct qtree_mem_dqinfo *info) ret = read_blk(info, blk, buf); if (ret < 0) goto out_buf; - ret = check_dquot_block_header(info, dh); - if (ret) - goto out_buf; info->dqi_free_blk = le32_to_cpu(dh->dqdh_next_free); } else { @@ -273,9 +241,6 @@ static uint find_free_dqentry(struct qtree_mem_dqinfo *info, *err = read_blk(info, blk, buf); if (*err < 0) goto out_buf; - *err = check_dquot_block_header(info, dh); - if (*err) - goto out_buf; } else { blk = get_free_dqblk(info); if ((int)blk < 0) { @@ -468,9 +433,6 @@ static int free_dqentry(struct qtree_mem_dqinfo *info, struct dquot *dquot, goto out_buf; } dh = (struct qt_disk_dqdbheader *)buf; - ret = check_dquot_block_header(info, dh); - if (ret) - goto out_buf; le16_add_cpu(&dh->dqdh_entries, -1); if (!le16_to_cpu(dh->dqdh_entries)) { /* Block got free? */ ret = remove_free_dqentry(info, buf, blk); diff --git a/fs/splice.c b/fs/splice.c index 866d5c2367b2..6610e55c0e2a 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -806,17 +806,15 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd, { struct pipe_inode_info *pipe; long ret, bytes; - umode_t i_mode; size_t len; int i, flags, more; /* - * We require the input being a regular file, as we don't want to - * randomly drop data for eg socket -> socket splicing. Use the - * piped splicing for that! + * We require the input to be seekable, as we don't want to randomly + * drop data for eg socket -> socket splicing. Use the piped splicing + * for that! */ - i_mode = file_inode(in)->i_mode; - if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode))) + if (unlikely(!(in->f_mode & FMODE_LSEEK))) return -EINVAL; /* diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c index e4b2ce2fa231..4229881e1601 100644 --- a/fs/userfaultfd.c +++ b/fs/userfaultfd.c @@ -975,7 +975,7 @@ static int resolve_userfault_fork(struct userfaultfd_ctx *ctx, int fd; fd = anon_inode_getfd("[userfaultfd]", &userfaultfd_fops, new, - O_RDONLY | (new->flags & UFFD_SHARED_FCNTL_FLAGS)); + O_RDWR | (new->flags & UFFD_SHARED_FCNTL_FLAGS)); if (fd < 0) return fd; @@ -1989,7 +1989,7 @@ SYSCALL_DEFINE1(userfaultfd, int, flags) mmgrab(ctx->mm); fd = anon_inode_getfd("[userfaultfd]", &userfaultfd_fops, ctx, - O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS)); + O_RDWR | (flags & UFFD_SHARED_FCNTL_FLAGS)); if (fd < 0) { mmdrop(ctx->mm); kmem_cache_free(userfaultfd_ctx_cachep, ctx); diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index c9237d30c29b..136ea0997e6d 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h @@ -100,7 +100,7 @@ __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *k int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full); __poll_t ring_buffer_poll_wait(struct trace_buffer *buffer, int cpu, struct file *filp, poll_table *poll_table); -void ring_buffer_wake_waiters(struct trace_buffer *buffer, int cpu); + #define RING_BUFFER_ALL_CPUS -1 diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c index b04b87a4e0a7..f6310f848f34 100644 --- a/kernel/livepatch/transition.c +++ b/kernel/livepatch/transition.c @@ -611,23 +611,9 @@ void klp_reverse_transition(void) /* Called from copy_process() during fork */ void klp_copy_process(struct task_struct *child) { - - /* - * The parent process may have gone through a KLP transition since - * the thread flag was copied in setup_thread_stack earlier. Bring - * the task flag up to date with the parent here. - * - * The operation is serialized against all klp_*_transition() - * operations by the tasklist_lock. The only exception is - * klp_update_patch_state(current), but we cannot race with - * that because we are current. - */ - if (test_tsk_thread_flag(current, TIF_PATCH_PENDING)) - set_tsk_thread_flag(child, TIF_PATCH_PENDING); - else - clear_tsk_thread_flag(child, TIF_PATCH_PENDING); - child->patch_state = current->patch_state; + + /* TIF_PATCH_PENDING gets copied in setup_thread_stack() */ } /* diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 2165c9ac14bf..d868df6f13c8 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -5662,12 +5662,8 @@ int ftrace_regex_release(struct inode *inode, struct file *file) if (filter_hash) { orig_hash = &iter->ops->func_hash->filter_hash; - if (iter->tr) { - if (list_empty(&iter->tr->mod_trace)) - iter->hash->flags &= ~FTRACE_HASH_FL_MOD; - else - iter->hash->flags |= FTRACE_HASH_FL_MOD; - } + if (iter->tr && !list_empty(&iter->tr->mod_trace)) + iter->hash->flags |= FTRACE_HASH_FL_MOD; } else orig_hash = &iter->ops->func_hash->notrace_hash; diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index a12e27815555..6deac666ba3e 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -414,7 +414,6 @@ struct rb_irq_work { struct irq_work work; wait_queue_head_t waiters; wait_queue_head_t full_waiters; - long wait_index; bool waiters_pending; bool full_waiters_pending; bool wakeup_full; @@ -795,44 +794,12 @@ static void rb_wake_up_waiters(struct irq_work *work) struct rb_irq_work *rbwork = container_of(work, struct rb_irq_work, work); wake_up_all(&rbwork->waiters); - if (rbwork->full_waiters_pending || rbwork->wakeup_full) { + if (rbwork->wakeup_full) { rbwork->wakeup_full = false; - rbwork->full_waiters_pending = false; wake_up_all(&rbwork->full_waiters); } } -/** - * ring_buffer_wake_waiters - wake up any waiters on this ring buffer - * @buffer: The ring buffer to wake waiters on - * - * In the case of a file that represents a ring buffer is closing, - * it is prudent to wake up any waiters that are on this. - */ -void ring_buffer_wake_waiters(struct trace_buffer *buffer, int cpu) -{ - struct ring_buffer_per_cpu *cpu_buffer; - struct rb_irq_work *rbwork; - - if (cpu == RING_BUFFER_ALL_CPUS) { - - /* Wake up individual ones too. One level recursion */ - for_each_buffer_cpu(buffer, cpu) - ring_buffer_wake_waiters(buffer, cpu); - - rbwork = &buffer->irq_work; - } else { - cpu_buffer = buffer->buffers[cpu]; - rbwork = &cpu_buffer->irq_work; - } - - rbwork->wait_index++; - /* make sure the waiters see the new index */ - smp_wmb(); - - rb_wake_up_waiters(&rbwork->work); -} - /** * ring_buffer_wait - wait for input to the ring buffer * @buffer: buffer to wait on @@ -848,7 +815,6 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full) struct ring_buffer_per_cpu *cpu_buffer; DEFINE_WAIT(wait); struct rb_irq_work *work; - long wait_index; int ret = 0; /* @@ -867,7 +833,6 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full) work = &cpu_buffer->irq_work; } - wait_index = READ_ONCE(work->wait_index); while (true) { if (full) @@ -923,7 +888,7 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full) nr_pages = cpu_buffer->nr_pages; dirty = ring_buffer_nr_dirty_pages(buffer, cpu); if (!cpu_buffer->shortest_full || - cpu_buffer->shortest_full > full) + cpu_buffer->shortest_full < full) cpu_buffer->shortest_full = full; raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); if (!pagebusy && @@ -932,11 +897,6 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full) } schedule(); - - /* Make sure to see the new wait index */ - smp_rmb(); - if (wait_index != work->wait_index) - break; } if (full) @@ -2531,9 +2491,6 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, /* Mark the rest of the page with padding */ rb_event_set_padding(event); - /* Make sure the padding is visible before the write update */ - smp_wmb(); - /* Set the write back to the previous setting */ local_sub(length, &tail_page->write); return; @@ -2545,9 +2502,6 @@ rb_reset_tail(struct ring_buffer_per_cpu *cpu_buffer, /* time delta must be non zero */ event->time_delta = 1; - /* Make sure the padding is visible before the tail_page->write update */ - smp_wmb(); - /* Set write to end of buffer */ length = (tail + length) - BUF_PAGE_SIZE; local_sub(length, &tail_page->write); @@ -4362,33 +4316,6 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) arch_spin_unlock(&cpu_buffer->lock); local_irq_restore(flags); - /* - * The writer has preempt disable, wait for it. But not forever - * Although, 1 second is pretty much "forever" - */ -#define USECS_WAIT 1000000 - for (nr_loops = 0; nr_loops < USECS_WAIT; nr_loops++) { - /* If the write is past the end of page, a writer is still updating it */ - if (likely(!reader || rb_page_write(reader) <= BUF_PAGE_SIZE)) - break; - - udelay(1); - - /* Get the latest version of the reader write value */ - smp_rmb(); - } - - /* The writer is not moving forward? Something is wrong */ - if (RB_WARN_ON(cpu_buffer, nr_loops == USECS_WAIT)) - reader = NULL; - - /* - * Make sure we see any padding after the write update - * (see rb_reset_tail()) - */ - smp_rmb(); - - return reader; } @@ -5414,15 +5341,7 @@ int ring_buffer_read_page(struct trace_buffer *buffer, unsigned int pos = 0; unsigned int size; - /* - * If a full page is expected, this can still be returned - * if there's been a previous partial read and the - * rest of the page can be read and the commit page is off - * the reader page. - */ - if (full && - (!read || (len < (commit - read)) || - cpu_buffer->reader_page == cpu_buffer->commit_page)) + if (full) goto out_unlock; if (len > (commit - read)) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index a5245362ce7a..50200898410d 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1197,14 +1197,12 @@ void *tracing_cond_snapshot_data(struct trace_array *tr) { void *cond_data = NULL; - local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) cond_data = tr->cond_snapshot->cond_data; arch_spin_unlock(&tr->max_lock); - local_irq_enable(); return cond_data; } @@ -1340,11 +1338,9 @@ int tracing_snapshot_cond_enable(struct trace_array *tr, void *cond_data, goto fail_unlock; } - local_irq_disable(); arch_spin_lock(&tr->max_lock); tr->cond_snapshot = cond_snapshot; arch_spin_unlock(&tr->max_lock); - local_irq_enable(); mutex_unlock(&trace_types_lock); @@ -1371,7 +1367,6 @@ int tracing_snapshot_cond_disable(struct trace_array *tr) { int ret = 0; - local_irq_disable(); arch_spin_lock(&tr->max_lock); if (!tr->cond_snapshot) @@ -1382,7 +1377,6 @@ int tracing_snapshot_cond_disable(struct trace_array *tr) } arch_spin_unlock(&tr->max_lock); - local_irq_enable(); return ret; } @@ -2204,11 +2198,6 @@ static size_t tgid_map_max; #define SAVED_CMDLINES_DEFAULT 128 #define NO_CMDLINE_MAP UINT_MAX -/* - * Preemption must be disabled before acquiring trace_cmdline_lock. - * The various trace_arrays' max_lock must be acquired in a context - * where interrupt is disabled. - */ static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED; struct saved_cmdlines_buffer { unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1]; @@ -2421,11 +2410,7 @@ static int trace_save_cmdline(struct task_struct *tsk) * the lock, but we also don't want to spin * nor do we want to disable interrupts, * so if we miss here, then better luck next time. - * - * This is called within the scheduler and wake up, so interrupts - * had better been disabled and run queue lock been held. */ - lockdep_assert_preemption_disabled(); if (!arch_spin_trylock(&trace_cmdline_lock)) return 0; @@ -5485,11 +5470,9 @@ tracing_saved_cmdlines_size_read(struct file *filp, char __user *ubuf, char buf[64]; int r; - preempt_disable(); arch_spin_lock(&trace_cmdline_lock); r = scnprintf(buf, sizeof(buf), "%u\n", savedcmd->cmdline_num); arch_spin_unlock(&trace_cmdline_lock); - preempt_enable(); return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); } @@ -5514,12 +5497,10 @@ static int tracing_resize_saved_cmdlines(unsigned int val) return -ENOMEM; } - preempt_disable(); arch_spin_lock(&trace_cmdline_lock); savedcmd_temp = savedcmd; savedcmd = s; arch_spin_unlock(&trace_cmdline_lock); - preempt_enable(); free_saved_cmdlines_buffer(savedcmd_temp); return 0; @@ -5972,12 +5953,10 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf) #ifdef CONFIG_TRACER_SNAPSHOT if (t->use_max_tr) { - local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) ret = -EBUSY; arch_spin_unlock(&tr->max_lock); - local_irq_enable(); if (ret) goto out; } @@ -7051,12 +7030,10 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt, goto out; } - local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) ret = -EBUSY; arch_spin_unlock(&tr->max_lock); - local_irq_enable(); if (ret) goto out; diff --git a/mm/mmap.c b/mm/mmap.c index bccc3235cd61..3f0912e2440e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1881,7 +1881,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr, if (!arch_validate_flags(vma->vm_flags)) { error = -EINVAL; if (file) - goto close_and_free_vma; + goto unmap_and_free_vma; else goto free_vma; } @@ -1925,9 +1925,6 @@ unsigned long mmap_region(struct file *file, unsigned long addr, return addr; -close_and_free_vma: - if (vma->vm_ops && vma->vm_ops->close) - vma->vm_ops->close(vma); unmap_and_free_vma: vma->vm_file = NULL; fput(file); diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 63499db5c63d..f68170a68d71 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1485,6 +1485,7 @@ struct ieee802_11_elems { const u8 *supp_rates; const u8 *ds_params; const struct ieee80211_tim_ie *tim; + const u8 *challenge; const u8 *rsn; const u8 *rsnx; const u8 *erp_info; @@ -1537,6 +1538,7 @@ struct ieee802_11_elems { u8 ssid_len; u8 supp_rates_len; u8 tim_len; + u8 challenge_len; u8 rsn_len; u8 rsnx_len; u8 ext_supp_rates_len; diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index c52b8eb7fb8a..29e4d4961c37 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -2899,14 +2899,14 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, { struct ieee80211_local *local = sdata->local; struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; - const struct element *challenge; u8 *pos; + struct ieee802_11_elems elems; u32 tx_flags = 0; pos = mgmt->u.auth.variable; - challenge = cfg80211_find_elem(WLAN_EID_CHALLENGE, pos, - len - (pos - (u8 *)mgmt)); - if (!challenge) + ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems, + mgmt->bssid, auth_data->bss->bssid); + if (!elems.challenge) return; auth_data->expected_transaction = 4; drv_mgd_prepare_tx(sdata->local, sdata, 0); @@ -2914,8 +2914,7 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | IEEE80211_TX_INTFL_MLME_CONN_TX; ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, - (void *)challenge, - challenge->datalen + sizeof(*challenge), + elems.challenge - 2, elems.challenge_len + 2, auth_data->bss->bssid, auth_data->bss->bssid, auth_data->key, auth_data->key_len, auth_data->key_idx, tx_flags); @@ -3300,7 +3299,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, } capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, elems, - mgmt->bssid, NULL); + mgmt->bssid, assoc_data->bss->bssid); if (elems->aid_resp) aid = le16_to_cpu(elems->aid_resp->aid); @@ -3709,7 +3708,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, return; ieee802_11_parse_elems(pos, len - (pos - (u8 *)mgmt), false, &elems, - mgmt->bssid, NULL); + mgmt->bssid, assoc_data->bss->bssid); if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY && elems.timeout_int && diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 7fa6efa8b83c..764a6655f513 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1124,6 +1124,10 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, } else elem_parse_failed = true; break; + case WLAN_EID_CHALLENGE: + elems->challenge = pos; + elems->challenge_len = elen; + break; case WLAN_EID_VENDOR_SPECIFIC: if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 && pos[2] == 0xf2) { diff --git a/scripts/selinux/install_policy.sh b/scripts/selinux/install_policy.sh index 20af56ce245c..2dccf141241d 100755 --- a/scripts/selinux/install_policy.sh +++ b/scripts/selinux/install_policy.sh @@ -78,7 +78,7 @@ cd /etc/selinux/dummy/contexts/files $SF -F file_contexts / mounts=`cat /proc/$$/mounts | \ - grep -E "ext[234]|jfs|xfs|reiserfs|jffs2|gfs2|btrfs|f2fs|ocfs2" | \ + egrep "ext[234]|jfs|xfs|reiserfs|jffs2|gfs2|btrfs|f2fs|ocfs2" | \ awk '{ print $2 '}` $SF -F file_contexts $mounts diff --git a/security/Kconfig.hardening b/security/Kconfig.hardening index b54eb7177a31..269967c4fc1b 100644 --- a/security/Kconfig.hardening +++ b/security/Kconfig.hardening @@ -22,23 +22,13 @@ menu "Memory initialization" config CC_HAS_AUTO_VAR_INIT_PATTERN def_bool $(cc-option,-ftrivial-auto-var-init=pattern) -config CC_HAS_AUTO_VAR_INIT_ZERO_BARE - def_bool $(cc-option,-ftrivial-auto-var-init=zero) - -config CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER - # Clang 16 and later warn about using the -enable flag, but it - # is required before then. - def_bool $(cc-option,-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang) - depends on !CC_HAS_AUTO_VAR_INIT_ZERO_BARE - config CC_HAS_AUTO_VAR_INIT_ZERO - def_bool CC_HAS_AUTO_VAR_INIT_ZERO_BARE || CC_HAS_AUTO_VAR_INIT_ZERO_ENABLER + def_bool $(cc-option,-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang) choice prompt "Initialize kernel stack variables at function entry" default GCC_PLUGIN_STRUCTLEAK_BYREF_ALL if COMPILE_TEST && GCC_PLUGINS default INIT_STACK_ALL_PATTERN if COMPILE_TEST && CC_HAS_AUTO_VAR_INIT_PATTERN - default INIT_STACK_ALL_ZERO if CC_HAS_AUTO_VAR_INIT_ZERO default INIT_STACK_NONE help This option enables initialization of stack variables at @@ -49,11 +39,11 @@ choice syscalls. This chooses the level of coverage over classes of potentially - uninitialized variables. The selected class of variable will be + uninitialized variables. The selected class will be initialized before use in a function. config INIT_STACK_NONE - bool "no automatic stack variable initialization (weakest)" + bool "no automatic initialization (weakest)" help Disable automatic stack variable initialization. This leaves the kernel vulnerable to the standard @@ -90,7 +80,7 @@ choice and is disallowed. config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL - bool "zero-init everything passed by reference (very strong)" + bool "zero-init anything passed by reference (very strong)" depends on GCC_PLUGINS depends on !(KASAN && KASAN_STACK=1) select GCC_PLUGIN_STRUCTLEAK @@ -101,44 +91,33 @@ choice of uninitialized stack variable exploits and information exposures. - As a side-effect, this keeps a lot of variables on the - stack that can otherwise be optimized out, so combining - this with CONFIG_KASAN_STACK can lead to a stack overflow - and is disallowed. - config INIT_STACK_ALL_PATTERN - bool "pattern-init everything (strongest)" + bool "0xAA-init everything on the stack (strongest)" depends on CC_HAS_AUTO_VAR_INIT_PATTERN help - Initializes everything on the stack (including padding) - with a specific debug value. This is intended to eliminate - all classes of uninitialized stack variable exploits and - information exposures, even variables that were warned about - having been left uninitialized. + Initializes everything on the stack with a 0xAA + pattern. This is intended to eliminate all classes + of uninitialized stack variable exploits and information + exposures, even variables that were warned to have been + left uninitialized. Pattern initialization is known to provoke many existing bugs related to uninitialized locals, e.g. pointers receive - non-NULL values, buffer sizes and indices are very big. The - pattern is situation-specific; Clang on 64-bit uses 0xAA - repeating for all types and padding except float and double - which use 0xFF repeating (-NaN). Clang on 32-bit uses 0xFF - repeating for all types and padding. + non-NULL values, buffer sizes and indices are very big. config INIT_STACK_ALL_ZERO - bool "zero-init everything (strongest and safest)" + bool "zero-init everything on the stack (strongest and safest)" depends on CC_HAS_AUTO_VAR_INIT_ZERO help - Initializes everything on the stack (including padding) - with a zero value. This is intended to eliminate all - classes of uninitialized stack variable exploits and - information exposures, even variables that were warned - about having been left uninitialized. - - Zero initialization provides safe defaults for strings - (immediately NUL-terminated), pointers (NULL), indices - (index 0), and sizes (0 length), so it is therefore more - suitable as a production security mitigation than pattern - initialization. + Initializes everything on the stack with a zero + value. This is intended to eliminate all classes + of uninitialized stack variable exploits and information + exposures, even variables that were warned to have been + left uninitialized. + + Zero initialization provides safe defaults for strings, + pointers, indices and sizes, and is therefore + more suitable as a security mitigation measure. endchoice diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 0d91143eb464..257ad5206240 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -1736,8 +1736,10 @@ static int snd_rawmidi_free(struct snd_rawmidi *rmidi) snd_info_free_entry(rmidi->proc_entry); rmidi->proc_entry = NULL; + mutex_lock(®ister_mutex); if (rmidi->ops && rmidi->ops->dev_unregister) rmidi->ops->dev_unregister(rmidi); + mutex_unlock(®ister_mutex); snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT]); snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT]); diff --git a/sound/core/sound_oss.c b/sound/core/sound_oss.c index 99874e80b682..610f317bea9d 100644 --- a/sound/core/sound_oss.c +++ b/sound/core/sound_oss.c @@ -162,6 +162,7 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev) mutex_unlock(&sound_oss_mutex); return -ENOENT; } + unregister_sound_special(minor); switch (SNDRV_MINOR_OSS_DEVICE(minor)) { case SNDRV_MINOR_OSS_PCM: track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_AUDIO); @@ -173,18 +174,12 @@ int snd_unregister_oss_device(int type, struct snd_card *card, int dev) track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1); break; } - if (track2 >= 0) + if (track2 >= 0) { + unregister_sound_special(track2); snd_oss_minors[track2] = NULL; + } snd_oss_minors[minor] = NULL; mutex_unlock(&sound_oss_mutex); - - /* call unregister_sound_special() outside sound_oss_mutex; - * otherwise may deadlock, as it can trigger the release of a card - */ - unregister_sound_special(minor); - if (track2 >= 0) - unregister_sound_special(track2); - kfree(mptr); return 0; } diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 60e3bc124836..574fe798d512 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -8164,13 +8164,11 @@ static const struct hda_fixup alc269_fixups[] = { [ALC285_FIXUP_ASUS_G533Z_PINS] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) { - { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */ - { 0x19, 0x03a19020 }, /* Mic Boost Volume */ - { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */ - { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */ - { 0x21, 0x03211420 }, + { 0x14, 0x90170120 }, { } }, + .chained = true, + .chain_id = ALC294_FIXUP_ASUS_G513_PINS, }, [ALC294_FIXUP_ASUS_COEF_1B] = { .type = HDA_FIXUP_VERBS, @@ -8776,6 +8774,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB), + SND_PCI_QUIRK(0x1028, 0x087d, "Dell Precision 5530", ALC289_FIXUP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), @@ -8964,7 +8963,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401), - SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC), @@ -8986,7 +8984,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE), SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE), SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), - SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE), diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 33c29a1f52d0..8f4ed39c49de 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -1971,8 +1971,8 @@ static int wcd9335_trigger(struct snd_pcm_substream *substream, int cmd, case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - slim_stream_disable(dai_data->sruntime); slim_stream_unprepare(dai_data->sruntime); + slim_stream_disable(dai_data->sruntime); break; default: break; diff --git a/sound/soc/codecs/wcd934x.c b/sound/soc/codecs/wcd934x.c index 104751ac6cd1..fd704df9b175 100644 --- a/sound/soc/codecs/wcd934x.c +++ b/sound/soc/codecs/wcd934x.c @@ -1829,8 +1829,8 @@ static int wcd934x_trigger(struct snd_pcm_substream *substream, int cmd, case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - slim_stream_disable(dai_data->sruntime); slim_stream_unprepare(dai_data->sruntime); + slim_stream_disable(dai_data->sruntime); break; default: break; diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 80dcac5abe0c..8527267725bb 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -73,13 +73,12 @@ static inline unsigned get_usb_high_speed_rate(unsigned int rate) */ static void release_urb_ctx(struct snd_urb_ctx *u) { - if (u->urb && u->buffer_size) + if (u->buffer_size) usb_free_coherent(u->ep->chip->dev, u->buffer_size, u->urb->transfer_buffer, u->urb->transfer_dma); usb_free_urb(u->urb); u->urb = NULL; - u->buffer_size = 0; } static const char *usb_error_string(int err) @@ -999,7 +998,6 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep) if (!ep->syncbuf) return -ENOMEM; - ep->nurbs = SYNC_URBS; for (i = 0; i < SYNC_URBS; i++) { struct snd_urb_ctx *u = &ep->urb[i]; u->index = i; @@ -1019,6 +1017,8 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep) u->urb->complete = snd_complete_urb; } + ep->nurbs = SYNC_URBS; + return 0; out_of_memory: -- Gitee