Linux 5.10.129
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.10.129 kernel.
All users of the 5.10 kernel series must upgrade.
The updated 5.10.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.10.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/xen/p2m.c | 6 arch/powerpc/include/asm/bpf_perf_event.h | 9 arch/powerpc/include/uapi/asm/bpf_perf_event.h | 9 arch/powerpc/kernel/prom_init_check.sh | 2 arch/powerpc/mm/nohash/book3e_pgtable.c | 6 arch/s390/Kconfig | 1 arch/s390/crypto/arch_random.c | 111 ------- arch/s390/include/asm/archrandom.h | 13 arch/s390/kernel/setup.c | 5 drivers/block/xen-blkfront.c | 56 ++- drivers/clocksource/timer-ixp4xx.c | 1 drivers/cpufreq/qoriq-cpufreq.c | 1 drivers/devfreq/event/exynos-ppmu.c | 8 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 3 drivers/hwmon/ibmaem.c | 12 drivers/infiniband/core/cm.c | 4 drivers/infiniband/hw/qedr/qedr.h | 1 drivers/infiniband/hw/qedr/verbs.c | 4 drivers/md/dm-raid.c | 34 +- drivers/md/raid5.c | 1 drivers/net/bonding/bond_3ad.c | 3 drivers/net/bonding/bond_alb.c | 2 drivers/net/caif/caif_virtio.c | 10 drivers/net/dsa/bcm_sf2.c | 5 drivers/net/ethernet/smsc/epic100.c | 4 drivers/net/phy/dp83822.c | 4 drivers/net/tun.c | 15 drivers/net/usb/ax88179_178a.c | 101 ++++-- drivers/net/usb/qmi_wwan.c | 2 drivers/net/usb/usbnet.c | 4 drivers/net/virtio_net.c | 8 drivers/net/xen-netfront.c | 56 +++ drivers/nfc/nfcmrvl/i2c.c | 6 drivers/nfc/nfcmrvl/spi.c | 6 drivers/nfc/nxp-nci/i2c.c | 3 drivers/nvdimm/bus.c | 4 drivers/nvme/host/pci.c | 3 drivers/xen/gntdev-common.h | 7 drivers/xen/gntdev.c | 140 ++++++--- fs/io_uring.c | 4 fs/iomap/buffered-io.c | 7 fs/nfsd/vfs.c | 3 fs/xfs/libxfs/xfs_btree.c | 12 fs/xfs/libxfs/xfs_sb.c | 16 - fs/xfs/xfs_aops.c | 17 - fs/xfs/xfs_error.c | 2 fs/xfs/xfs_reflink.c | 3 fs/xfs/xfs_super.c | 120 ++++--- fs/xfs/xfs_trans.c | 23 - fs/xfs/xfs_trans.h | 30 + include/linux/dim.h | 2 net/ipv4/ip_tunnel_core.c | 2 net/ipv4/tcp_ipv4.c | 4 net/ipv6/addrconf.c | 4 net/ipv6/route.c | 9 net/ipv6/seg6_hmac.c | 1 net/ipv6/sit.c | 10 net/netfilter/nft_set_hash.c | 2 net/rose/rose_timer.c | 34 +- net/sched/act_api.c | 22 - net/sunrpc/xdr.c | 2 net/tipc/node.c | 41 +- tools/testing/selftests/net/udpgso_bench.sh | 2 tools/testing/selftests/rseq/Makefile | 2 tools/testing/selftests/rseq/basic_percpu_ops_test.c | 5 tools/testing/selftests/rseq/compiler.h | 30 + tools/testing/selftests/rseq/param_test.c | 8 tools/testing/selftests/rseq/rseq-abi.h | 151 +++++++++ tools/testing/selftests/rseq/rseq-arm.h | 110 +++---- tools/testing/selftests/rseq/rseq-arm64.h | 79 +++-- tools/testing/selftests/rseq/rseq-generic-thread-pointer.h | 25 + tools/testing/selftests/rseq/rseq-mips.h | 71 +--- tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h | 30 + tools/testing/selftests/rseq/rseq-ppc.h | 128 +++++--- tools/testing/selftests/rseq/rseq-s390.h | 55 ++- tools/testing/selftests/rseq/rseq-skip.h | 2 tools/testing/selftests/rseq/rseq-thread-pointer.h | 19 + tools/testing/selftests/rseq/rseq-x86-thread-pointer.h | 40 ++ tools/testing/selftests/rseq/rseq-x86.h | 200 ++++++++----- tools/testing/selftests/rseq/rseq.c | 165 +++++----- tools/testing/selftests/rseq/rseq.h | 30 + 82 files changed, 1426 insertions(+), 768 deletions(-)
Alexey Khoroshilov (1):
NFSD: restore EINVAL error translation in nfsd_commit()
Anthony Iliopoulos (1):
xfs: fix xfs_trans slab cache name
Carlo Lobrano (1):
net: usb: qmi_wwan: add Telit 0x1060 composition
Chris Ye (1):
nvdimm: Fix badblocks clear off-by-one error
Christophe Leroy (1):
powerpc/book3e: Fix PUD allocation size in map_kernel_page()
Chuck Lever (1):
SUNRPC: Fix READ_PLUS crasher
Daniele Palmas (1):
net: usb: qmi_wwan: add Telit 0x1070 composition
Darrick J. Wong (1):
xfs: fix xfs_reflink_unshare usage of filemap_write_and_wait_range
Dave Chinner (2):
xfs: use current->journal_info for detecting transaction recursion
xfs: update superblock counters correctly for !lazysbcount
Demi Marie Obenour (1):
xen/gntdev: Avoid blocking in unmap_grant_pages()
Dimitris Michailidis (1):
selftests/net: pass ipv6_args to udpgso_bench's IPv6 TCP test
Doug Berger (1):
net: dsa: bcm_sf2: force pause link settings
Duoming Zhou (1):
net: rose: fix UAF bugs caused by timer handler
Enguerrand de Ribaucourt (2):
net: dp83822: disable false carrier interrupt
net: dp83822: disable rx error interrupt
Eric Dumazet (3):
net: bonding: fix possible NULL deref in rlb code
tunnels: do not assume mac header is set in skb_tunnel_check_pmtu()
tcp: add a missing nf_reset_ct() in 3WHS handling
Gao Xiang (1):
xfs: ensure xfs_errortag_random_default matches XFS_ERRTAG_MAX
Greg Kroah-Hartman (2):
clocksource/drivers/ixp4xx: remove EXPORT_SYMBOL_GPL from ixp4xx_timer_setup() Linux 5.10.129
Heinz Mauelshagen (1):
dm raid: fix accesses beyond end of raid member array
Jakub Kicinski (3):
net: tun: unlink NAPI from device on destruction
net: tun: stop NAPI when detaching queues
net: tun: avoid disabling NAPI twice
Jan Beulich (1):
xen-netfront: restore __skb_queue_tail() positioning in xennet_get_responses()
Jason A. Donenfeld (1):
s390/archrandom: simplify back to earlier design and initialize earlier
Jason Wang (2):
virtio-net: fix race between ndo_open() and virtio_device_ready()
caif_virtio: fix race between virtio_device_ready() and ndo_open()
Jens Axboe (1):
io_uring: ensure that send/sendmsg and recv/recvmsg check sqe->ioprio
Jose Alonso (1):
net: usb: ax88179_178a: Fix packet receiving
Kamal Heib (1):
RDMA/qedr: Fix reporting QP timeout attribute
Krzysztof Kozlowski (1):
nfc: nfcmrvl: Fix irq_of_parse_and_map() return value
Liam Howlett (1):
powerpc/prom_init: Fix kernel config grep
Liang He (1):
drivers: cpufreq: Add missing of_node_put() in qoriq-cpufreq.c
Masahiro Yamada (1):
s390: remove unneeded 'select BUILD_BIN2C'
Mathieu Desnoyers (15):
selftests/rseq: introduce own copy of rseq uapi header selftests/rseq: Remove useless assignment to cpu variable selftests/rseq: Remove volatile from __rseq_abi
selftests/rseq: Introduce rseq_get_abi() helper
selftests/rseq: Introduce thread pointer getters
selftests/rseq: Uplift rseq selftests for compatibility with glibc-2.35 selftests/rseq: Fix ppc32: wrong rseq_cs 32-bit field pointer on big endian selftests/rseq: Fix ppc32 missing instruction selection "u" and "x" for load/store selftests/rseq: Fix ppc32 offsets by using long rather than off_t selftests/rseq: Fix warnings about #if checks of undefined tokens selftests/rseq: Remove arm/mips asm goto compiler work-around selftests/rseq: Fix: work-around asm goto compiler bugs selftests/rseq: x86-64: use %fs segment selector for accessing rseq thread area selftests/rseq: x86-32: use %gs segment selector for accessing rseq thread area selftests/rseq: Change type of rseq_offset to ptrdiff_t
Miaoqian Lin (2):
RDMA/cm: Fix memory leak in ib_cm_insert_listen
PM / devfreq: exynos-ppmu: Fix refcount leak in of_get_devfreq_events
Michael Walle (1):
NFC: nxp-nci: Don't issue a zero length i2c_master_read()
Mikulas Patocka (1):
dm raid: fix KASAN warning in raid5_add_disks
Naveen N. Rao (1):
powerpc/bpf: Fix use of user_pt_regs in uapi
Nicolas Dichtel (1):
ipv6: take care of disable_policy when restoring routes
Oleksandr Tyshchenko (1):
xen/arm: Fix race in RB-tree based P2M accounting
Oliver Neukum (1):
usbnet: fix memory allocation in helpers
Pablo Greco (1):
nvme-pci: add NVME_QUIRK_BOGUS_NID for ADATA XPG SX6000LNP (AKA SPECTRIX S40G)
Pablo Neira Ayuso (1):
netfilter: nft_dynset: restore set element counter when failing to update
Pavel Reichl (2):
xfs: rename variable mp to parsing_mp
xfs: Skip repetitive warnings about mount options
Roger Pau Monne (4):
xen/blkfront: fix leaking data in shared pages xen/netfront: fix leaking data in shared pages xen/netfront: force data bouncing when backend is untrusted xen/blkfront: force data bouncing when backend is untrusted
Ruili Ji (1):
drm/amdgpu: To flush tlb for MMHUB of RAVEN series
Shuah Khan (1):
selftests/rseq: remove ARRAY_SIZE define from individual tests
Tao Liu (1):
linux/dim: Fix divide by 0 in RDMA DIM
Tong Zhang (1):
epic100: fix use after free on rmmod
Victor Nogueira (1):
net/sched: act_api: Notify user space if any actions were flushed before error
Xin Long (1):
tipc: move bc link creation back to tipc_node_create
Yang Yingliang (1):
hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
Yevhen Orlov (1):
net: bonding: fix use-after-free after 802.3ad slave unbind
YueHaibing (1):
net: ipv6: unexport __init-annotated seg6_hmac_net_init()
katrinzhou (1):
ipv6/sit: fix ipip6_tunnel_get_prl return value
kernel test robot (1):
sit: use min
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 128 +SUBLEVEL = 129 EXTRAVERSION = NAME = Dare mighty things
arch/arm/xen/p2m.c +4 -2
@@ -62,11 +62,12 @@ static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)unsigned long __pfn_to_mfn (unsigned long pfn) { -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;struct xen_p2m_entry *entry;unsigned long irqflags;read_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (entry->pfn <= pfn &&
@@ -153,10 +154,11 @@ bool __set_phys_to_machine_multi(unsigned long pfn,int rc;unsigned long irqflags;struct xen_p2m_entry *p2m_entry; -struct rb_node *n = phys_to_mach.rb_node; +struct rb_node *n;if (mfn ==INVALID_P2M_ENTRY ) {write_lock_irqsave (&p2m_lock, irqflags); + n = phys_to_mach.rb_node;while (n) { p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys); if (p2m_entry->pfn <= pfn &&
arch/powerpc/include/asm/bpf_perf_event.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_POWERPC_BPF_PERF_EVENT_H +#define _ASM_POWERPC_BPF_PERF_EVENT_H + +#include <asm/ptrace.h> + +typedef struct user_pt_regs bpf_user_pt_regs_t ; + +#endif /* _ASM_POWERPC_BPF_PERF_EVENT_H */
arch/powerpc/include/uapi/asm/bpf_perf_event.h deleted +0 -9
@@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ -#define _UAPI__ASM_BPF_PERF_EVENT_H__ - -#include <asm/ptrace.h> - -typedef struct user_pt_regs bpf_user_pt_regs_t ; - -#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
arch/powerpc/kernel/prom_init_check.sh +1 -1
@@ -13,7 +13,7 @@ # If you really need to reference something from prom_init.o add # it to the list below: -grep "^CONFIG_KASAN=y$" .config >/dev/null +grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null if [ $? -eq 0 ] then MEM_FUNCS="__memcpy __memset"
arch/powerpc/mm/nohash/book3e_pgtable.c +3 -3
@@ -95,8 +95,8 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot) pgdp =pgd_offset_k (ea); p4dp =p4d_offset (pgdp, ea);if (p4d_none (*p4dp)) { - pmdp =early_alloc_pgtable (PMD_TABLE_SIZE ); -p4d_populate (&init_mm, p4dp, pmdp); + pudp =early_alloc_pgtable (PUD_TABLE_SIZE ); +p4d_populate (&init_mm, p4dp, pudp); } pudp =pud_offset (p4dp, ea);if (pud_none (*pudp)) {
@@ -105,7 +105,7 @@ int __ref map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot) } pmdp =pmd_offset (pudp, ea);if (!pmd_present (*pmdp)) { - ptep =early_alloc_pgtable (PAGE_SIZE ); + ptep =early_alloc_pgtable (PTE_TABLE_SIZE );pmd_populate_kernel (&init_mm, pmdp, ptep); } ptep =pte_offset_kernel (pmdp, ea);
arch/s390/Kconfig +0 -1
@@ -507,7 +507,6 @@ config KEXEC config KEXEC_FILE bool "kexec file based system call" select KEXEC_CORE - select BUILD_BIN2C depends on CRYPTO depends on CRYPTO_SHA256 depends on CRYPTO_SHA256_S390
arch/s390/crypto/arch_random.c +1 -110
127 lines not on this page · raw message
arch/s390/include/asm/archrandom.h +8 -5
@@ -2,7 +2,7 @@/* * Kernel interface for the s390 arch_random_* functions * -* Copyright IBM Corp. 2017 +* Copyright IBM Corp. 2017, 2020 * * Author: Harald Freudenberger <[email protected]> *
@@ -15,12 +15,11 @@#include <linux/static_key.h> #include <linux/atomic.h> +#include <asm/cpacf.h> DECLARE_STATIC_KEY_FALSE (s390_arch_random_available);extern atomic64_t s390_arch_random_counter; -bool s390_arch_random_generate (u8 *buf,unsigned int nbytes); -static inline bool __must_check arch_get_random_long (unsigned long *v) {return false;
@@ -34,7 +33,9 @@ static inline bool __must_check arch_get_random_int(unsigned int *v)static inline bool __must_check arch_get_random_seed_long (unsigned long *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; }
@@ -42,7 +43,9 @@ static inline bool __must_check arch_get_random_seed_long(unsigned long *v)static inline bool __must_check arch_get_random_seed_int (unsigned int *v) {if (static_branch_likely (&s390_arch_random_available)) { -return s390_arch_random_generate ((u8 *)v,sizeof (*v)); +cpacf_trng (NULL ,0 , (u8 *)v,sizeof (*v)); +atomic64_add (sizeof (*v), &s390_arch_random_counter); +return true; }return false; }
arch/s390/kernel/setup.c +5 -0
@@ -1009,6 +1009,11 @@ static void __init setup_randomness(void)if (stsi (vmms,3 ,2 ,2 ) ==0 && vmms->count)add_device_randomness (&vmms->vm,sizeof (vmms->vm[0 ]) * vmms->count);memblock_free ((unsigned long ) vmms,PAGE_SIZE ); + +#ifdef CONFIG_ARCH_RANDOM +if (cpacf_query_func (CPACF_PRNO ,CPACF_PRNO_TRNG )) +static_branch_enable (&s390_arch_random_available); +#endif }/*
drivers/block/xen-blkfront.c +38 -18
174 lines not on this page · raw message
drivers/clocksource/timer-ixp4xx.c +0 -1
@@ -258,7 +258,6 @@ void __init ixp4xx_timer_setup(resource_size_t timerbase, }ixp4xx_timer_register (base, timer_irq, timer_freq); } -EXPORT_SYMBOL_GPL (ixp4xx_timer_setup);#ifdef CONFIG_OF static __init int ixp4xx_of_timer_init (struct device_node *np)
drivers/cpufreq/qoriq-cpufreq.c +1 -0
@@ -275,6 +275,7 @@ static int qoriq_cpufreq_probe(struct platform_device *pdev) np =of_find_matching_node (NULL , qoriq_cpufreq_blacklist);if (np) { +of_node_put (np);dev_info (&pdev->dev,"Disabling due to erratum A-008083" );return -ENODEV ; }
drivers/devfreq/event/exynos-ppmu.c +6 -2
@@ -514,15 +514,19 @@ static int of_get_devfreq_events(struct device_node *np, count =of_get_child_count (events_np); desc =devm_kcalloc (dev, count,sizeof (*desc),GFP_KERNEL ); -if (!desc) +if (!desc) { +of_node_put (events_np);return -ENOMEM ; + } info->num_events = count; of_id =of_match_device (exynos_ppmu_id_match, dev);if (of_id) info->ppmu_type = (enum exynos_ppmu_type )of_id->data; -else +else { +of_node_put (events_np);return -EINVAL ; + } j =0 ;for_each_child_of_node (events_np, node) {
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +2 -1
@@ -689,7 +689,8 @@ int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct kgd_dev *kgd, uint16_t pasid)const uint32_t flush_type =0 ;bool all_hub = false; -if (adev->family ==AMDGPU_FAMILY_AI ) +if (adev->family ==AMDGPU_FAMILY_AI || + adev->family ==AMDGPU_FAMILY_RV ) all_hub = true;return amdgpu_gmc_flush_gpu_tlb_pasid (adev, pasid, flush_type, all_hub);
drivers/hwmon/ibmaem.c +8 -4
@@ -550,7 +550,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle) res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -598,7 +598,9 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
@@ -690,7 +692,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe, res =platform_device_add (data->pdev);if (res) - goto ipmi_err; + goto dev_add_err;platform_set_drvdata (data->pdev, data);
@@ -738,7 +740,9 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,ipmi_destroy_user (data->ipmi.user); ipmi_err:platform_set_drvdata (data->pdev,NULL ); -platform_device_unregister (data->pdev); +platform_device_del (data->pdev); +dev_add_err: +platform_device_put (data->pdev); dev_err:ida_simple_remove (&aem_ida, data->id); id_err:
drivers/infiniband/core/cm.c +3 -1
@@ -1280,8 +1280,10 @@ struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device,return ERR_CAST (cm_id_priv); err =cm_init_listen (cm_id_priv, service_id,0 ); -if (err) +if (err) { +ib_destroy_cm_id (&cm_id_priv->id);return ERR_PTR (err); + }spin_lock_irq (&cm_id_priv->lock); listen_id_priv =cm_insert_listen (cm_id_priv, cm_handler);
drivers/infiniband/hw/qedr/qedr.h +1 -0
@@ -418,6 +418,7 @@ struct qedr_qp {u32 sq_psn;u32 qkey;u32 dest_qp_num; +u8 timeout;/* Relevant to qps created from kernel space only (ULPs) */ u8 prev_wqe_size;
drivers/infiniband/hw/qedr/verbs.c +3 -1
@@ -2622,6 +2622,8 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,1 <<max_t (int, attr->timeout -8 ,0 ); else qp_params.ack_timeout = 0; + + qp->timeout = attr->timeout; }if (attr_mask &IB_QP_RETRY_CNT ) {
@@ -2781,7 +2783,7 @@ int qedr_query_qp(struct ib_qp *ibqp,rdma_ah_set_dgid_raw (&qp_attr->ah_attr, ¶ms.dgid.bytes[0 ]);rdma_ah_set_port_num (&qp_attr->ah_attr,1 );rdma_ah_set_sl (&qp_attr->ah_attr,0 ); - qp_attr->timeout = params.timeout; + qp_attr->timeout = qp->timeout; qp_attr->rnr_retry = params.rnr_retry; qp_attr->retry_cnt = params.retry_cnt; qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
drivers/md/dm-raid.c +18 -16
@@ -1002,12 +1002,13 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)static int validate_raid_redundancy (struct raid_set *rs) {unsigned int i, rebuild_cnt =0 ; -unsigned int rebuilds_per_group =0 , copies; +unsigned int rebuilds_per_group =0 , copies, raid_disks;unsigned int group_size, last_group_start; -for (i =0 ; i < rs->md.raid_disks; i++) -if (!test_bit (In_sync, &rs->dev[i].rdev.flags) || - !rs->dev[i].rdev.sb_page) +for (i =0 ; i < rs->raid_disks; i++) +if (!test_bit (FirstUse, &rs->dev[i].rdev.flags) && + ((!test_bit (In_sync, &rs->dev[i].rdev.flags) || + !rs->dev[i].rdev.sb_page))) rebuild_cnt++;switch (rs->md.level) {
@@ -1047,8 +1048,9 @@ static int validate_raid_redundancy(struct raid_set *rs)* A A B B C * C D D E E */ + raid_disks =min (rs->raid_disks, rs->md.raid_disks);if (__is_raid10_near (rs->md.new_layout)) { -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1071,10 +1073,10 @@ static int validate_raid_redundancy(struct raid_set *rs)* results in the need to treat the last (potentially larger) * set differently. */ - group_size = (rs->md.raid_disks / copies); - last_group_start = (rs->md.raid_disks / group_size) -1 ; + group_size = (raid_disks / copies); + last_group_start = (raid_disks / group_size) -1 ; last_group_start *= group_size; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < raid_disks; i++) {if (!(i % copies) && !(i > last_group_start)) rebuilds_per_group =0 ; if ((!rs->dev[i].rdev.sb_page ||
@@ -1589,7 +1591,7 @@ static sector_t __rdev_sectors(struct raid_set *rs) {int i; -for (i =0 ; i < rs->md.raid_disks; i++) { +for (i =0 ; i < rs->raid_disks; i++) {struct md_rdev *rdev = &rs->dev[i].rdev; if (!test_bit(Journal, &rdev->flags) &&
@@ -3732,13 +3734,13 @@ static int raid_iterate_devices(struct dm_target *ti,unsigned int i;int r =0 ; -for (i =0 ; !r && i < rs->md.raid_disks; i++) -if (rs->dev[i].data_dev) - r =fn (ti, - rs->dev[i].data_dev, -0 ,/* No offset on data devs */ - rs->md.dev_sectors, - data); +for (i =0 ; !r && i < rs->raid_disks; i++) { +if (rs->dev[i].data_dev) { + r =fn (ti, rs->dev[i].data_dev, +0 ,/* No offset on data devs */ + rs->md.dev_sectors, data); + } + }return r; }
drivers/md/raid5.c +1 -0
@@ -8004,6 +8004,7 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)*/ if (rdev->saved_raid_disk >=0 && rdev->saved_raid_disk >= first && + rdev->saved_raid_disk <= last && conf->disks[rdev->saved_raid_disk].rdev ==NULL ) first = rdev->saved_raid_disk;
drivers/net/bonding/bond_3ad.c +2 -1
@@ -2209,7 +2209,8 @@ void bond_3ad_unbind_slave(struct slave *slave) temp_aggregator->num_of_ports--;if (__agg_active_ports (temp_aggregator) ==0 ) { select_new_active_agg = temp_aggregator->is_active; -ad_clear_agg (temp_aggregator); +if (temp_aggregator->num_of_ports ==0 ) +ad_clear_agg (temp_aggregator);if (select_new_active_agg) {slave_info (bond->dev, slave->dev,"Removing an active aggregator\n" );/* select new active aggregator */
drivers/net/bonding/bond_alb.c +1 -1
@@ -1279,12 +1279,12 @@ int bond_alb_initialize(struct bonding *bond, int rlb_enabled)return res;if (rlb_enabled) { - bond->alb_info.rlb_enabled =1 ; res =rlb_initialize (bond);if (res) {tlb_deinitialize (bond);return res; } + bond->alb_info.rlb_enabled =1 ; }else { bond->alb_info.rlb_enabled =0 ; }
drivers/net/caif/caif_virtio.c +9 -1
@@ -723,13 +723,21 @@ static int cfv_probe(struct virtio_device *vdev)/* Carrier is off until netdevice is opened */ netif_carrier_off (netdev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); +/* register Netdev */ - err =register_netdev (netdev); + err =register_netdevice (netdev);if (err) { +rtnl_unlock ();dev_err (&vdev->dev,"Unable to register netdev (%d)\n" , err); goto err; } +virtio_device_ready (vdev); + +rtnl_unlock (); +debugfs_init (cfv);return 0 ;
drivers/net/dsa/bcm_sf2.c +5 -0
@@ -774,6 +774,11 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,if (duplex ==DUPLEX_FULL ) reg |=DUPLX_MODE ; +if (tx_pause) + reg |=TXFLOW_CNTL ; +if (rx_pause) + reg |=RXFLOW_CNTL ; +core_writel (priv, reg, offset); }
drivers/net/ethernet/smsc/epic100.c +2 -2
@@ -1513,14 +1513,14 @@ static void epic_remove_one(struct pci_dev *pdev)struct net_device *dev =pci_get_drvdata (pdev);struct epic_private *ep =netdev_priv (dev); +unregister_netdev (dev);dma_free_coherent (&pdev->dev,TX_TOTAL_SIZE , ep->tx_ring, ep->tx_ring_dma);dma_free_coherent (&pdev->dev,RX_TOTAL_SIZE , ep->rx_ring, ep->rx_ring_dma); -unregister_netdev (dev);pci_iounmap (pdev, ep->ioaddr); -pci_release_regions (pdev);free_netdev (dev); +pci_release_regions (pdev);pci_disable_device (pdev);/* pci_power_off(pdev, -1); */ }
drivers/net/phy/dp83822.c +1 -3
@@ -243,9 +243,7 @@ static int dp83822_config_intr(struct phy_device *phydev)if (misr_status <0 )return misr_status; - misr_status |= (DP83822_RX_ERR_HF_INT_EN | -DP83822_FALSE_CARRIER_HF_INT_EN | -DP83822_LINK_STAT_INT_EN | + misr_status |= (DP83822_LINK_STAT_INT_EN |DP83822_ENERGY_DET_INT_EN |DP83822_LINK_QUAL_INT_EN );
drivers/net/tun.c +13 -2
@@ -279,6 +279,12 @@ static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile, } } +static void tun_napi_enable (struct tun_file *tfile) +{ +if (tfile->napi_enabled) +napi_enable (&tfile->napi); +} +static void tun_napi_disable (struct tun_file *tfile) {if (tfile->napi_enabled)
@@ -640,7 +646,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean) tun =rtnl_dereference (tfile->tun);if (tun && clean) { -tun_napi_disable (tfile); +if (!tfile->detached) +tun_napi_disable (tfile);tun_napi_del (tfile); }
@@ -659,8 +666,10 @@ static void __tun_detach(struct tun_file *tfile, bool clean)if (clean) {RCU_INIT_POINTER (tfile->tun,NULL );sock_put (&tfile->sk); - }else + }else {tun_disable_queue (tun, tfile); +tun_napi_disable (tfile); + }synchronize_net ();tun_flow_delete_by_queue (tun, tun->numqueues +1 );
@@ -733,6 +742,7 @@ static void tun_detach_all(struct net_device *dev)sock_put (&tfile->sk); }list_for_each_entry_safe (tfile, tmp, &tun->disabled, next) { +tun_napi_del (tfile);tun_enable_queue (tfile);tun_queue_purge (tfile);xdp_rxq_info_unreg (&tfile->xdp_rxq);
@@ -813,6 +823,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file,if (tfile->detached) {tun_enable_queue (tfile); +tun_napi_enable (tfile); }else {sock_hold (&tfile->sk);tun_napi_init (tun, tfile, napi, napi_frags);
drivers/net/usb/ax88179_178a.c +76 -25
133 lines not on this page · raw message
drivers/net/usb/qmi_wwan.c +2 -0
@@ -1293,6 +1293,8 @@ static const struct usb_device_id products[] = { {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
drivers/net/usb/usbnet.c +2 -2
@@ -1969,7 +1969,7 @@ static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (size) { - buf =kmalloc (size,GFP_KERNEL ); + buf =kmalloc (size,GFP_NOIO );if (!buf) goto out; }
@@ -2001,7 +2001,7 @@ static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, cmd, reqtype, value, index, size);if (data) { - buf =kmemdup (data, size,GFP_KERNEL ); + buf =kmemdup (data, size,GFP_NOIO );if (!buf) goto out; }else {
drivers/net/virtio_net.c +7 -1
@@ -3171,14 +3171,20 @@ static int virtnet_probe(struct virtio_device *vdev) } } - err =register_netdev (dev); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ +rtnl_lock (); + + err =register_netdevice (dev);if (err) {pr_debug ("virtio_net: registering device failed\n" ); +rtnl_unlock (); goto free_failover; }virtio_device_ready (vdev); +rtnl_unlock (); + err =virtnet_cpu_notif_add (vi);if (err) {pr_debug ("virtio_net: registering cpu notifier failed\n" );
drivers/net/xen-netfront.c +52 -4
106 lines not on this page · raw message
drivers/nfc/nfcmrvl/i2c.c +3 -3
@@ -186,9 +186,9 @@ static int nfcmrvl_i2c_parse_dt(struct device_node *node, pdata->irq_polarity =IRQF_TRIGGER_RISING ; ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nfcmrvl/spi.c +3 -3
@@ -129,9 +129,9 @@ static int nfcmrvl_spi_parse_dt(struct device_node *node, } ret =irq_of_parse_and_map (node,0 ); -if (ret <0 ) { -pr_err ("Unable to get irq, error: %d\n" , ret); -return ret; +if (!ret) { +pr_err ("Unable to get irq\n" ); +return -EINVAL ; } pdata->irq = ret;
drivers/nfc/nxp-nci/i2c.c +3 -0
@@ -162,6 +162,9 @@ static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy *phy,skb_put_data (*skb, (void *)&header,NCI_CTRL_HDR_SIZE ); +if (!header.plen) +return 0 ; + r =i2c_master_recv (client,skb_put (*skb, header.plen), header.plen);if (r != header.plen) { nfc_err(&client->dev,
drivers/nvdimm/bus.c +2 -2
@@ -187,8 +187,8 @@ static int nvdimm_clear_badblocks_region(struct device *dev, void *data) ndr_end = nd_region->ndr_start + nd_region->ndr_size -1 ;/* make sure we are in the region */ -if (ctx->phys < nd_region->ndr_start - || (ctx->phys + ctx->cleared) > ndr_end) +if (ctx->phys < nd_region->ndr_start || + (ctx->phys + ctx->cleared -1 ) > ndr_end)return 0 ; sector = (ctx->phys - nd_region->ndr_start) /512 ;
drivers/nvme/host/pci.c +2 -1
@@ -3245,7 +3245,8 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_DEVICE(0x1d1d, 0x2601), /* CNEX Granby */ .driver_data = NVME_QUIRK_LIGHTNVM, }, { PCI_DEVICE(0x10ec, 0x5762), /* ADATA SX6000LNP */ - .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, }, + .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN | + NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1cc1, 0x8201), /* ADATA SX8200PNP 512GB */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS | NVME_QUIRK_IGNORE_DEV_SUBNQN, },
drivers/xen/gntdev-common.h +7 -0
@@ -16,6 +16,7 @@#include <linux/mmu_notifier.h> #include <linux/types.h> #include <xen/interface/event_channel.h> +#include <xen/grant_table.h> struct gntdev_dmabuf_priv ;
@@ -56,6 +57,7 @@ struct gntdev_grant_map {struct gnttab_unmap_grant_ref *unmap_ops;struct gnttab_map_grant_ref *kmap_ops;struct gnttab_unmap_grant_ref *kunmap_ops; +bool *being_removed;struct page **pages;unsigned long pages_vm_start;
@@ -73,6 +75,11 @@ struct gntdev_grant_map {/* Needed to avoid allocation in gnttab_dma_free_pages(). */ xen_pfn_t *frames;#endif + +/* Number of live grants */ +atomic_t live_grants; +/* Needed to avoid allocation in __unmap_grant_pages */ +struct gntab_unmap_queue_data unmap_data; }; struct gntdev_grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count,
drivers/xen/gntdev.c +99 -41
258 lines not on this page · raw message
fs/io_uring.c +4 -0
@@ -4366,6 +4366,8 @@ static int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)if (unlikely (req->ctx->flags &IORING_SETUP_IOPOLL ))return -EINVAL ; +if (unlikely (sqe->addr2 || sqe->splice_fd_in || sqe->ioprio)) +return -EINVAL ; sr->msg_flags =READ_ONCE (sqe->msg_flags); sr->umsg =u64_to_user_ptr (READ_ONCE (sqe->addr));
@@ -4601,6 +4603,8 @@ static int io_recvmsg_prep(struct io_kiocb *req,if (unlikely (req->ctx->flags &IORING_SETUP_IOPOLL ))return -EINVAL ; +if (unlikely (sqe->addr2 || sqe->splice_fd_in || sqe->ioprio)) +return -EINVAL ; sr->msg_flags =READ_ONCE (sqe->msg_flags); sr->umsg =u64_to_user_ptr (READ_ONCE (sqe->addr));
fs/iomap/buffered-io.c +0 -7
@@ -1460,13 +1460,6 @@ iomap_do_writepage(struct page *page, struct writeback_control *wbc, void *data) PF_MEMALLOC)) goto redirty; -/* -* Given that we do not allow direct reclaim to call us, we should -* never be called in a recursive filesystem reclaim context. -*/ -if (WARN_ON_ONCE (current->flags &PF_MEMALLOC_NOFS )) - goto redirty; -/* * Is this page beyond the end of the file? *
fs/nfsd/vfs.c +2 -1
@@ -1156,6 +1156,7 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, nfsd_net_id)); err2 =filemap_check_wb_err (nf->nf_file->f_mapping, since); + err =nfserrno (err2);break ;case -EINVAL : err = nfserr_notsupp;
@@ -1163,8 +1164,8 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,default :nfsd_reset_boot_verifier (net_generic (nf->nf_net, nfsd_net_id)); + err =nfserrno (err2); } - err =nfserrno (err2); }else nfsd_copy_boot_verifier (verf,net_generic (nf->nf_net, nfsd_net_id));
fs/xfs/libxfs/xfs_btree.c +10 -2
@@ -2811,7 +2811,7 @@ xfs_btree_split_worker(struct xfs_btree_split_args *args =container_of (work, struct xfs_btree_split_args, work);unsigned long pflags; -unsigned long new_pflags =PF_MEMALLOC_NOFS ; +unsigned long new_pflags =0 ;/* * we are in a transaction context here, but may also be doing work
@@ -2823,12 +2823,20 @@ xfs_btree_split_worker( new_pflags |=PF_MEMALLOC |PF_SWAPWRITE |PF_KSWAPD ;current_set_flags_nested (&pflags, new_pflags); +xfs_trans_set_context (args->cur->bc_tp); args->result =__xfs_btree_split (args->cur, args->level, args->ptrp, args->key, args->curp, args->stat); -complete (args->done); +xfs_trans_clear_context (args->cur->bc_tp);current_restore_flags_nested (&pflags, new_pflags); + +/* +* Do not access args after complete() has run here. We don't own args +* and the owner may run and free args before we return here. +*/ +complete (args->done); + }/*
fs/xfs/libxfs/xfs_sb.c +13 -3
@@ -956,9 +956,19 @@ xfs_log_sb(struct xfs_mount *mp = tp->t_mountp;struct xfs_buf *bp =xfs_trans_getsb (tp); - mp->m_sb.sb_icount =percpu_counter_sum (&mp->m_icount); - mp->m_sb.sb_ifree =percpu_counter_sum (&mp->m_ifree); - mp->m_sb.sb_fdblocks =percpu_counter_sum (&mp->m_fdblocks); +/* +* Lazy sb counters don't update the in-core superblock so do that now. +* If this is at unmount, the counters will be exactly correct, but at +* any other time they will only be ballpark correct because of +* reservations that have been taken out percpu counters. If we have an +* unclean shutdown, this will be corrected by log recovery rebuilding +* the counters from the AGF block counts. +*/ +if (xfs_sb_version_haslazysbcount (&mp->m_sb)) { + mp->m_sb.sb_icount =percpu_counter_sum (&mp->m_icount); + mp->m_sb.sb_ifree =percpu_counter_sum (&mp->m_ifree); + mp->m_sb.sb_fdblocks =percpu_counter_sum (&mp->m_fdblocks); + }xfs_sb_to_disk (bp->b_addr, &mp->m_sb);xfs_trans_buf_set_type (tp, bp,XFS_BLFT_SB_BUF );
fs/xfs/xfs_aops.c +15 -2
@@ -62,7 +62,7 @@ xfs_setfilesize_trans_alloc(* We hand off the transaction to the completion thread now, so * clear the flag here. */ -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); +xfs_trans_clear_context (tp);return 0 ; }
@@ -125,7 +125,7 @@ xfs_setfilesize_ioend(* thus we need to mark ourselves as being in a transaction manually. * Similarly for freeze protection. */ -current_set_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); +xfs_trans_set_context (tp);__sb_writers_acquired (VFS_I (ip)->i_sb,SB_FREEZE_FS );/* we abort the update if there was an IO error */
@@ -577,6 +577,12 @@ xfs_vm_writepage( {struct xfs_writepage_ctx wpc = { }; +if (WARN_ON_ONCE (current->journal_info)) { +redirty_page_for_writepage (wbc, page); +unlock_page (page); +return 0 ; + } +return iomap_writepage (page, wbc, &wpc.ctx, &xfs_writeback_ops); }
@@ -587,6 +593,13 @@ xfs_vm_writepages( {struct xfs_writepage_ctx wpc = { }; +/* +* Writing back data in a transaction context can result in recursive +* transactions. This is bad, so issue a warning and get out of here. +*/ +if (WARN_ON_ONCE (current->journal_info)) +return 0 ; +xfs_iflags_clear (XFS_I (mapping->host),XFS_ITRUNCATED );return iomap_writepages (mapping, wbc, &wpc.ctx, &xfs_writeback_ops); }
fs/xfs/xfs_error.c +2 -0
@@ -293,6 +293,8 @@ xfs_errortag_add(struct xfs_mount *mp, unsigned int error_tag) { + BUILD_BUG_ON(ARRAY_SIZE(xfs_errortag_random_default) != XFS_ERRTAG_MAX); +if (error_tag >=XFS_ERRTAG_MAX )return -EINVAL ;
fs/xfs/xfs_reflink.c +2 -1
@@ -1503,7 +1503,8 @@ xfs_reflink_unshare(if (error) goto out; - error =filemap_write_and_wait_range (inode->i_mapping, offset, len); + error =filemap_write_and_wait_range (inode->i_mapping, offset, + offset + len -1 );if (error) goto out;
fs/xfs/xfs_super.c +68 -52
230 lines not on this page · raw message
fs/xfs/xfs_trans.c +8 -15
@@ -68,6 +68,7 @@ xfs_trans_free(xfs_extent_busy_clear (tp->t_mountp, &tp->t_busy, false);trace_xfs_trans_free (tp, _RET_IP_); +xfs_trans_clear_context (tp);if (!(tp->t_flags &XFS_TRANS_NO_WRITECOUNT ))sb_end_intwrite (tp->t_mountp->m_super);xfs_trans_free_dqinfo (tp);
@@ -119,7 +120,8 @@ xfs_trans_dup( ntp->t_rtx_res = tp->t_rtx_res - tp->t_rtx_res_used; tp->t_rtx_res = tp->t_rtx_res_used; - ntp->t_pflags = tp->t_pflags; + +xfs_trans_switch_context (tp, ntp);/* move deferred ops over to the new tp */ xfs_defer_move (ntp, tp);
@@ -153,9 +155,6 @@ xfs_trans_reserve(int error =0 ;bool rsvd = (tp->t_flags &XFS_TRANS_RESERVE ) !=0 ; -/* Mark this thread as being in a transaction */ -current_set_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); -/* * Attempt to reserve the needed disk blocks by decrementing * the number needed from the number available. This will
@@ -163,10 +162,8 @@ xfs_trans_reserve(*/ if (blocks >0 ) { error =xfs_mod_fdblocks (mp, -((int64_t )blocks), rsvd); -if (error !=0 ) { -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); +if (error !=0 )return -ENOSPC ; - } tp->t_blk_res += blocks; }
@@ -240,9 +237,6 @@ xfs_trans_reserve(xfs_mod_fdblocks (mp, (int64_t )blocks, rsvd); tp->t_blk_res =0 ; } - -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); -return error; }
@@ -266,6 +260,7 @@ xfs_trans_alloc( tp =kmem_cache_zalloc (xfs_trans_zone,GFP_KERNEL | __GFP_NOFAIL);if (!(flags &XFS_TRANS_NO_WRITECOUNT ))sb_start_intwrite (mp->m_super); +xfs_trans_set_context (tp);/* * Zero-reservation ("empty") transactions can't modify anything, so
@@ -620,6 +615,9 @@ xfs_trans_unreserve_and_mod_sb(/* apply remaining deltas */ spin_lock (&mp->m_sb_lock); + mp->m_sb.sb_fdblocks += tp->t_fdblocks_delta + tp->t_res_fdblocks_delta; + mp->m_sb.sb_icount += idelta; + mp->m_sb.sb_ifree += ifreedelta; mp->m_sb.sb_frextents += rtxdelta; mp->m_sb.sb_dblocks += tp->t_dblocks_delta; mp->m_sb.sb_agcount += tp->t_agcount_delta;
@@ -878,7 +876,6 @@ __xfs_trans_commit(xfs_log_commit_cil (mp, tp, &commit_lsn, regrant); -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS );xfs_trans_free (tp);/*
@@ -910,7 +907,6 @@ __xfs_trans_commit(xfs_log_ticket_ungrant (mp->m_log, tp->t_ticket); tp->t_ticket =NULL ; } -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS );xfs_trans_free_items (tp, !!error);xfs_trans_free (tp);
@@ -970,9 +966,6 @@ xfs_trans_cancel( tp->t_ticket =NULL ; } -/* mark this thread as no longer being in a transaction */ -current_restore_flags_nested (&tp->t_pflags,PF_MEMALLOC_NOFS ); -xfs_trans_free_items (tp, dirty);xfs_trans_free (tp); }
fs/xfs/xfs_trans.h +30 -0
@@ -268,4 +268,34 @@ xfs_trans_item_relog( return lip->li_ops->iop_relog(lip, tp); } +static inline void +xfs_trans_set_context ( +struct xfs_trans *tp) +{ +ASSERT (current->journal_info ==NULL ); + tp->t_pflags =memalloc_nofs_save (); + current->journal_info = tp; +} + +static inline void +xfs_trans_clear_context ( +struct xfs_trans *tp) +{ +if (current->journal_info == tp) { +memalloc_nofs_restore (tp->t_pflags); + current->journal_info =NULL ; + } +} + +static inline void +xfs_trans_switch_context ( +struct xfs_trans *old_tp, +struct xfs_trans *new_tp) +{ +ASSERT (current->journal_info == old_tp); + new_tp->t_pflags = old_tp->t_pflags; + old_tp->t_pflags =0 ; + current->journal_info = new_tp; +} +#endif /* __XFS_TRANS_H__ */
include/linux/dim.h +1 -1
@@ -21,7 +21,7 @@* We consider 10% difference as significant. */ #define IS_SIGNIFICANT_DIFF (val, ref) \ - (((100UL * abs((val) - (ref))) / (ref)) > 10) + ((ref) && (((100UL * abs((val) - (ref))) / (ref)) > 10))/* * Calculate the gap between two values.
net/ipv4/ip_tunnel_core.c +1 -1
@@ -410,7 +410,7 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,u32 mtu =dst_mtu (encap_dst) - headroom;if ((skb_is_gso (skb) &&skb_gso_validate_network_len (skb, mtu)) || - (!skb_is_gso (skb) && (skb->len -skb_mac_header_len (skb)) <= mtu)) + (!skb_is_gso (skb) && (skb->len -skb_network_offset (skb)) <= mtu))return 0 ;skb_dst_update_pmtu_no_confirm (skb, mtu);
net/ipv4/tcp_ipv4.c +3 -1
@@ -1980,7 +1980,8 @@ int tcp_v4_rcv(struct sk_buff *skb)struct sock *nsk; sk = req->rsk_listener; -if (unlikely (tcp_v4_inbound_md5_hash (sk, skb, dif, sdif))) { +if (unlikely (!xfrm4_policy_check (sk,XFRM_POLICY_IN , skb) || +tcp_v4_inbound_md5_hash (sk, skb, dif, sdif))) {sk_drops_add (sk, skb);reqsk_put (req); goto discard_it;
@@ -2019,6 +2020,7 @@ int tcp_v4_rcv(struct sk_buff *skb) } goto discard_and_relse; } +nf_reset_ct (skb);if (nsk == sk) {reqsk_put (req);tcp_v4_restore_cb (skb);
net/ipv6/addrconf.c +0 -4
@@ -1102,10 +1102,6 @@ ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, goto out; } -if (net->ipv6.devconf_all->disable_policy || - idev->cnf.disable_policy) - f6i->dst_nopolicy = true; -neigh_parms_data_state_setall (idev->nd_parms); ifa->addr = *cfg->pfx;
net/ipv6/route.c +8 -1
@@ -4479,8 +4479,15 @@ struct fib6_info *addrconf_f6i_alloc(struct net *net, } f6i =ip6_route_info_create (&cfg, gfp_flags,NULL ); -if (!IS_ERR (f6i)) +if (!IS_ERR (f6i)) { f6i->dst_nocount = true; + +if (!anycast && + (net->ipv6.devconf_all->disable_policy || + idev->cnf.disable_policy)) + f6i->dst_nopolicy = true; + } +return f6i; }
net/ipv6/seg6_hmac.c +0 -1
@@ -409,7 +409,6 @@ int __net_init seg6_hmac_net_init(struct net *net)return 0 ; } -EXPORT_SYMBOL (seg6_hmac_net_init);void seg6_hmac_exit (void ) {
net/ipv6/sit.c +4 -6
@@ -321,9 +321,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr) kcalloc(cmax, sizeof(*kp), GFP_KERNEL | __GFP_NOWARN) : NULL; -rcu_read_lock (); - - ca = t->prl_count < cmax ? t->prl_count : cmax; + ca =min (t->prl_count, cmax);if (!kp) {/* We don't try hard to allocate much memory for
@@ -338,7 +336,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr) } } - c =0 ; +rcu_read_lock ();for_each_prl_rcu (t->prl) {if (c >= cmax)break ;
@@ -350,7 +348,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr)if (kprl.addr !=htonl (INADDR_ANY ))break ; } -out: +rcu_read_unlock (); len =sizeof (*kp) * c;
@@ -359,7 +357,7 @@ static int ipip6_tunnel_get_prl(struct net_device *dev, struct ifreq *ifr) ret = -EFAULT ;kfree (kp); - +out:return ret; }
net/netfilter/nft_set_hash.c +2 -0
@@ -142,6 +142,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key,/* Another cpu may race to insert the element with the same key */ if (prev) {nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); he = prev; }
@@ -151,6 +152,7 @@ static bool nft_rhash_update(struct nft_set *set, const u32 *key, err2:nft_set_elem_destroy (set, he, true); +atomic_dec (&set->nelems); err1:return false; }
net/rose/rose_timer.c +19 -15
@@ -31,89 +31,89 @@ static void rose_idletimer_expiry(struct timer_list *);void rose_start_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); sk->sk_timer.function = rose_heartbeat_expiry; sk->sk_timer.expires = jiffies +5 *HZ ; -add_timer (&sk->sk_timer); +sk_reset_timer (sk, &sk->sk_timer, sk->sk_timer.expires); }void rose_start_t1timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t1; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t2timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t2; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_t3timer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->t3; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_hbtimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->timer); +sk_stop_timer (sk, &rose->timer); rose->timer.function = rose_timer_expiry; rose->timer.expires = jiffies + rose->hb; -add_timer (&rose->timer); +sk_reset_timer (sk, &rose->timer, rose->timer.expires); }void rose_start_idletimer (struct sock *sk) {struct rose_sock *rose =rose_sk (sk); -del_timer (&rose->idletimer); +sk_stop_timer (sk, &rose->idletimer);if (rose->idle >0 ) { rose->idletimer.function = rose_idletimer_expiry; rose->idletimer.expires = jiffies + rose->idle; -add_timer (&rose->idletimer); +sk_reset_timer (sk, &rose->idletimer, rose->idletimer.expires); } }void rose_stop_heartbeat (struct sock *sk) { -del_timer (&sk->sk_timer); +sk_stop_timer (sk, &sk->sk_timer); }void rose_stop_timer (struct sock *sk) { -del_timer (&rose_sk (sk)->timer); +sk_stop_timer (sk, &rose_sk (sk)->timer); }void rose_stop_idletimer (struct sock *sk) { -del_timer (&rose_sk (sk)->idletimer); +sk_stop_timer (sk, &rose_sk (sk)->idletimer); }static void rose_heartbeat_expiry (struct timer_list *t)
@@ -130,6 +130,7 @@ static void rose_heartbeat_expiry(struct timer_list *t) (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {bh_unlock_sock (sk);rose_destroy_socket (sk); +sock_put (sk);return ; }break ;
@@ -152,6 +153,7 @@ static void rose_heartbeat_expiry(struct timer_list *t)rose_start_heartbeat (sk);bh_unlock_sock (sk); +sock_put (sk); }static void rose_timer_expiry (struct timer_list *t)
@@ -181,6 +183,7 @@ static void rose_timer_expiry(struct timer_list *t)break ; }bh_unlock_sock (sk); +sock_put (sk); }static void rose_idletimer_expiry (struct timer_list *t)
@@ -205,4 +208,5 @@ static void rose_idletimer_expiry(struct timer_list *t)sock_set_flag (sk,SOCK_DEAD ); }bh_unlock_sock (sk); +sock_put (sk); }
net/sched/act_api.c +14 -8
@@ -302,7 +302,8 @@ static int tcf_idr_release_unsafe(struct tc_action *p) }static int tcf_del_walker (struct tcf_idrinfo *idrinfo,struct sk_buff *skb, -const struct tc_action_ops *ops) +const struct tc_action_ops *ops, +struct netlink_ext_ack *extack) {struct nlattr *nest;int n_i =0 ;
@@ -318,20 +319,25 @@ static int tcf_del_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,if (nla_put_string (skb,TCA_KIND , ops->kind)) goto nla_put_failure; + ret =0 ;mutex_lock (&idrinfo->lock);idr_for_each_entry_ul (idr, p, tmp, id) {if (IS_ERR (p))continue ; ret =tcf_idr_release_unsafe (p); -if (ret ==ACT_P_DELETED ) { +if (ret ==ACT_P_DELETED )module_put (ops->owner); - n_i++; - }else if (ret <0 ) { -mutex_unlock (&idrinfo->lock); - goto nla_put_failure; - } +else if (ret <0 ) +break ; + n_i++; }mutex_unlock (&idrinfo->lock); +if (ret <0 ) { +if (n_i) +NL_SET_ERR_MSG (extack,"Unable to flush all TC actions" ); +else + goto nla_put_failure; + } ret =nla_put_u32 (skb,TCA_FCNT , n_i);if (ret)
@@ -352,7 +358,7 @@ int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,struct tcf_idrinfo *idrinfo = tn->idrinfo;if (type ==RTM_DELACTION ) { -return tcf_del_walker (idrinfo, skb, ops); +return tcf_del_walker (idrinfo, skb, ops, extack); }else if (type ==RTM_GETACTION ) {return tcf_dump_walker (idrinfo, skb, cb); }else {
net/sunrpc/xdr.c +1 -1
@@ -752,7 +752,7 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,*/ xdr->p = (void *)p + frag2bytes; space_left = xdr->buf->buflen - xdr->buf->len; -if (space_left - nbytes >=PAGE_SIZE ) +if (space_left - frag1bytes >=PAGE_SIZE ) xdr->end = (void *)p +PAGE_SIZE ;else xdr->end = (void *)p + space_left - frag1bytes;
net/tipc/node.c +22 -19
72 lines not on this page · raw message
tools/testing/selftests/net/udpgso_bench.sh +1 -1
@@ -120,7 +120,7 @@ run_all() { run_udp "${ipv4_args}" echo "ipv6" - run_tcp "${ipv4_args}" + run_tcp "${ipv6_args}" run_udp "${ipv6_args}" }
tools/testing/selftests/rseq/Makefile +1 -1
@@ -6,7 +6,7 @@ endif CFLAGS += -O2 -Wall -g -I./ -I../../../../usr/include/ -L$(OUTPUT) -Wl,-rpath=./ \ $(CLANG_FLAGS) -LDLIBS += -lpthread +LDLIBS += -lpthread -ldl # Own dependencies because we only want to build against 1st prerequisite, but # still track changes to header files and depend on shared object.
tools/testing/selftests/rseq/basic_percpu_ops_test.c +2 -3
@@ -9,10 +9,9 @@#include <string.h> #include <stddef.h> +#include "../kselftest.h" #include "rseq.h" -#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct percpu_lock_entry {intptr_t v; } __attribute__((aligned (128 )));
@@ -168,7 +167,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret, cpu; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/compiler.h new file +30 -0
@@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ +/* +* rseq/compiler.h +* +* Work-around asm goto compiler bugs. +* +* (C) Copyright 2021 - Mathieu Desnoyers <[email protected]> +*/ + +#ifndef RSEQ_COMPILER_H +#define RSEQ_COMPILER_H + +/* +* gcc prior to 4.8.2 miscompiles asm goto. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 +* +* gcc prior to 8.1.0 miscompiles asm goto at O1. +* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103908 +* +* clang prior to version 13.0.1 miscompiles asm goto at O2. +* https://github.com/llvm/llvm-project/issues/52735 +* +* Work around these issues by adding a volatile inline asm with +* memory clobber in the fallthrough after the asm goto and at each +* label target. Emit this for all compilers in case other similar +* issues are found in the future. +*/ +#define rseq_after_asm_goto () asm volatile ("" : : : "memory") + +#endif /* RSEQ_COMPILER_H_ */
tools/testing/selftests/rseq/param_test.c +3 -5
@@ -161,7 +161,7 @@ unsigned int yield_mod_cnt, nr_abort;" cbnz " INJECT_ASM_REG ", 222b\n" \ "333:\n" -#elif __PPC__ +#elif defined(__PPC__)#define RSEQ_INJECT_INPUT \ , [loop_cnt_1]"m"(loop_cnt[1]) \
@@ -368,9 +368,7 @@ void *test_percpu_spinlock_thread(void *arg)abort (); reps = thread_data->reps;for (i =0 ; i < reps; i++) { -int cpu =rseq_cpu_start (); - - cpu =rseq_this_cpu_lock (&data->lock); +int cpu =rseq_this_cpu_lock (&data->lock); data->c[cpu].count++;rseq_percpu_unlock (&data->lock, cpu);#ifndef BENCHMARK
@@ -551,7 +549,7 @@ struct percpu_list_node *this_cpu_list_pop(struct percpu_list *list,for (;;) {struct percpu_list_node *head;intptr_t *targetptr, expectnot, *load; -off_t offset; +long offset;int ret; cpu =rseq_cpu_start ();
tools/testing/selftests/rseq/rseq-abi.h new file +151 -0
151 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm.h +56 -54
340 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-arm64.h +56 -23
173 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-generic-thread-pointer.h new file +25 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-mips.h +17 -54
71 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-ppc-thread-pointer.h new file +30 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-ppc.h +84 -44
128 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-s390.h +42 -13
55 lines not on this page · raw message
tools/testing/selftests/rseq/rseq-skip.h +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-thread-pointer.h new file +19 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86-thread-pointer.h new file +40 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/rseq/rseq-x86.h +136 -64
200 lines not on this page · raw message
tools/testing/selftests/rseq/rseq.c +79 -86
165 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.