Linux 6.1.112
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.112 kernel.
All users of the 6.1 kernel series must upgrade.
The updated 6.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.1.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/loongarch/include/asm/hw_irq.h | 2 arch/loongarch/kernel/irq.c | 3 arch/microblaze/mm/init.c | 5 arch/x86/kernel/cpu/mshyperv.c | 1 arch/x86/mm/init.c | 16 block/blk-core.c | 10 block/blk-mq.c | 10 drivers/gpio/gpiolib-cdev.c | 12 drivers/gpio/gpiolib.c | 3 drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 10 drivers/hwmon/asus-ec-sensors.c | 2 drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 42 +- drivers/net/can/spi/mcp251xfd/mcp251xfd-dump.c | 2 drivers/net/can/spi/mcp251xfd/mcp251xfd-regmap.c | 2 drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c | 14 drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c | 2 drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c | 7 drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 1 drivers/net/ethernet/faraday/ftgmac100.c | 26 + drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 2 drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 9 drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 2 drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 23 - drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c | 3 drivers/pinctrl/pinctrl-at91.c | 5 drivers/powercap/intel_rapl_msr.c | 12 drivers/scsi/lpfc/lpfc_bsg.c | 2 drivers/spi/spi-bcm63xx.c | 1 drivers/spi/spidev.c | 2 drivers/usb/class/usbtmc.c | 2 drivers/usb/serial/pl2303.c | 1 drivers/usb/serial/pl2303.h | 4 fs/btrfs/block-rsv.c | 14 fs/btrfs/block-rsv.h | 12 fs/btrfs/delayed-ref.h | 21 + fs/ocfs2/xattr.c | 27 + fs/smb/client/connect.c | 14 fs/xfs/libxfs/xfs_ag.c | 19 - fs/xfs/libxfs/xfs_alloc.c | 69 +++ fs/xfs/libxfs/xfs_bmap.c | 16 fs/xfs/libxfs/xfs_bmap.h | 2 fs/xfs/libxfs/xfs_bmap_btree.c | 19 - fs/xfs/libxfs/xfs_btree.c | 18 - fs/xfs/libxfs/xfs_fs.h | 2 fs/xfs/libxfs/xfs_ialloc.c | 17 fs/xfs/libxfs/xfs_log_format.h | 9 fs/xfs/libxfs/xfs_sb.c | 56 +++ fs/xfs/libxfs/xfs_trans_inode.c | 113 ------ fs/xfs/xfs_attr_inactive.c | 1 fs/xfs/xfs_bmap_util.c | 18 - fs/xfs/xfs_buf_item.c | 88 +++-- fs/xfs/xfs_dquot.c | 1 fs/xfs/xfs_export.c | 14 fs/xfs/xfs_extent_busy.c | 1 fs/xfs/xfs_fsmap.c | 1 fs/xfs/xfs_fsops.c | 13 fs/xfs/xfs_icache.c | 58 ++- fs/xfs/xfs_icache.h | 4 fs/xfs/xfs_inode.c | 260 +++++++++++++-- fs/xfs/xfs_inode.h | 36 +- fs/xfs/xfs_inode_item.c | 149 ++++++++ fs/xfs/xfs_inode_item.h | 1 fs/xfs/xfs_itable.c | 11 fs/xfs/xfs_log.c | 47 -- fs/xfs/xfs_log_recover.c | 19 - fs/xfs/xfs_mount.h | 11 fs/xfs/xfs_notify_failure.c | 15 fs/xfs/xfs_qm.c | 72 +++- fs/xfs/xfs_super.c | 1 fs/xfs/xfs_trace.h | 46 ++ fs/xfs/xfs_trans.c | 9 include/net/netfilter/nf_tables.h | 13 net/mac80211/tx.c | 4 net/netfilter/nf_tables_api.c | 5 net/netfilter/nft_lookup.c | 1 net/netfilter/nft_set_pipapo.c | 6 net/netfilter/nft_socket.c | 41 ++ net/wireless/core.h | 8 sound/pci/hda/patch_realtek.c | 76 ++-- sound/soc/amd/acp/acp-sof-mach.c | 2 sound/soc/au1x/db1200.c | 1 sound/soc/codecs/tda7419.c | 1 sound/soc/intel/common/soc-acpi-intel-cht-match.c | 1 sound/soc/intel/keembay/kmb_platform.c | 1 sound/soc/sof/mediatek/mt8195/mt8195.c | 3 tools/hv/Makefile | 2 tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 89 files changed, 1254 insertions(+), 461 deletions(-)
Albert Jakieła (1):
ASoC: SOF: mediatek: Add missing board compatible
Benjamin Berg (1):
wifi: iwlwifi: lower message level for FW buffer destination
Dan Carpenter (1):
netfilter: nft_socket: Fix a NULL vs IS_ERR() bug in nft_socket_cgroup_subtree_level()
Daniel Gabay (1):
wifi: iwlwifi: mvm: fix iwl_mvm_scan_fits() calculation
Darrick J. Wong (8):
xfs: fix uninitialized variable access
xfs: load uncached unlinked inodes into memory on demand
xfs: fix negative array access in xfs_getbmap
xfs: use i_prev_unlinked to distinguish inodes that are not on the unlinked list
xfs: reload entire unlinked bucket lists
xfs: make inode unlinked bucket recovery work with quotacheck
xfs: fix reloading entire unlinked bucket lists
xfs: set bnobt/cntbt numrecs correctly when formatting new AGs
Dave Chinner (13):
xfs: dquot shrinker doesn't check for XFS_DQFLAG_FREEING
xfs: don't use BMBT btree split workers for IO completion
xfs: fix low space alloc deadlock
xfs: prefer free inodes at ENOSPC over chunk allocation
xfs: block reservation too large for minleft allocation
xfs: quotacheck failure can race with background inode inactivation
xfs: buffer pins need to hold a buffer reference
xfs: defered work could create precommits
xfs: fix AGF vs inode cluster buffer deadlock
xfs: collect errors from inodegc for unlinked inode recovery
xfs: remove WARN when dquot cache insertion fails
xfs: fix unlink vs cluster buffer instantiation race
xfs: journal geometry is not properly bounds checked
Dmitry Antipov (1):
wifi: mac80211: free skb on error path in ieee80211_beacon_get_ap()
Edward Adam Davis (1):
USB: usbtmc: prevent kernel-usb-infoleak
Emmanuel Grumbach (3):
wifi: iwlwifi: mvm: pause TCM when the firmware is stopped
wifi: iwlwifi: mvm: don't wait for tx queues if firmware is dead
wifi: iwlwifi: clear trans->state earlier upon error
Fabio Estevam (1):
spi: spidev: Add an entry for elgin,jg10309-01
Ferry Meng (2):
ocfs2: add bounds checking to ocfs2_xattr_find_entry()
ocfs2: strict bound check before memcmp in ocfs2_xattr_find_entry()
Filipe Manana (1):
btrfs: calculate the right space for delayed refs when updating global reserve
Florian Westphal (1):
netfilter: nft_socket: make cgroupsv2 matching work with namespaces
Geert Uytterhoeven (1):
spi: spidev: Add missing spi_device_id for jg10309-01
Greg Kroah-Hartman (1):
Linux 6.1.112
Hagar Hemdan (1):
gpio: prevent potential speculation leaks in gpio_device_get_desc()
Hans de Goede (1):
ASoC: Intel: soc-acpi-cht: Make Lenovo Yoga Tab 3 X90F DMI match less strict
Hongbo Li (2):
ASoC: allow module autoloading for table db1200_pids
ASoC: allow module autoloading for table board_ids
Hongyu Jin (1):
block: Fix where bio IO priority gets set
Huacai Chen (1):
LoongArch: Define ARCH_IRQ_INIT_FLAGS as IRQ_NOPROBE
Jacky Chou (1):
net: ftgmac100: Ensure tx descriptor updates are visible
Junhao Xie (1):
USB: serial: pl2303: add device id for Macrosilicon MS3020
Kailang Yang (2):
ALSA: hda/realtek - Fixed ALC256 headphone no sound
ALSA: hda/realtek - FIxed ALC285 headphone no sound
Kent Gibson (1):
gpiolib: cdev: Ignore reconfiguration without direction
Liao Chen (3):
ASoC: intel: fix module autoloading
ASoC: tda7419: fix module autoloading
spi: bcm63xx: Enable module autoloading
Long Li (1):
xfs: fix ag count overflow during growfs
Marc Kleine-Budde (3):
can: mcp251xfd: mcp251xfd_ring_init(): check TX-coalescing configuration
can: mcp251xfd: properly indent labels
can: mcp251xfd: move mcp251xfd_timestamp_start()/stop() into mcp251xfd_chip_start/stop()
Matthieu Baerts (NGI0) (1):
selftests: mptcp: join: restrict fullmesh endp on 1st sf
Michael Kelley (1):
x86/hyperv: Set X86_FEATURE_TSC_KNOWN_FREQ when Hyper-V provides frequency
Mike Rapoport (1):
microblaze: don't treat zero reserved memory regions as error
Pablo Neira Ayuso (2):
netfilter: nft_set_pipapo: walk over current view on netlink dump
netfilter: nf_tables: missing iterator type in lookup walk
Paulo Alcantara (1):
smb: client: fix hang in wait_for_response() for negproto
Ping-Ke Shih (1):
Revert "wifi: cfg80211: check wiphy mutex is held for wdev mutex"
Ross Brown (1):
hwmon: (asus-ec-sensors) remove VRM temp X570-E GAMING
Sherry Yang (1):
scsi: lpfc: Fix overflow build issue
Shiyang Ruan (2):
xfs: fix the calculation for "end" and "length"
xfs: correct calculation for agend and blockcount
Sumeet Pawnikar (1):
powercap: RAPL: fix invalid initialization for pl4_supported field
Thomas Blocher (1):
pinctrl: at91: make it work with current gpiolib
Tony Luck (1):
x86/mm: Switch to new Intel CPU model defines
Wengang Wang (1):
xfs: fix extent busy updating
Wu Guanghao (1):
xfs: Fix deadlock on xfs_inodegc_worker
Ye Bin (1):
xfs: fix BUG_ON in xfs_getbmap()
hongchi.peng (1):
drm: komeda: Fix an issue related to normalized zpos
zhang jiao (1):
tools: hv: rm .*.cmd when make clean
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 111 +SUBLEVEL = 112 EXTRAVERSION = NAME = Curry Ramen
arch/loongarch/include/asm/hw_irq.h +2 -0
@@ -9,6 +9,8 @@extern atomic_t irq_err_count; +#define ARCH_IRQ_INIT_FLAGS IRQ_NOPROBE +/* * interrupt-retrigger: NOP for now. This may not be appropriate for all * machines, we'll see ...
arch/loongarch/kernel/irq.c +0 -3
@@ -122,9 +122,6 @@ void __init init_IRQ(void)panic ("IPI IRQ request failed\n" );#endif -for (i =0 ; i <NR_IRQS ; i++) -irq_set_noprobe (i); -for_each_possible_cpu (i) { page =alloc_pages_node (cpu_to_node (i),GFP_KERNEL , order);
arch/microblaze/mm/init.c +0 -5
@@ -193,11 +193,6 @@ asmlinkage void __init mmu_init(void) {unsigned int kstart, ksize; -if (!memblock.reserved.cnt) { -pr_emerg ("Error memory count\n" ); -machine_restart (NULL ); - } -if ((u32 ) memblock.memory.regions[0 ].size <0x400000 ) {pr_emerg ("Memory must be greater than 4MB\n" );machine_restart (NULL );
arch/x86/kernel/cpu/mshyperv.c +1 -0
@@ -324,6 +324,7 @@ static void __init ms_hyperv_init_platform(void) ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) { x86_platform.calibrate_tsc = hv_get_tsc_khz; x86_platform.calibrate_cpu = hv_get_tsc_khz; +setup_force_cpu_cap (X86_FEATURE_TSC_KNOWN_FREQ ); }if (ms_hyperv.priv_high &HV_ISOLATION ) {
arch/x86/mm/init.c +6 -10
@@ -262,21 +262,17 @@ static void __init probe_page_size_mask(void) } } -#define INTEL_MATCH (_model) { .vendor = X86_VENDOR_INTEL, \ - .family = 6, \ - .model = _model, \ - }/* * INVLPG may not properly flush Global entries * on these CPUs when PCIDs are enabled. */ static const struct x86_cpu_id invlpg_miss_ids[] = { -INTEL_MATCH (INTEL_FAM6_ALDERLAKE ), -INTEL_MATCH (INTEL_FAM6_ALDERLAKE_L ), -INTEL_MATCH (INTEL_FAM6_ALDERLAKE_N ), -INTEL_MATCH (INTEL_FAM6_RAPTORLAKE ), -INTEL_MATCH (INTEL_FAM6_RAPTORLAKE_P ), -INTEL_MATCH (INTEL_FAM6_RAPTORLAKE_S ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE ,0 ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE_L ,0 ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE_N ,0 ), +X86_MATCH_INTEL_FAM6_MODEL (RAPTORLAKE ,0 ), +X86_MATCH_INTEL_FAM6_MODEL (RAPTORLAKE_P ,0 ), +X86_MATCH_INTEL_FAM6_MODEL (RAPTORLAKE_S ,0 ), {} };
block/blk-core.c +10 -0
@@ -49,6 +49,7 @@#include "blk-pm.h" #include "blk-cgroup.h" #include "blk-throttle.h" +#include "blk-ioprio.h" struct dentry *blk_debugfs_root;
@@ -799,6 +800,14 @@ void submit_bio_noacct(struct bio *bio) }EXPORT_SYMBOL (submit_bio_noacct); +static void bio_set_ioprio (struct bio *bio) +{ +/* Nobody set ioprio so far? Initialize it based on task's nice value */ +if (IOPRIO_PRIO_CLASS (bio->bi_ioprio) ==IOPRIO_CLASS_NONE ) + bio->bi_ioprio =get_current_ioprio (); +blkcg_set_ioprio (bio); +} +/** * submit_bio - submit a bio to the block device layer for I/O * @bio: The &struct bio which describes the I/O
@@ -824,6 +833,7 @@ void submit_bio(struct bio *bio)count_vm_events (PGPGOUT ,bio_sectors (bio)); } +bio_set_ioprio (bio);submit_bio_noacct (bio); }EXPORT_SYMBOL (submit_bio);
block/blk-mq.c +0 -10
@@ -42,7 +42,6 @@#include "blk-stat.h" #include "blk-mq-sched.h" #include "blk-rq-qos.h" -#include "blk-ioprio.h" static DEFINE_PER_CPU(struct llist_head, blk_cpu_done);
@@ -2949,14 +2948,6 @@ static bool blk_mq_can_use_cached_rq(struct request *rq, struct blk_plug *plug,return true; } -static void bio_set_ioprio (struct bio *bio) -{ -/* Nobody set ioprio so far? Initialize it based on task's nice value */ -if (IOPRIO_PRIO_CLASS (bio->bi_ioprio) ==IOPRIO_CLASS_NONE ) - bio->bi_ioprio =get_current_ioprio (); -blkcg_set_ioprio (bio); -} -/** * blk_mq_submit_bio - Create and send a request to block device. * @bio: Bio pointer.
@@ -2980,7 +2971,6 @@ void blk_mq_submit_bio(struct bio *bio)blk_status_t ret; bio =blk_queue_bounce (bio, q); -bio_set_ioprio (bio);if (plug) { rq =rq_list_peek (&plug->cached_rq);
drivers/gpio/gpiolib-cdev.c +7 -5
@@ -1523,12 +1523,14 @@ static long linereq_set_config_unlocked(struct linereq *lr, line = &lr->lines[i]; desc = lr->lines[i].desc; flags =gpio_v2_line_config_flags (lc, i); -gpio_v2_line_config_flags_to_desc_flags (flags, &desc->flags); - edflags = flags &GPIO_V2_LINE_EDGE_DETECTOR_FLAGS ;/* -* Lines have to be requested explicitly for input -* or output, else the line will be treated "as is". +* Lines not explicitly reconfigured as input or output +* are left unchanged. */ +if (!(flags &GPIO_V2_LINE_DIRECTION_FLAGS )) +continue ; +gpio_v2_line_config_flags_to_desc_flags (flags, &desc->flags); + edflags = flags &GPIO_V2_LINE_EDGE_DETECTOR_FLAGS ;if (flags &GPIO_V2_LINE_FLAG_OUTPUT ) {int val =gpio_v2_line_config_output_value (lc, i);
@@ -1536,7 +1538,7 @@ static long linereq_set_config_unlocked(struct linereq *lr, ret =gpiod_direction_output (desc, val);if (ret)return ret; - }else if (flags &GPIO_V2_LINE_FLAG_INPUT ) { + }else { ret =gpiod_direction_input (desc);if (ret)return ret;
drivers/gpio/gpiolib.c +2 -1
@@ -5,6 +5,7 @@#include <linux/module.h> #include <linux/interrupt.h> #include <linux/irq.h> +#include <linux/nospec.h> #include <linux/spinlock.h> #include <linux/list.h> #include <linux/device.h>
@@ -146,7 +147,7 @@ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc,if (hwnum >= gdev->ngpio)return ERR_PTR (-EINVAL ); -return &gdev->descs[hwnum]; +return &gdev->descs[array_index_nospec (hwnum, gdev->ngpio)]; }EXPORT_SYMBOL_GPL (gpiochip_get_desc);
drivers/gpu/drm/arm/display/komeda/komeda_kms.c +7 -3
@@ -163,6 +163,7 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc,struct drm_plane *plane;struct list_head zorder_list;int order =0 , err; +u32 slave_zpos =0 ;DRM_DEBUG_ATOMIC ("[CRTC:%d:%s] calculating normalized zpos values\n" , crtc->base.id, crtc->name);
@@ -202,10 +203,13 @@ static int komeda_crtc_normalize_zpos(struct drm_crtc *crtc, plane_st->zpos, plane_st->normalized_zpos);/* calculate max slave zorder */ -if (has_bit (drm_plane_index (plane), kcrtc->slave_planes)) +if (has_bit (drm_plane_index (plane), kcrtc->slave_planes)) { + slave_zpos = plane_st->normalized_zpos; +if (to_kplane_st (plane_st)->layer_split) + slave_zpos++; kcrtc_st->max_slave_zorder = -max (plane_st->normalized_zpos, - kcrtc_st->max_slave_zorder); +max (slave_zpos, kcrtc_st->max_slave_zorder); + } } crtc_st->zpos_changed = true;
drivers/hwmon/asus-ec-sensors.c +1 -1
@@ -369,7 +369,7 @@ static const struct ec_board_info board_info_strix_b550_i_gaming = {static const struct ec_board_info board_info_strix_x570_e_gaming = { .sensors =SENSOR_SET_TEMP_CHIPSET_CPU_MB | -SENSOR_TEMP_T_SENSOR |SENSOR_TEMP_VRM | +SENSOR_TEMP_T_SENSOR |SENSOR_FAN_CHIPSET |SENSOR_CURR_CPU |SENSOR_IN_CPU_CORE , .mutex_path =ASUS_HW_ACCESS_MUTEX_ASMX ,
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +22 -20
119 lines not on this page · raw message
drivers/net/can/spi/mcp251xfd/mcp251xfd-dump.c +1 -1
@@ -94,7 +94,7 @@ static void mcp251xfd_dump_registers(const struct mcp251xfd_priv *priv,kfree (buf); } - out: +out:mcp251xfd_dump_header (iter,MCP251XFD_DUMP_OBJECT_TYPE_REG , reg); }
drivers/net/can/spi/mcp251xfd/mcp251xfd-regmap.c +1 -1
@@ -397,7 +397,7 @@ mcp251xfd_regmap_crc_read(void *context,return err; } - out: +out:memcpy (val_buf, buf_rx->data, val_len);return 0 ;
drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c +11 -3
@@ -280,7 +280,7 @@ int mcp251xfd_ring_init(struct mcp251xfd_priv *priv)const struct mcp251xfd_rx_ring *rx_ring;u16 base =0 , ram_used;u8 fifo_nr =1 ; -int i; +int err =0 , i;netdev_reset_queue (priv->ndev);
@@ -376,10 +376,18 @@ int mcp251xfd_ring_init(struct mcp251xfd_priv *priv)netdev_err (priv->ndev,"Error during ring configuration, using more RAM (%u bytes) than available (%u bytes).\n" , ram_used,MCP251XFD_RAM_SIZE ); -return -ENOMEM ; + err = -ENOMEM ; } -return 0 ; +if (priv->tx_obj_num_coalesce_irq && + priv->tx_obj_num_coalesce_irq *2 != priv->tx->obj_num) { +netdev_err (priv->ndev, +"Error during ring configuration, number of TEF coalescing buffers (%u) must be half of TEF buffers (%u).\n" , + priv->tx_obj_num_coalesce_irq, priv->tx->obj_num); + err = -EINVAL ; + } + +return err; }void mcp251xfd_ring_free (struct mcp251xfd_priv *priv)
drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c +1 -1
@@ -219,7 +219,7 @@ int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv) total_frame_len += frame_len; } - out_netif_wake_queue: +out_netif_wake_queue: len = i;/* number of handled goods TEFs */ if (len) {struct mcp251xfd_tef_ring *ring = priv->tef;
drivers/net/can/spi/mcp251xfd/mcp251xfd-timestamp.c +5 -2
@@ -48,9 +48,12 @@ void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv) cc->shift =1 ; cc->mult =clocksource_hz2mult (priv->can.clock.freq, cc->shift); -timecounter_init (&priv->tc, &priv->cc,ktime_get_real_ns ()); -INIT_DELAYED_WORK (&priv->timestamp, mcp251xfd_timestamp_work); +} + +void mcp251xfd_timestamp_start (struct mcp251xfd_priv *priv) +{ +timecounter_init (&priv->tc, &priv->cc,ktime_get_real_ns ());schedule_delayed_work (&priv->timestamp,MCP251XFD_TIMESTAMP_WORK_DELAY_SEC *HZ ); }
drivers/net/can/spi/mcp251xfd/mcp251xfd.h +1 -0
@@ -939,6 +939,7 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv);int mcp251xfd_handle_rxif (struct mcp251xfd_priv *priv);int mcp251xfd_handle_tefif (struct mcp251xfd_priv *priv);void mcp251xfd_timestamp_init (struct mcp251xfd_priv *priv); +void mcp251xfd_timestamp_start (struct mcp251xfd_priv *priv);void mcp251xfd_timestamp_stop (struct mcp251xfd_priv *priv);void mcp251xfd_tx_obj_write_sync (struct work_struct *work);
drivers/net/ethernet/faraday/ftgmac100.c +18 -8
@@ -566,7 +566,7 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed) (*processed)++;return true; - drop: +drop:/* Clean rxdes0 (which resets own bit) */ rxdes->rxdes0 =cpu_to_le32 (status & priv->rxdes0_edorr_mask); priv->rx_pointer =ftgmac100_next_rx_pointer (priv, pointer);
@@ -650,6 +650,11 @@ static bool ftgmac100_tx_complete_packet(struct ftgmac100 *priv)ftgmac100_free_tx_packet (priv, pointer, skb, txdes, ctl_stat); txdes->txdes0 =cpu_to_le32 (ctl_stat & priv->txdes0_edotr_mask); +/* Ensure the descriptor config is visible before setting the tx +* pointer. +*/ +smp_wmb (); + priv->tx_clean_pointer =ftgmac100_next_tx_pointer (priv, pointer);return true;
@@ -803,6 +808,11 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,dma_wmb (); first->txdes0 =cpu_to_le32 (f_ctl_stat); +/* Ensure the descriptor config is visible before setting the tx +* pointer. +*/ +smp_wmb (); +/* Update next TX pointer */ priv->tx_pointer = pointer;
@@ -823,7 +833,7 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,return NETDEV_TX_OK ; - dma_err: +dma_err:if (net_ratelimit ())netdev_err (netdev,"map tx fragment failed\n" );
@@ -845,7 +855,7 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,* last fragment, so we know ftgmac100_free_tx_packet() * hasn't freed the skb yet. */ - drop: +drop:/* Drop the packet */ dev_kfree_skb_any (skb); netdev->stats.tx_dropped++;
@@ -1338,7 +1348,7 @@ static void ftgmac100_reset(struct ftgmac100 *priv)ftgmac100_init_all (priv, true);netdev_dbg (netdev,"Reset done !\n" ); - bail: +bail:if (priv->mii_bus)mutex_unlock (&priv->mii_bus->mdio_lock);if (netdev->phydev)
@@ -1537,15 +1547,15 @@ static int ftgmac100_open(struct net_device *netdev)return 0 ; - err_ncsi: +err_ncsi:napi_disable (&priv->napi);netif_stop_queue (netdev); - err_alloc: +err_alloc:ftgmac100_free_buffers (priv);free_irq (netdev->irq, netdev); - err_irq: +err_irq:netif_napi_del (&priv->napi); - err_hw: +err_hw:iowrite32 (0 , priv->base +FTGMAC100_OFFSET_IER );ftgmac100_free_rings (priv);return err;
drivers/net/wireless/intel/iwlwifi/fw/dbg.c +1 -1
@@ -3131,7 +3131,7 @@ void iwl_fw_dbg_stop_restart_recording(struct iwl_fw_runtime *fwrt, {int ret__maybe_unused =0 ; -if (test_bit (STATUS_FW_ERROR , &fwrt->trans->status)) +if (!iwl_trans_fw_running (fwrt->trans))return ; if (fw_has_capa(&fwrt->fw->ucode_capa,
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +1 -1
@@ -1472,8 +1472,8 @@ static inline void iwl_trans_fw_error(struct iwl_trans *trans, bool sync)/* prevent double restarts due to the same erroneous FW */ if (!test_and_set_bit (STATUS_FW_ERROR , &trans->status)) { -iwl_op_mode_nic_error (trans->op_mode, sync); trans->state =IWL_TRANS_NO_FW ; +iwl_op_mode_nic_error (trans->op_mode, sync); } }
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +8 -1
@@ -4800,6 +4800,10 @@ static void iwl_mvm_flush_no_vif(struct iwl_mvm *mvm, u32 queues, bool drop)int i;if (!iwl_mvm_has_new_tx_api (mvm)) { +/* we can't ask the firmware anything if it is dead */ +if (test_bit (IWL_MVM_STATUS_HW_RESTART_REQUESTED , + &mvm->status)) +return ;if (drop) {mutex_lock (&mvm->mutex); iwl_mvm_flush_tx_path(mvm,
@@ -4881,8 +4885,11 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,/* this can take a while, and we may need/want other operations * to succeed while doing this, so do it without the mutex held +* If the firmware is dead, this can't work... */ -if (!drop && !iwl_mvm_has_new_tx_api (mvm)) +if (!drop && !iwl_mvm_has_new_tx_api (mvm) && + !test_bit (IWL_MVM_STATUS_HW_RESTART_REQUESTED , + &mvm->status))iwl_trans_wait_tx_queues_empty (mvm->trans, msk); }
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +2 -0
@@ -1366,6 +1366,8 @@ void iwl_mvm_stop_device(struct iwl_mvm *mvm)clear_bit (IWL_MVM_STATUS_FIRMWARE_RUNNING , &mvm->status); +iwl_mvm_pause_tcm (mvm, false); +iwl_fw_dbg_stop_sync (&mvm->fwrt);iwl_trans_stop_device (mvm->trans);iwl_free_fw_paging (&mvm->fwrt);
drivers/net/wireless/intel/iwlwifi/mvm/scan.c +12 -11
@@ -824,8 +824,8 @@ static inline bool iwl_mvm_scan_fits(struct iwl_mvm *mvm, int n_ssids,return ((n_ssids <=PROBE_OPTION_MAX ) && (n_channels <= mvm->fw->ucode_capa.n_scan_channels) & (ies->common_ie_len + - ies->len[NL80211_BAND_2GHZ ] + - ies->len[NL80211_BAND_5GHZ ] <= + ies->len[NL80211_BAND_2GHZ ] + ies->len[NL80211_BAND_5GHZ ] + + ies->len[NL80211_BAND_6GHZ ] <=iwl_mvm_max_scan_ie_fw_cmd_room (mvm))); }
@@ -2935,18 +2935,16 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm, params.n_channels = j; } -if (non_psc_included && - !iwl_mvm_scan_fits (mvm, req->n_ssids, ies, params.n_channels)) { -kfree (params.channels); -return -ENOBUFS ; +if (!iwl_mvm_scan_fits (mvm, req->n_ssids, ies, params.n_channels)) { + ret = -ENOBUFS ; + goto out; } uid =iwl_mvm_build_scan_cmd (mvm, vif, &hcmd, ¶ms, type); - -if (non_psc_included) -kfree (params.channels); -if (uid <0 ) -return uid; +if (uid <0 ) { + ret = uid; + goto out; + } ret =iwl_mvm_send_cmd (mvm, &hcmd);if (!ret) {
@@ -2963,6 +2961,9 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm, mvm->sched_scan_pass_all =SCHED_SCAN_PASS_ALL_DISABLED ; } +out: +if (non_psc_included) +kfree (params.channels);return ret; }
drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +2 -1
@@ -68,7 +68,8 @@ iwl_pcie_ctxt_info_dbg_enable(struct iwl_trans *trans, }break ;default : -IWL_ERR (trans,"WRT: Invalid buffer destination\n" ); +IWL_DEBUG_FW (trans,"WRT: Invalid buffer destination (%d)\n" , +le32_to_cpu (fw_mon_cfg->buf_location)); } out:if (dbg_flags)
drivers/pinctrl/pinctrl-at91.c +4 -1
@@ -1420,8 +1420,11 @@ static int at91_pinctrl_probe(struct platform_device *pdev)/* We will handle a range of GPIO pins */ for (i =0 ; i < gpio_banks; i++) -if (gpio_chips[i]) +if (gpio_chips[i]) {pinctrl_add_gpio_range (info->pctl, &gpio_chips[i]->range); +gpiochip_add_pin_range (&gpio_chips[i]->chip,dev_name (info->pctl->dev),0 , + gpio_chips[i]->range.pin_base, gpio_chips[i]->range.npins); + }dev_info (&pdev->dev,"initialized AT91 pinctrl driver\n" );
drivers/powercap/intel_rapl_msr.c +6 -6
@@ -136,12 +136,12 @@ static int rapl_msr_write_raw(int cpu, struct reg_action *ra)/* List of verified CPUs. */ static const struct x86_cpu_id pl4_support_ids[] = { - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_TIGERLAKE_L ,X86_FEATURE_ANY }, - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_ALDERLAKE ,X86_FEATURE_ANY }, - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_ALDERLAKE_L ,X86_FEATURE_ANY }, - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_ALDERLAKE_N ,X86_FEATURE_ANY }, - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_RAPTORLAKE ,X86_FEATURE_ANY }, - {X86_VENDOR_INTEL ,6 ,INTEL_FAM6_RAPTORLAKE_P ,X86_FEATURE_ANY }, +X86_MATCH_INTEL_FAM6_MODEL (TIGERLAKE_L ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE_L ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (ALDERLAKE_N ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (RAPTORLAKE ,NULL ), +X86_MATCH_INTEL_FAM6_MODEL (RAPTORLAKE_P ,NULL ), {} };
drivers/scsi/lpfc/lpfc_bsg.c +1 -1
@@ -5409,7 +5409,7 @@ lpfc_get_cgnbuf_info(struct bsg_job *job)struct get_cgnbuf_info_req *cgnbuf_req;struct lpfc_cgn_info *cp;uint8_t *cgn_buff; -int size, cinfosz; +size_t size, cinfosz;int rc =0 ; if (job->request_len < sizeof(struct fc_bsg_request) +
drivers/spi/spi-bcm63xx.c +1 -0
@@ -482,6 +482,7 @@ static const struct of_device_id bcm63xx_spi_of_match[] = { { .compatible = "brcm,bcm6358-spi", .data = &bcm6358_spi_reg_offsets }, { }, }; +MODULE_DEVICE_TABLE (of, bcm63xx_spi_of_match);static int bcm63xx_spi_probe (struct platform_device *pdev) {
drivers/spi/spidev.c +2 -0
@@ -694,6 +694,7 @@ static struct class *spidev_class;static const struct spi_device_id spidev_spi_ids[] = { { .name ="bh2228fv" }, { .name ="dh2228fv" }, + { .name ="jg10309-01" }, { .name ="ltc2488" }, { .name ="sx1301" }, { .name ="bk4" },
@@ -722,6 +723,7 @@ static int spidev_of_check(struct device *dev)static const struct of_device_id spidev_dt_ids[] = { { .compatible ="cisco,spi-petra" , .data = &spidev_of_check }, { .compatible ="dh,dhcom-board" , .data = &spidev_of_check }, + { .compatible ="elgin,jg10309-01" , .data = &spidev_of_check }, { .compatible ="lineartechnology,ltc2488" , .data = &spidev_of_check }, { .compatible ="lwn,bk4" , .data = &spidev_of_check }, { .compatible ="menlo,m53cpld" , .data = &spidev_of_check },
drivers/usb/class/usbtmc.c +1 -1
@@ -754,7 +754,7 @@ static struct urb *usbtmc_create_urb(void)if (!urb)return NULL ; - dmabuf =kmalloc (bufsize,GFP_KERNEL ); + dmabuf =kzalloc (bufsize,GFP_KERNEL );if (!dmabuf) {usb_free_urb (urb);return NULL ;
drivers/usb/serial/pl2303.c +1 -0
@@ -118,6 +118,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) }, { USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_PRODUCT_ID) }, + { USB_DEVICE(MACROSILICON_VENDOR_ID, MACROSILICON_MS3020_PRODUCT_ID) }, { } /* Terminating entry */ };
drivers/usb/serial/pl2303.h +4 -0
@@ -171,3 +171,7 @@/* Allied Telesis VT-Kit3 */ #define AT_VENDOR_ID 0x0caa#define AT_VTKIT3_PRODUCT_ID 0x3001 + +/* Macrosilicon MS3020 */ +#define MACROSILICON_VENDOR_ID 0x345f +#define MACROSILICON_MS3020_PRODUCT_ID 0x3020
fs/btrfs/block-rsv.c +8 -6
@@ -384,17 +384,19 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info)/* * But we also want to reserve enough space so we can do the fallback -* global reserve for an unlink, which is an additional 5 items (see the -* comment in __unlink_start_trans for what we're modifying.) +* global reserve for an unlink, which is an additional +* BTRFS_UNLINK_METADATA_UNITS items. * * But we also need space for the delayed ref updates from the unlink, -* so its 10, 5 for the actual operation, and 5 for the delayed ref -* updates. +* so add BTRFS_UNLINK_METADATA_UNITS units for delayed refs, one for +* each unlink metadata item. */ - min_items +=10 ; + min_items +=BTRFS_UNLINK_METADATA_UNITS ; num_bytes =max_t (u64, num_bytes, -btrfs_calc_insert_metadata_size (fs_info, min_items)); +btrfs_calc_insert_metadata_size (fs_info, min_items) + +btrfs_calc_delayed_ref_bytes (fs_info, +BTRFS_UNLINK_METADATA_UNITS ));spin_lock (&sinfo->lock);spin_lock (&block_rsv->lock);
fs/btrfs/block-rsv.h +12 -0
@@ -50,6 +50,18 @@ struct btrfs_block_rsv {u64 qgroup_rsv_reserved; }; +/* +* Number of metadata items necessary for an unlink operation: +* +* 1 for the possible orphan item +* 1 for the dir item +* 1 for the dir index +* 1 for the inode ref +* 1 for the inode +* 1 for the parent inode +*/ +#define BTRFS_UNLINK_METADATA_UNITS 6 +void btrfs_init_block_rsv (struct btrfs_block_rsv *rsv,enum btrfs_rsv_type type);void btrfs_init_root_block_rsv (struct btrfs_root *root); struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
fs/btrfs/delayed-ref.h +21 -0
@@ -253,6 +253,27 @@ extern struct kmem_cache *btrfs_delayed_extent_op_cachep;int __init btrfs_delayed_ref_init (void );void __cold btrfs_delayed_ref_exit (void ); +static inline u64 btrfs_calc_delayed_ref_bytes (struct btrfs_fs_info *fs_info, +int num_delayed_refs) +{ +u64 num_bytes; + + num_bytes =btrfs_calc_insert_metadata_size (fs_info, num_delayed_refs); + +/* +* We have to check the mount option here because we could be enabling +* the free space tree for the first time and don't have the compat_ro +* option set yet. +* +* We need extra reservations if we have the free space tree because +* we'll have to modify that tree as well. +*/ +if (btrfs_test_opt (fs_info,FREE_SPACE_TREE )) + num_bytes *=2 ; + +return num_bytes; +} +static inline void btrfs_init_generic_ref (struct btrfs_ref *generic_ref,int action,u64 bytenr,u64 len,u64 parent) {
fs/ocfs2/xattr.c +18 -9
@@ -1066,13 +1066,13 @@ ssize_t ocfs2_listxattr(struct dentry *dentry,return i_ret + b_ret; } -static int ocfs2_xattr_find_entry (int name_index, +static int ocfs2_xattr_find_entry (struct inode *inode,int name_index,const char *name,struct ocfs2_xattr_search *xs) {struct ocfs2_xattr_entry *entry;size_t name_len; -int i, cmp =1 ; +int i, name_offset, cmp =1 ;if (name ==NULL )return -EINVAL ;
@@ -1080,13 +1080,22 @@ static int ocfs2_xattr_find_entry(int name_index, name_len =strlen (name); entry = xs->here;for (i =0 ; i <le16_to_cpu (xs->header->xh_count); i++) { +if ((void *)entry >= xs->end) { +ocfs2_error (inode->i_sb,"corrupted xattr entries" ); +return -EFSCORRUPTED ; + } cmp = name_index -ocfs2_xattr_get_type (entry);if (!cmp) cmp = name_len - entry->xe_name_len; -if (!cmp) - cmp =memcmp (name, (xs->base + -le16_to_cpu (entry->xe_name_offset)), - name_len); +if (!cmp) { + name_offset =le16_to_cpu (entry->xe_name_offset); +if ((xs->base + name_offset + name_len) > xs->end) { +ocfs2_error (inode->i_sb, +"corrupted xattr entries" ); +return -EFSCORRUPTED ; + } + cmp =memcmp (name, (xs->base + name_offset), name_len); + }if (cmp ==0 )break ; entry +=1 ;
@@ -1170,7 +1179,7 @@ static int ocfs2_xattr_ibody_get(struct inode *inode, xs->base = (void *)xs->header; xs->here = xs->header->xh_entries; - ret =ocfs2_xattr_find_entry (name_index, name, xs); + ret =ocfs2_xattr_find_entry (inode, name_index, name, xs);if (ret)return ret; size =le64_to_cpu (xs->here->xe_value_size);
@@ -2702,7 +2711,7 @@ static int ocfs2_xattr_ibody_find(struct inode *inode,/* Find the named attribute. */ if (oi->ip_dyn_features &OCFS2_INLINE_XATTR_FL ) { - ret =ocfs2_xattr_find_entry (name_index, name, xs); + ret =ocfs2_xattr_find_entry (inode, name_index, name, xs);if (ret && ret != -ENODATA )return ret; xs->not_found = ret;
@@ -2837,7 +2846,7 @@ static int ocfs2_xattr_block_find(struct inode *inode, xs->end = (void *)(blk_bh->b_data) + blk_bh->b_size; xs->here = xs->header->xh_entries; - ret =ocfs2_xattr_find_entry (name_index, name, xs); + ret =ocfs2_xattr_find_entry (inode, name_index, name, xs); }else ret = ocfs2_xattr_index_block_find(inode, blk_bh, name_index,
fs/smb/client/connect.c +13 -1
@@ -673,6 +673,19 @@ allocate_buffers(struct TCP_Server_Info *server)static bool server_unresponsive (struct TCP_Server_Info *server) { +/* +* If we're in the process of mounting a share or reconnecting a session +* and the server abruptly shut down (e.g. socket wasn't closed, packet +* had been ACK'ed but no SMB response), don't wait longer than 20s to +* negotiate protocol. +*/ +spin_lock (&server->srv_lock); +if (server->tcpStatus == CifsInNegotiate && +time_after (jiffies, server->lstrp +20 *HZ )) { +spin_unlock (&server->srv_lock); +cifs_reconnect (server, false); +return true; + }/* * We need to wait 3 echo intervals to make sure we handle such * situations right:
@@ -684,7 +697,6 @@ server_unresponsive(struct TCP_Server_Info *server)* 65s kernel_recvmsg times out, and we see that we haven't gotten * a response in >60s. */ -spin_lock (&server->srv_lock); if ((server->tcpStatus == CifsGood || server->tcpStatus == CifsNeedNegotiate) && (!server->ops->can_echo || server->ops->can_echo(server)) &&
fs/xfs/libxfs/xfs_ag.c +9 -10
@@ -415,10 +415,12 @@ xfs_freesp_init_recs(ASSERT (start >= mp->m_ag_prealloc_blocks);if (start != mp->m_ag_prealloc_blocks) {/* -* Modify first record to pad stripe align of log +* Modify first record to pad stripe align of log and +* bump the record count. */ arec->ar_blockcount =cpu_to_be32 (start - mp->m_ag_prealloc_blocks); +be16_add_cpu (&block->bb_numrecs,1 ); nrec = arec +1 ;/*
@@ -429,7 +431,6 @@ xfs_freesp_init_recs(be32_to_cpu (arec->ar_startblock) + be32_to_cpu(arec->ar_blockcount)); arec = nrec; -be16_add_cpu (&block->bb_numrecs,1 ); }/* * Change record start to after the internal log
@@ -438,15 +439,13 @@ xfs_freesp_init_recs( }/* -* Calculate the record block count and check for the case where -* the log might have consumed all available space in the AG. If -* so, reset the record count to 0 to avoid exposure of an invalid -* record start block. +* Calculate the block count of this record; if it is nonzero, +* increment the record count. */ arec->ar_blockcount =cpu_to_be32 (id->agsize -be32_to_cpu (arec->ar_startblock)); -if (!arec->ar_blockcount) - block->bb_numrecs =0 ; +if (arec->ar_blockcount) +be16_add_cpu (&block->bb_numrecs,1 ); }/*
@@ -458,7 +457,7 @@ xfs_bnoroot_init(struct xfs_buf *bp, struct aghdr_init_data *id) { - xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 1, id->agno); + xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 0, id->agno);xfs_freesp_init_recs (mp, bp, id); }
@@ -468,7 +467,7 @@ xfs_cntroot_init(struct xfs_buf *bp, struct aghdr_init_data *id) { - xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 1, id->agno); + xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 0, id->agno);xfs_freesp_init_recs (mp, bp, id); }
fs/xfs/libxfs/xfs_alloc.c +57 -12
133 lines not on this page · raw message
fs/xfs/libxfs/xfs_bmap.c +1 -15
@@ -3413,21 +3413,7 @@ xfs_bmap_process_allocated_extent( xfs_fileoff_t orig_offset, xfs_extlen_t orig_length) { - int nullfb; - - nullfb = ap->tp->t_firstblock ==NULLFSBLOCK ; - -/* -* check the allocation happened at the same or higher AG than -* the first block that was allocated. -*/ -ASSERT (nullfb || -XFS_FSB_TO_AGNO (args->mp, ap->tp->t_firstblock) <= -XFS_FSB_TO_AGNO (args->mp, args->fsbno)); - ap->blkno = args->fsbno; -if (nullfb) - ap->tp->t_firstblock = args->fsbno; ap->length = args->len;/* * If the extent size hint is active, we tried to round the
@@ -4256,7 +4242,7 @@ xfs_bmapi_convert_unwritten(return 0 ; } -static inline xfs_extlen_t +xfs_extlen_t xfs_bmapi_minleft( struct xfs_trans *tp, struct xfs_inode *ip,
fs/xfs/libxfs/xfs_bmap.h +2 -0
@@ -220,6 +220,8 @@ int xfs_bmap_add_extent_unwritten_real(struct xfs_trans *tp, struct xfs_inode *ip, int whichfork, struct xfs_iext_cursor *icur, struct xfs_btree_cur **curp, struct xfs_bmbt_irec *new, int *logflagsp); +xfs_extlen_t xfs_bmapi_minleft (struct xfs_trans *tp,struct xfs_inode *ip, +int fork);enum xfs_bmap_intent_type {XFS_BMAP_MAP =1 ,
fs/xfs/libxfs/xfs_bmap_btree.c +9 -10
@@ -213,18 +213,16 @@ xfs_bmbt_alloc_block(if (args.fsbno ==NULLFSBLOCK ) { args.fsbno =be64_to_cpu (start->l); args.type =XFS_ALLOCTYPE_START_BNO ; +/* -* Make sure there is sufficient room left in the AG to -* complete a full tree split for an extent insert. If -* we are converting the middle part of an extent then -* we may need space for two tree splits. -* -* We are relying on the caller to make the correct block -* reservation for this operation to succeed. If the -* reservation amount is insufficient then we may fail a -* block allocation here and corrupt the filesystem. +* If we are coming here from something like unwritten extent +* conversion, there has been no data extent allocation already +* done, so we have to ensure that we attempt to locate the +* entire set of bmbt allocations in the same AG, as +* xfs_bmapi_write() would have reserved. */ - args.minleft = args.tp->t_blk_res; + args.minleft =xfs_bmapi_minleft (cur->bc_tp, cur->bc_ino.ip, + cur->bc_ino.whichfork); }else if (cur->bc_tp->t_flags &XFS_TRANS_LOWMODE ) { args.type =XFS_ALLOCTYPE_START_BNO ; }else {
@@ -248,6 +246,7 @@ xfs_bmbt_alloc_block(* successful activate the lowspace algorithm. */ args.fsbno =0 ; + args.minleft =0 ; args.type =XFS_ALLOCTYPE_FIRST_AG ; error =xfs_alloc_vextent (&args);if (error)
fs/xfs/libxfs/xfs_btree.c +16 -2
@@ -2913,9 +2913,22 @@ xfs_btree_split_worker( }/* -* BMBT split requests often come in with little stack to work on. Push +* BMBT split requests often come in with little stack to work on so we push * them off to a worker thread so there is lots of stack to use. For the other * btree types, just call directly to avoid the context switch overhead here. +* +* Care must be taken here - the work queue rescuer thread introduces potential +* AGF <> worker queue deadlocks if the BMBT block allocation has to lock new +* AGFs to allocate blocks. A task being run by the rescuer could attempt to +* lock an AGF that is already locked by a task queued to run by the rescuer, +* resulting in an ABBA deadlock as the rescuer cannot run the lock holder to +* release it until the current thread it is running gains the lock. +* +* To avoid this issue, we only ever queue BMBT splits that don't have an AGF +* already locked to allocate from. The only place that doesn't hold an AGF +* locked is unwritten extent conversion at IO completion, but that has already +* been offloaded to a worker thread and hence has no stack consumption issues +* we have to worry about. */ STATIC int /* error */ xfs_btree_split(
@@ -2929,7 +2942,8 @@ xfs_btree_split(struct xfs_btree_split_args args;DECLARE_COMPLETION_ONSTACK (done); -if (cur->bc_btnum !=XFS_BTNUM_BMAP ) +if (cur->bc_btnum !=XFS_BTNUM_BMAP || + cur->bc_tp->t_firstblock ==NULLFSBLOCK )return __xfs_btree_split (cur, level, ptrp, key, curp, stat); args.cur = cur;
fs/xfs/libxfs/xfs_fs.h +2 -0
@@ -257,6 +257,8 @@ typedef struct xfs_fsop_resblks {#define XFS_MAX_AG_BLOCKS (XFS_MAX_AG_BYTES / XFS_MIN_BLOCKSIZE)#define XFS_MAX_CRC_AG_BLOCKS (XFS_MAX_AG_BYTES / XFS_MIN_CRC_BLOCKSIZE) +#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) +/* keep the maximum size under 2^31 by a small amount */ #define XFS_MAX_LOG_BYTES \ ((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES)
fs/xfs/libxfs/xfs_ialloc.c +17 -0
@@ -1737,6 +1737,7 @@ xfs_dialloc(struct xfs_perag *pag;struct xfs_ino_geometry *igeo =M_IGEO (mp);bool ok_alloc = true; +bool low_space = false;int flags;xfs_ino_t ino;
@@ -1767,6 +1768,20 @@ xfs_dialloc( ok_alloc = false; } +/* +* If we are near to ENOSPC, we want to prefer allocation from AGs that +* have free inodes in them rather than use up free space allocating new +* inode chunks. Hence we turn off allocation for the first non-blocking +* pass through the AGs if we are near ENOSPC to consume free inodes +* that we can immediately allocate, but then we allow allocation on the +* second pass if we fail to find an AG with free inodes in it. +*/ +if (percpu_counter_read_positive (&mp->m_fdblocks) < + mp->m_low_space[XFS_LOWSP_1_PCNT ]) { + ok_alloc = false; + low_space = true; + } +/* * Loop until we find an allocation group that either has free inodes * or in which we can allocate some inodes. Iterate through the
@@ -1795,6 +1810,8 @@ xfs_dialloc(break ; } flags =0 ; +if (low_space) + ok_alloc = true; }xfs_perag_put (pag); }
fs/xfs/libxfs/xfs_log_format.h +8 -1
@@ -324,7 +324,6 @@ struct xfs_inode_log_format_32 {#define XFS_ILOG_DOWNER 0x200/* change the data fork owner on replay */ #define XFS_ILOG_AOWNER 0x400/* change the attr fork owner on replay */ -/* * The timestamps are dirty, but not necessarily anything else in the inode * core. Unlike the other fields above this one must never make it to disk
@@ -333,6 +332,14 @@ struct xfs_inode_log_format_32 {*/ #define XFS_ILOG_TIMESTAMP 0x4000 +/* +* The version field has been changed, but not necessarily anything else of +* interest. This must never make it to disk - it is used purely to ensure that +* the inode item ->precommit operation can update the fsync flag triggers +* in the inode item correctly. +*/ +#define XFS_ILOG_IVERSION 0x8000 +#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
fs/xfs/libxfs/xfs_sb.c +55 -1
68 lines not on this page · raw message
fs/xfs/libxfs/xfs_trans_inode.c +8 -105
145 lines not on this page · raw message
fs/xfs/xfs_attr_inactive.c +0 -1
@@ -333,7 +333,6 @@ xfs_attr_inactive(int error =0 ; mp = dp->i_mount; -ASSERT (!XFS_NOT_DQATTACHED (mp, dp));xfs_ilock (dp, lock_mode);if (!xfs_inode_has_attr_fork (dp))
fs/xfs/xfs_bmap_util.c +9 -9
@@ -314,15 +314,13 @@ xfs_getbmap_report_one(if (isnullstartblock (got->br_startblock) || got->br_startblock ==DELAYSTARTBLOCK ) {/* -* Delalloc extents that start beyond EOF can occur due to -* speculative EOF allocation when the delalloc extent is larger -* than the largest freespace extent at conversion time. These -* extents cannot be converted by data writeback, so can exist -* here even if we are not supposed to be finding delalloc -* extents. +* Take the flush completion as being a point-in-time snapshot +* where there are no delalloc extents, and if any new ones +* have been created racily, just skip them as being 'after' +* the flush and so don't get reported. */ -if (got->br_startoff <XFS_B_TO_FSB (ip->i_mount,XFS_ISIZE (ip))) -ASSERT ((bmv->bmv_iflags &BMV_IF_DELALLOC ) !=0 ); +if (!(bmv->bmv_iflags &BMV_IF_DELALLOC )) +return 0 ; p->bmv_oflags |=BMV_OF_DELALLOC ; p->bmv_block =-2 ;
@@ -560,7 +558,9 @@ xfs_getbmap(if (!xfs_iext_next_extent (ifp, &icur, &got)) {xfs_fileoff_t end =XFS_B_TO_FSB (mp,XFS_ISIZE (ip)); - out[bmv->bmv_entries -1 ].bmv_oflags |=BMV_OF_LAST ; +if (bmv->bmv_entries >0 ) + out[bmv->bmv_entries -1 ].bmv_oflags |= +BMV_OF_LAST ;if (whichfork !=XFS_ATTR_FORK && bno < end && !xfs_getbmap_full (bmv)) {
fs/xfs/xfs_buf_item.c +65 -23
134 lines not on this page · raw message
fs/xfs/xfs_dquot.c +0 -1
@@ -798,7 +798,6 @@ xfs_qm_dqget_cache_insert( error =radix_tree_insert (tree, id, dqp);if (unlikely (error)) {/* Duplicate found! Caller must try again. */ -WARN_ON (error != -EEXIST );mutex_unlock (&qi->qi_tree_lock);trace_xfs_dqget_dup (dqp);return error;
fs/xfs/xfs_export.c +14 -0
@@ -146,6 +146,20 @@ xfs_nfs_get_inode(return ERR_PTR (error); } +/* +* Reload the incore unlinked list to avoid failure in inodegc. +* Use an unlocked check here because unrecovered unlinked inodes +* should be somewhat rare. +*/ +if (xfs_inode_unlinked_incomplete (ip)) { + error =xfs_inode_reload_unlinked (ip); +if (error) { +xfs_force_shutdown (mp,SHUTDOWN_CORRUPT_INCORE ); +xfs_irele (ip); +return ERR_PTR (error); + } + } +if (VFS_I (ip)->i_generation != generation) {xfs_irele (ip);return ERR_PTR (-ESTALE );
fs/xfs/xfs_extent_busy.c +1 -0
@@ -236,6 +236,7 @@ xfs_extent_busy_update_extent(* */ busyp->bno = fend; + busyp->length = bend - fend; }else if (bbno < fbno) {/* * Case 8:
fs/xfs/xfs_fsmap.c +1 -0
@@ -761,6 +761,7 @@ xfs_getfsmap_datadev_bnobt( {struct xfs_alloc_rec_incore akeys[2 ]; +memset (akeys,0 ,sizeof (akeys)); info->missing_owner =XFS_FMR_OWN_UNKNOWN ;return __xfs_getfsmap_datadev (tp, keys, info, xfs_getfsmap_datadev_bnobt_query, &akeys[0 ]);
fs/xfs/xfs_fsops.c +9 -4
@@ -115,11 +115,16 @@ xfs_growfs_data_private( nb_div = nb; nb_mod =do_div (nb_div, mp->m_sb.sb_agblocks); - nagcount = nb_div + (nb_mod !=0 ); -if (nb_mod && nb_mod <XFS_MIN_AG_BLOCKS ) { - nagcount--; - nb = (xfs_rfsblock_t )nagcount * mp->m_sb.sb_agblocks; +if (nb_mod && nb_mod >=XFS_MIN_AG_BLOCKS ) + nb_div++; +else if (nb_mod) + nb = nb_div * mp->m_sb.sb_agblocks; + +if (nb_div >XFS_MAX_AGNUMBER +1 ) { + nb_div =XFS_MAX_AGNUMBER +1 ; + nb = nb_div * mp->m_sb.sb_agblocks; } + nagcount = nb_div; delta = nb - mp->m_sb.sb_dblocks;/* * Reject filesystems with a single AG because they are not
fs/xfs/xfs_icache.c +48 -10
129 lines not on this page · raw message
fs/xfs/xfs_icache.h +2 -2
@@ -59,7 +59,7 @@ int xfs_blockgc_free_dquots(struct xfs_mount *mp, struct xfs_dquot *udqp, unsigned int iwalk_flags);int xfs_blockgc_free_quota (struct xfs_inode *ip,unsigned int iwalk_flags);int xfs_blockgc_free_space (struct xfs_mount *mp,struct xfs_icwalk *icm); -void xfs_blockgc_flush_all (struct xfs_mount *mp); +int xfs_blockgc_flush_all (struct xfs_mount *mp);void xfs_inode_set_eofblocks_tag (struct xfs_inode *ip);void xfs_inode_clear_eofblocks_tag (struct xfs_inode *ip);
@@ -77,7 +77,7 @@ void xfs_blockgc_start(struct xfs_mount *mp);void xfs_inodegc_worker (struct work_struct *work);void xfs_inodegc_push (struct xfs_mount *mp); -void xfs_inodegc_flush (struct xfs_mount *mp); +int xfs_inodegc_flush (struct xfs_mount *mp);void xfs_inodegc_stop (struct xfs_mount *mp);void xfs_inodegc_start (struct xfs_mount *mp);void xfs_inodegc_cpu_dead (struct xfs_mount *mp,unsigned int cpu);
fs/xfs/xfs_inode.c +233 -27
361 lines not on this page · raw message
fs/xfs/xfs_inode.h +33 -3
@@ -68,8 +68,21 @@ typedef struct xfs_inode {uint64_t i_diflags2;/* XFS_DIFLAG2_... */ struct timespec64 i_crtime;/* time created */ -/* unlinked list pointers */ +/* +* Unlinked list pointers. These point to the next and previous inodes +* in the AGI unlinked bucket list, respectively. These fields can +* only be updated with the AGI locked. +* +* i_next_unlinked caches di_next_unlinked. +*/ xfs_agino_t i_next_unlinked; + +/* +* If the inode is not on an unlinked list, this field is zero. If the +* inode is the first element in an unlinked list, this field is +* NULLAGINO. Otherwise, i_prev_unlinked points to the previous inode +* in the unlinked list. +*/ xfs_agino_t i_prev_unlinked;/* VFS inode */
@@ -81,6 +94,11 @@ typedef struct xfs_inode {struct list_head i_ioend_list; } xfs_inode_t; +static inline bool xfs_inode_on_unlinked_list (const struct xfs_inode *ip) +{ +return ip->i_prev_unlinked !=0 ; +} +static inline bool xfs_inode_has_attr_fork (struct xfs_inode *ip) {return ip->i_forkoff >0 ;
@@ -326,6 +344,9 @@ static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip)*/ #define XFS_INACTIVATING (1 << 13) +/* Quotacheck is running but inode has not been added to quota counts. */ +#define XFS_IQUOTAUNCHECKED (1 << 14) +/* All inode state flags related to inode reclaim. */ #define XFS_ALL_IRECLAIM_FLAGS (XFS_IRECLAIMABLE | \ XFS_IRECLAIM | \
@@ -340,7 +361,7 @@ static inline bool xfs_inode_has_large_extent_counts(struct xfs_inode *ip)#define XFS_IRECLAIM_RESET_FLAGS \ (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | XFS_NEED_INACTIVE | \ - XFS_INACTIVATING) + XFS_INACTIVATING | XFS_IQUOTAUNCHECKED)/* * Flags for inode locking.
@@ -470,7 +491,7 @@ enum layout_break_reason { (xfs_has_grpid((pip)->i_mount) || (VFS_I(pip)->i_mode & S_ISGID))int xfs_release (struct xfs_inode *ip); -void xfs_inactive (struct xfs_inode *ip); +int xfs_inactive (struct xfs_inode *ip);int xfs_lookup (struct xfs_inode *dp,const struct xfs_name *name,struct xfs_inode **ipp,struct xfs_name *ci_name); int xfs_create(struct user_namespace *mnt_userns,
@@ -575,4 +596,13 @@ void xfs_end_io(struct work_struct *work);int xfs_ilock2_io_mmap (struct xfs_inode *ip1,struct xfs_inode *ip2);void xfs_iunlock2_io_mmap (struct xfs_inode *ip1,struct xfs_inode *ip2); +static inline bool +xfs_inode_unlinked_incomplete ( +struct xfs_inode *ip) +{ +return VFS_I (ip)->i_nlink ==0 && !xfs_inode_on_unlinked_list (ip); +} +int xfs_inode_reload_unlinked_bucket (struct xfs_trans *tp,struct xfs_inode *ip); +int xfs_inode_reload_unlinked (struct xfs_inode *ip); +#endif /* __XFS_INODE_H__ */
fs/xfs/xfs_inode_item.c +149 -0
161 lines not on this page · raw message
fs/xfs/xfs_inode_item.h +1 -0
@@ -17,6 +17,7 @@ struct xfs_inode_log_item {struct xfs_log_item ili_item;/* common portion */ struct xfs_inode *ili_inode;/* inode ptr */ unsigned short ili_lock_flags;/* inode lock flags */ +unsigned int ili_dirty_flags;/* dirty in current tx */ /* * The ili_lock protects the interactions between the dirty state and * the flush state of the inode log item. This allows us to do atomic
fs/xfs/xfs_itable.c +11 -0
@@ -80,6 +80,17 @@ xfs_bulkstat_one_int(if (error) goto out; +/* Reload the incore unlinked list to avoid failure in inodegc. */ +if (xfs_inode_unlinked_incomplete (ip)) { + error =xfs_inode_reload_unlinked_bucket (tp, ip); +if (error) { +xfs_iunlock (ip,XFS_ILOCK_SHARED ); +xfs_force_shutdown (mp,SHUTDOWN_CORRUPT_INCORE ); +xfs_irele (ip); +return error; + } + } +ASSERT (ip !=NULL );ASSERT (ip->i_imap.im_blkno !=0 ); inode =VFS_I (ip);
fs/xfs/xfs_log.c +15 -32
75 lines not on this page · raw message
fs/xfs/xfs_log_recover.c +9 -10
@@ -2711,7 +2711,9 @@ xlog_recover_iunlink_bucket(* just to flush the inodegc queue and wait for it to * complete. */ -xfs_inodegc_flush (mp); + error =xfs_inodegc_flush (mp); +if (error) +break ; } prev_agino = agino;
@@ -2719,10 +2721,15 @@ xlog_recover_iunlink_bucket( }if (prev_ip) { +int error2; + ip->i_prev_unlinked = prev_agino;xfs_irele (prev_ip); + + error2 =xfs_inodegc_flush (mp); +if (error2 && !error) +return error2; } -xfs_inodegc_flush (mp);return error; }
@@ -2789,7 +2796,6 @@ xlog_recover_iunlink_ag(* bucket and remaining inodes on it unreferenced and * unfreeable. */ -xfs_inodegc_flush (pag->pag_mount);xlog_recover_clear_agi_bucket (pag, bucket); } }
@@ -2806,13 +2812,6 @@ xlog_recover_process_iunlinks(for_each_perag (log->l_mp, agno, pag)xlog_recover_iunlink_ag (pag); - -/* -* Flush the pending unlinked inodes to ensure that the inactivations -* are fully completed on disk and the incore inodes can be reclaimed -* before we signal that recovery is complete. -*/ -xfs_inodegc_flush (log->l_mp); }STATIC void
fs/xfs/xfs_mount.h +10 -1
@@ -62,6 +62,7 @@ struct xfs_error_cfg {struct xfs_inodegc {struct llist_head list;struct delayed_work work; +int error;/* approximate count of inodes in the list */ unsigned int items;
@@ -400,6 +401,8 @@ __XFS_HAS_FEAT(nouuid, NOUUID)#define XFS_OPSTATE_WARNED_SHRINK 8/* Kernel has logged a warning about logged xattr updates being used. */ #define XFS_OPSTATE_WARNED_LARP 9 +/* Mount time quotacheck is running */ +#define XFS_OPSTATE_QUOTACHECK_RUNNING 10#define __XFS_IS_OPSTATE (name,NAME ) \ static inline bool xfs_is_ ## name (struct xfs_mount *mp) \
@@ -422,6 +425,11 @@ __XFS_IS_OPSTATE(inode32, INODE32) __XFS_IS_OPSTATE(readonly, READONLY) __XFS_IS_OPSTATE(inodegc_enabled, INODEGC_ENABLED) __XFS_IS_OPSTATE(blockgc_enabled, BLOCKGC_ENABLED) +#ifdef CONFIG_XFS_QUOTA +__XFS_IS_OPSTATE(quotacheck_running, QUOTACHECK_RUNNING) +#else +# define xfs_is_quotacheck_running (mp) (false) +#endif static inline bool xfs_should_warn (struct xfs_mount *mp,long nr)
@@ -439,7 +447,8 @@ xfs_should_warn(struct xfs_mount *mp, long nr) { (1UL << XFS_OPSTATE_BLOCKGC_ENABLED), "blockgc" }, \ { (1UL << XFS_OPSTATE_WARNED_SCRUB), "wscrub" }, \ { (1UL << XFS_OPSTATE_WARNED_SHRINK), "wshrink" }, \ - { (1UL << XFS_OPSTATE_WARNED_LARP), "wlarp" } + { (1UL << XFS_OPSTATE_WARNED_LARP), "wlarp" }, \ + { (1UL << XFS_OPSTATE_QUOTACHECK_RUNNING), "quotacheck" }/* * Max and min values for mount-option defined I/O
fs/xfs/xfs_notify_failure.c +8 -7
@@ -114,7 +114,8 @@ xfs_dax_notify_ddev_failure(int error =0 ;xfs_fsblock_t fsbno =XFS_DADDR_TO_FSB (mp, daddr);xfs_agnumber_t agno =XFS_FSB_TO_AGNO (mp, fsbno); -xfs_fsblock_t end_fsbno =XFS_DADDR_TO_FSB (mp, daddr + bblen); +xfs_fsblock_t end_fsbno =XFS_DADDR_TO_FSB (mp, + daddr + bblen -1 );xfs_agnumber_t end_agno =XFS_FSB_TO_AGNO (mp, end_fsbno); error =xfs_trans_alloc_empty (mp, &tp);
@@ -125,8 +126,8 @@ xfs_dax_notify_ddev_failure(struct xfs_rmap_irec ri_low = { };struct xfs_rmap_irec ri_high;struct xfs_agf *agf; -xfs_agblock_t agend;struct xfs_perag *pag; +xfs_agblock_t range_agend; pag =xfs_perag_get (mp, agno); error =xfs_alloc_read_agf (pag, tp,0 , &agf_bp);
@@ -147,10 +148,10 @@ xfs_dax_notify_ddev_failure( ri_high.rm_startblock =XFS_FSB_TO_AGBNO (mp, end_fsbno); agf = agf_bp->b_addr; - agend =min (be32_to_cpu (agf->agf_length), + range_agend =min (be32_to_cpu (agf->agf_length) -1 , ri_high.rm_startblock); notify.startblock = ri_low.rm_startblock; - notify.blockcount = agend - ri_low.rm_startblock; + notify.blockcount = range_agend +1 - ri_low.rm_startblock; error =xfs_rmap_query_range (cur, &ri_low, &ri_high, xfs_dax_failure_fn, ¬ify);
@@ -210,7 +211,7 @@ xfs_dax_notify_failure( ddev_end = ddev_start +bdev_nr_bytes (mp->m_ddev_targp->bt_bdev) -1 ;/* Ignore the range out of filesystem area */ -if (offset + len < ddev_start) +if (offset + len -1 < ddev_start)return -ENXIO ;if (offset > ddev_end)return -ENXIO ;
@@ -222,8 +223,8 @@ xfs_dax_notify_failure( len -= ddev_start - offset; offset =0 ; } -if (offset + len > ddev_end) - len -= ddev_end - offset; +if (offset + len -1 > ddev_end) + len = ddev_end - offset +1 ;return xfs_dax_notify_ddev_failure (mp,BTOBB (offset),BTOBB (len), mf_flags);
fs/xfs/xfs_qm.c +54 -18
128 lines not on this page · raw message
fs/xfs/xfs_super.c +1 -0
@@ -1089,6 +1089,7 @@ xfs_inodegc_init_percpu(#endif init_llist_head (&gc->list); gc->items =0 ; + gc->error =0 ;INIT_DELAYED_WORK (&gc->work, xfs_inodegc_worker); }return 0 ;
fs/xfs/xfs_trace.h +46 -0
58 lines not on this page · raw message
fs/xfs/xfs_trans.c +8 -1
@@ -290,7 +290,9 @@ xfs_trans_alloc(* Do not perform a synchronous scan because callers can hold * other locks. */ -xfs_blockgc_flush_all (mp); + error =xfs_blockgc_flush_all (mp); +if (error) +return error; want_retry = false; goto retry; }
@@ -970,6 +972,11 @@ __xfs_trans_commit( error =xfs_defer_finish_noroll (&tp);if (error) goto out_unreserve; + +/* Run precommits from final tx in defer chain. */ + error =xfs_trans_run_precommits (tp); +if (error) + goto out_unreserve; }/*
include/net/netfilter/nf_tables.h +13 -0
@@ -296,9 +296,22 @@ struct nft_set_elem {void *priv; }; +/** +* enum nft_iter_type - nftables set iterator type +* +* @NFT_ITER_READ: read-only iteration over set elements +* @NFT_ITER_UPDATE: iteration under mutex to update set element state +*/ +enum nft_iter_type { +NFT_ITER_UNSPEC , +NFT_ITER_READ , +NFT_ITER_UPDATE , +}; +struct nft_set ;struct nft_set_iter {u8 genmask; +enum nft_iter_type type:8 ;unsigned int count;unsigned int skip;int err;
net/mac80211/tx.c +3 -1
@@ -5196,8 +5196,10 @@ ieee80211_beacon_get_ap(struct ieee80211_hw *hw,if (beacon->tail)skb_put_data (skb, beacon->tail, beacon->tail_len); -if (ieee80211_beacon_protect (skb, local, sdata, link) <0 ) +if (ieee80211_beacon_protect (skb, local, sdata, link) <0 ) { +dev_kfree_skb (skb);return NULL ; + }ieee80211_beacon_get_finish (hw, vif, link, offs, beacon, skb, chanctx_conf, csa_off_base);
net/netfilter/nf_tables_api.c +5 -0
@@ -628,6 +628,7 @@ static void nft_map_deactivate(const struct nft_ctx *ctx, struct nft_set *set) {struct nft_set_iter iter = { .genmask =nft_genmask_next (ctx->net), + .type =NFT_ITER_UPDATE , .fn = nft_mapelem_deactivate, };
@@ -5143,6 +5144,7 @@ int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set, } iter.genmask =nft_genmask_next (ctx->net); + iter.type =NFT_ITER_UPDATE ; iter.skip =0 ; iter.count =0 ; iter.err =0 ;
@@ -5218,6 +5220,7 @@ static void nft_map_activate(const struct nft_ctx *ctx, struct nft_set *set) {struct nft_set_iter iter = { .genmask =nft_genmask_next (ctx->net), + .type =NFT_ITER_UPDATE , .fn = nft_mapelem_activate, };
@@ -5574,6 +5577,7 @@ static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb) args.cb = cb; args.skb = skb; args.iter.genmask =nft_genmask_cur (net); + args.iter.type =NFT_ITER_READ ; args.iter.skip = cb->args[0 ]; args.iter.count =0 ; args.iter.err =0 ;
@@ -6957,6 +6961,7 @@ static int nft_set_flush(struct nft_ctx *ctx, struct nft_set *set, u8 genmask) {struct nft_set_iter iter = { .genmask = genmask, + .type =NFT_ITER_UPDATE , .fn = nft_setelem_flush, };
net/netfilter/nft_lookup.c +1 -0
@@ -211,6 +211,7 @@ static int nft_lookup_validate(const struct nft_ctx *ctx,return 0 ; iter.genmask =nft_genmask_next (ctx->net); + iter.type =NFT_ITER_UPDATE ; iter.skip =0 ; iter.count =0 ; iter.err =0 ;
net/netfilter/nft_set_pipapo.c +4 -2
@@ -2042,13 +2042,15 @@ static void nft_pipapo_walk(const struct nft_ctx *ctx, struct nft_set *set, struct nft_set_iter *iter) {struct nft_pipapo *priv =nft_set_priv (set); -struct net *net =read_pnet (&set->net);const struct nft_pipapo_match *m;const struct nft_pipapo_field *f;int i, r; +WARN_ON_ONCE (iter->type !=NFT_ITER_READ && + iter->type !=NFT_ITER_UPDATE ); +rcu_read_lock (); -if (iter->genmask ==nft_genmask_cur (net)) +if (iter->type ==NFT_ITER_READ ) m =rcu_dereference (priv->match);else m = priv->clone;
net/netfilter/nft_socket.c +38 -3
73 lines not on this page · raw message
net/wireless/core.h +1 -7
@@ -228,7 +228,6 @@ void cfg80211_register_wdev(struct cfg80211_registered_device *rdev,static inline void wdev_lock (struct wireless_dev *wdev)__acquires (wdev) { -lockdep_assert_held (&wdev->wiphy->mtx);mutex_lock (&wdev->mtx);__acquire (wdev->mtx); }
@@ -236,16 +235,11 @@ static inline void wdev_lock(struct wireless_dev *wdev)static inline void wdev_unlock (struct wireless_dev *wdev)__releases (wdev) { -lockdep_assert_held (&wdev->wiphy->mtx);__release (wdev->mtx);mutex_unlock (&wdev->mtx); } -static inline void ASSERT_WDEV_LOCK (struct wireless_dev *wdev) -{ -lockdep_assert_held (&wdev->wiphy->mtx); -lockdep_assert_held (&wdev->mtx); -} +#define ASSERT_WDEV_LOCK (wdev) lockdep_assert_held(&(wdev)->mtx)static inline bool cfg80211_has_monitors_only (struct cfg80211_registered_device *rdev) {
sound/pci/hda/patch_realtek.c +51 -25
26 lines not on this page · raw message
sound/soc/intel/common/soc-acpi-intel-cht-match.c +0 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_join.sh +3 -1
Lines of this file are not shown. View the 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.