Linux 5.4.221
Greg Kroah-Hartman
maintainerDocumentation/arm64/silicon-errata.rst +4 -0
@@ -70,8 +70,12 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A57 | #1742098 | ARM64_ERRATUM_1742098 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A72 | #853709 | N/A | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A72 | #1655431 | ARM64_ERRATUM_1742098 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A73 | #858921 | ARM64_ERRATUM_858921 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A55 | #1024718 | ARM64_ERRATUM_1024718 |
Makefile +4 -2
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 220 +SUBLEVEL = 221 EXTRAVERSION = NAME = Kleptomaniac Octopus
@@ -802,7 +802,9 @@ DEBUG_CFLAGS += -gsplit-dwarf else DEBUG_CFLAGS += -g endif -ifneq ($(LLVM_IAS),1) +ifeq ($(LLVM_IAS),1) +KBUILD_AFLAGS += -g +else KBUILD_AFLAGS += -Wa,-gdwarf-2 endif endif
arch/arm64/Kconfig +16 -0
@@ -574,6 +574,22 @@ config ARM64_ERRATUM_1542419 If unsure, say Y. +config ARM64_ERRATUM_1742098 + bool "Cortex-A57/A72: 1742098: ELR recorded incorrectly on interrupt taken between cryptographic instructions in a sequence" + depends on COMPAT + default y + help + This option removes the AES hwcap for aarch32 user-space to + workaround erratum 1742098 on Cortex-A57 and Cortex-A72. + + Affected parts may corrupt the AES state if an interrupt is + taken between a pair of AES instructions. These instructions + are only present if the cryptography extensions are present. + All software should have a fallback implementation for CPUs + that don't implement the cryptography extensions. + + If unsure, say Y. + config CAVIUM_ERRATUM_22375 bool "Cavium erratum 22375, 24313" default y
arch/arm64/include/asm/cpucaps.h +2 -1
@@ -56,7 +56,8 @@#define ARM64_WORKAROUND_CAVIUM_TX2_219_PRFM 46#define ARM64_WORKAROUND_1542419 47#define ARM64_SPECTRE_BHB 48 +#define ARM64_WORKAROUND_1742098 49 -#define ARM64_NCAPS 49 +#define ARM64_NCAPS 50#endif /* __ASM_CPUCAPS_H */
arch/arm64/kernel/cpu_errata.c +16 -0
@@ -817,6 +817,14 @@ static const struct arm64_cpu_capabilities erratum_843419_list[] = { };#endif +#ifdef CONFIG_ARM64_ERRATUM_1742098 +static struct midr_range broken_aarch32_aes[] = { +MIDR_RANGE (MIDR_CORTEX_A57 ,0 ,1 ,0xf ,0xf ), +MIDR_ALL_VERSIONS (MIDR_CORTEX_A72 ), + {}, +}; +#endif + const struct arm64_cpu_capabilities arm64_errata[] = {#ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE {
@@ -997,6 +1005,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = { .matches = has_neoverse_n1_erratum_1542419, .cpu_enable = cpu_enable_trap_ctr_access, }, +#endif +#ifdef CONFIG_ARM64_ERRATUM_1742098 + { + .desc = "ARM erratum 1742098", + .capability = ARM64_WORKAROUND_1742098, + CAP_MIDR_RANGE_LIST(broken_aarch32_aes), + .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM, + }, #endif { }
arch/arm64/kernel/cpufeature.c +12 -1
@@ -21,6 +21,7 @@#include <asm/cpufeature.h> #include <asm/cpu_ops.h> #include <asm/fpsimd.h> +#include <asm/hwcap.h> #include <asm/mmu_context.h> #include <asm/processor.h> #include <asm/sysreg.h>
@@ -1280,6 +1281,14 @@ static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry, }#endif +static void elf_hwcap_fixup (void ) +{ +#ifdef CONFIG_ARM64_ERRATUM_1742098 +if (cpus_have_const_cap (ARM64_WORKAROUND_1742098 )) + compat_elf_hwcap2 &= ~COMPAT_HWCAP2_AES ; +#endif /* ARM64_ERRATUM_1742098 */ +} +static const struct arm64_cpu_capabilities arm64_features[] = { { .desc ="GIC system register CPU interface" ,
@@ -2103,8 +2112,10 @@ void __init setup_cpu_features(void)mark_const_caps_ready ();setup_elf_hwcaps (arm64_elf_hwcaps); -if (system_supports_32bit_el0 ()) +if (system_supports_32bit_el0 ()) {setup_elf_hwcaps (compat_elf_hwcaps); +elf_hwcap_fixup (); + }if (system_uses_ttbr0_pan ())pr_info ("emulated: Privileged Access Never (PAN) using TTBR0_EL1 switching\n" );
arch/arm64/kernel/topology.c +0 -40
@@ -21,46 +21,6 @@#include <asm/cputype.h> #include <asm/topology.h> -void store_cpu_topology (unsigned int cpuid) -{ -struct cpu_topology *cpuid_topo = &cpu_topology[cpuid]; -u64 mpidr; - -if (cpuid_topo->package_id !=-1 ) - goto topology_populated; - - mpidr =read_cpuid_mpidr (); - -/* Uniprocessor systems can rely on default topology values */ -if (mpidr &MPIDR_UP_BITMASK ) -return ; - -/* -* This would be the place to create cpu topology based on MPIDR. -* -* However, it cannot be trusted to depict the actual topology; some -* pieces of the architecture enforce an artificial cap on Aff0 values -* (e.g. GICv3's ICC_SGI1R_EL1 limits it to 15), leading to an -* artificial cycling of Aff1, Aff2 and Aff3 values. IOW, these end up -* having absolutely no relationship to the actual underlying system -* topology, and cannot be reasonably used as core / package ID. -* -* If the MT bit is set, Aff0 *could* be used to define a thread ID, but -* we still wouldn't be able to obtain a sane core ID. This means we -* need to entirely ignore MPIDR for any topology deduction. -*/ - cpuid_topo->thread_id =-1 ; - cpuid_topo->core_id = cpuid; - cpuid_topo->package_id =cpu_to_node (cpuid); - -pr_debug ("CPU%u: cluster %d core %d thread %d mpidr %#016llx\n" , - cpuid, cpuid_topo->package_id, cpuid_topo->core_id, - cpuid_topo->thread_id, mpidr); - -topology_populated: -update_siblings_masks (cpuid); -} -#ifdef CONFIG_ACPI static bool __init acpi_cpu_is_threaded (int cpu) {
arch/riscv/Kconfig +1 -1
@@ -51,7 +51,7 @@ config RISCV select PCI_MSI if PCI select RISCV_TIMER select GENERIC_IRQ_MULTI_HANDLER - select GENERIC_ARCH_TOPOLOGY if SMP + select GENERIC_ARCH_TOPOLOGY select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_MMIOWB select HAVE_EBPF_JIT if 64BIT
arch/riscv/kernel/smpboot.c +3 -1
@@ -46,6 +46,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) {int cpuid; +store_cpu_topology (smp_processor_id ()); +/* This covers non-smp usecase mandated by "nosmp" option */ if (max_cpus ==0 )return ;
@@ -142,8 +144,8 @@ asmlinkage __visible void __init smp_callin(void) current->active_mm = mm;trap_init (); +store_cpu_topology (smp_processor_id ());notify_cpu_starting (smp_processor_id ()); -update_siblings_masks (smp_processor_id ());set_cpu_online (smp_processor_id (),1 );/* * Remote TLB flushes are ignored while the CPU is offline, so emit
arch/x86/kernel/cpu/microcode/amd.c +13 -3
@@ -441,7 +441,13 @@ apply_microcode_early_amd(u32 cpuid_1_eax, void *ucode, size_t size, bool save_preturn ret;native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev, dummy); -if (rev >= mc->hdr.patch_id) + +/* +* Allow application of the same revision to pick up SMT-specific +* changes even if the revision of the other SMT thread is already +* up-to-date. +*/ +if (rev > mc->hdr.patch_id)return ret;if (!__apply_microcode_amd (mc)) {
@@ -523,8 +529,12 @@ void load_ucode_amd_ap(unsigned int cpuid_1_eax)native_rdmsr (MSR_AMD64_PATCH_LEVEL , rev, dummy); -/* Check whether we have saved a new patch already: */ -if (*new_rev && rev < mc->hdr.patch_id) { +/* +* Check whether a new patch has been saved already. Also, allow application of +* the same revision in order to pick up SMT-thread-specific configuration even +* if the sibling SMT thread already has an up-to-date revision. +*/ +if (*new_rev && rev <= mc->hdr.patch_id) {if (!__apply_microcode_amd (mc)) { *new_rev = mc->hdr.patch_id;return ;
drivers/acpi/acpi_extlog.c +20 -13
@@ -12,6 +12,7 @@#include <linux/ratelimit.h> #include <linux/edac.h> #include <linux/ras.h> +#include <acpi/ghes.h> #include <asm/cpu.h> #include <asm/mce.h>
@@ -140,8 +141,8 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,int cpu = mce->extcpu;struct acpi_hest_generic_status *estatus, *tmp;struct acpi_hest_generic_data *gdata; -const guid_t *fru_id = &guid_null; -char *fru_text ="" ; +const guid_t *fru_id; +char *fru_text;guid_t *sec_type;static u32 err_seq;
@@ -162,17 +163,23 @@ static int extlog_print(struct notifier_block *nb, unsigned long val,/* log event via trace */ err_seq++; - gdata = (struct acpi_hest_generic_data *)(tmp +1 ); -if (gdata->validation_bits &CPER_SEC_VALID_FRU_ID ) - fru_id = (guid_t *)gdata->fru_id; -if (gdata->validation_bits &CPER_SEC_VALID_FRU_TEXT ) - fru_text = gdata->fru_text; - sec_type = (guid_t *)gdata->section_type; -if (guid_equal (sec_type, &CPER_SEC_PLATFORM_MEM )) { -struct cper_sec_mem_err *mem = (void *)(gdata +1 ); -if (gdata->error_data_length >=sizeof (*mem)) -trace_extlog_mem_event (mem, err_seq, fru_id, fru_text, - (u8 )gdata->error_severity); +apei_estatus_for_each_section (tmp, gdata) { +if (gdata->validation_bits &CPER_SEC_VALID_FRU_ID ) + fru_id = (guid_t *)gdata->fru_id; +else + fru_id = &guid_null; +if (gdata->validation_bits &CPER_SEC_VALID_FRU_TEXT ) + fru_text = gdata->fru_text; +else + fru_text ="" ; + sec_type = (guid_t *)gdata->section_type; +if (guid_equal (sec_type, &CPER_SEC_PLATFORM_MEM )) { +struct cper_sec_mem_err *mem = (void *)(gdata +1 ); + +if (gdata->error_data_length >=sizeof (*mem)) +trace_extlog_mem_event (mem, err_seq, fru_id, fru_text, + (u8 )gdata->error_severity); + } } out:
drivers/acpi/video_detect.c +64 -0
70 lines not on this page · raw message
drivers/ata/ahci.h +1 -1
@@ -254,7 +254,7 @@ enum {PCS_7 =0x94 ,/* 7+ port PCS (Denverton) */ /* em constants */ -EM_MAX_SLOTS =8 , +EM_MAX_SLOTS =SATA_PMP_MAX_PORTS , EM_MAX_RETRY = 5,/* em_ctl bits */
drivers/ata/ahci_imx.c +1 -1
@@ -1239,4 +1239,4 @@ module_platform_driver(imx_ahci_driver);MODULE_DESCRIPTION ("Freescale i.MX AHCI SATA platform driver" );MODULE_AUTHOR ("Richard Zhu <[email protected]>" );MODULE_LICENSE ("GPL" ); -MODULE_ALIAS ("ahci:imx" ); +MODULE_ALIAS ("platform:" DRV_NAME );
drivers/base/arch_topology.c +19 -0
@@ -538,4 +538,23 @@ void __init init_cpu_topology(void) else if (of_have_populated_dt() && parse_dt_topology()) reset_cpu_topology(); } + +void store_cpu_topology (unsigned int cpuid) +{ +struct cpu_topology *cpuid_topo = &cpu_topology[cpuid]; + +if (cpuid_topo->package_id !=-1 ) + goto topology_populated; + + cpuid_topo->thread_id =-1 ; + cpuid_topo->core_id = cpuid; + cpuid_topo->package_id =cpu_to_node (cpuid); + +pr_debug ("CPU%u: package %d core %d thread %d\n" , + cpuid, cpuid_topo->package_id, cpuid_topo->core_id, + cpuid_topo->thread_id); + +topology_populated: +update_siblings_masks (cpuid); +}#endif
drivers/hid/hid-magicmouse.c +1 -1
@@ -387,7 +387,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,magicmouse_raw_event (hdev, report, data +2 , data[1 ]);magicmouse_raw_event (hdev, report, data +2 + data[1 ], size -2 - data[1 ]); -break ; +return 0 ;default :return 0 ; }
drivers/hwmon/coretemp.c +41 -15
127 lines not on this page · raw message
drivers/iommu/intel-iommu.c +5 -0
@@ -2751,6 +2751,7 @@ static int __init si_domain_init(int hw)if (md_domain_init (si_domain,DEFAULT_DOMAIN_ADDRESS_WIDTH )) {domain_exit (si_domain); + si_domain =NULL ;return -EFAULT ; }
@@ -3371,6 +3372,10 @@ static int __init init_dmars(void)disable_dmar_iommu (iommu);free_dmar_iommu (iommu); } +if (si_domain) { +domain_exit (si_domain); + si_domain =NULL ; + }kfree (g_iommus);
drivers/media/platform/qcom/venus/vdec.c +2 -0
@@ -157,6 +157,8 @@ vdec_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)else return NULL ; fmt =find_format (inst, pixmp->pixelformat, f->type); +if (!fmt) +return NULL ; } pixmp->width = clamp(pixmp->width, frame_width_min(inst),
drivers/net/ethernet/hisilicon/hns/hnae.c +3 -1
@@ -419,8 +419,10 @@ int hnae_ae_register(struct hnae_ae_dev *hdev, struct module *owner) hdev->cls_dev.release = hnae_release; (void )dev_set_name (&hdev->cls_dev,"hnae%d" , hdev->id); ret =device_register (&hdev->cls_dev); -if (ret) +if (ret) { +put_device (&hdev->cls_dev);return ret; + }__module_get (THIS_MODULE );
drivers/net/hyperv/hyperv_net.h +3 -0
@@ -954,6 +954,9 @@ struct net_device_context {u32 vf_alloc;/* Serial number of the VF to team with */ u32 vf_serial; + +/* completion variable to confirm vf association */ +struct completion vf_add; };/* Per channel data */
drivers/net/hyperv/netvsc.c +4 -0
@@ -1223,6 +1223,10 @@ static void netvsc_send_vf(struct net_device *ndev, net_device_ctx->vf_alloc = nvmsg->msg.v4_msg.vf_assoc.allocated; net_device_ctx->vf_serial = nvmsg->msg.v4_msg.vf_assoc.serial; + +if (net_device_ctx->vf_alloc) +complete (&net_device_ctx->vf_add); +netdev_info (ndev,"VF slot %u %s\n" , net_device_ctx->vf_serial, net_device_ctx->vf_alloc ?"added" :"removed" );
drivers/net/hyperv/netvsc_drv.c +20 -0
@@ -2133,6 +2133,7 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev) {struct device *parent = vf_netdev->dev.parent;struct net_device_context *ndev_ctx; +struct net_device *ndev;struct pci_dev *pdev;u32 serial;
@@ -2159,6 +2160,18 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)return hv_get_drvdata (ndev_ctx->device_ctx); } +/* Fallback path to check synthetic vf with +* help of mac addr +*/ +list_for_each_entry (ndev_ctx, &netvsc_dev_list, list) { + ndev =hv_get_drvdata (ndev_ctx->device_ctx); +if (ether_addr_equal (vf_netdev->perm_addr, ndev->perm_addr)) { +netdev_notice (vf_netdev, +"falling back to mac addr based matching\n" ); +return ndev; + } + } +netdev_notice (vf_netdev,"no netdev found for vf serial:%u\n" , serial);return NULL ;
@@ -2232,6 +2245,11 @@ static int netvsc_vf_changed(struct net_device *vf_netdev)if (!netvsc_dev)return NOTIFY_DONE ; +if (vf_is_up && !net_device_ctx->vf_alloc) { +netdev_info (ndev,"Waiting for the VF association from host\n" ); +wait_for_completion (&net_device_ctx->vf_add); + } +netvsc_switch_datapath (ndev, vf_is_up);netdev_info (ndev,"Data path switched %s VF: %s\n" , vf_is_up ?"to" :"from" , vf_netdev->name);
@@ -2253,6 +2271,7 @@ static int netvsc_unregister_vf(struct net_device *vf_netdev)netdev_info (ndev,"VF unregistering: %s\n" , vf_netdev->name); +reinit_completion (&net_device_ctx->vf_add);netdev_rx_handler_unregister (vf_netdev);netdev_upper_dev_unlink (vf_netdev, ndev);RCU_INIT_POINTER (net_device_ctx->vf_netdev,NULL );
@@ -2290,6 +2309,7 @@ static int netvsc_probe(struct hv_device *dev,INIT_DELAYED_WORK (&net_device_ctx->dwork, netvsc_link_change); +init_completion (&net_device_ctx->vf_add);spin_lock_init (&net_device_ctx->lock);INIT_LIST_HEAD (&net_device_ctx->reconfig_events);INIT_DELAYED_WORK (&net_device_ctx->vf_takeover, netvsc_vf_setup);
drivers/net/phy/dp83867.c +8 -0
@@ -432,6 +432,14 @@ static int dp83867_config_init(struct phy_device *phydev)else val &= ~DP83867_SGMII_TYPE ;phy_write_mmd (phydev,DP83867_DEVADDR ,DP83867_SGMIICTL , val); + +/* This is a SW workaround for link instability if RX_CTRL is +* not strapped to mode 3 or 4 in HW. This is required for SGMII +* in addition to clearing bit 7, handled above. +*/ +if (dp83867->rxctrl_strap_quirk) +phy_set_bits_mmd (phydev,DP83867_DEVADDR ,DP83867_CFG4 , +BIT (8 )); } val =phy_read (phydev,DP83867_CFG3 );
drivers/net/usb/cdc_ether.c +7 -0
@@ -764,6 +764,13 @@ static const struct usb_device_id products[] = { },#endif +/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */ +{ +USB_DEVICE_AND_INTERFACE_INFO (LENOVO_VENDOR_ID ,0x3054 ,USB_CLASS_COMM , + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info =0 , +}, + /* ThinkPad USB-C Dock (based on Realtek RTL8153) */ { USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
drivers/net/usb/r8152.c +1 -0
@@ -5823,6 +5823,7 @@ static const struct usb_device_id rtl8152_table[] = { {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927)}, {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)},
fs/btrfs/backref.c +31 -15
115 lines not on this page · raw message
fs/ocfs2/namei.c +11 -12
@@ -231,6 +231,7 @@ static int ocfs2_mknod(struct inode *dir,handle_t *handle =NULL ;struct ocfs2_super *osb;struct ocfs2_dinode *dirfe; +struct ocfs2_dinode *fe =NULL ;struct buffer_head *new_fe_bh =NULL ;struct inode *inode =NULL ;struct ocfs2_alloc_context *inode_ac =NULL ;
@@ -381,6 +382,7 @@ static int ocfs2_mknod(struct inode *dir, goto leave; } + fe = (struct ocfs2_dinode *) new_fe_bh->b_data;if (S_ISDIR (mode)) { status =ocfs2_fill_new_dir (osb, handle, dir, inode, new_fe_bh, data_ac, meta_ac);
@@ -446,8 +448,11 @@ static int ocfs2_mknod(struct inode *dir, leave:if (status <0 && did_quota_inode)dquot_free_inode (inode); -if (handle) +if (handle) { +if (status <0 && fe) +ocfs2_set_links_count (fe,0 );ocfs2_commit_trans (osb, handle); + }ocfs2_inode_unlock (dir,1 );if (did_block_signals)
@@ -625,18 +630,9 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,return status; } - status =__ocfs2_mknod_locked (dir, inode, dev, new_fe_bh, +return __ocfs2_mknod_locked (dir, inode, dev, new_fe_bh, parent_fe_bh, handle, inode_ac, fe_blkno, suballoc_loc, suballoc_bit); -if (status <0 ) { -u64 bg_blkno =ocfs2_which_suballoc_group (fe_blkno, suballoc_bit); -int tmp =ocfs2_free_suballoc_bits (handle, inode_ac->ac_inode, - inode_ac->ac_bh, suballoc_bit, bg_blkno,1 ); -if (tmp) -mlog_errno (tmp); - } - -return status; } static int ocfs2_mkdir(struct inode *dir,
@@ -2017,8 +2013,11 @@ static int ocfs2_symlink(struct inode *dir, ocfs2_clusters_to_bytes(osb->sb, 1));if (status <0 && did_quota_inode)dquot_free_inode (inode); -if (handle) +if (handle) { +if (status <0 && fe) +ocfs2_set_links_count (fe,0 );ocfs2_commit_trans (osb, handle); + }ocfs2_inode_unlock (dir,1 );if (did_block_signals)
fs/proc/task_mmu.c +1 -1
@@ -884,7 +884,7 @@ static int show_smaps_rollup(struct seq_file *m, void *v) last_vma_end = vma->vm_end; } -show_vma_header_prefix (m, priv->mm->mmap->vm_start, +show_vma_header_prefix (m, priv->mm->mmap ? priv->mm->mmap->vm_start :0 , last_vma_end,0 ,0 ,0 ,0 );seq_pad (m,' ' );seq_puts (m,"[rollup]\n" );
fs/xfs/libxfs/xfs_alloc.c +1 -1
@@ -685,7 +685,7 @@ xfs_alloc_update_counters(xfs_trans_agblocks_delta (tp, len);if (unlikely (be32_to_cpu (agf->agf_freeblks) >be32_to_cpu (agf->agf_length))) { -xfs_buf_corruption_error (agbp); +xfs_buf_mark_corrupt (agbp);return -EFSCORRUPTED ; }
fs/xfs/libxfs/xfs_attr_leaf.c +3 -3
@@ -2288,7 +2288,7 @@ xfs_attr3_leaf_lookup_int(xfs_attr3_leaf_hdr_from_disk (args->geo, &ichdr, leaf); entries =xfs_attr3_leaf_entryp (leaf);if (ichdr.count >= args->geo->blksize /8 ) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);return -EFSCORRUPTED ; }
@@ -2307,11 +2307,11 @@ xfs_attr3_leaf_lookup_int(break ; }if (!(probe >=0 && (!ichdr.count || probe < ichdr.count))) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);return -EFSCORRUPTED ; }if (!(span <=4 ||be32_to_cpu (entry->hashval) == hashval)) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);return -EFSCORRUPTED ; }
fs/xfs/libxfs/xfs_bmap.c +2 -30
@@ -5925,8 +5925,8 @@ xfs_bmap_insert_extents(* @split_fsb is a block where the extents is split. If split_fsb lies in a * hole or the first block of extents, just return 0. */ -STATIC int -xfs_bmap_split_extent_at ( +int +xfs_bmap_split_extent (struct xfs_trans *tp,struct xfs_inode *ip,xfs_fileoff_t split_fsb)
@@ -6037,34 +6037,6 @@ xfs_bmap_split_extent_at(return error; } -int -xfs_bmap_split_extent ( -struct xfs_inode *ip, -xfs_fileoff_t split_fsb) -{ -struct xfs_mount *mp = ip->i_mount; -struct xfs_trans *tp; -int error; - - error =xfs_trans_alloc (mp, &M_RES (mp)->tr_write, -XFS_DIOSTRAT_SPACE_RES (mp,0 ),0 ,0 , &tp); -if (error) -return error; - -xfs_ilock (ip,XFS_ILOCK_EXCL ); -xfs_trans_ijoin (tp, ip,XFS_ILOCK_EXCL ); - - error =xfs_bmap_split_extent_at (tp, ip, split_fsb); -if (error) - goto out; - -return xfs_trans_commit (tp); - -out: -xfs_trans_cancel (tp); -return error; -} -/* Deferred mapping is only for real extents in the data fork. */ static bool xfs_bmap_is_update_needed(
fs/xfs/libxfs/xfs_bmap.h +2 -1
@@ -222,7 +222,8 @@ int xfs_bmap_can_insert_extents(struct xfs_inode *ip, xfs_fileoff_t off,int xfs_bmap_insert_extents (struct xfs_trans *tp,struct xfs_inode *ip,xfs_fileoff_t *next_fsb,xfs_fileoff_t offset_shift_fsb,bool *done,xfs_fileoff_t stop_fsb); -int xfs_bmap_split_extent (struct xfs_inode *ip,xfs_fileoff_t split_offset); +int xfs_bmap_split_extent (struct xfs_trans *tp,struct xfs_inode *ip, +xfs_fileoff_t split_offset); int xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, int whichfork, xfs_fileoff_t off, xfs_filblks_t len, xfs_filblks_t prealloc, struct xfs_bmbt_irec *got, struct xfs_iext_cursor *cur,
fs/xfs/libxfs/xfs_btree.c +1 -1
@@ -1820,7 +1820,7 @@ xfs_btree_lookup_get_block( out_bad: *blkp =NULL ; -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);xfs_trans_brelse (cur->bc_tp, bp);return -EFSCORRUPTED ; }
fs/xfs/libxfs/xfs_da_btree.c +5 -5
@@ -504,7 +504,7 @@ xfs_da3_split( node = oldblk->bp->b_addr;if (node->hdr.info.forw) {if (be32_to_cpu (node->hdr.info.forw) != addblk->blkno) { -xfs_buf_corruption_error (oldblk->bp); +xfs_buf_mark_corrupt (oldblk->bp); error = -EFSCORRUPTED ; goto out; }
@@ -517,7 +517,7 @@ xfs_da3_split( node = oldblk->bp->b_addr;if (node->hdr.info.back) {if (be32_to_cpu (node->hdr.info.back) != addblk->blkno) { -xfs_buf_corruption_error (oldblk->bp); +xfs_buf_mark_corrupt (oldblk->bp); error = -EFSCORRUPTED ; goto out; }
@@ -1544,7 +1544,7 @@ xfs_da3_node_lookup_int( }if (magic !=XFS_DA_NODE_MAGIC && magic !=XFS_DA3_NODE_MAGIC ) { -xfs_buf_corruption_error (blk->bp); +xfs_buf_mark_corrupt (blk->bp);return -EFSCORRUPTED ; }
@@ -1559,7 +1559,7 @@ xfs_da3_node_lookup_int(/* Tree taller than we can handle; bail out! */ if (nodehdr.level >=XFS_DA_NODE_MAXDEPTH ) { -xfs_buf_corruption_error (blk->bp); +xfs_buf_mark_corrupt (blk->bp);return -EFSCORRUPTED ; }
@@ -1567,7 +1567,7 @@ xfs_da3_node_lookup_int(if (blkno == args->geo->leafblk) expected_level = nodehdr.level -1 ;else if (expected_level != nodehdr.level) { -xfs_buf_corruption_error (blk->bp); +xfs_buf_mark_corrupt (blk->bp);return -EFSCORRUPTED ; }else expected_level--;
fs/xfs/libxfs/xfs_dir2_block.c +31 -2
@@ -114,6 +114,23 @@ const struct xfs_buf_ops xfs_dir3_block_buf_ops = { .verify_struct = xfs_dir3_block_verify, }; +static xfs_failaddr_t +xfs_dir3_block_header_check ( +struct xfs_inode *dp, +struct xfs_buf *bp) +{ +struct xfs_mount *mp = dp->i_mount; + +if (xfs_sb_version_hascrc (&mp->m_sb)) { +struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; + +if (be64_to_cpu (hdr3->owner) != dp->i_ino) +return __this_address; + } + +return NULL ; +} + int xfs_dir3_block_read( struct xfs_trans *tp,
@@ -121,12 +138,24 @@ xfs_dir3_block_read( struct xfs_buf **bpp) {struct xfs_mount *mp = dp->i_mount; +xfs_failaddr_t fa;int err; err =xfs_da_read_buf (tp, dp, mp->m_dir_geo->datablk,-1 , bpp,XFS_DATA_FORK , &xfs_dir3_block_buf_ops); -if (!err && tp && *bpp) -xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_BLOCK_BUF ); +if (err || !*bpp) +return err; + +/* Check things that we can't do in the verifier. */ + fa =xfs_dir3_block_header_check (dp, *bpp); +if (fa) { +__xfs_buf_mark_corrupt (*bpp, fa); +xfs_trans_brelse (tp, *bpp); + *bpp =NULL ; +return -EFSCORRUPTED ; + } + +xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_BLOCK_BUF );return err; }
fs/xfs/libxfs/xfs_dir2_data.c +30 -2
@@ -348,6 +348,22 @@ static const struct xfs_buf_ops xfs_dir3_data_reada_buf_ops = { .verify_write = xfs_dir3_data_write_verify, }; +static xfs_failaddr_t +xfs_dir3_data_header_check ( +struct xfs_inode *dp, +struct xfs_buf *bp) +{ +struct xfs_mount *mp = dp->i_mount; + +if (xfs_sb_version_hascrc (&mp->m_sb)) { +struct xfs_dir3_data_hdr *hdr3 = bp->b_addr; + +if (be64_to_cpu (hdr3->hdr.owner) != dp->i_ino) +return __this_address; + } + +return NULL ; +}int xfs_dir3_data_read(
@@ -357,12 +373,24 @@ xfs_dir3_data_read(xfs_daddr_t mapped_bno, struct xfs_buf **bpp) { + xfs_failaddr_t fa;int err; err =xfs_da_read_buf (tp, dp, bno, mapped_bno, bpp,XFS_DATA_FORK , &xfs_dir3_data_buf_ops); -if (!err && tp && *bpp) -xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_DATA_BUF ); +if (err || !*bpp) +return err; + +/* Check things that we can't do in the verifier. */ + fa =xfs_dir3_data_header_check (dp, *bpp); +if (fa) { +__xfs_buf_mark_corrupt (*bpp, fa); +xfs_trans_brelse (tp, *bpp); + *bpp =NULL ; +return -EFSCORRUPTED ; + } + +xfs_trans_buf_set_type (tp, *bpp,XFS_BLFT_DIR_DATA_BUF );return err; }
fs/xfs/libxfs/xfs_dir2_leaf.c +1 -1
@@ -1344,7 +1344,7 @@ xfs_dir2_leaf_removename( ltp =xfs_dir2_leaf_tail_p (args->geo, leaf); bestsp =xfs_dir2_leaf_bests_p (ltp);if (be16_to_cpu (bestsp[db]) != oldbest) { -xfs_buf_corruption_error (lbp); +xfs_buf_mark_corrupt (lbp);return -EFSCORRUPTED ; }/*
fs/xfs/libxfs/xfs_dir2_node.c +4 -4
@@ -208,7 +208,7 @@ __xfs_dir3_free_read(/* Check things that we can't do in the verifier. */ fa =xfs_dir3_free_header_check (dp, fbno, *bpp);if (fa) { -xfs_verifier_error (*bpp, -EFSCORRUPTED , fa); +__xfs_buf_mark_corrupt (*bpp, fa);xfs_trans_brelse (tp, *bpp); *bpp =NULL ;return -EFSCORRUPTED ;
@@ -375,7 +375,7 @@ xfs_dir2_leaf_to_node( ltp =xfs_dir2_leaf_tail_p (args->geo, leaf);if (be32_to_cpu (ltp->bestcount) > (uint )dp->i_d.di_size / args->geo->blksize) { -xfs_buf_corruption_error (lbp); +xfs_buf_mark_corrupt (lbp);return -EFSCORRUPTED ; }
@@ -449,7 +449,7 @@ xfs_dir2_leafn_add(* into other peoples memory */ if (index <0 ) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);return -EFSCORRUPTED ; }
@@ -745,7 +745,7 @@ xfs_dir2_leafn_lookup_for_entry(xfs_dir3_leaf_check (dp, bp);if (leafhdr.count <=0 ) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);return -EFSCORRUPTED ; }
fs/xfs/libxfs/xfs_dquot_buf.c +4 -4
@@ -35,10 +35,10 @@ xfs_calc_dquots_per_chunk(xfs_failaddr_t xfs_dquot_verify ( -struct xfs_mount *mp, -xfs_disk_dquot_t *ddq, -xfs_dqid_t id, -uint type)/* used only during quotacheck */ +struct xfs_mount *mp, +struct xfs_disk_dquot *ddq, +xfs_dqid_t id, +uint type)/* used only during quotacheck */ {/* * We can encounter an uninitialized dquot buffer for 2 reasons:
fs/xfs/libxfs/xfs_format.h +5 -5
@@ -1144,11 +1144,11 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev)/* * This is the main portion of the on-disk representation of quota -* information for a user. This is the q_core of the xfs_dquot_t that +* information for a user. This is the q_core of the struct xfs_dquot that * is kept in kernel memory. We pad this with some more expansion room * to construct the on disk structure. */ -typedef struct xfs_disk_dquot { +struct xfs_disk_dquot {__be16 d_magic;/* dquot magic = XFS_DQUOT_MAGIC */ __u8 d_version;/* dquot version */ __u8 d_flags;/* XFS_DQ_USER/PROJ/GROUP */
@@ -1171,15 +1171,15 @@ typedef struct xfs_disk_dquot {__be32 d_rtbtimer;/* similar to above; for RT disk blocks */ __be16 d_rtbwarns;/* warnings issued wrt RT disk blocks */ __be16 d_pad; -} xfs_disk_dquot_t; +};/* * This is what goes on disk. This is separated from the xfs_disk_dquot because * carrying the unnecessary padding would be a waste of memory. */ typedef struct xfs_dqblk { - xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[4]; /* filling for posterity */ + struct xfs_disk_dquot dd_diskdq; /* portion living incore as well */ + char dd_fill[4];/* filling for posterity */ /* * These two are only present on filesystems with the CRC bits set.
fs/xfs/libxfs/xfs_trans_resv.c +3 -3
@@ -776,7 +776,7 @@ xfs_calc_clear_agi_bucket_reservation(/* * Adjusting quota limits. -* the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) +* the disk quota buffer: sizeof(struct xfs_disk_dquot) */ STATIC uintxfs_calc_qm_setqlim_reservation (void )
@@ -800,7 +800,7 @@ xfs_calc_qm_dqalloc_reservation(/* * Turning off quotas. -* the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 +* the quota off logitems: sizeof(struct xfs_qoff_logitem) * 2 * the superblock for the quota flags: sector size */ STATIC uint
@@ -813,7 +813,7 @@ xfs_calc_qm_quotaoff_reservation(/* * End of turning off quotas. -* the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 +* the quota off logitems: sizeof(struct xfs_qoff_logitem) * 2 */ STATIC uintxfs_calc_qm_quotaoff_end_reservation (void )
fs/xfs/xfs_attr_inactive.c +3 -3
@@ -145,7 +145,7 @@ xfs_attr3_node_inactive(* Since this code is recursive (gasp!) we must protect ourselves. */ if (level >XFS_DA_NODE_MAXDEPTH ) { -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);xfs_trans_brelse (*trans, bp);/* no locks for later trans */ return -EFSCORRUPTED ; }
@@ -196,7 +196,7 @@ xfs_attr3_node_inactive( error =xfs_attr3_leaf_inactive (trans, dp, child_bp);break ;default : -xfs_buf_corruption_error (child_bp); +xfs_buf_mark_corrupt (child_bp);xfs_trans_brelse (*trans, child_bp); error = -EFSCORRUPTED ;break ;
@@ -281,7 +281,7 @@ xfs_attr3_root_inactive(break ;default : error = -EFSCORRUPTED ; -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);xfs_trans_brelse (*trans, bp);break ; }
fs/xfs/xfs_attr_list.c +1 -1
@@ -271,7 +271,7 @@ xfs_attr_node_list_lookup(return 0 ; out_corruptbuf: -xfs_buf_corruption_error (bp); +xfs_buf_mark_corrupt (bp);xfs_trans_brelse (tp, bp);return -EFSCORRUPTED ; }
fs/xfs/xfs_bmap_util.c +32 -25
106 lines not on this page · raw message
fs/xfs/xfs_buf.c +22 -0
@@ -1546,6 +1546,28 @@ xfs_buf_zero( } } +/* +* Log a message about and stale a buffer that a caller has decided is corrupt. +* +* This function should be called for the kinds of metadata corruption that +* cannot be detect from a verifier, such as incorrect inter-block relationship +* data. Do /not/ call this function from a verifier function. +* +* The buffer must be XBF_DONE prior to the call. Afterwards, the buffer will +* be marked stale, but b_error will not be set. The caller is responsible for +* releasing the buffer or fixing it. +*/ +void +__xfs_buf_mark_corrupt ( +struct xfs_buf *bp, +xfs_failaddr_t fa) +{ +ASSERT (bp->b_flags &XBF_DONE ); + +xfs_buf_corruption_error (bp, fa); +xfs_buf_stale (bp); +} +/* * Handling of buffer targets (buftargs). */
fs/xfs/xfs_buf.h +2 -0
@@ -270,6 +270,8 @@ static inline int xfs_buf_submit(struct xfs_buf *bp) }void xfs_buf_zero (struct xfs_buf *bp,size_t boff,size_t bsize); +void __xfs_buf_mark_corrupt (struct xfs_buf *bp,xfs_failaddr_t fa); +#define xfs_buf_mark_corrupt (bp) __xfs_buf_mark_corrupt((bp), __this_address)/* Buffer Utility Routines */ extern void *xfs_buf_offset (struct xfs_buf *,size_t );
fs/xfs/xfs_dquot.c +13 -13
@@ -48,7 +48,7 @@ static struct lock_class_key xfs_dquot_project_class;*/ void xfs_qm_dqdestroy ( -xfs_dquot_t *dqp) +struct xfs_dquot *dqp) {ASSERT (list_empty (&dqp->q_lru));
@@ -113,8 +113,8 @@ xfs_qm_adjust_dqlimits(*/ void xfs_qm_adjust_dqtimers ( -xfs_mount_t *mp, -xfs_disk_dquot_t *d) +struct xfs_mount *mp, +struct xfs_disk_dquot *d) {ASSERT (d->d_id);
@@ -497,7 +497,7 @@ xfs_dquot_from_disk(struct xfs_disk_dquot *ddqp = bp->b_addr + dqp->q_bufoffset;/* copy everything from disk dquot to the incore dquot */ -memcpy (&dqp->q_core, ddqp,sizeof (xfs_disk_dquot_t)); +memcpy (&dqp->q_core, ddqp,sizeof (struct xfs_disk_dquot ));/* * Reservation counters are defined as reservation plus current usage
@@ -989,7 +989,7 @@ xfs_qm_dqput(*/ void xfs_qm_dqrele ( -xfs_dquot_t *dqp) +struct xfs_dquot *dqp) {if (!dqp)return ;
@@ -1018,8 +1018,8 @@ xfs_qm_dqflush_done(struct xfs_buf *bp, struct xfs_log_item *lip) { - xfs_dq_logitem_t *qip = (struct xfs_dq_logitem *)lip; -xfs_dquot_t *dqp = qip->qli_dquot; + struct xfs_dq_logitem *qip = (struct xfs_dq_logitem *)lip; +struct xfs_dquot *dqp = qip->qli_dquot;struct xfs_ail *ailp = lip->li_ailp;/*
@@ -1105,8 +1105,8 @@ xfs_qm_dqflush(* Get the buffer containing the on-disk dquot */ error =xfs_trans_read_buf (mp,NULL , mp->m_ddev_targp, dqp->q_blkno, - mp->m_quotainfo->qi_dqchunklen,0 , &bp, - &xfs_dquot_buf_ops); + mp->m_quotainfo->qi_dqchunklen,XBF_TRYLOCK , + &bp, &xfs_dquot_buf_ops);if (error) goto out_unlock;
@@ -1129,7 +1129,7 @@ xfs_qm_dqflush( }/* This is the only portion of data that needs to persist */ -memcpy (ddqp, &dqp->q_core,sizeof (xfs_disk_dquot_t)); +memcpy (ddqp, &dqp->q_core,sizeof (struct xfs_disk_dquot ));/* * Clear the dirty field and remember the flush lsn for later use.
@@ -1176,7 +1176,7 @@ xfs_qm_dqflush( out_unlock:xfs_dqfunlock (dqp); -return -EIO ; +return error; }/*
@@ -1187,8 +1187,8 @@ xfs_qm_dqflush(*/ void xfs_dqlock2 ( -xfs_dquot_t *d1, -xfs_dquot_t *d2) +struct xfs_dquot *d1, +struct xfs_dquot *d2) {if (d1 && d2) {ASSERT (d1 != d2);
fs/xfs/xfs_dquot.h +50 -48
142 lines not on this page · raw message
fs/xfs/xfs_dquot_item.c +37 -10
79 lines not on this page · raw message
fs/xfs/xfs_dquot_item.h +19 -16
@@ -11,25 +11,28 @@ struct xfs_trans;struct xfs_mount ;struct xfs_qoff_logitem ; -typedef struct xfs_dq_logitem { -struct xfs_log_item qli_item;/* common portion */ -struct xfs_dquot *qli_dquot;/* dquot ptr */ -xfs_lsn_t qli_flush_lsn;/* lsn at last flush */ -}xfs_dq_logitem_t ; +struct xfs_dq_logitem { +struct xfs_log_item qli_item;/* common portion */ +struct xfs_dquot *qli_dquot;/* dquot ptr */ +xfs_lsn_t qli_flush_lsn;/* lsn at last flush */ +}; -typedef struct xfs_qoff_logitem { -struct xfs_log_item qql_item;/* common portion */ -struct xfs_qoff_logitem *qql_start_lip;/* qoff-start logitem, if any */ +struct xfs_qoff_logitem { +struct xfs_log_item qql_item;/* common portion */ +struct xfs_qoff_logitem *qql_start_lip;/* qoff-start logitem, if any */ unsigned int qql_flags; -}xfs_qoff_logitem_t ; +}; -extern void xfs_qm_dquot_logitem_init (struct xfs_dquot *); -extern xfs_qoff_logitem_t *xfs_qm_qoff_logitem_init (struct xfs_mount *, -struct xfs_qoff_logitem *,uint ); -extern xfs_qoff_logitem_t *xfs_trans_get_qoff_item (struct xfs_trans *, -struct xfs_qoff_logitem *,uint ); -extern void xfs_trans_log_quotaoff_item (struct xfs_trans *, -struct xfs_qoff_logitem *); +void xfs_qm_dquot_logitem_init (struct xfs_dquot *dqp); +struct xfs_qoff_logitem *xfs_qm_qoff_logitem_init (struct xfs_mount *mp, +struct xfs_qoff_logitem *start, +uint flags); +void xfs_qm_qoff_logitem_relse (struct xfs_qoff_logitem *); +struct xfs_qoff_logitem *xfs_trans_get_qoff_item (struct xfs_trans *tp, +struct xfs_qoff_logitem *startqoff, +uint flags); +void xfs_trans_log_quotaoff_item (struct xfs_trans *tp, +struct xfs_qoff_logitem *qlp);#endif /* __XFS_DQUOT_ITEM_H__ */
fs/xfs/xfs_error.c +5 -2
@@ -345,16 +345,19 @@ xfs_corruption_error(* Complain about the kinds of metadata corruption that we can't detect from a * verifier, such as incorrect inter-block relationship data. Does not set * bp->b_error. +* +* Call xfs_buf_mark_corrupt, not this function. */ void xfs_buf_corruption_error ( -struct xfs_buf *bp) +struct xfs_buf *bp, +xfs_failaddr_t fa) {struct xfs_mount *mp = bp->b_mount;xfs_alert_tag (mp,XFS_PTAG_VERIFIER_ERROR ,"Metadata corruption detected at %pS, %s block 0x%llx" , - __return_address, bp->b_ops->name, bp->b_bn); + fa, bp->b_ops->name, bp->b_bn);xfs_alert (mp,"Unmount and run xfs_repair" );
fs/xfs/xfs_error.h +1 -1
@@ -15,7 +15,7 @@ extern void xfs_corruption_error(const char *tag, int level, struct xfs_mount *mp, const void *buf, size_t bufsize, const char *filename, int linenum, xfs_failaddr_t failaddr); -void xfs_buf_corruption_error (struct xfs_buf *bp); +void xfs_buf_corruption_error (struct xfs_buf *bp,xfs_failaddr_t fa);extern void xfs_buf_verifier_error (struct xfs_buf *bp,int error,const char *name,const void *buf,size_t bufsz,xfs_failaddr_t failaddr);
fs/xfs/xfs_export.c +1 -13
@@ -15,7 +15,6 @@#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_icache.h" -#include "xfs_log.h" #include "xfs_pnfs.h" /*
@@ -221,18 +220,7 @@ STATIC intxfs_fs_nfs_commit_metadata ( struct inode *inode) { -struct xfs_inode *ip =XFS_I (inode); -struct xfs_mount *mp = ip->i_mount; -xfs_lsn_t lsn =0 ; - -xfs_ilock (ip,XFS_ILOCK_SHARED ); -if (xfs_ipincount (ip)) - lsn = ip->i_itemp->ili_last_lsn; -xfs_iunlock (ip,XFS_ILOCK_SHARED ); - -if (!lsn) -return 0 ; -return xfs_log_force_lsn (mp, lsn,XFS_LOG_SYNC ,NULL ); +return xfs_log_force_inode (XFS_I (inode)); }const struct export_operations xfs_export_operations = {
fs/xfs/xfs_file.c +5 -11
@@ -80,19 +80,9 @@ xfs_dir_fsync( int datasync) {struct xfs_inode *ip =XFS_I (file->f_mapping->host); -struct xfs_mount *mp = ip->i_mount; -xfs_lsn_t lsn =0 ;trace_xfs_dir_fsync (ip); - -xfs_ilock (ip,XFS_ILOCK_SHARED ); -if (xfs_ipincount (ip)) - lsn = ip->i_itemp->ili_last_lsn; -xfs_iunlock (ip,XFS_ILOCK_SHARED ); - -if (!lsn) -return 0 ; -return xfs_log_force_lsn (mp, lsn,XFS_LOG_SYNC ,NULL ); +return xfs_log_force_inode (ip); }STATIC int
@@ -1054,7 +1044,11 @@ xfs_file_remap_range( ret =xfs_reflink_update_dest (dest, pos_out + len, cowextsize, remap_flags); +if (ret) + goto out_unlock; +if (mp->m_flags &XFS_MOUNT_WSYNC ) +xfs_log_force_inode (dest); out_unlock:xfs_reflink_remap_unlock (file_in, file_out);if (ret)
fs/xfs/xfs_inode.c +21 -2
@@ -2149,7 +2149,7 @@ xfs_iunlink_update_bucket(* head of the list. */ if (old_value == new_agino) { -xfs_buf_corruption_error (agibp); +xfs_buf_mark_corrupt (agibp);return -EFSCORRUPTED ; }
@@ -2283,7 +2283,7 @@ xfs_iunlink( next_agino =be32_to_cpu (agi->agi_unlinked[bucket_index]);if (next_agino == agino || !xfs_verify_agino_or_null (mp, agno, next_agino)) { -xfs_buf_corruption_error (agibp); +xfs_buf_mark_corrupt (agibp);return -EFSCORRUPTED ; }
@@ -3973,3 +3973,22 @@ xfs_irele(trace_xfs_irele (ip, _RET_IP_);iput (VFS_I (ip)); } + +/* +* Ensure all commited transactions touching the inode are written to the log. +*/ +int +xfs_log_force_inode ( +struct xfs_inode *ip) +{ +xfs_lsn_t lsn =0 ; + +xfs_ilock (ip,XFS_ILOCK_SHARED ); +if (xfs_ipincount (ip)) + lsn = ip->i_itemp->ili_last_lsn; +xfs_iunlock (ip,XFS_ILOCK_SHARED ); + +if (!lsn) +return 0 ; +return xfs_log_force_lsn (ip->i_mount, lsn,XFS_LOG_SYNC ,NULL ); +}
fs/xfs/xfs_inode.h +1 -0
@@ -441,6 +441,7 @@ int xfs_itruncate_extents_flags(struct xfs_trans **, struct xfs_inode *, int, xfs_fsize_t, int);void xfs_iext_realloc (xfs_inode_t *,int ,int ); +int xfs_log_force_inode (struct xfs_inode *ip);void xfs_iunpin_wait (xfs_inode_t *);#define xfs_ipincount (ip) ((unsigned int) atomic_read(&ip->i_pincount))
fs/xfs/xfs_inode_item.c +13 -15
@@ -732,29 +732,27 @@ xfs_iflush_done(* holding the lock before removing the inode from the AIL. */ if (need_ail) { -bool mlip_changed = false; +xfs_lsn_t tail_lsn =0 ;/* this is an opencoded batch version of xfs_trans_ail_delete */ spin_lock (&ailp->ail_lock);list_for_each_entry (blip, &tmp, li_bio_list) {if (INODE_ITEM (blip)->ili_logged && - blip->li_lsn ==INODE_ITEM (blip)->ili_flush_lsn) - mlip_changed |=xfs_ail_delete_one (ailp, blip); -else { + blip->li_lsn ==INODE_ITEM (blip)->ili_flush_lsn) { +/* +* xfs_ail_update_finish() only cares about the +* lsn of the first tail item removed, any +* others will be at the same or higher lsn so +* we just ignore them. +*/ +xfs_lsn_t lsn =xfs_ail_delete_one (ailp, blip); +if (!tail_lsn && lsn) + tail_lsn = lsn; + }else {xfs_clear_li_failed (blip); } } - -if (mlip_changed) { -if (!XFS_FORCED_SHUTDOWN (ailp->ail_mount)) -xlog_assign_tail_lsn_locked (ailp->ail_mount); -if (list_empty (&ailp->ail_head)) -wake_up_all (&ailp->ail_empty); - } -spin_unlock (&ailp->ail_lock); - -if (mlip_changed) -xfs_log_space_wake (ailp->ail_mount); +xfs_ail_update_finish (ailp, tail_lsn); }/*
fs/xfs/xfs_log.c +13 -13
@@ -837,19 +837,6 @@ xfs_log_write_unmount_record(if (error) goto out_err; -/* -* If we think the summary counters are bad, clear the unmount header -* flag in the unmount record so that the summary counters will be -* recalculated during log recovery at next mount. Refer to -* xlog_check_unmount_rec for more details. -*/ -if (XFS_TEST_ERROR (xfs_fs_has_sickness (mp,XFS_SICK_FS_COUNTERS ), mp, -XFS_ERRTAG_FORCE_SUMMARY_RECALC )) { -xfs_alert (mp,"%s: will fix summary counters at next mount" , - __func__); - flags &= ~XLOG_UNMOUNT_TRANS ; - } -/* remove inited flag, and account for space used */ tic->t_flags =0 ; tic->t_curr_res -=sizeof (magic);
@@ -932,6 +919,19 @@ xfs_log_unmount_write(xfs_mount_t *mp) } while (iclog != first_iclog);#endif if (! (XLOG_FORCED_SHUTDOWN (log))) { +/* +* If we think the summary counters are bad, avoid writing the +* unmount record to force log recovery at next mount, after +* which the summary counters will be recalculated. Refer to +* xlog_check_unmount_rec for more details. +*/ +if (XFS_TEST_ERROR (xfs_fs_has_sickness (mp,XFS_SICK_FS_COUNTERS ), + mp,XFS_ERRTAG_FORCE_SUMMARY_RECALC )) { +xfs_alert (mp, +"%s: will fix summary counters at next mount" , + __func__); +return 0 ; + }xfs_log_write_unmount_record (mp); }else {/*
fs/xfs/xfs_log_cil.c +34 -5
@@ -670,6 +670,12 @@ xlog_cil_push( push_seq = cil->xc_push_seq;ASSERT (push_seq <= ctx->sequence); +/* +* Wake up any background push waiters now this context is being pushed. +*/ +if (ctx->space_used >=XLOG_CIL_BLOCKING_SPACE_LIMIT (log)) +wake_up_all (&cil->xc_push_wait); +/* * Check if we've anything to push. If there is nothing, then we don't * move on to a new sequence number and so we have to be able to push
@@ -740,7 +746,7 @@ xlog_cil_push(/* * initialise the new context and attach it to the CIL. Then attach -* the current context to the CIL committing lsit so it can be found +* the current context to the CIL committing list so it can be found * during log forces to extract the commit lsn of the sequence that * needs to be forced. */
@@ -900,7 +906,7 @@ xlog_cil_push_work(*/ static void xlog_cil_push_background ( -struct xlog *log) + struct xlog *log) __releases(cil->xc_ctx_lock) {struct xfs_cil *cil = log->l_cilp;
@@ -914,14 +920,36 @@ xlog_cil_push_background(* don't do a background push if we haven't used up all the * space available yet. */ -if (cil->xc_ctx->space_used <XLOG_CIL_SPACE_LIMIT (log)) +if (cil->xc_ctx->space_used <XLOG_CIL_SPACE_LIMIT (log)) { +up_read (&cil->xc_ctx_lock);return ; + }spin_lock (&cil->xc_push_lock);if (cil->xc_push_seq < cil->xc_current_sequence) { cil->xc_push_seq = cil->xc_current_sequence;queue_work (log->l_mp->m_cil_workqueue, &cil->xc_push_work); } + +/* +* Drop the context lock now, we can't hold that if we need to sleep +* because we are over the blocking threshold. The push_lock is still +* held, so blocking threshold sleep/wakeup is still correctly +* serialised here. +*/ +up_read (&cil->xc_ctx_lock); + +/* +* If we are well over the space limit, throttle the work that is being +* done until the push work on this context has begun. +*/ +if (cil->xc_ctx->space_used >=XLOG_CIL_BLOCKING_SPACE_LIMIT (log)) { +trace_xfs_log_cil_wait (log, cil->xc_ctx->ticket); +ASSERT (cil->xc_ctx->space_used < log->l_logsize); +xlog_wait (&cil->xc_push_wait, &cil->xc_push_lock); +return ; + } +spin_unlock (&cil->xc_push_lock); }
@@ -1038,9 +1066,9 @@ xfs_log_commit_cil(if (lip->li_ops->iop_committing) lip->li_ops->iop_committing (lip, xc_commit_lsn); } -xlog_cil_push_background (log); -up_read (&cil->xc_ctx_lock); +/* xlog_cil_push_background() releases cil->xc_ctx_lock */ +xlog_cil_push_background (log); }/*
@@ -1194,6 +1222,7 @@ xlog_cil_init(INIT_LIST_HEAD (&cil->xc_committing);spin_lock_init (&cil->xc_cil_lock);spin_lock_init (&cil->xc_push_lock); +init_waitqueue_head (&cil->xc_push_wait);init_rwsem (&cil->xc_ctx_lock);init_waitqueue_head (&cil->xc_commit_wait);
fs/xfs/xfs_log_priv.h +47 -6
66 lines not on this page · raw message
fs/xfs/xfs_log_recover.c +3 -2
@@ -2577,6 +2577,7 @@ xlog_recover_do_reg_buffer(int bit;int nbits;xfs_failaddr_t fa; +const size_t size_disk_dquot =sizeof (struct xfs_disk_dquot );trace_xfs_log_recover_buf_reg_buf (mp->m_log, buf_f);
@@ -2619,7 +2620,7 @@ xlog_recover_do_reg_buffer( "XFS: NULL dquot in %s.", __func__); goto next; } -if (item->ri_buf[i].i_len <sizeof (xfs_disk_dquot_t)) { +if (item->ri_buf[i].i_len < size_disk_dquot) {xfs_alert (mp,"XFS: dquot too small (%d) in %s." , item->ri_buf[i].i_len, __func__);
@@ -3250,7 +3251,7 @@ xlog_recover_dquot_pass2(xfs_alert (log->l_mp,"NULL dquot in %s." , __func__);return -EFSCORRUPTED ; } -if (item->ri_buf[1 ].i_len <sizeof (xfs_disk_dquot_t)) { +if (item->ri_buf[1 ].i_len <sizeof (struct xfs_disk_dquot )) {xfs_alert (log->l_mp,"dquot too small (%d) in %s." , item->ri_buf[1 ].i_len, __func__);return -EFSCORRUPTED ;
fs/xfs/xfs_mount.h +5 -0
@@ -179,6 +179,11 @@ typedef struct xfs_mount {struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX ][XFS_ERR_ERRNO_MAX ];struct xstats m_stats;/* per-fs stats */ +/* +* Workqueue item so that we can coalesce multiple inode flush attempts +* into a single flush. +*/ +struct work_struct m_flush_inodes_work;struct workqueue_struct *m_buf_workqueue;struct workqueue_struct *m_unwritten_workqueue;struct workqueue_struct *m_cil_workqueue;
fs/xfs/xfs_qm.c +38 -26
117 lines not on this page · raw message
fs/xfs/xfs_qm_bhv.c +3 -3
@@ -54,11 +54,11 @@ xfs_fill_statvfs_from_dquot(*/ void xfs_qm_statvfs ( -xfs_inode_t *ip, +struct xfs_inode *ip,struct kstatfs *statp) { -xfs_mount_t *mp = ip->i_mount; -xfs_dquot_t *dqp; +struct xfs_mount *mp = ip->i_mount; +struct xfs_dquot *dqp;if (!xfs_qm_dqget (mp,xfs_get_projid (ip),XFS_DQ_PROJ , false, &dqp)) {xfs_fill_statvfs_from_dquot (statp, dqp);
fs/xfs/xfs_qm_syscalls.c +69 -73
172 lines not on this page · raw message
fs/xfs/xfs_stats.c +5 -5
@@ -57,13 +57,13 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf)/* Loop over all stats groups */ for (i = j =0 ; i <ARRAY_SIZE (xstats); i++) { - len +=snprintf (buf + len,PATH_MAX - len,"%s" , + len +=scnprintf (buf + len,PATH_MAX - len,"%s" , xstats[i].desc);/* inner loop does each group */ for (; j < xstats[i].endpoint; j++) - len +=snprintf (buf + len,PATH_MAX - len," %u" , + len +=scnprintf (buf + len,PATH_MAX - len," %u" ,counter_val (stats, j)); - len +=snprintf (buf + len,PATH_MAX - len,"\n" ); + len +=scnprintf (buf + len,PATH_MAX - len,"\n" ); }/* extra precision counters */ for_each_possible_cpu (i) {
@@ -72,9 +72,9 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) xs_read_bytes +=per_cpu_ptr (stats, i)->s.xs_read_bytes; } - len +=snprintf (buf + len,PATH_MAX -len,"xpc %Lu %Lu %Lu\n" , + len +=scnprintf (buf + len,PATH_MAX -len,"xpc %Lu %Lu %Lu\n" , xs_xstrat_bytes, xs_write_bytes, xs_read_bytes); - len +=snprintf (buf + len,PATH_MAX -len,"debug %u\n" , + len +=scnprintf (buf + len,PATH_MAX -len,"debug %u\n" , #if defined(DEBUG) 1);#else
fs/xfs/xfs_super.c +23 -5
@@ -840,6 +840,20 @@ xfs_destroy_mount_workqueues(destroy_workqueue (mp->m_buf_workqueue); } +static void +xfs_flush_inodes_worker ( +struct work_struct *work) +{ + struct xfs_mount *mp = container_of(work, struct xfs_mount, + m_flush_inodes_work); +struct super_block *sb = mp->m_super; + +if (down_read_trylock (&sb->s_umount)) { +sync_inodes_sb (sb); +up_read (&sb->s_umount); + } +} +/* * Flush all dirty data to disk. Must not be called while holding an XFS_ILOCK * or a page lock. We use sync_inodes_sb() here to ensure we block while waiting
@@ -850,12 +864,15 @@ voidxfs_flush_inodes ( struct xfs_mount *mp) { -struct super_block *sb = mp->m_super; +/* +* If flush_work() returns true then that means we waited for a flush +* which was already in progress. Don't bother running another scan. +*/ +if (flush_work (&mp->m_flush_inodes_work)) +return ; -if (down_read_trylock (&sb->s_umount)) { -sync_inodes_sb (sb); -up_read (&sb->s_umount); - } +queue_work (mp->m_sync_workqueue, &mp->m_flush_inodes_work); +flush_work (&mp->m_flush_inodes_work); }/* Catch misguided souls that try to use this interface on XFS */
@@ -1532,6 +1549,7 @@ xfs_mount_alloc(spin_lock_init (&mp->m_perag_lock);mutex_init (&mp->m_growlock);atomic_set (&mp->m_active_trans,0 ); +INIT_WORK (&mp->m_flush_inodes_work, xfs_flush_inodes_worker);INIT_DELAYED_WORK (&mp->m_reclaim_work, xfs_reclaim_worker);INIT_DELAYED_WORK (&mp->m_eofblocks_work, xfs_eofblocks_worker);INIT_DELAYED_WORK (&mp->m_cowblocks_work, xfs_cowblocks_worker);
fs/xfs/xfs_trace.h +1 -0
@@ -1011,6 +1011,7 @@ DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub);DEFINE_LOGGRANT_EVENT (xfs_log_ungrant_enter);DEFINE_LOGGRANT_EVENT (xfs_log_ungrant_exit);DEFINE_LOGGRANT_EVENT (xfs_log_ungrant_sub); +DEFINE_LOGGRANT_EVENT (xfs_log_cil_wait); DECLARE_EVENT_CLASS(xfs_log_item_class, TP_PROTO(struct xfs_log_item *lip),
fs/xfs/xfs_trans_ail.c +56 -32
152 lines not on this page · raw message
fs/xfs/xfs_trans_dquot.c +27 -27
97 lines not on this page · raw message
fs/xfs/xfs_trans_priv.h +4 -2
@@ -91,9 +91,11 @@ xfs_trans_ail_update(xfs_trans_ail_update_bulk (ailp,NULL , &lip,1 , lsn); } -bool xfs_ail_delete_one (struct xfs_ail *ailp,struct xfs_log_item *lip); +xfs_lsn_t xfs_ail_delete_one (struct xfs_ail *ailp,struct xfs_log_item *lip); +void xfs_ail_update_finish(struct xfs_ail *ailp, xfs_lsn_t old_lsn) + __releases(ailp->ail_lock);void xfs_trans_ail_delete (struct xfs_ail *ailp,struct xfs_log_item *lip, - int shutdown_type) __releases(ailp->ail_lock); +int shutdown_type);static inline void xfs_trans_ail_remove(
net/atm/mpoa_proc.c +2 -1
@@ -222,11 +222,12 @@ static ssize_t proc_mpc_write(struct file *file, const char __user *buff,if (!page)return -ENOMEM ; -for (p = page, len =0 ; len < nbytes; p++, len++) { +for (p = page, len =0 ; len < nbytes; p++) {if (get_user (*p, buff++)) {free_page ((unsigned long )page);return -EFAULT ; } + len +=1 ;if (*p =='\0' || *p =='\n' )break ; }
net/sched/sch_cake.c +4 -0
@@ -2190,8 +2190,12 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch)static void cake_reset (struct Qdisc *sch) { +struct cake_sched_data *q =qdisc_priv (sch);u32 c; +if (!q->tins) +return ; +for (c =0 ; c <CAKE_MAX_TINS ; c++)cake_clear_tin (sch, c); }
net/tipc/discover.c +1 -1
@@ -146,8 +146,8 @@ static bool tipc_disc_addr_trial_msg(struct tipc_discoverer *d, {struct net *net = d->net;struct tipc_net *tn =tipc_net (net); -bool trial =time_before (jiffies, tn->addr_trial_end);u32 self =tipc_own_addr (net); +bool trial =time_before (jiffies, tn->addr_trial_end) && !self;if (mtyp ==DSC_TRIAL_FAIL_MSG ) {if (!trial)
net/tipc/topsrv.c +1 -1
@@ -568,7 +568,7 @@ bool tipc_topsrv_kern_subscr(struct net *net, u32 port, u32 type, u32 lower, sub.seq.upper = upper; sub.timeout =TIPC_WAIT_FOREVER ; sub.filter = filter; - *(u32 *)&sub.usr_handle = port; + *(u64 *)&sub.usr_handle = (u64 )port; con =tipc_conn_alloc (tipc_topsrv (net));if (IS_ERR (con))
virt/kvm/arm/vgic/vgic-its.c +4 -1
@@ -2095,7 +2095,7 @@ static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz,memset (entry,0 , esz); -while (len >0 ) { +while (true) {int next_offset;size_t byte_offset;
@@ -2108,6 +2108,9 @@ static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz,return next_offset; byte_offset = next_offset * esz; +if (byte_offset >= len) +break ; + id += next_offset; gpa += byte_offset; len -= byte_offset;
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.221 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/arm64/silicon-errata.rst | 4 Makefile | 6 - arch/arm64/Kconfig | 16 +++ arch/arm64/include/asm/cpucaps.h | 3 arch/arm64/kernel/cpu_errata.c | 16 +++ arch/arm64/kernel/cpufeature.c | 13 ++ arch/arm64/kernel/topology.c | 40 -------- arch/riscv/Kconfig | 2 arch/riscv/kernel/smpboot.c | 4 arch/x86/kernel/cpu/microcode/amd.c | 16 ++- drivers/acpi/acpi_extlog.c | 33 ++++-- drivers/acpi/video_detect.c | 64 +++++++++++++ drivers/ata/ahci.h | 2 drivers/ata/ahci_imx.c | 2 drivers/base/arch_topology.c | 19 ++++ drivers/hid/hid-magicmouse.c | 2 drivers/hwmon/coretemp.c | 56 ++++++++--- drivers/iommu/intel-iommu.c | 5 + drivers/media/platform/qcom/venus/vdec.c | 2 drivers/net/ethernet/hisilicon/hns/hnae.c | 4 drivers/net/hyperv/hyperv_net.h | 3 drivers/net/hyperv/netvsc.c | 4 drivers/net/hyperv/netvsc_drv.c | 20 ++++ drivers/net/phy/dp83867.c | 8 + drivers/net/usb/cdc_ether.c | 7 + drivers/net/usb/r8152.c | 1 fs/btrfs/backref.c | 46 ++++++--- fs/ocfs2/namei.c | 23 ++-- fs/proc/task_mmu.c | 2 fs/xfs/libxfs/xfs_alloc.c | 2 fs/xfs/libxfs/xfs_attr_leaf.c | 6 - fs/xfs/libxfs/xfs_bmap.c | 32 ------ fs/xfs/libxfs/xfs_bmap.h | 3 fs/xfs/libxfs/xfs_btree.c | 2 fs/xfs/libxfs/xfs_da_btree.c | 10 +- fs/xfs/libxfs/xfs_dir2_block.c | 33 ++++++ fs/xfs/libxfs/xfs_dir2_data.c | 32 ++++++ fs/xfs/libxfs/xfs_dir2_leaf.c | 2 fs/xfs/libxfs/xfs_dir2_node.c | 8 - fs/xfs/libxfs/xfs_dquot_buf.c | 8 - fs/xfs/libxfs/xfs_format.h | 10 +- fs/xfs/libxfs/xfs_trans_resv.c | 6 - fs/xfs/xfs_attr_inactive.c | 6 - fs/xfs/xfs_attr_list.c | 2 fs/xfs/xfs_bmap_util.c | 57 ++++++------ fs/xfs/xfs_buf.c | 22 ++++ fs/xfs/xfs_buf.h | 2 fs/xfs/xfs_dquot.c | 26 ++--- fs/xfs/xfs_dquot.h | 98 ++++++++++---------- fs/xfs/xfs_dquot_item.c | 47 +++++++-- fs/xfs/xfs_dquot_item.h | 35 ++++--- fs/xfs/xfs_error.c | 7 + fs/xfs/xfs_error.h | 2 fs/xfs/xfs_export.c | 14 -- fs/xfs/xfs_file.c | 16 +-- fs/xfs/xfs_inode.c | 23 ++++ fs/xfs/xfs_inode.h | 1 fs/xfs/xfs_inode_item.c | 28 ++--- fs/xfs/xfs_log.c | 26 ++--- fs/xfs/xfs_log_cil.c | 39 +++++++- fs/xfs/xfs_log_priv.h | 53 +++++++++-- fs/xfs/xfs_log_recover.c | 5 - fs/xfs/xfs_mount.h | 5 + fs/xfs/xfs_qm.c | 64 ++++++++----- fs/xfs/xfs_qm_bhv.c | 6 - fs/xfs/xfs_qm_syscalls.c | 142 ++++++++++++++---------------- fs/xfs/xfs_stats.c | 10 +- fs/xfs/xfs_super.c | 28 ++++- fs/xfs/xfs_trace.h | 1 fs/xfs/xfs_trans_ail.c | 88 +++++++++++------- fs/xfs/xfs_trans_dquot.c | 54 +++++------ fs/xfs/xfs_trans_priv.h | 6 - net/atm/mpoa_proc.c | 3 net/sched/sch_cake.c | 4 net/tipc/discover.c | 2 net/tipc/topsrv.c | 2 virt/kvm/arm/vgic/vgic-its.c | 5 - 77 files changed, 972 insertions(+), 534 deletions(-)
Alexander Potapenko (1):
tipc: fix an information leak in tipc_topsrv_kern_subscr
Alexander Stein (1):
ata: ahci-imx: Fix MODULE_ALIAS
Borislav Petkov (1):
x86/microcode/AMD: Apply the patch early on every logical thread
Brian Foster (6):
xfs: open code insert range extent split helper
xfs: rework insert range into an atomic operation
xfs: rework collapse range into an atomic operation
xfs: factor out quotaoff intent AIL removal and memory free
xfs: fix unmount hang and memory leak on shutdown during quotaoff
xfs: trylock underlying buffer on dquot flush
Bryan O'Donoghue (1):
media: venus: dec: Handle the case where find_format fails
Christoph Hellwig (2):
xfs: factor out a new xfs_log_force_inode helper
xfs: reflink should force the log out if mounted with wsync
Conor Dooley (2):
arm64: topology: move store_cpu_topology() to shared code
riscv: topology: fix default topology reporting
Darrick J. Wong (8):
xfs: add a function to deal with corrupt buffers post-verifiers
xfs: xfs_buf_corruption_error should take __this_address
xfs: fix buffer corruption reporting when xfs_dir3_free_header_check fails
xfs: check owner of dir3 data blocks
xfs: check owner of dir3 blocks
xfs: preserve default grace interval during quotacheck
xfs: don't write a corrupt unmount record to force summary counter recalc
xfs: move inode flush to the sync workqueue
Dave Chinner (5):
xfs: Lower CIL flush limit for large logs
xfs: Throttle commits on delayed background CIL push
xfs: factor common AIL item deletion code
xfs: tail updates only need to occur when LSN changes
xfs: fix use-after-free on CIL context on shutdown
Eric Ren (1):
KVM: arm64: vgic: Fix exit condition in scan_its_table()
Filipe Manana (2):
btrfs: fix processing of delayed data refs during backref walking
btrfs: fix processing of delayed tree block refs during backref walking
Gaurav Kohli (1):
hv_netvsc: Fix race between VF offering and VF association message from host
Greg Kroah-Hartman (1):
Linux 5.4.221
Harini Katakam (1):
net: phy: dp83867: Extend RX strap quirk for SGMII mode
James Morse (1):
arm64: errata: Remove AES hwcap for COMPAT tasks
Jean-Francois Le Fillatre (1):
r8152: add PID for the Lenovo OneLink+ Dock
Jerry Snitselaar (1):
iommu/vt-d: Clean up si_domain in the init_dmars() error path
Joseph Qi (2):
ocfs2: clear dinode links count in case of error
ocfs2: fix BUG when iput after ocfs2_mknod fails
José Expósito (1):
HID: magicmouse: Do not set BTN_MOUSE on double report
Kai-Heng Feng (1):
ata: ahci: Match EM_MAX_SLOTS with SATA_PMP_MAX_PORTS
Mark Tomlinson (1):
tipc: Fix recognition of trial period
Nick Desaulniers (1):
Makefile.debug: re-enable debug info for .S files
Pavel Reichl (4):
xfs: remove the xfs_disk_dquot_t and xfs_dquot_t
xfs: remove the xfs_dq_logitem_t typedef
xfs: remove the xfs_qoff_logitem_t typedef
xfs: Replace function declaration by actual definition
Seth Jenkins (1):
mm: /proc/pid/smaps_rollup: fix no vma's null-deref
Takashi Iwai (1):
xfs: Use scnprintf() for avoiding potential buffer overflow
Tony Luck (1):
ACPI: extlog: Handle multiple records
Werner Sembach (1):
ACPI: video: Force backlight native for more TongFang devices
Xiaobo Liu (1):
net/atm: fix proc_mpc_write incorrect return value
Yang Yingliang (1):
net: hns: fix possible memory leak in hnae_ae_register()
Zhang Rui (1):
hwmon/coretemp: Handle large core ID value
Zhengchao Shao (1):
net: sched: cake: fix null pointer access issue when cake_init() fails