Linux 6.1.92
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.92 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
------------
Documentation/admin-guide/hw-vuln/core-scheduling.rst | 4 Documentation/sphinx/kernel_include.py | 1 Makefile | 2 arch/arm64/Kconfig | 1 arch/arm64/include/asm/lse.h | 1 drivers/android/binder.c | 2 drivers/android/binder_internal.h | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 3 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 7 drivers/mfd/stpmic1.c | 5 drivers/mmc/core/mmc.c | 9 drivers/net/ethernet/intel/ice/ice_virtchnl.c | 22 - drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c | 3 drivers/net/ethernet/micrel/ks8851_common.c | 18 - drivers/net/usb/ax88179_178a.c | 37 +- drivers/pinctrl/core.c | 14 drivers/remoteproc/mtk_scp.c | 10 drivers/tty/serial/kgdboc.c | 30 ++ drivers/usb/dwc3/gadget.c | 4 drivers/usb/typec/tipd/core.c | 45 ++- drivers/usb/typec/tipd/tps6598x.h | 11 drivers/usb/typec/ucsi/displayport.c | 4 fs/iomap/buffered-io.c | 254 +++++++++++++++++- fs/iomap/iter.c | 19 + fs/nfs/callback.c | 9 fs/nfsd/nfs4proc.c | 5 fs/nfsd/nfssvc.c | 12 fs/xfs/libxfs/xfs_bmap.c | 8 fs/xfs/libxfs/xfs_errortag.h | 12 fs/xfs/libxfs/xfs_refcount.c | 146 +++++++++- fs/xfs/libxfs/xfs_sb.c | 7 fs/xfs/xfs_aops.c | 37 +- fs/xfs/xfs_bmap_util.c | 10 fs/xfs/xfs_bmap_util.h | 2 fs/xfs/xfs_buf.c | 1 fs/xfs/xfs_buf_item.c | 2 fs/xfs/xfs_error.c | 27 + fs/xfs/xfs_file.c | 2 fs/xfs/xfs_fsops.c | 4 fs/xfs/xfs_icache.c | 6 fs/xfs/xfs_inode.c | 16 - fs/xfs/xfs_ioctl.c | 4 fs/xfs/xfs_iomap.c | 177 +++++++----- fs/xfs/xfs_iomap.h | 6 fs/xfs/xfs_log.c | 53 +-- fs/xfs/xfs_mount.c | 15 + fs/xfs/xfs_pnfs.c | 6 include/linux/iomap.h | 47 ++- net/sunrpc/svc_xprt.c | 16 - security/keys/trusted-keys/trusted_tpm2.c | 25 + 50 files changed, 865 insertions(+), 298 deletions(-)
Aidan MacDonald (1):
mfd: stpmic1: Fix swapped mask/unmask in irq chip
Akira Yokosawa (1):
docs: kernel_include.py: Cope with docutils 0.21
AngeloGioacchino Del Regno (1):
remoteproc: mediatek: Make sure IPI buffer fits in L2TCM
Carlos Llamas (1):
binder: fix max_thread type inconsistency
Daniel Thompson (1):
serial: kgdboc: Fix NMI-safety problems from keyboard reset code
Darrick J. Wong (8):
xfs: fix incorrect error-out in xfs_remove
xfs: invalidate block device page cache during unmount
xfs: attach dquots to inode before reading data/cow fork mappings
xfs: hoist refcount record merge predicates
xfs: estimate post-merge refcounts correctly
xfs: invalidate xfs_bufs when allocating cow extents
xfs: allow inode inactivation during a ro mount log recovery
xfs: fix log recovery when unknown rocompat bits are set
Dave Chinner (10):
xfs: write page faults in iomap are not buffered writes
xfs: punching delalloc extents on write failure is racy
xfs: use byte ranges for write cleanup ranges xfs,iomap: move delalloc punching to iomap
iomap: buffered write failure should not truncate the page cache
xfs: xfs_bmap_punch_delalloc_range() should take a byte range
iomap: write iomap validity checks
xfs: use iomap_valid method to detect stale cached iomaps
xfs: drop write error injection is unfixable, remove it
xfs: fix off-by-one-block in xfs_discard_folio()
Eric Sandeen (1):
xfs: short circuit xfs_growfs_data_private() if delta is zero
Greg Kroah-Hartman (1):
Linux 6.1.92
Guo Xuenan (2):
xfs: wait iclog complete before tearing down AIL
xfs: fix super block buf log item UAF during force shutdown
Heikki Krogerus (1):
usb: typec: ucsi: displayport: Fix potential deadlock
Hironori Shiina (1):
xfs: get root inode correctly at bulkstat
Jacob Keller (2):
ice: pass VSI pointer into ice_vc_isvalid_q_id
ice: remove unnecessary duplicate checks for VF VSI ID
Jarkko Sakkinen (2):
KEYS: trusted: Fix memory leak in tpm2_key_encode()
KEYS: trusted: Do not use WARN when encode fails
Javier Carrasco (1):
usb: typec: tipd: fix event checking for tps6598x
Jose Fernandez (1):
drm/amd/display: Fix division by zero in setup_dsc_config
Jose Ignacio Tornos Martinez (1):
net: usb: ax88179_178a: fix link status when link is set to down/up
Long Li (2):
xfs: fix sb write verify for lazysbcount
xfs: fix incorrect i_nlink caused by inode racing
Mark Rutland (1):
arm64: atomics: lse: remove stale dependency on JUMP_LABEL
Mengqi Zhang (1):
mmc: core: Add HS400 tuning in HS400es initialization
NeilBrown (1):
nfsd: don't allow nfsd threads to be signalled.
Prashanth K (1):
usb: dwc3: Wait unconditionally after issuing EndXfer command
Ronald Wahl (1):
net: ks8851: Fix another TX stall caused by wrong ISR flag handling
Sergey Shtylyov (1):
pinctrl: core: handle radix_tree_insert() errors in pinctrl_register_one_pin()
Srinivasan Shanmugam (1):
drm/amdgpu: Fix possible NULL dereference in amdgpu_ras_query_error_status_helper()
Thomas Weißschuh (1):
admin-guide/hw-vuln/core-scheduling: fix return type of PR_SCHED_CORE_GET
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/hw-vuln/core-scheduling.rst +2 -2
@@ -67,8 +67,8 @@ arg4: will be performed for all tasks in the task group of ``pid``. arg5: - userspace pointer to an unsigned long for storing the cookie returned by - ``PR_SCHED_CORE_GET`` command. Should be 0 for all other commands. + userspace pointer to an unsigned long long for storing the cookie returned + by ``PR_SCHED_CORE_GET`` command. Should be 0 for all other commands. In order for a process to push a cookie to, or pull a cookie from a process, it is required to have the ptrace access mode: `PTRACE_MODE_READ_REALCREDS` to the
Documentation/sphinx/kernel_include.py +0 -1
@@ -97,7 +97,6 @@ class KernelInclude(Include): # HINT: this is the only line I had to change / commented out: #path = utils.relative_path(None, path) - path = nodes.reprunicode(path) encoding = self.options.get( 'encoding', self.state.document.settings.input_encoding) e_handler=self.state.document.settings.input_encoding_error_handler
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 91 +SUBLEVEL = 92 EXTRAVERSION = NAME = Curry Ramen
arch/arm64/Kconfig +0 -1
@@ -1752,7 +1752,6 @@ config ARM64_LSE_ATOMICS config ARM64_USE_LSE_ATOMICS bool "Atomic instructions" - depends on JUMP_LABEL default y help As part of the Large System Extensions, ARMv8.1 introduces new
arch/arm64/include/asm/lse.h +0 -1
@@ -10,7 +10,6 @@#include <linux/compiler_types.h> #include <linux/export.h> -#include <linux/jump_label.h> #include <linux/stringify.h> #include <asm/alternative.h> #include <asm/alternative-macros.h>
drivers/android/binder.c +1 -1
@@ -5350,7 +5350,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) goto err;break ;case BINDER_SET_MAX_THREADS : { -int max_threads; +u32 max_threads;if (copy_from_user (&max_threads, ubuf,sizeof (max_threads))) {
drivers/android/binder_internal.h +1 -1
@@ -420,7 +420,7 @@ struct binder_proc {struct list_head todo;struct binder_stats stats;struct list_head delivered_death; -int max_threads; +u32 max_threads;int requested_threads;int requested_threads_started;int tmp_ref;
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +3 -0
@@ -974,6 +974,9 @@ int amdgpu_ras_query_error_status(struct amdgpu_device *adev,if (!obj)return -EINVAL ; +if (!info || info->head.block ==AMDGPU_RAS_BLOCK_COUNT ) +return -EINVAL ; +if (info->head.block ==AMDGPU_RAS_BLOCK__UMC ) {amdgpu_ras_get_ecc_info (adev, &err_data); }else {
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +6 -1
@@ -924,7 +924,12 @@ static bool setup_dsc_config(if (!is_dsc_possible) goto done; - dsc_cfg->num_slices_v = pic_height/slice_height; +if (slice_height >0 ) { + dsc_cfg->num_slices_v = pic_height / slice_height; + }else { + is_dsc_possible = false; + goto done; + }if (target_bandwidth_kbps >0 ) { is_dsc_possible = decide_dsc_target_bpp_x16(
drivers/mfd/stpmic1.c +3 -2
@@ -108,8 +108,9 @@ static const struct regmap_irq stpmic1_irqs[] = {static const struct regmap_irq_chip stpmic1_regmap_irq_chip = { .name ="pmic_irq" , .status_base =INT_PENDING_R1 , - .mask_base =INT_CLEAR_MASK_R1 , - .unmask_base =INT_SET_MASK_R1 , + .mask_base =INT_SET_MASK_R1 , + .unmask_base =INT_CLEAR_MASK_R1 , + .mask_unmask_non_inverted = true, .ack_base =INT_CLEAR_R1 , .num_regs =STPMIC1_PMIC_NUM_IRQ_REGS , .irqs = stpmic1_irqs,
drivers/mmc/core/mmc.c +7 -2
@@ -1819,8 +1819,13 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,if (err) goto free_card; - - }else if (!mmc_card_hs400es (card)) { + }else if (mmc_card_hs400es (card)) { +if (host->ops->execute_hs400_tuning) { + err = host->ops->execute_hs400_tuning (host, card); +if (err) + goto free_card; + } + }else {/* Select the desired bus width optionally */ err =mmc_select_bus_width (card);if (err >0 &&mmc_card_hs (card)) {
drivers/net/ethernet/intel/ice/ice_virtchnl.c +10 -12
@@ -544,17 +544,15 @@ bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id)/** * ice_vc_isvalid_q_id -* @vf: pointer to the VF info -* @vsi_id: VSI ID +* @vsi: VSI to check queue ID against * @qid: VSI relative queue ID * * check for the valid queue ID */ -static bool ice_vc_isvalid_q_id (struct ice_vf *vf,u16 vsi_id,u8 qid) +static bool ice_vc_isvalid_q_id (struct ice_vsi *vsi,u8 qid) { -struct ice_vsi *vsi =ice_find_vsi (vf->pf, vsi_id);/* allocated Tx and Rx queues should be always equal for VF VSI */ -return (vsi && (qid < vsi->alloc_txq)); +return qid < vsi->alloc_txq; }/**
@@ -1254,7 +1252,7 @@ static int ice_vc_ena_qs_msg(struct ice_vf *vf, u8 *msg)*/ q_map = vqs->rx_queues;for_each_set_bit (vf_q_id, &q_map,ICE_MAX_RSS_QS_PER_VF ) { -if (!ice_vc_isvalid_q_id (vf, vqs->vsi_id, vf_q_id)) { +if (!ice_vc_isvalid_q_id (vsi, vf_q_id)) { v_ret =VIRTCHNL_STATUS_ERR_PARAM ; goto error_param; }
@@ -1276,7 +1274,7 @@ static int ice_vc_ena_qs_msg(struct ice_vf *vf, u8 *msg) q_map = vqs->tx_queues;for_each_set_bit (vf_q_id, &q_map,ICE_MAX_RSS_QS_PER_VF ) { -if (!ice_vc_isvalid_q_id (vf, vqs->vsi_id, vf_q_id)) { +if (!ice_vc_isvalid_q_id (vsi, vf_q_id)) { v_ret =VIRTCHNL_STATUS_ERR_PARAM ; goto error_param; }
@@ -1381,7 +1379,7 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg) q_map = vqs->tx_queues;for_each_set_bit (vf_q_id, &q_map,ICE_MAX_RSS_QS_PER_VF ) { -if (!ice_vc_isvalid_q_id (vf, vqs->vsi_id, vf_q_id)) { +if (!ice_vc_isvalid_q_id (vsi, vf_q_id)) { v_ret =VIRTCHNL_STATUS_ERR_PARAM ; goto error_param; }
@@ -1407,7 +1405,7 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg)bitmap_zero (vf->rxq_ena,ICE_MAX_RSS_QS_PER_VF ); }else if (q_map) {for_each_set_bit (vf_q_id, &q_map,ICE_MAX_RSS_QS_PER_VF ) { -if (!ice_vc_isvalid_q_id (vf, vqs->vsi_id, vf_q_id)) { +if (!ice_vc_isvalid_q_id (vsi, vf_q_id)) { v_ret =VIRTCHNL_STATUS_ERR_PARAM ; goto error_param; }
@@ -1463,7 +1461,7 @@ ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi, u16 vector_id,for_each_set_bit (vsi_q_id_idx, &qmap,ICE_MAX_RSS_QS_PER_VF ) { vsi_q_id = vsi_q_id_idx; -if (!ice_vc_isvalid_q_id (vf, vsi->vsi_num, vsi_q_id)) +if (!ice_vc_isvalid_q_id (vsi, vsi_q_id))return VIRTCHNL_STATUS_ERR_PARAM ; q_vector->num_ring_rx++;
@@ -1477,7 +1475,7 @@ ice_cfg_interrupt(struct ice_vf *vf, struct ice_vsi *vsi, u16 vector_id,for_each_set_bit (vsi_q_id_idx, &qmap,ICE_MAX_RSS_QS_PER_VF ) { vsi_q_id = vsi_q_id_idx; -if (!ice_vc_isvalid_q_id (vf, vsi->vsi_num, vsi_q_id)) +if (!ice_vc_isvalid_q_id (vsi, vsi_q_id))return VIRTCHNL_STATUS_ERR_PARAM ; q_vector->num_ring_tx++;
@@ -1611,7 +1609,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg) qpi->txq.headwb_enabled || !ice_vc_isvalid_ring_len(qpi->txq.ring_len) || !ice_vc_isvalid_ring_len(qpi->rxq.ring_len) || - !ice_vc_isvalid_q_id(vf, qci->vsi_id, qpi->txq.queue_id)) { + !ice_vc_isvalid_q_id(vsi, qpi->txq.queue_id)) { goto error_param; }
drivers/net/ethernet/intel/ice/ice_virtchnl_fdir.c +0 -3
@@ -107,9 +107,6 @@ ice_vc_fdir_param_check(struct ice_vf *vf, u16 vsi_id)if (!(vf->driver_caps &VIRTCHNL_VF_OFFLOAD_FDIR_PF ))return -EINVAL ; -if (vsi_id != vf->lan_vsi_num) -return -EINVAL ; -if (!ice_vc_isvalid_vsi_id (vf, vsi_id))return -EINVAL ;
drivers/net/ethernet/micrel/ks8851_common.c +1 -17
@@ -328,7 +328,6 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) {struct ks8851_net *ks = _ks;struct sk_buff_head rxq; -unsigned handled =0 ;unsigned long flags;unsigned int status;struct sk_buff *skb;
@@ -336,24 +335,17 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)ks8851_lock (ks, &flags); status =ks8851_rdreg16 (ks,KS_ISR ); +ks8851_wrreg16 (ks,KS_ISR , status);netif_dbg (ks, intr, ks->netdev,"%s: status 0x%04x\n" , __func__, status); -if (status &IRQ_LCI ) - handled |=IRQ_LCI ; -if (status &IRQ_LDI ) {u16 pmecr =ks8851_rdreg16 (ks,KS_PMECR ); pmecr &= ~PMECR_WKEVT_MASK ;ks8851_wrreg16 (ks,KS_PMECR , pmecr |PMECR_WKEVT_LINK ); - - handled |=IRQ_LDI ; } -if (status &IRQ_RXPSI ) - handled |=IRQ_RXPSI ; -if (status &IRQ_TXI ) {unsigned short tx_space =ks8851_rdreg16 (ks,KS_TXMIR );
@@ -365,20 +357,12 @@ static irqreturn_t ks8851_irq(int irq, void *_ks)if (netif_queue_stopped (ks->netdev))netif_wake_queue (ks->netdev);spin_unlock (&ks->statelock); - - handled |=IRQ_TXI ; } -if (status &IRQ_RXI ) - handled |=IRQ_RXI ; -if (status &IRQ_SPIBEI ) {netdev_err (ks->netdev,"%s: spi bus error\n" , __func__); - handled |=IRQ_SPIBEI ; } -ks8851_wrreg16 (ks,KS_ISR , handled); -if (status &IRQ_RXI ) {/* the datasheet says to disable the rx interrupt during * packet read-out, however we're masking the interrupt
drivers/net/usb/ax88179_178a.c +26 -11
@@ -174,6 +174,7 @@ struct ax88179_data {u32 wol_supported;u32 wolopts;u8 disconnecting; +u8 initialized; };struct ax88179_int_data {
@@ -1673,6 +1674,18 @@ static int ax88179_reset(struct usbnet *dev)return 0 ; } +static int ax88179_net_reset (struct usbnet *dev) +{ +struct ax88179_data *ax179_data = dev->driver_priv; + +if (ax179_data->initialized) +ax88179_reset (dev); +else + ax179_data->initialized =1 ; + +return 0 ; +} +static int ax88179_stop (struct usbnet *dev) {u16 tmp16;
@@ -1692,6 +1705,7 @@ static const struct driver_info ax88179_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1704,6 +1718,7 @@ static const struct driver_info ax88178a_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1716,7 +1731,7 @@ static const struct driver_info cypress_GX3_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1729,7 +1744,7 @@ static const struct driver_info dlink_dub1312_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1742,7 +1757,7 @@ static const struct driver_info sitecom_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1755,7 +1770,7 @@ static const struct driver_info samsung_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1768,7 +1783,7 @@ static const struct driver_info lenovo_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1781,7 +1796,7 @@ static const struct driver_info belkin_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1794,7 +1809,7 @@ static const struct driver_info toshiba_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1807,7 +1822,7 @@ static const struct driver_info mct_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1820,7 +1835,7 @@ static const struct driver_info at_umc2000_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1833,7 +1848,7 @@ static const struct driver_info at_umc200_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
@@ -1846,7 +1861,7 @@ static const struct driver_info at_umc2000sp_info = { .unbind = ax88179_unbind, .status = ax88179_status, .link_reset = ax88179_link_reset, - .reset = ax88179_reset, + .reset = ax88179_net_reset, .stop = ax88179_stop, .flags = FLAG_ETHER | FLAG_FRAMING_AX, .rx_fixup = ax88179_rx_fixup,
drivers/pinctrl/core.c +11 -3
@@ -205,6 +205,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, const struct pinctrl_pin_desc *pin) {struct pin_desc *pindesc; +int error; pindesc =pin_desc_get (pctldev, pin->number);if (pindesc) {
@@ -226,18 +227,25 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, }else { pindesc->name =kasprintf (GFP_KERNEL ,"PIN%u" , pin->number);if (!pindesc->name) { -kfree (pindesc); -return -ENOMEM ; + error = -ENOMEM ; + goto failed; } pindesc->dynamic_name = true; } pindesc->drv_data = pin->drv_data; -radix_tree_insert (&pctldev->pin_desc_tree, pin->number, pindesc); + error =radix_tree_insert (&pctldev->pin_desc_tree, pin->number, pindesc); +if (error) + goto failed; +pr_debug ("registered pin %d (%s) on %s\n" , pin->number, pindesc->name, pctldev->desc->name);return 0 ; + +failed: +kfree (pindesc); +return error; } static int pinctrl_register_pins(struct pinctrl_dev *pctldev,
drivers/remoteproc/mtk_scp.c +9 -1
@@ -126,7 +126,7 @@ static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp,static int scp_ipi_init (struct mtk_scp *scp,const struct firmware *fw) {int ret; -size_t offset; +size_t buf_sz, offset;/* read the ipi buf addr from FW itself first */ ret =scp_elf_read_ipi_buf_addr (scp, fw, &offset);
@@ -138,6 +138,14 @@ static int scp_ipi_init(struct mtk_scp *scp, const struct firmware *fw) }dev_info (scp->dev,"IPI buf addr %#010zx\n" , offset); +/* Make sure IPI buffer fits in the L2TCM range assigned to this core */ + buf_sz =sizeof (*scp->recv_buf) +sizeof (*scp->send_buf); + +if (scp->sram_size < buf_sz + offset) { +dev_err (scp->dev,"IPI buffer does not fit in SRAM.\n" ); +return -EOVERFLOW ; + } + scp->recv_buf = (struct mtk_share_obj __iomem *) (scp->sram_base + offset); scp->send_buf = (struct mtk_share_obj __iomem *)
drivers/tty/serial/kgdboc.c +29 -1
@@ -19,6 +19,7 @@#include <linux/console.h> #include <linux/vt_kern.h> #include <linux/input.h> +#include <linux/irq_work.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/serial_core.h>
@@ -48,6 +49,25 @@ static struct kgdb_io kgdboc_earlycon_io_ops;static int (*earlycon_orig_exit)(struct console *con);#endif /* IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */ +/* +* When we leave the debug trap handler we need to reset the keyboard status +* (since the original keyboard state gets partially clobbered by kdb use of +* the keyboard). +* +* The path to deliver the reset is somewhat circuitous. +* +* To deliver the reset we register an input handler, reset the keyboard and +* then deregister the input handler. However, to get this done right, we do +* have to carefully manage the calling context because we can only register +* input handlers from task context. +* +* In particular we need to trigger the action from the debug trap handler with +* all its NMI and/or NMI-like oddities. To solve this the kgdboc trap exit code +* (the "post_exception" callback) uses irq_work_queue(), which is NMI-safe, to +* schedule a callback from a hardirq context. From there we have to defer the +* work again, this time using schedule_work(), to get a callback using the +* system workqueue, which runs in task context. +*/ #ifdef CONFIG_KDB_KEYBOARD static int kgdboc_reset_connect(struct input_handler *handler, struct input_dev *dev,
@@ -99,10 +119,17 @@ static void kgdboc_restore_input_helper(struct work_struct *dummy) static DECLARE_WORK(kgdboc_restore_input_work, kgdboc_restore_input_helper); +static void kgdboc_queue_restore_input_helper (struct irq_work *unused) +{ +schedule_work (&kgdboc_restore_input_work); +} + +static DEFINE_IRQ_WORK(kgdboc_restore_input_irq_work, kgdboc_queue_restore_input_helper); +static void kgdboc_restore_input (void ) {if (likely (system_state ==SYSTEM_RUNNING )) -schedule_work (&kgdboc_restore_input_work); +irq_work_queue (&kgdboc_restore_input_irq_work); }static int kgdboc_register_kbd (char **cptr)
@@ -133,6 +160,7 @@ static void kgdboc_unregister_kbd(void) i--; } } +irq_work_sync (&kgdboc_restore_input_irq_work);flush_work (&kgdboc_restore_input_work); }#else /* ! CONFIG_KDB_KEYBOARD */
drivers/usb/dwc3/gadget.c +1 -3
@@ -1708,7 +1708,6 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc)*/ static int __dwc3_stop_active_transfer (struct dwc3_ep *dep,bool force,bool interrupt) { -struct dwc3 *dwc = dep->dwc;struct dwc3_gadget_ep_cmd_params params;u32 cmd;int ret;
@@ -1733,8 +1732,7 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool int dep->resource_index =0 ;if (!interrupt) { - if (!DWC3_IP_IS(DWC3) || DWC3_VER_IS_PRIOR(DWC3, 310A)) -mdelay (1 ); +mdelay (1 ); dep->flags &= ~DWC3_EP_TRANSFER_STARTED ; }else if (!ret) { dep->flags |=DWC3_EP_END_TRANSFER_PENDING ;
drivers/usb/typec/tipd/core.c +32 -13
87 lines not on this page · raw message
drivers/usb/typec/tipd/tps6598x.h +11 -0
@@ -199,4 +199,15 @@#define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_A BIT(2)#define TPS_DATA_STATUS_DP_SPEC_PIN_ASSIGNMENT_B (BIT(2) | BIT(1)) +/* Version Register */ +#define TPS_VERSION_HW_VERSION_MASK GENMASK(31, 24) +#define TPS_VERSION_HW_VERSION (x) TPS_FIELD_GET(TPS_VERSION_HW_VERSION_MASK, (x)) +#define TPS_VERSION_HW_65981_2_6 0x00 +#define TPS_VERSION_HW_65987_8_DH 0xF7 +#define TPS_VERSION_HW_65987_8_DK 0xF9 + +/* Int Event Register length */ +#define TPS_65981_2_6_INTEVENT_LEN 8 +#define TPS_65987_8_INTEVENT_LEN 11 +#endif /* __TPS6598X_H__ */
drivers/usb/typec/ucsi/displayport.c +0 -4
@@ -275,8 +275,6 @@ static void ucsi_displayport_work(struct work_struct *work) struct ucsi_dp *dp = container_of(work, struct ucsi_dp, work);int ret; -mutex_lock (&dp->con->lock); - ret =typec_altmode_vdm (dp->alt, dp->header, dp->vdo_data, dp->vdo_size);if (ret)
@@ -285,8 +283,6 @@ static void ucsi_displayport_work(struct work_struct *work) dp->vdo_data =NULL ; dp->vdo_size =0 ; dp->header =0 ; - -mutex_unlock (&dp->con->lock); }void ucsi_displayport_remove_partner (struct typec_altmode *alt)
fs/iomap/buffered-io.c +253 -1
290 lines not on this page · raw message
fs/iomap/iter.c +18 -1
@@ -7,12 +7,28 @@#include <linux/iomap.h> #include "trace.h" +/* +* Advance to the next range we need to map. +* +* If the iomap is marked IOMAP_F_STALE, it means the existing map was not fully +* processed - it was aborted because the extent the iomap spanned may have been +* changed during the operation. In this case, the iteration behaviour is to +* remap the unprocessed range of the iter, and that means we may need to remap +* even when we've made no progress (i.e. iter->processed = 0). Hence the +* "finished iterating" case needs to distinguish between +* (processed = 0) meaning we are done and (processed = 0 && stale) meaning we +* need to remap the entire remaining range. +*/ static inline int iomap_iter_advance (struct iomap_iter *iter) { +bool stale = iter->iomap.flags &IOMAP_F_STALE ; +/* handle the previous iteration (if any) */ if (iter->iomap.length) { -if (iter->processed <=0 ) +if (iter->processed <0 )return iter->processed; +if (!iter->processed && !stale) +return 0 ;if (WARN_ON_ONCE (iter->processed >iomap_length (iter)))return -EIO ; iter->pos += iter->processed;
@@ -33,6 +49,7 @@ static inline void iomap_iter_done(struct iomap_iter *iter)WARN_ON_ONCE (iter->iomap.offset > iter->pos);WARN_ON_ONCE (iter->iomap.length ==0 );WARN_ON_ONCE (iter->iomap.offset + iter->iomap.length <= iter->pos); +WARN_ON_ONCE (iter->iomap.flags &IOMAP_F_STALE );trace_iomap_iter_dstmap (iter->inode, &iter->iomap);if (iter->srcmap.type !=IOMAP_HOLE )
fs/nfs/callback.c +1 -8
@@ -80,9 +80,6 @@ nfs4_callback_svc(void *vrqstp)set_freezable ();while (!kthread_freezable_should_stop (NULL )) { - -if (signal_pending (current)) -flush_signals (current);/* * Listen for a request on the socket */
@@ -112,11 +109,7 @@ nfs41_callback_svc(void *vrqstp)set_freezable ();while (!kthread_freezable_should_stop (NULL )) { - -if (signal_pending (current)) -flush_signals (current); - -prepare_to_wait (&serv->sv_cb_waitq, &wq,TASK_INTERRUPTIBLE ); +prepare_to_wait (&serv->sv_cb_waitq, &wq,TASK_IDLE );spin_lock_bh (&serv->sv_cb_lock);if (!list_empty (&serv->sv_cb_list)) { req = list_first_entry(&serv->sv_cb_list,
fs/nfsd/nfs4proc.c +2 -3
@@ -1313,12 +1313,11 @@ static __be32 nfsd4_ssc_setup_dul(struct nfsd_net *nn, char *ipaddr,/* found a match */ if (ni->nsui_busy) {/* wait - and try again */ -prepare_to_wait (&nn->nfsd_ssc_waitq, &wait, -TASK_INTERRUPTIBLE ); +prepare_to_wait (&nn->nfsd_ssc_waitq, &wait,TASK_IDLE );spin_unlock (&nn->nfsd_ssc_lock);/* allow 20secs for mount/unmount for now - revisit */ -if (signal_pending (current) || +if (kthread_should_stop () || (schedule_timeout (20 *HZ ) ==0 )) {finish_wait (&nn->nfsd_ssc_waitq, &wait);kfree (work);
fs/nfsd/nfssvc.c +0 -12
@@ -952,15 +952,6 @@ nfsd(void *vrqstp) current->fs->umask =0 ; -/* -* thread is spawned with all signals set to SIG_IGN, re-enable -* the ones that will bring down the thread -*/ -allow_signal (SIGKILL ); -allow_signal (SIGHUP ); -allow_signal (SIGINT ); -allow_signal (SIGQUIT ); -atomic_inc (&nfsdstats.th_cnt);set_freezable ();
@@ -985,9 +976,6 @@ nfsd(void *vrqstp)validate_process_creds (); } -/* Clear signals before calling svc_exit_thread() */ -flush_signals (current); -atomic_dec (&nfsdstats.th_cnt); out:
fs/xfs/libxfs/xfs_bmap.c +5 -3
@@ -4058,7 +4058,7 @@ xfs_bmap_alloc_userdata(* the busy list. */ bma->datatype =XFS_ALLOC_NOBUSY ; -if (whichfork ==XFS_DATA_FORK ) { +if (whichfork ==XFS_DATA_FORK || whichfork ==XFS_COW_FORK ) { bma->datatype |=XFS_ALLOC_USERDATA ;if (bma->offset ==0 ) bma->datatype |=XFS_ALLOC_INITIAL_USER_DATA ;
@@ -4551,7 +4551,8 @@ xfs_bmapi_convert_delalloc(* the extent. Just return the real extent at this offset. */ if (!isnullstartblock (bma.got.br_startblock)) { -xfs_bmbt_to_iomap (ip, iomap, &bma.got,0 , flags); +xfs_bmbt_to_iomap (ip, iomap, &bma.got,0 , flags, +xfs_iomap_inode_sequence (ip, flags)); *seq =READ_ONCE (ifp->if_seq); goto out_trans_cancel; }
@@ -4599,7 +4600,8 @@ xfs_bmapi_convert_delalloc(XFS_STATS_INC (mp, xs_xstrat_quick);ASSERT (!isnullstartblock (bma.got.br_startblock)); -xfs_bmbt_to_iomap (ip, iomap, &bma.got,0 , flags); +xfs_bmbt_to_iomap (ip, iomap, &bma.got,0 , flags, +xfs_iomap_inode_sequence (ip, flags)); *seq =READ_ONCE (ifp->if_seq);if (whichfork ==XFS_COW_FORK )
fs/xfs/libxfs/xfs_errortag.h +5 -7
@@ -40,13 +40,12 @@#define XFS_ERRTAG_REFCOUNT_FINISH_ONE 25#define XFS_ERRTAG_BMAP_FINISH_ONE 26#define XFS_ERRTAG_AG_RESV_CRITICAL 27 +/* -* DEBUG mode instrumentation to test and/or trigger delayed allocation -* block killing in the event of failed writes. When enabled, all -* buffered writes are silenty dropped and handled as if they failed. -* All delalloc blocks in the range of the write (including pre-existing -* delalloc blocks!) are tossed as part of the write failure error -* handling sequence. +* Drop-writes support removed because write error handling cannot trash +* pre-existing delalloc extents in any useful way anymore. We retain the +* definition so that we can reject it as an invalid value in +* xfs_errortag_valid(). */ #define XFS_ERRTAG_DROP_WRITES 28#define XFS_ERRTAG_LOG_BAD_CRC 29
@@ -95,7 +94,6 @@#define XFS_RANDOM_REFCOUNT_FINISH_ONE 1#define XFS_RANDOM_BMAP_FINISH_ONE 1#define XFS_RANDOM_AG_RESV_CRITICAL 4 -#define XFS_RANDOM_DROP_WRITES 1#define XFS_RANDOM_LOG_BAD_CRC 1#define XFS_RANDOM_LOG_ITEM_PIN 1#define XFS_RANDOM_BUF_LRU_REF 2
fs/xfs/libxfs/xfs_refcount.c +130 -16
174 lines not on this page · raw message
fs/xfs/libxfs/xfs_sb.c +5 -2
@@ -266,7 +266,8 @@ xfs_validate_sb_write(return -EFSCORRUPTED ; } -if (xfs_sb_has_ro_compat_feature (sbp,XFS_SB_FEAT_RO_COMPAT_UNKNOWN )) { +if (!xfs_is_readonly (mp) && +xfs_sb_has_ro_compat_feature (sbp,XFS_SB_FEAT_RO_COMPAT_UNKNOWN )) { xfs_alert(mp, "Corruption detected in superblock read-only compatible features (0x%x)!", (sbp->sb_features_ro_compat &
@@ -973,7 +974,9 @@ xfs_log_sb(*/ if (xfs_has_lazysbcount (mp)) { 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_ifree =min_t (uint64_t, +percpu_counter_sum (&mp->m_ifree), + mp->m_sb.sb_icount); mp->m_sb.sb_fdblocks =percpu_counter_sum (&mp->m_fdblocks); }
fs/xfs/xfs_aops.c +20 -17
@@ -114,9 +114,8 @@ xfs_end_ioend(if (unlikely (error)) {if (ioend->io_flags &IOMAP_F_SHARED ) {xfs_reflink_cancel_cow_range (ip, offset, size, true); -xfs_bmap_punch_delalloc_range (ip, -XFS_B_TO_FSBT (mp, offset), -XFS_B_TO_FSB (mp, size)); +xfs_bmap_punch_delalloc_range (ip, offset, + offset + size); } goto done; }
@@ -373,7 +372,7 @@ xfs_map_blocks( isnullstartblock(imap.br_startblock)) goto allocate_blocks; -xfs_bmbt_to_iomap (ip, &wpc->iomap, &imap,0 ,0 ); +xfs_bmbt_to_iomap (ip, &wpc->iomap, &imap,0 ,0 ,XFS_WPC (wpc)->data_seq);trace_xfs_map_blocks_found (ip, offset, count, whichfork, &imap);return 0 ; allocate_blocks:
@@ -440,27 +439,25 @@ xfs_prepare_ioend( }/* -* If the page has delalloc blocks on it, we need to punch them out before we -* invalidate the page. If we don't, we leave a stale delalloc mapping on the -* inode that can trip up a later direct I/O read operation on the same region. +* If the folio has delalloc blocks on it, the caller is asking us to punch them +* out. If we don't, we can leave a stale delalloc mapping covered by a clean +* page that needs to be dirtied again before the delalloc mapping can be +* converted. This stale delalloc mapping can trip up a later direct I/O read +* operation on the same region. * -* We prevent this by truncating away the delalloc regions on the page. Because +* We prevent this by truncating away the delalloc regions on the folio. Because * they are delalloc, we can do this without needing a transaction. Indeed - if * we get ENOSPC errors, we have to be able to do this truncation without a -* transaction as there is no space left for block reservation (typically why we -* see a ENOSPC in writeback). +* transaction as there is no space left for block reservation (typically why +* we see a ENOSPC in writeback). */ static void xfs_discard_folio (struct folio *folio,loff_t pos) { -struct inode *inode = folio->mapping->host; -struct xfs_inode *ip =XFS_I (inode); +struct xfs_inode *ip =XFS_I (folio->mapping->host);struct xfs_mount *mp = ip->i_mount; -size_t offset =offset_in_folio (folio, pos); -xfs_fileoff_t start_fsb =XFS_B_TO_FSBT (mp, pos); -xfs_fileoff_t pageoff_fsb =XFS_B_TO_FSBT (mp, offset);int error;if (xfs_is_shutdown (mp))
@@ -470,8 +467,14 @@ xfs_discard_folio("page discard on page " PTR_FMT ", inode 0x%llx, pos %llu." , folio, ip->i_ino, pos); - error =xfs_bmap_punch_delalloc_range (ip, start_fsb, -i_blocks_per_folio (inode, folio) - pageoff_fsb); +/* +* The end of the punch range is always the offset of the the first +* byte of the next folio. Hence the end offset is only dependent on the +* folio itself and not the start offset that is passed in. +*/ + error =xfs_bmap_punch_delalloc_range (ip, pos, +folio_pos (folio) +folio_size (folio)); +if (error && !xfs_is_shutdown (mp))xfs_alert (mp,"page discard unable to remove delalloc mapping." ); }
fs/xfs/xfs_bmap_util.c +6 -4
@@ -590,11 +590,13 @@ xfs_getbmap(int xfs_bmap_punch_delalloc_range (struct xfs_inode *ip, -xfs_fileoff_t start_fsb, -xfs_fileoff_t length) +xfs_off_t start_byte, +xfs_off_t end_byte) { +struct xfs_mount *mp = ip->i_mount;struct xfs_ifork *ifp = &ip->i_df; -xfs_fileoff_t end_fsb = start_fsb + length; +xfs_fileoff_t start_fsb =XFS_B_TO_FSBT (mp, start_byte); +xfs_fileoff_t end_fsb =XFS_B_TO_FSB (mp, end_byte);struct xfs_bmbt_irec got, del;struct xfs_iext_cursor icur;int error =0 ;
@@ -607,7 +609,7 @@ xfs_bmap_punch_delalloc_range(while (got.br_startoff + got.br_blockcount > start_fsb) { del = got; -xfs_trim_extent (&del, start_fsb, length); +xfs_trim_extent (&del, start_fsb, end_fsb - start_fsb);/* * A delete can push the cursor forward. Step back to the
fs/xfs/xfs_bmap_util.h +1 -1
@@ -31,7 +31,7 @@ xfs_bmap_rtalloc(struct xfs_bmalloca *ap)#endif /* CONFIG_XFS_RT */ int xfs_bmap_punch_delalloc_range (struct xfs_inode *ip, -xfs_fileoff_t start_fsb,xfs_fileoff_t length); +xfs_off_t start_byte,xfs_off_t end_byte);struct kgetbmap {__s64 bmv_offset;/* file offset of segment in blocks */
fs/xfs/xfs_buf.c +1 -0
@@ -1945,6 +1945,7 @@ xfs_free_buftarg(list_lru_destroy (&btp->bt_lru);blkdev_issue_flush (btp->bt_bdev); +invalidate_bdev (btp->bt_bdev);fs_put_dax (btp->bt_daxdev, btp->bt_mount);kmem_free (btp);
fs/xfs/xfs_buf_item.c +2 -0
@@ -1018,6 +1018,8 @@ xfs_buf_item_relse(trace_xfs_buf_item_relse (bp, _RET_IP_);ASSERT (!test_bit (XFS_LI_IN_AIL , &bip->bli_item.li_flags)); +if (atomic_read (&bip->bli_refcount)) +return ; bp->b_log_item =NULL ;xfs_buf_rele (bp);xfs_buf_item_free (bip);
fs/xfs/xfs_error.c +20 -7
@@ -46,7 +46,7 @@ static unsigned int xfs_errortag_random_default[] = {XFS_RANDOM_REFCOUNT_FINISH_ONE ,XFS_RANDOM_BMAP_FINISH_ONE ,XFS_RANDOM_AG_RESV_CRITICAL , -XFS_RANDOM_DROP_WRITES , +0 ,/* XFS_RANDOM_DROP_WRITES has been removed */ XFS_RANDOM_LOG_BAD_CRC ,XFS_RANDOM_LOG_ITEM_PIN , XFS_RANDOM_BUF_LRU_REF,
@@ -162,7 +162,6 @@ XFS_ERRORTAG_ATTR_RW(refcount_continue_update, XFS_ERRTAG_REFCOUNT_CONTINUE_UPDAXFS_ERRORTAG_ATTR_RW (refcount_finish_one,XFS_ERRTAG_REFCOUNT_FINISH_ONE );XFS_ERRORTAG_ATTR_RW (bmap_finish_one,XFS_ERRTAG_BMAP_FINISH_ONE );XFS_ERRORTAG_ATTR_RW (ag_resv_critical,XFS_ERRTAG_AG_RESV_CRITICAL ); -XFS_ERRORTAG_ATTR_RW (drop_writes,XFS_ERRTAG_DROP_WRITES );XFS_ERRORTAG_ATTR_RW (log_bad_crc,XFS_ERRTAG_LOG_BAD_CRC );XFS_ERRORTAG_ATTR_RW (log_item_pin,XFS_ERRTAG_LOG_ITEM_PIN );XFS_ERRORTAG_ATTR_RW (buf_lru_ref,XFS_ERRTAG_BUF_LRU_REF );
@@ -206,7 +205,6 @@ static struct attribute *xfs_errortag_attrs[] = {XFS_ERRORTAG_ATTR_LIST (refcount_finish_one),XFS_ERRORTAG_ATTR_LIST (bmap_finish_one),XFS_ERRORTAG_ATTR_LIST (ag_resv_critical), -XFS_ERRORTAG_ATTR_LIST (drop_writes),XFS_ERRORTAG_ATTR_LIST (log_bad_crc),XFS_ERRORTAG_ATTR_LIST (log_item_pin), XFS_ERRORTAG_ATTR_LIST(buf_lru_ref),
@@ -256,6 +254,19 @@ xfs_errortag_del(kmem_free (mp->m_errortag); } +static bool +xfs_errortag_valid ( +unsigned int error_tag) +{ +if (error_tag >=XFS_ERRTAG_MAX ) +return false; + +/* Error out removed injection types */ +if (error_tag ==XFS_ERRTAG_DROP_WRITES ) +return false; +return true; +} + bool xfs_errortag_test( struct xfs_mount *mp,
@@ -277,7 +288,9 @@ xfs_errortag_test(if (!mp->m_errortag)return false; -ASSERT (error_tag <XFS_ERRTAG_MAX ); +if (!xfs_errortag_valid (error_tag)) +return false; + randfactor = mp->m_errortag[error_tag];if (!randfactor ||prandom_u32_max (randfactor))return false;
@@ -293,7 +306,7 @@ xfs_errortag_get( struct xfs_mount *mp, unsigned int error_tag) { -if (error_tag >=XFS_ERRTAG_MAX ) +if (!xfs_errortag_valid (error_tag))return -EINVAL ;return mp->m_errortag[error_tag];
@@ -305,7 +318,7 @@ xfs_errortag_set( unsigned int error_tag, unsigned int tag_value) { -if (error_tag >=XFS_ERRTAG_MAX ) +if (!xfs_errortag_valid (error_tag))return -EINVAL ; mp->m_errortag[error_tag] = tag_value;
@@ -319,7 +332,7 @@ xfs_errortag_add( {BUILD_BUG_ON (ARRAY_SIZE (xfs_errortag_random_default) !=XFS_ERRTAG_MAX ); -if (error_tag >=XFS_ERRTAG_MAX ) +if (!xfs_errortag_valid (error_tag))return -EINVAL ; return xfs_errortag_set(mp, error_tag,
fs/xfs/xfs_file.c +1 -1
@@ -1325,7 +1325,7 @@ __xfs_filemap_fault(if (write_fault) {xfs_ilock (XFS_I (inode),XFS_MMAPLOCK_SHARED ); ret =iomap_page_mkwrite (vmf, - &xfs_buffered_write_iomap_ops); + &xfs_page_mkwrite_iomap_ops);xfs_iunlock (XFS_I (inode),XFS_MMAPLOCK_SHARED ); }else { ret =filemap_fault (vmf);
fs/xfs/xfs_fsops.c +4 -0
@@ -129,6 +129,10 @@ xfs_growfs_data_private(if (delta <0 && nagcount <2 )return -EINVAL ; +/* No work to do */ +if (delta ==0 ) +return 0 ; + oagcount = mp->m_sb.sb_agcount;/* allocate the new per-ag structures */ if (nagcount > oagcount) {
fs/xfs/xfs_icache.c +6 -0
@@ -342,6 +342,9 @@ xfs_iget_recycle(trace_xfs_iget_recycle (ip); +if (!xfs_ilock_nowait (ip,XFS_ILOCK_EXCL )) +return -EAGAIN ; +/* * We need to make it look like the inode is being reclaimed to prevent * the actual reclaim workers from stomping over us while we recycle
@@ -355,6 +358,7 @@ xfs_iget_recycle(ASSERT (!rwsem_is_locked (&inode->i_rwsem)); error =xfs_reinit_inode (mp, inode); +xfs_iunlock (ip,XFS_ILOCK_EXCL );if (error) {/* * Re-initializing the inode failed, and we are in deep
@@ -523,6 +527,8 @@ xfs_iget_cache_hit(if (ip->i_flags &XFS_IRECLAIMABLE ) {/* Drops i_flags_lock and RCU read lock. */ error =xfs_iget_recycle (pag, ip); +if (error == -EAGAIN ) + goto out_skip;if (error)return error; }else {
fs/xfs/xfs_inode.c +11 -5
@@ -1652,8 +1652,11 @@ xfs_inode_needs_inactive(if (VFS_I (ip)->i_mode ==0 )return false; -/* If this is a read-only mount, don't do this (would generate I/O) */ -if (xfs_is_readonly (mp)) +/* +* If this is a read-only mount, don't do this (would generate I/O) +* unless we're in log recovery and cleaning the iunlinked list. +*/ +if (xfs_is_readonly (mp) && !xlog_recovery_needed (mp->m_log))return false;/* If the log isn't running, push inodes straight to reclaim. */
@@ -1713,8 +1716,11 @@ xfs_inactive( mp = ip->i_mount;ASSERT (!xfs_iflags_test (ip,XFS_IRECOVERY )); -/* If this is a read-only mount, don't do this (would generate I/O) */ -if (xfs_is_readonly (mp)) +/* +* If this is a read-only mount, don't do this (would generate I/O) +* unless we're in log recovery and cleaning the iunlinked list. +*/ +if (xfs_is_readonly (mp) && !xlog_recovery_needed (mp->m_log)) goto out;/* Metadata inodes require explicit resource cleanup. */
@@ -2479,7 +2485,7 @@ xfs_remove( error =xfs_dir_replace (tp, ip, &xfs_name_dotdot, tp->t_mountp->m_sb.sb_rootino,0 );if (error) -return error; + goto out_trans_cancel; } }else {/*
fs/xfs/xfs_ioctl.c +2 -2
@@ -754,7 +754,7 @@ xfs_bulkstat_fmt(static int xfs_bulk_ireq_setup (struct xfs_mount *mp, -struct xfs_bulk_ireq *hdr, +const struct xfs_bulk_ireq *hdr,struct xfs_ibulk *breq,void __user *ubuffer) {
@@ -780,7 +780,7 @@ xfs_bulk_ireq_setup(switch (hdr->ino) {case XFS_BULK_IREQ_SPECIAL_ROOT : - hdr->ino = mp->m_sb.sb_rootino; + breq->startino = mp->m_sb.sb_rootino;break ;default :return -EINVAL ;
fs/xfs/xfs_iomap.c +106 -71
352 lines not on this page · raw message
fs/xfs/xfs_iomap.h +4 -2
@@ -13,14 +13,15 @@ struct xfs_bmbt_irec;int xfs_iomap_write_direct (struct xfs_inode *ip,xfs_fileoff_t offset_fsb,xfs_fileoff_t count_fsb,unsigned int flags, -struct xfs_bmbt_irec *imap); +struct xfs_bmbt_irec *imap,u64 *sequence);int xfs_iomap_write_unwritten (struct xfs_inode *,xfs_off_t ,xfs_off_t ,bool );xfs_fileoff_t xfs_iomap_eof_align_last_fsb (struct xfs_inode *ip,xfs_fileoff_t end_fsb); +u64 xfs_iomap_inode_sequence (struct xfs_inode *ip,u16 iomap_flags);int xfs_bmbt_to_iomap (struct xfs_inode *ip,struct iomap *iomap,struct xfs_bmbt_irec *imap,unsigned int mapping_flags, -u16 iomap_flags); +u16 iomap_flags,u64 sequence_cookie);int xfs_zero_range (struct xfs_inode *ip,loff_t pos,loff_t len,bool *did_zero);
@@ -47,6 +48,7 @@ xfs_aligned_fsb_count( }extern const struct iomap_ops xfs_buffered_write_iomap_ops; +extern const struct iomap_ops xfs_page_mkwrite_iomap_ops;extern const struct iomap_ops xfs_direct_write_iomap_ops;extern const struct iomap_ops xfs_read_iomap_ops;extern const struct iomap_ops xfs_seek_iomap_ops;
fs/xfs/xfs_log.c +25 -28
96 lines not on this page · raw message
fs/xfs/xfs_mount.c +15 -0
@@ -538,6 +538,20 @@ xfs_check_summary_counts(return 0 ; } +static void +xfs_unmount_check ( +struct xfs_mount *mp) +{ +if (xfs_is_shutdown (mp)) +return ; + +if (percpu_counter_sum (&mp->m_ifree) > +percpu_counter_sum (&mp->m_icount)) { +xfs_alert (mp,"ifree/icount mismatch at unmount" ); +xfs_fs_mark_sick (mp,XFS_SICK_FS_COUNTERS ); + } +} +/* * Flush and reclaim dirty inodes in preparation for unmount. Inodes and * internal inode structures can be sitting in the CIL and AIL at this point,
@@ -1077,6 +1091,7 @@ xfs_unmountfs(if (error)xfs_warn (mp,"Unable to free reserved block pool. " "Freespace may not be correct on next mount." ); +xfs_unmount_check (mp);xfs_log_unmount (mp);xfs_da_unmount (mp);
fs/xfs/xfs_pnfs.c +4 -2
@@ -125,6 +125,7 @@ xfs_fs_map_blocks(int nimaps =1 ;uint lock_flags;int error =0 ; +u64 seq;if (xfs_is_shutdown (mp))return -EIO ;
@@ -176,6 +177,7 @@ xfs_fs_map_blocks( lock_flags =xfs_ilock_data_map_shared (ip); error =xfs_bmapi_read (ip, offset_fsb, end_fsb - offset_fsb, &imap, &nimaps, bmapi_flags); + seq =xfs_iomap_inode_sequence (ip,0 );ASSERT (!nimaps || imap.br_startblock !=DELAYSTARTBLOCK );
@@ -189,7 +191,7 @@ xfs_fs_map_blocks(xfs_iunlock (ip, lock_flags); error =xfs_iomap_write_direct (ip, offset_fsb, - end_fsb - offset_fsb,0 , &imap); + end_fsb - offset_fsb,0 , &imap, &seq);if (error) goto out_unlock;
@@ -209,7 +211,7 @@ xfs_fs_map_blocks( }xfs_iunlock (ip,XFS_IOLOCK_EXCL ); - error =xfs_bmbt_to_iomap (ip, iomap, &imap,0 ,0 ); + error =xfs_bmbt_to_iomap (ip, iomap, &imap,0 ,0 , seq); *device_generation = mp->m_generation;return error; out_unlock:
include/linux/iomap.h +39 -8
83 lines not on this page · raw message
net/sunrpc/svc_xprt.c +6 -10
@@ -696,8 +696,8 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)/* Made progress, don't sleep yet */ continue ; -set_current_state (TASK_INTERRUPTIBLE ); -if (signalled () ||kthread_should_stop ()) { +set_current_state (TASK_IDLE ); +if (kthread_should_stop ()) {set_current_state (TASK_RUNNING );return -EINTR ; }
@@ -733,7 +733,7 @@ rqst_should_sleep(struct svc_rqst *rqstp)return false;/* are we shutting down? */ -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ())return false;/* are we freezing? */
@@ -755,11 +755,7 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)if (rqstp->rq_xprt) goto out_found; -/* -* We have to be able to interrupt this wait -* to bring down the daemons ... -*/ -set_current_state (TASK_INTERRUPTIBLE ); +set_current_state (TASK_IDLE );smp_mb__before_atomic ();clear_bit (SP_CONGESTED , &pool->sp_flags);clear_bit (RQ_BUSY , &rqstp->rq_flags);
@@ -781,7 +777,7 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)if (!time_left)atomic_long_inc (&pool->sp_stats.threads_timedout); -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ())return ERR_PTR (-EINTR );return ERR_PTR (-EAGAIN ); out_found:
@@ -879,7 +875,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)try_to_freeze ();cond_resched (); err = -EINTR ; -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ()) goto out; xprt =svc_get_next_xprt (rqstp, timeout);
security/keys/trusted-keys/trusted_tpm2.c +19 -6
@@ -38,6 +38,7 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,u8 *end_work = scratch +SCRATCH_SIZE ;u8 *priv, *pub;u16 priv_len, pub_len; +int ret; priv_len =get_unaligned_be16 (src) +2 ; priv = src;
@@ -57,8 +58,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,unsigned char bool[3 ], *w = bool;/* tag 0 is emptyAuth */ w =asn1_encode_boolean (w, w +sizeof (bool ), true); -if (WARN (IS_ERR (w),"BUG: Boolean failed to encode" )) -return PTR_ERR (w); +if (WARN (IS_ERR (w),"BUG: Boolean failed to encode" )) { + ret =PTR_ERR (w); + goto err; + } work =asn1_encode_tag (work, end_work,0 , bool, w - bool); }
@@ -69,8 +72,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,* trigger, so if it does there's something nefarious going on */ if (WARN (work - scratch + pub_len + priv_len +14 >SCRATCH_SIZE , -"BUG: scratch buffer is too small" )) -return -EINVAL ; +"BUG: scratch buffer is too small" )) { + ret = -EINVAL ; + goto err; + } work =asn1_encode_integer (work, end_work, options->keyhandle); work =asn1_encode_octet_string (work, end_work, pub, pub_len);
@@ -79,10 +84,18 @@ static int tpm2_key_encode(struct trusted_key_payload *payload, work1 = payload->blob; work1 =asn1_encode_sequence (work1, work1 +sizeof (payload->blob), scratch, work - scratch); -if (WARN (IS_ERR (work1),"BUG: ASN.1 encoder failed" )) -return PTR_ERR (work1); +if (IS_ERR (work1)) { + ret =PTR_ERR (work1); +pr_err ("BUG: ASN.1 encoder failed with %d\n" , ret); + goto err; + } +kfree (scratch);return work1 - payload->blob; + +err: +kfree (scratch); +return ret; }struct tpm2_key_context {