Linux 6.6.153
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.6.153 kernel.
All users of the 6.6 kernel series must upgrade.
The updated 6.6.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.6.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/Kconfig | 1 arch/arm64/boot/dts/nvidia/tegra194.dtsi | 2 arch/m68k/Kconfig | 7 - arch/m68k/Kconfig.cpu | 16 +++ arch/m68k/kernel/Makefile | 2 arch/m68k/kernel/dma.c | 2 arch/openrisc/include/asm/processor.h | 2 arch/openrisc/kernel/dma.c | 4 arch/openrisc/kernel/signal.c | 5 - arch/parisc/Kconfig | 1 arch/powerpc/platforms/pseries/lparcfg.c | 2 arch/powerpc/platforms/pseries/pci.c | 2 arch/riscv/include/asm/pgtable-32.h | 3 arch/riscv/include/asm/pgtable.h | 1 arch/riscv/mm/init.c | 2 arch/riscv/mm/pageattr.c | 8 - arch/x86/kvm/svm/sev.c | 34 +++++-- arch/x86/kvm/svm/svm.h | 1 block/genhd.c | 12 +- crypto/ccm.c | 2 drivers/crypto/qce/core.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 34 ++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 21 ++++ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 10 -- drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 85 ++++--------------- drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 26 +++++ drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 27 +++++- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 16 --- drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h | 6 - drivers/gpu/drm/radeon/radeon_kms.c | 1 drivers/i2c/busses/i2c-bcm-iproc.c | 11 ++ drivers/input/joystick/iforce/iforce-packets.c | 11 ++ drivers/input/joystick/iforce/iforce-usb.c | 3 drivers/input/joystick/psxpad-spi.c | 1 drivers/input/joystick/xpad.c | 2 drivers/input/keyboard/atkbd.c | 8 + drivers/input/mouse/focaltech.c | 2 drivers/input/rmi4/rmi_f54.c | 43 +++++++-- drivers/input/rmi4/rmi_f55.c | 4 drivers/input/touchscreen/hynitron_cstxxx.c | 13 ++ drivers/input/touchscreen/sur40.c | 23 ++--- drivers/mmc/host/omap_hsmmc.c | 2 drivers/mmc/host/sdhci.c | 16 +++ drivers/mmc/host/sdhci.h | 2 drivers/net/can/rcar/rcar_canfd.c | 28 +++--- drivers/net/ethernet/intel/ice/ice_vf_lib.c | 27 ++++++ drivers/net/ethernet/intel/ice/ice_vf_lib_private.h | 1 drivers/net/ethernet/intel/ice/ice_virtchnl.c | 21 ++++ drivers/net/ethernet/intel/igc/igc_main.c | 1 drivers/net/ethernet/microsoft/mana/mana_en.c | 4 drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 drivers/net/ipvlan/ipvlan_main.c | 4 drivers/net/macvlan.c | 4 drivers/net/veth.c | 4 drivers/net/vrf.c | 49 +++-------- drivers/net/vxlan/vxlan_core.c | 45 ++++------ drivers/net/vxlan/vxlan_mdb.c | 4 drivers/s390/cio/vfio_ccw_async.c | 16 +++ drivers/s390/cio/vfio_ccw_chp.c | 17 +++ drivers/s390/cio/vfio_ccw_cp.c | 31 ++++--- drivers/s390/cio/vfio_ccw_cp.h | 8 + drivers/s390/cio/vfio_ccw_drv.c | 15 ++- drivers/s390/cio/vfio_ccw_fsm.c | 8 + drivers/s390/cio/vfio_ccw_ops.c | 35 +++++++ drivers/s390/cio/vfio_ccw_private.h | 6 + drivers/s390/net/qeth_core_main.c | 3 drivers/s390/net/qeth_l3_main.c | 5 + drivers/video/fbdev/core/fb_io_fops.c | 8 + fs/binfmt_elf.c | 4 fs/binfmt_elf_fdpic.c | 4 fs/binfmt_misc.c | 14 ++- fs/btrfs/block-group.c | 61 ++++++++----- fs/btrfs/block-group.h | 3 fs/btrfs/extent-tree.c | 6 - fs/btrfs/messages.h | 7 + fs/btrfs/space-info.c | 2 fs/btrfs/transaction.c | 5 - fs/btrfs/zoned.c | 5 - fs/btrfs/zoned.h | 6 - fs/ceph/addr.c | 54 +++--------- fs/ceph/caps.c | 17 +++ fs/ceph/file.c | 9 +- fs/ceph/mds_client.c | 11 ++ fs/ceph/mds_client.h | 2 fs/ceph/mdsmap.c | 2 fs/erofs/Kconfig | 3 fs/exec.c | 6 - fs/f2fs/data.c | 2 fs/iomap/buffered-io.c | 42 +++++---- fs/smb/client/cifsglob.h | 27 ------ fs/smb/client/cifssmb.c | 6 - fs/smb/client/connect.c | 2 fs/smb/client/transport.c | 8 - fs/smb/common/cifsglob.h | 36 ++++++++ fs/smb/server/auth.c | 4 fs/smb/server/connection.c | 23 +++-- fs/smb/server/connection.h | 5 + fs/smb/server/oplock.c | 8 - fs/smb/server/smb2misc.c | 2 fs/smb/server/smb2ops.c | 32 +++---- fs/smb/server/smb2pdu.c | 88 +++++++++----------- fs/smb/server/smb2pdu.h | 9 -- fs/smb/server/smb_common.c | 43 +++++++-- fs/smb/server/smb_common.h | 43 ++------- fs/super.c | 22 +++-- fs/userfaultfd.c | 20 ++-- fs/xfs/libxfs/xfs_sb.c | 4 fs/xfs/scrub/alloc.c | 5 - fs/xfs/xfs_dquot.c | 3 fs/xfs/xfs_dquot_item_recover.c | 2 include/asm-generic/pgtable_uffd.h | 17 +++ include/linux/fs.h | 12 ++ include/linux/mm_inline.h | 7 - include/linux/mmap_lock.h | 4 include/linux/netdevice.h | 52 ++++++++++- include/linux/pagewalk.h | 7 - include/linux/userfaultfd_k.h | 19 ---- include/net/dropreason-core.h | 21 ++++ include/net/gro.h | 1 include/net/ip_vs.h | 7 + include/net/pkt_cls.h | 16 +++ include/net/pkt_sched.h | 3 include/net/sch_generic.h | 2 include/net/tcp.h | 58 ++++++------- include/uapi/linux/ip_vs.h | 6 - kernel/dma/Kconfig | 9 ++ kernel/dma/direct.c | 12 -- kernel/fork.c | 12 +- kernel/trace/ftrace.c | 9 +- kernel/trace/ring_buffer.c | 23 ++--- mm/huge_memory.c | 43 ++++++--- mm/internal.h | 7 + mm/migrate_device.c | 5 - mm/pagewalk.c | 82 ++++++++++++++++-- mm/ptdump.c | 10 ++ mm/userfaultfd.c | 26 +++++ mm/vmalloc.c | 49 +++++++++-- net/ceph/cls_lock_client.c | 21 +++- net/ceph/decode.c | 18 ++-- net/ceph/osdmap.c | 9 +- net/core/dev.c | 29 +++++- net/core/gro.c | 31 +++++++ net/core/pktgen.c | 43 +++++---- net/ipv4/bpf_tcp_ca.c | 2 net/ipv4/tcp_dctcp.h | 2 net/ipv4/tcp_input.c | 56 +++++++++--- net/ipv4/tcp_minisocks.c | 12 ++ net/ipv4/tcp_output.c | 6 - net/ipv4/udp_offload.c | 29 ------ net/mptcp/fastopen.c | 7 - net/mptcp/options.c | 67 ++++++++++++++- net/mptcp/protocol.h | 1 net/netfilter/ipset/ip_set_bitmap_gen.h | 2 net/netfilter/ipset/ip_set_core.c | 19 ++-- net/netfilter/ipset/ip_set_list_set.c | 10 +- net/netfilter/ipvs/ip_vs_conn.c | 4 net/netfilter/ipvs/ip_vs_core.c | 6 - net/netfilter/ipvs/ip_vs_ctl.c | 4 net/netfilter/ipvs/ip_vs_dh.c | 4 net/netfilter/ipvs/ip_vs_lblc.c | 2 net/netfilter/ipvs/ip_vs_lblcr.c | 8 - net/netfilter/nf_flow_table_core.c | 7 - net/netfilter/nf_tables_offload.c | 2 net/packet/af_packet.c | 27 ++---- net/sched/act_api.c | 13 +- net/sched/cls_api.c | 32 +++++-- net/sched/cls_bpf.c | 18 +++- net/sched/cls_u32.c | 3 net/sched/sch_api.c | 24 ++++- net/tls/tls_sw.c | 5 + net/x25/af_x25.c | 4 net/x25/x25_timer.c | 25 +++-- security/selinux/ss/policydb.c | 31 +++++++ security/selinux/ss/services.c | 28 +++++- sound/soc/codecs/cs35l41-lib.c | 2 sound/soc/codecs/cs35l45-tables.c | 32 +++---- sound/soc/codecs/cs4265.c | 4 sound/soc/codecs/lpass-wsa-macro.c | 8 - sound/soc/codecs/tas2562.c | 9 +- sound/soc/fsl/fsl_sai.c | 29 +++++- sound/soc/sof/sof-audio.c | 9 -- sound/soc/xilinx/xlnx_formatter_pcm.c | 10 -- tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 184 files changed, 1786 insertions(+), 934 deletions(-)
Aldo Ariel Panzardo (1):
net/sched: serialize qdisc_rtab_list against concurrent get/put
Alexey Velichayshiy (1):
netfilter: nf_tables_offload: suppress WARN_ON_ONCE for ENOMEM in abort path
Ali Ahmet Memis (1):
openrisc: signal: do not restore privileged SR bits on sigreturn
Amir Goldstein (1):
fs: don't block write during exec on pre-content watched files
Andy Shevchenko (1):
libceph: Amend checking to fix make W=1 build breakage
Asad Kamal (1):
drm/amdgpu: fix aperture iounmap skipped on device removal
Baul Lee (1):
net/x25: fix use-after-free of the socket by its timers
Breno Leitao (1):
vxlan: Do not alloc tstats manually
Bryam Vargas (5):
selinux: require every boolean value to be defined
selinux: reject a class permission count below its inherited common
selinux: do not cancel a policy conversion that never started
selinux: reject an unclaimed class value in security_get_classes()
Input: synaptics-rmi4 - bound the F54 report size to the allocated buffer
Candice Li (1):
drm/amdgpu: validate GEM_CREATE domain combinations
Chancel Liu (1):
ASoC: fsl_sai: Fix spurious BCLK on resume by clearing BYP
Chao Shi (1):
block: stop the timeout timer when releasing a never added disk
Chao Yu (1):
f2fs: fix UAF issue in f2fs_merge_page_bio()
ChenXiaoSong (3):
smb/server: rename include guard in smb_common.h smb/server: fix minimum SMB1 PDU size smb/server: fix minimum SMB2 PDU size
Chengfeng Ye (1):
net: pktgen: fix proc entry use-after-free
Christian Brauner (3):
super: fix emergency thaw deadlock on frozen block devices
binfmt_misc: restore write access when removing an entry
binfmt_misc: use exe_file_deny_write_access() for the interpreter clone
Christoph Hellwig (3):
xfs: check v5 superblock features early
dma-direct: add a CONFIG_ARCH_HAS_DMA_ALLOC symbol
m68k: use the coherent DMA code for coldfire without data cache
Chuck Lever (1):
net/tls: Fail tls_sw_splice_read() after a failed async decrypt
Chunyan Zhang (1):
mm: userfaultfd: add pgtable_supports_uffd_wp()
Daniel Borkmann (2):
net, sched: Make tc-related drop reason more flexible net, sched: Add tcf_set_drop_reason for {__,}tcf_classify
Darrick J. Wong (1):
xfs: only check mergeability of bnobt records
David Carlier (1):
igc: remove napi_synchronize() in igc_down()
David Rosca (6):
drm/amdgpu: Reject UVD message with invalid number of h265 refs drm/amdgpu: Reject UVD message with dimensions above 4096 drm/amdgpu: Implement insert_end for VCE 3 drm/amdgpu: Fix UVD min buffer sizes
drm/amdgpu: Fix UVD dpb min size calculation for H264 drm/amdgpu: Fix UVD decode image min size calculation
David Sterba (1):
btrfs: add debug build only WARN
Dawid Osuchowski (1):
ice: fix VF interrupts cleanup
Dawid Wróbel (1):
ASoC: codecs: lpass-wsa-macro: Fix enum kcontrol accesses
Dmitry Torokhov (6):
Input: synaptics-rmi4 - fix F55 transmitter electrode count typo
Input: synaptics-rmi4 - zero report size on F54 work error
Input: synaptics-rmi4 - block s_input when F54 queue is busy
Input: synaptics-rmi4 - propagate F54 worker errors to V4L2 queue
Input: sur40 - fix input device registration ordering
Input: sur40 - fix V4L error path cleanup
Eric Dumazet (4):
vxlan: use pskb_network_may_pull() for transmit path header pulls
ipvlan: inherit needed_headroom and needed_tailroom from phy_dev
macvlan: inherit needed_headroom and needed_tailroom from lowerdev
af_packet: Don't send zero-byte data in tpacket_snd().
Eric Farman (6):
s390/vfio_ccw: Limit the number of channel program segments s390/vfio_ccw: Cancel existing workqueues s390/vfio_ccw: Ensure index for read/write regions are within range s390/vfio_ccw: Fix out of bounds check on CCW array s390/vfio_ccw: Move cp cleanup out of not operational s390/vfio_ccw: Selectively expand io_mutex
Erni Sri Satya Vennela (1):
net: mana: Fix EQ leak in mana_remove on NULL port
Felix Fietkau (1):
net: move skb_gro_receive_list from udp to core
Filipe Manana (1):
btrfs: remove fs_info argument from btrfs_zoned_activate_one_bg()
Florian Westphal (2):
netfilter: ipset: fix list type element drift bug
netfilter: ipset: let destroy callbacks adjust ext mem size
Gang Yan (1):
selftests: mptcp: join: mark tests with data corruption as failed
Gao Xiang (1):
erofs: fix EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS on some UP platforms
George Wilson (2):
powerpc/pseries: pci - logic bug powerpc/pseries: lparcfg - fix kbuf[] underflow
Greg Kroah-Hartman (1):
Linux 6.6.153
Guanghui Yang (1):
btrfs: zoned: fix missing chunk metadata reservation
Guangshuo Li (1):
drm/radeon: fix autosuspend cleanup during teardown
Guillaume Nault (2):
vrf: Make pcpu_dstats update functions available to other modules.
vxlan: Handle stats using NETDEV_PCPU_STAT_DSTATS.
Haibo Chen (1):
mmc: sdhci: make tuning_err a signed int
Herbert Xu (1):
crypto: ccm - Set rfc4309 maxauthsize from child
Hidayath Khan (1):
s390/qeth: validate user buffer length in SNMP and ARP query ioctls
Ilpo Järvinen (2):
tcp: Pass flags to __tcp_send_ack
tcp: fast path functions later
Jamal Hadi Salim (3):
net, sched: Fix SKB_NOT_DROPPED_YET splat under debug config net/sched: act_api: fix TOCTOU NULL deref on a->goto_chain net/sched: cls_bpf: reject dev-bound programs bound to a different device
Jeremy Kerr (1):
net: core,vrf: Change pcpu_dstat fields to u64_stats_t
Jianing Li (1):
Input: hynitron_cstxxx - validate touch count and finger IDs
Jon Hunter (1):
arm64: tegra: Add EL2 virtual timer interrupt for Tegra194
Jonas Gorski (1):
i2c: iproc: reset bus after timeout if START_BUSY is stuck
Josh Poimboeuf (1):
ftrace: Fix off-by-one fentry site disable in ftrace_free_mem()
Junrui Luo (1):
drm/amdgpu: disallow multiple FENCE chunks in one submit
Jérémy Jean (1):
netfilter: flowtable: publish GC-visible tuple last
Kefeng Wang (1):
mm: migrate_device: fix pte_pfn/pte_dirty called on non-present PTE
Kefu Chai (1):
libceph: tolerate addrvecs with multiple entries of the same type
Kyohei Kadota (1):
Input: xpad - add support for ZENAIM LEVERLESS
Leon Hwang (1):
ftrace: Protect direct_functions in ftrace_find_rec_direct
Linmao Li (1):
Input: psxpad-spi - set driver data before use
Long Li (2):
xfs: fix ilock leak on error in xfs_dq_get_next_id
xfs: don't swallow dquot recovery verification errors
Lorenzo Stoakes (1):
mm/pagewalk: split walk_page_range_novma() into kernel/user parts
Lorenzo Stoakes (ARM) (3):
mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF mm/ptdump: always stabilise against page table freeing using init_mm mm/huge_memory: fix huge_zero_pfn race
Mark Brown (1):
ASoC: tas2562: Validate values for volume writes
Matt Fleming (1):
veth: convert frag_list skbs before running XDP
Matthew Wilcox (Oracle) (3):
ceph: Remove ceph_writepage()
ceph: Use a folio in ceph_page_mkwrite()
iomap: hold state_lock over call to ifs_set_range_uptodate()
Matthieu Baerts (NGI0) (2):
mptcp: avoid combining some incoming suboptions
mptcp: options: reset DSS fields in case of unexpected size
Max Kellermann (2):
ceph: avoid fs reclaim while using current->journal_info
ceph: fix hanging __ceph_get_caps() with stale mds_wanted
Mike Rapoport (Microsoft) (2):
userfaultfd: move vma_can_userfault out of line
userfaultfd: prevent registration of special VMAs
Mingyu Wang (1):
fbdev: core: Fix pointer desynchronization in fb_io_read()
Myeonghun Pak (1):
mmc: sdhci: unmap the bounce buffer before device release
Namjae Jeon (4):
ksmbd: rename smb2_get_msg to smb_get_msg
ksmbd: validate minimum PDU size for transform requests
ksmbd: conn lock to serialize smb2 negotiate
ksmbd: reject repeated SMB2 NEGOTIATE requests
Naohiro Aota (1):
btrfs: add space_info argument to btrfs_chunk_alloc()
Palmer Dabbelt (1):
RISC-V: Provide pgtable_l5_enabled on rv32
Paolo Abeni (1):
net: harmonize tstats and dstats
Paolo Bonzini (1):
KVM: SVM: Serialize accesses to the owner and mirror list with separate lock
Pavitra Jha (2):
libceph: fix multiple unsafe decodes in decode_locker()
libceph: fix two unsafe bare decodes in decode_lockers()
Pengpeng Hou (1):
Input: iforce - validate input packet lengths
Peter Seiderer (1):
net: pktgen: fix code style (WARNING: Block comments)
Peter Ujfalusi (4):
ASoC: SOF: sof-audio: Fix error path in sof_widget_setup_unlocked()
ASoC: cs4265: sort the register default table
ASoC: cs35l45: sort the register default table
ASoC: cs35l41: sort the register default table
Pierre-Eric Pelloux-Prayer (1):
drm/amdgpu: move debug_vm handling to amdgpu_cs_parser_fini
Raphael Zimmer (1):
libceph: Avoid using invalid osd indices from primary_temp
Richard Davies (1):
Input: focaltech - fix array out-of-bounds in focaltech_process_rel_packet
Rosen Penev (1):
ASoC: xilinx: formatter_pcm: pass aud_drv_data to irq handlers
Shiming Cheng (1):
net: gro: fix double aggregation of flush-marked skbs
Siddharth Vadapalli (1):
net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG
Steven Rostedt (1):
ring-buffer: Remove jump to out label in ring_buffer_swap_cpu()
Tengda Wu (1):
ring-buffer: Use current_context for safe per-CPU buffer swap
Thorsten Blum (1):
crypto: qce - fix error path in devm_qce_register_algs
Tu Nguyen (1):
can: rcar_canfd: change the initializing flow for clocks and resets
Uwe Kleine-König (1):
m68k: Define NR_CPUS to 1
Victor Nogueira (2):
net: sched: Move drop_reason to struct tc_skb_cb
net: sched: Add initial TC error skb drop reasons
Wei Fang (1):
net: packet: fix wrong transport_header when sending VLAN-tagged frame
Wolfram Sang (1):
i2c: bcm-iproc: remove printout on handled timeouts
Wyatt Feng (1):
mptcp: fastopen: only mark MPTFO subflows with SYN data
Xiang Mei (1):
libceph: bound pg_{temp,upmap,upmap_items} length to CEPH_PG_MAX_SIZE
Xiang Mei (Microsoft) (1):
netfilter: ipset: fix refcount race between list:set GC and swap
Yan Zhai (1):
packet: add a generic drop reason for receive
Yang Wang (2):
drm/amd/pm: fix torn gpu metrics reads
drm/amd/pm: fix pptable use-after-free
Yiming Zhu (1):
ceph: fix MDS random selection readiness predicate
Yizhou Zhao (1):
ipvs: separate destination availability state
Yuxiang Yang (1):
tcp: challenge ACK for non-exact RST in SYN-RECEIVED
Zhan Xusheng (1):
mmc: omap_hsmmc: fix busy_timeout overflow in ns conversion on 32-bit
Zhang Changzhong (1):
net/sched: cls_u32: skip hash tables in u32_bind_class()
Zhang Yi (1):
iomap: fix out-of-bounds bitmap_set() with zero-length range
ZhangGuoDong (2):
smb: move smb_version_values to common/smbglob.h
smb: move get_rfc1002_len() to common/smbglob.h
Zhefu Zhang (1):
Input: atkbd - skip deactivate for Xiaomi Book Pro 14's internal keyboard
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 -SUBLEVEL = 152 +SUBLEVEL = 153 EXTRAVERSION = NAME = Pinguïn Aangedreven
arch/arm/Kconfig +1 -0
@@ -8,6 +8,7 @@ config ARM select ARCH_HAS_CPU_FINALIZE_INIT if MMU select ARCH_HAS_CURRENT_STACK_POINTER select ARCH_HAS_DEBUG_VIRTUAL if MMU + select ARCH_HAS_DMA_ALLOC if MMU select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_FORTIFY_SOURCE
arch/arm64/boot/dts/nvidia/tegra194.dtsi +2 -0
@@ -3161,6 +3161,8 @@ timer { <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 10 + (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 15 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; interrupt-parent = <&gic>; always-on;
arch/m68k/Kconfig +4 -3
@@ -6,15 +6,16 @@ config M68K select ARCH_HAS_BINFMT_FLAT select ARCH_HAS_CPU_FINALIZE_INIT if MMU select ARCH_HAS_CURRENT_STACK_POINTER - select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE - select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA + select ARCH_HAS_DMA_ALLOC if M68K_NONCOHERENT_DMA && COLDFIRE + select ARCH_HAS_DMA_PREP_COHERENT if M68K_NONCOHERENT_DMA && !COLDFIRE + select ARCH_HAS_SYNC_DMA_FOR_DEVICE if M68K_NONCOHERENT_DMA select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS select ARCH_MIGHT_HAVE_PC_PARPORT if ISA select ARCH_NO_PREEMPT if !COLDFIRE select ARCH_USE_MEMTEST if MMU_MOTOROLA select ARCH_WANT_IPC_PARSE_VERSION select BINFMT_FLAT_ARGVP_ENVP_ON_STACK - select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE + select DMA_DIRECT_REMAP if M68K_NONCOHERENT_DMA && !COLDFIRE select GENERIC_ATOMIC64 select GENERIC_CPU_DEVICES select GENERIC_IOMAP
arch/m68k/Kconfig.cpu +16 -0
@@ -535,3 +535,19 @@ config CACHE_COPYBACK The ColdFire CPU cache is set into Copy-back mode. endchoice endif # HAVE_CACHE_CB + +config NR_CPUS + int + default "1" + +# Coldfire cores that do not have a data cache configured can do coherent DMA. +config COLDFIRE_COHERENT_DMA + bool + default y + depends on COLDFIRE + depends on !HAVE_CACHE_CB && !CACHE_D && !CACHE_BOTH + +config M68K_NONCOHERENT_DMA + bool + default y + depends on HAS_DMA && !COLDFIRE_COHERENT_DMA
arch/m68k/kernel/Makefile +1 -1
@@ -23,7 +23,7 @@ obj-$(CONFIG_MMU_MOTOROLA) += ints.o vectors.o obj-$(CONFIG_MMU_SUN3) += ints.o vectors.o obj-$(CONFIG_PCI) += pcibios.o -obj-$(CONFIG_HAS_DMA) += dma.o +obj-$(CONFIG_M68K_NONCOHERENT_DMA) += dma.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o obj-$(CONFIG_BOOTINFO_PROC) += bootinfo_proc.o
arch/m68k/kernel/dma.c +1 -1
@@ -17,7 +17,7 @@#include <asm/cacheflush.h> -#if defined(CONFIG_MMU ) && !defined(CONFIG_COLDFIRE ) +#ifndef CONFIG_COLDFIRE void arch_dma_prep_coherent (struct page *page,size_t size) {cache_push (page_to_phys (page), size);
arch/openrisc/include/asm/processor.h +2 -0
@@ -26,6 +26,8 @@ | SPR_SR_DCE | SPR_SR_SM)#define USER_SR (SPR_SR_DME | SPR_SR_IME | SPR_SR_ICE \ | SPR_SR_DCE | SPR_SR_IEE | SPR_SR_TEE) +/* SR bits user space may change via sigreturn, the rest stay kernel owned */ +#define SPR_SR_USER_MASK (SPR_SR_F | SPR_SR_CY | SPR_SR_OV)/* * User space process size. This is hardcoded into a few places,
arch/openrisc/kernel/dma.c +2 -2
@@ -75,7 +75,7 @@ void *arch_dma_set_uncached(void *cpu_addr, size_t size)* them and setting the cache-inhibit bit. */ mmap_write_lock (&init_mm); - error =walk_page_range_novma (&init_mm, va, va + size, + error =walk_kernel_page_table_range (va, va + size, &set_nocache_walk_ops,NULL ,NULL );mmap_write_unlock (&init_mm);
@@ -90,7 +90,7 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)mmap_write_lock (&init_mm);/* walk_page_range shouldn't be able to fail here */ -WARN_ON (walk_page_range_novma (&init_mm, va, va + size, +WARN_ON (walk_kernel_page_table_range (va, va + size, &clear_nocache_walk_ops,NULL ,NULL ));mmap_write_unlock (&init_mm); }
arch/openrisc/kernel/signal.c +3 -2
@@ -42,6 +42,7 @@ asmlinkage int do_work_pending(struct pt_regs *regs, unsigned int thread_flags,static int restore_sigcontext (struct pt_regs *regs,struct sigcontext __user *sc) { +unsigned long old_sr = regs->sr;int err =0 ;/* Always make any pending restarted system calls return -EINTR */
@@ -57,8 +58,8 @@ static int restore_sigcontext(struct pt_regs *regs, err |=__copy_from_user (®s->sr, &sc->regs.sr,sizeof (unsigned long )); err |=__copy_from_user (®s->fpcsr, &sc->fpcsr,sizeof (unsigned long )); -/* make sure the SM-bit is cleared so user-mode cannot fool us */ - regs->sr &= ~SPR_SR_SM ; +/* keep the privileged SR bits kernel owned, restore only user flags */ + regs->sr = (old_sr & ~SPR_SR_USER_MASK ) | (regs->sr &SPR_SR_USER_MASK ); regs->orig_gpr11 =-1 ;/* Avoid syscall restart checks */
arch/parisc/Kconfig +1 -0
@@ -8,6 +8,7 @@ config PARISC select HAVE_FUNCTION_GRAPH_TRACER select HAVE_SYSCALL_TRACEPOINTS select ARCH_WANT_FRAME_POINTERS + select ARCH_HAS_DMA_ALLOC if PA11 select ARCH_HAS_ELF_RANDOMIZE select ARCH_HAS_STRICT_KERNEL_RWX select ARCH_HAS_STRICT_MODULE_RWX
arch/powerpc/platforms/pseries/lparcfg.c +1 -1
@@ -673,7 +673,7 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,if (!firmware_has_feature (FW_FEATURE_SPLPAR ))return -EINVAL ; -if (count >sizeof (kbuf)) +if (count ==0 || count >sizeof (kbuf))return -EINVAL ;if (copy_from_user (kbuf, buf, count))
arch/powerpc/platforms/pseries/pci.c +1 -1
@@ -159,7 +159,7 @@ static int pseries_pci_sriov_enable(struct pci_dev *pdev, u16 num_vfs)/* First integer stores max config */ max_config_vfs =of_read_number (&max_vfs[0 ],1 ); -if (max_config_vfs < num_vfs && num_vfs >MAX_VFS_FOR_MAP_PE ) { +if (max_config_vfs < num_vfs || num_vfs >MAX_VFS_FOR_MAP_PE ) { dev_err(&pdev->dev, "Num VFs %x > %x Configurable VFs\n", num_vfs, (num_vfs > MAX_VFS_FOR_MAP_PE) ?
arch/riscv/include/asm/pgtable-32.h +3 -0
@@ -33,4 +33,7 @@ _PAGE_WRITE | _PAGE_EXEC | \ _PAGE_USER | _PAGE_GLOBAL)) +static const __maybe_unused int pgtable_l4_enabled; +static const __maybe_unused int pgtable_l5_enabled; +#endif /* _ASM_RISCV_PGTABLE_32_H */
arch/riscv/include/asm/pgtable.h +0 -1
@@ -905,7 +905,6 @@ extern uintptr_t _dtb_early_pa;#define dtb_early_pa _dtb_early_pa#endif /* CONFIG_XIP_KERNEL */ extern u64 satp_mode; -extern bool pgtable_l4_enabled;void paging_init (void );void misc_mem_init (void );
arch/riscv/mm/init.c +2 -0
@@ -50,10 +50,12 @@ u64 satp_mode __ro_after_init = SATP_MODE_32;#endif EXPORT_SYMBOL (satp_mode); +#ifdef CONFIG_64BIT bool pgtable_l4_enabled =IS_ENABLED (CONFIG_64BIT ) && !IS_ENABLED (CONFIG_XIP_KERNEL );bool pgtable_l5_enabled =IS_ENABLED (CONFIG_64BIT ) && !IS_ENABLED (CONFIG_XIP_KERNEL );EXPORT_SYMBOL (pgtable_l4_enabled);EXPORT_SYMBOL (pgtable_l5_enabled); +#endif phys_addr_t phys_ram_base__ro_after_init ;EXPORT_SYMBOL (phys_ram_base);
arch/riscv/mm/pageattr.c +4 -4
@@ -299,7 +299,7 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,if (ret) goto unlock; - ret =walk_page_range_novma (&init_mm, lm_start, lm_end, + ret =walk_kernel_page_table_range (lm_start, lm_end, &pageattr_ops,NULL , &masks);if (ret) goto unlock;
@@ -317,13 +317,13 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,if (ret) goto unlock; - ret =walk_page_range_novma (&init_mm, lm_start, lm_end, + ret =walk_kernel_page_table_range (lm_start, lm_end, &pageattr_ops,NULL , &masks);if (ret) goto unlock; } - ret =walk_page_range_novma (&init_mm, start, end, &pageattr_ops,NULL , + ret =walk_kernel_page_table_range (start, end, &pageattr_ops,NULL , &masks); unlock:
@@ -335,7 +335,7 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,*/ flush_tlb_all ();#else - ret =walk_page_range_novma (&init_mm, start, end, &pageattr_ops,NULL , + ret =walk_kernel_page_table_range (start, end, &pageattr_ops,NULL , &masks);mmap_write_unlock (&init_mm);
arch/x86/kvm/svm/sev.c +25 -9
@@ -68,6 +68,8 @@ module_param_named(debug_swap, sev_es_debug_swap_enabled, bool, 0444);static u8 sev_enc_bit;static DECLARE_RWSEM (sev_deactivate_lock);static DEFINE_MUTEX (sev_bitmap_lock); +/* Protects kvm_sev_info's enc_context_owner, mirror_vms and mirror_entry. */ +static DEFINE_MUTEX (sev_mirror_lock);unsigned int max_sev_asid;static unsigned int min_sev_asid;static unsigned long sev_me_mask;
@@ -1713,18 +1715,18 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm) dst->asid = src->asid; dst->handle = src->handle; dst->pages_locked = src->pages_locked; - dst->enc_context_owner = src->enc_context_owner; dst->es_active = src->es_active; src->asid =0 ; src->active = false; src->handle =0 ; src->pages_locked =0 ; - src->enc_context_owner =NULL ; src->es_active = false;list_cut_before (&dst->regions_list, &src->regions_list, &src->regions_list); +mutex_lock (&sev_mirror_lock); +/* * If this VM has mirrors, "transfer" each mirror's refcount of the * source to the destination (this KVM). The caller holds a reference
@@ -1741,13 +1743,16 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)* If this VM is a mirror, remove the old mirror from the owners list * and add the new mirror to the list. */ -if (is_mirroring_enc_context (dst_kvm)) { +if (is_mirroring_enc_context (src_kvm)) {struct kvm_sev_info *owner_sev_info = - &to_kvm_svm (dst->enc_context_owner)->sev_info; + &to_kvm_svm (src->enc_context_owner)->sev_info; + dst->enc_context_owner = src->enc_context_owner; + src->enc_context_owner =NULL ;list_del (&src->mirror_entry);list_add_tail (&dst->mirror_entry, &owner_sev_info->mirror_vms); } +mutex_unlock (&sev_mirror_lock);kvm_for_each_vcpu (i, dst_vcpu, dst_kvm) { dst_svm =to_svm (dst_vcpu);
@@ -2125,12 +2130,15 @@ int sev_vm_copy_enc_context_from(struct kvm *kvm, unsigned int source_fd)* disappear until we're done with it */ source_sev = &to_kvm_svm (source_kvm)->sev_info; -kvm_get_kvm (source_kvm); mirror_sev = &to_kvm_svm (kvm)->sev_info; -list_add_tail (&mirror_sev->mirror_entry, &source_sev->mirror_vms);/* Set enc_context_owner and copy its encryption context over */ +mutex_lock (&sev_mirror_lock); +kvm_get_kvm (source_kvm); +list_add_tail (&mirror_sev->mirror_entry, &source_sev->mirror_vms); mirror_sev->enc_context_owner = source_kvm; +mutex_unlock (&sev_mirror_lock); + mirror_sev->active = true; mirror_sev->asid = source_sev->asid; mirror_sev->fd = source_sev->fd;
@@ -2166,11 +2174,19 @@ void sev_vm_destroy(struct kvm *kvm)/* If this is a mirror_kvm release the enc_context_owner and skip sev cleanup */ if (is_mirroring_enc_context (kvm)) { -struct kvm *owner_kvm = sev->enc_context_owner; +struct kvm *owner_kvm; -mutex_lock (&owner_kvm->lock); +mutex_lock (&sev_mirror_lock); + owner_kvm = sev->enc_context_owner;list_del (&sev->mirror_entry); -mutex_unlock (&owner_kvm->lock); + sev->enc_context_owner =NULL ; + +/* +* The reference to owner_kvm cannot move after sev_mirror_lock is +* released. Release it before kvm_put_kvm() so that owner_kvm is +* never destroyed inside sev_mirror_lock. +*/ +mutex_unlock (&sev_mirror_lock);kvm_put_kvm (owner_kvm);return ; }
arch/x86/kvm/svm/svm.h +1 -0
@@ -86,6 +86,7 @@ struct kvm_sev_info {unsigned long pages_locked;/* Number of pages locked */ struct list_head regions_list;/* List of registered regions */ u64 ap_jump_table;/* SEV-ES AP Jump Table address */ +/* The three fields below are protected by sev_mirror_lock */ struct kvm *enc_context_owner;/* Owner of copied encryption context */ struct list_head mirror_vms;/* List of VMs mirroring */ struct list_head mirror_entry;/* Use as a list entry of mirrors */
block/genhd.c +8 -4
@@ -1174,14 +1174,18 @@ static void disk_release(struct device *dev)/* * To undo the all initialization from blk_mq_init_allocated_queue in * case of a probe failure where add_disk is never called we have to -* call blk_mq_exit_queue here. We can't do this for the more common -* teardown case (yet) as the tagset can be gone by the time the disk -* is released once it was added. +* call blk_mq_exit_queue here, after stopping the timer and work items +* that I/O issued before add_disk may have left pending. We can't do +* this for the more common teardown case (yet) as the tagset can be +* gone by the time the disk is released once it was added. */ if (queue_is_mq (disk->queue) &&test_bit (GD_OWNS_QUEUE , &disk->state) && - !test_bit (GD_ADDED , &disk->state)) + !test_bit (GD_ADDED , &disk->state)) { +blk_sync_queue (disk->queue); +blk_mq_cancel_work_sync (disk->queue);blk_mq_exit_queue (disk->queue); + }blkcg_exit_disk (disk);
crypto/ccm.c +1 -1
@@ -752,7 +752,7 @@ static int crypto_rfc4309_create(struct crypto_template *tmpl, inst->alg.ivsize =8 ; inst->alg.chunksize =crypto_aead_alg_chunksize (alg); - inst->alg.maxauthsize =16 ; + inst->alg.maxauthsize =crypto_aead_alg_maxauthsize (alg); inst->alg.base.cra_ctxsize =sizeof (struct crypto_rfc4309_ctx );
drivers/crypto/qce/core.c +1 -1
@@ -58,7 +58,7 @@ static int qce_register_algs(struct qce_device *qce) ret = ops->register_algs (qce);if (ret) {for (j = i -1 ; j >=0 ; j--) - ops->unregister_algs (qce); + qce_ops[j]->unregister_algs (qce);return ret; } }
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +20 -14
@@ -253,6 +253,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,if (size <sizeof (struct drm_amdgpu_cs_chunk_fence )) goto free_partial_kdata; +/* Only a single user fence is allowed to simplify handling. */ +if (p->uf_bo) + goto free_partial_kdata; + ret =amdgpu_cs_p1_user_fence (p, p->chunks[i].kdata, &uf_offset);if (ret)
@@ -1178,19 +1182,6 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p) job->vm_pd_addr =amdgpu_gmc_pd_addr (vm->root.bo); } -if (amdgpu_vm_debug) { -/* Invalidate all BOs to test for userspace bugs */ -amdgpu_bo_list_for_each_entry (e, p->bo_list) { -struct amdgpu_bo *bo = e->bo; - -/* ignore duplicates */ -if (!bo) -continue ; - -amdgpu_vm_bo_invalidate (adev, bo, false); - } - } -return 0 ; }
@@ -1379,6 +1370,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,/* Cleanup the parser structure */ static void amdgpu_cs_parser_fini (struct amdgpu_cs_parser *parser) { +struct amdgpu_device *adev = parser->adev; +struct amdgpu_bo_list_entry *e;unsigned int i;amdgpu_sync_free (&parser->sync);
@@ -1394,8 +1387,21 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser)if (parser->ctx)amdgpu_ctx_put (parser->ctx); -if (parser->bo_list) +if (parser->bo_list) { +if (amdgpu_vm_debug) { +/* Invalidate all BOs to test for userspace bugs */ +amdgpu_bo_list_for_each_entry (e, parser->bo_list) { +struct amdgpu_bo *bo = e->bo; + +/* ignore duplicates */ +if (!bo) +continue ; + +amdgpu_vm_bo_invalidate (adev, bo, false); + } + }amdgpu_bo_list_put (parser->bo_list); + }for (i =0 ; i < parser->nchunks; i++)kvfree (parser->chunks[i].kdata);
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +21 -0
@@ -273,6 +273,25 @@ static const struct drm_gem_object_funcs amdgpu_gem_object_funcs = { .vm_ops = &amdgpu_gem_vm_ops, }; +static bool amdgpu_gem_are_domains_valid (u32 domains) +{ +u32 normal =AMDGPU_GEM_DOMAIN_CPU | +AMDGPU_GEM_DOMAIN_GTT | +AMDGPU_GEM_DOMAIN_VRAM ; +/* Treat all non CPU/GTT/VRAM domains as special domains. */ +u32 special =AMDGPU_GEM_DOMAIN_MASK & ~normal; +u32 normal_mask = domains & normal; +u32 special_mask = domains & special; + +if (!special_mask) +return true; + +if (normal_mask) +return false; + +return !(special_mask & (special_mask -1 )); +} +/* * GEM ioctls. */
@@ -308,6 +327,8 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,/* reject invalid gem domains */ if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK )return -EINVAL ; +if (!amdgpu_gem_are_domains_valid (args->in.domains)) +return -EINVAL ;if (!amdgpu_is_tmz (adev) && (flags &AMDGPU_GEM_CREATE_ENCRYPTED )) {DRM_NOTE_ONCE ("Cannot allocate secure buffer since TMZ is disabled\n" );
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +2 -8
@@ -2044,8 +2044,6 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)*/ void amdgpu_ttm_fini (struct amdgpu_device *adev) { -int idx; -if (!adev->mman.initialized)return ;
@@ -2068,13 +2066,9 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)amdgpu_ttm_fw_reserve_vram_fini (adev);amdgpu_ttm_drv_reserve_vram_fini (adev); -if (drm_dev_enter (adev_to_drm (adev), &idx)) { - -if (adev->mman.aper_base_kaddr) -iounmap (adev->mman.aper_base_kaddr); +if (adev->mman.aper_base_kaddr) { +iounmap (adev->mman.aper_base_kaddr); adev->mman.aper_base_kaddr =NULL ; - -drm_dev_exit (idx); }amdgpu_vram_mgr_fini (adev);
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +18 -67
151 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +22 -4
@@ -873,6 +873,23 @@ static void vce_v3_0_ring_emit_ib(struct amdgpu_ring *ring,amdgpu_ring_write (ring, ib->length_dw); } +static void vce_v3_0_ring_emit_fence (struct amdgpu_ring *ring,u64 addr, +u64 seq,unsigned flags) +{ +WARN_ON (flags &AMDGPU_FENCE_FLAG_64BIT ); + +amdgpu_ring_write (ring,VCE_CMD_FENCE ); +amdgpu_ring_write (ring, addr); +amdgpu_ring_write (ring,upper_32_bits (addr)); +amdgpu_ring_write (ring, seq); +amdgpu_ring_write (ring,VCE_CMD_TRAP ); +} + +static void vce_v3_0_ring_insert_end (struct amdgpu_ring *ring) +{ +amdgpu_ring_write (ring,VCE_CMD_END ); +} +static void vce_v3_0_emit_vm_flush (struct amdgpu_ring *ring,unsigned int vmid,uint64_t pd_addr) {
@@ -882,7 +899,6 @@ static void vce_v3_0_emit_vm_flush(struct amdgpu_ring *ring,amdgpu_ring_write (ring,VCE_CMD_FLUSH_TLB );amdgpu_ring_write (ring, vmid); -amdgpu_ring_write (ring,VCE_CMD_END ); }static void vce_v3_0_emit_pipeline_sync (struct amdgpu_ring *ring)
@@ -952,17 +968,19 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { .set_wptr = vce_v3_0_ring_set_wptr, .parse_cs = amdgpu_vce_ring_parse_cs_vm, .emit_frame_size = -6 +/* vce_v3_0_emit_vm_flush */ +5 +/* vce_v3_0_emit_vm_flush */ 4 +/* vce_v3_0_emit_pipeline_sync */ - 6 + 6, /* amdgpu_vce_ring_emit_fence x2 vm fence */ +5 +5 +/* vce_v3_0_ring_emit_fence x2 vm fence */ + 1, /* vce_v3_0_ring_insert_end */ .emit_ib_size = 5, /* vce_v3_0_ring_emit_ib */ .emit_ib = vce_v3_0_ring_emit_ib, .emit_vm_flush = vce_v3_0_emit_vm_flush, .emit_pipeline_sync = vce_v3_0_emit_pipeline_sync, - .emit_fence = amdgpu_vce_ring_emit_fence, + .emit_fence = vce_v3_0_ring_emit_fence, .test_ring = amdgpu_vce_ring_test_ring, .test_ib = amdgpu_vce_ring_test_ib, .insert_nop = amdgpu_ring_insert_nop, + .insert_end = vce_v3_0_ring_insert_end, .pad_ib = amdgpu_ring_generic_pad_ib, .begin_use = amdgpu_vce_ring_begin_use, .end_use = amdgpu_vce_ring_end_use,
drivers/gpu/drm/amd/pm/amdgpu_dpm.c +22 -5
@@ -996,17 +996,28 @@ int amdgpu_dpm_dispatch_task(struct amdgpu_device *adev,return ret; } -int amdgpu_dpm_get_pp_table (struct amdgpu_device *adev,char **table) +int amdgpu_dpm_get_pp_table (struct amdgpu_device *adev,char *table, +size_t size) {const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; +char *pptable =NULL ;int ret =0 ; +if ((!table && size) || (table && !size)) +return -EINVAL ; +if (!pp_funcs->get_pp_table)return 0 ;mutex_lock (&adev->pm.mutex); ret = pp_funcs->get_pp_table (adev->powerplay.pp_handle, - table); + &pptable); +if (ret >0 && !pptable) { + ret = -EINVAL ; + }else if (ret >0 && table) { + ret =min_t (size_t, ret, size); +memcpy (table, pptable, ret); + }mutex_unlock (&adev->pm.mutex);return ret;
@@ -1255,17 +1266,23 @@ int amdgpu_dpm_set_power_profile_mode(struct amdgpu_device *adev,return ret; } -int amdgpu_dpm_get_gpu_metrics (struct amdgpu_device *adev,void **table) +ssize_t amdgpu_dpm_get_gpu_metrics (struct amdgpu_device *adev,void *buf, +size_t size) {const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; -int ret =0 ; +void *table; +ssize_t ret;if (!pp_funcs->get_gpu_metrics)return 0 ;mutex_lock (&adev->pm.mutex); ret = pp_funcs->get_gpu_metrics (adev->powerplay.pp_handle, - table); + &table); +if (ret >0 ) { + ret =min_t (ssize_t, ret, size); +memcpy (buf, table, ret); + }mutex_unlock (&adev->pm.mutex);return ret;
drivers/gpu/drm/amd/pm/amdgpu_pm.c +2 -14
@@ -496,7 +496,6 @@ static ssize_t amdgpu_get_pp_table(struct device *dev, {struct drm_device *ddev =dev_get_drvdata (dev);struct amdgpu_device *adev =drm_to_adev (ddev); -char *table =NULL ;int size, ret;if (amdgpu_in_reset (adev))
@@ -510,7 +509,7 @@ static ssize_t amdgpu_get_pp_table(struct device *dev,return ret; } - size =amdgpu_dpm_get_pp_table (adev, &table); + size =amdgpu_dpm_get_pp_table (adev, buf,PAGE_SIZE -1 );pm_runtime_mark_last_busy (ddev->dev);pm_runtime_put_autosuspend (ddev->dev);
@@ -518,11 +517,6 @@ static ssize_t amdgpu_get_pp_table(struct device *dev,if (size <=0 )return size; -if (size >=PAGE_SIZE ) - size =PAGE_SIZE -1 ; - -memcpy (buf, table, size); -return size; }
@@ -1781,7 +1775,6 @@ static ssize_t amdgpu_get_gpu_metrics(struct device *dev, {struct drm_device *ddev =dev_get_drvdata (dev);struct amdgpu_device *adev =drm_to_adev (ddev); -void *gpu_metrics;ssize_t size =0 ;int ret;
@@ -1796,15 +1789,10 @@ static ssize_t amdgpu_get_gpu_metrics(struct device *dev,return ret; } - size =amdgpu_dpm_get_gpu_metrics (adev, &gpu_metrics); + size =amdgpu_dpm_get_gpu_metrics (adev, buf,PAGE_SIZE -1 );if (size <=0 ) goto out; -if (size >=PAGE_SIZE ) - size =PAGE_SIZE -1 ; - -memcpy (buf, gpu_metrics, size); - out:pm_runtime_mark_last_busy (ddev->dev);pm_runtime_put_autosuspend (ddev->dev);
drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h +4 -2
@@ -463,7 +463,8 @@ int amdgpu_dpm_get_pp_num_states(struct amdgpu_device *adev,int amdgpu_dpm_dispatch_task (struct amdgpu_device *adev,enum amd_pp_task task_id,enum amd_pm_state_type *user_state); -int amdgpu_dpm_get_pp_table (struct amdgpu_device *adev,char **table); +int amdgpu_dpm_get_pp_table (struct amdgpu_device *adev,char *table, +size_t size); int amdgpu_dpm_set_fine_grain_clk_vol(struct amdgpu_device *adev, uint32_t type, long *input,
@@ -493,7 +494,8 @@ int amdgpu_dpm_get_power_profile_mode(struct amdgpu_device *adev, char *buf);int amdgpu_dpm_set_power_profile_mode (struct amdgpu_device *adev,long *input,uint32_t size); -int amdgpu_dpm_get_gpu_metrics (struct amdgpu_device *adev,void **table); +ssize_t amdgpu_dpm_get_gpu_metrics (struct amdgpu_device *adev,void *buf, +size_t size);int amdgpu_dpm_get_fan_control_mode (struct amdgpu_device *adev,uint32_t *fan_mode); int amdgpu_dpm_set_fan_speed_pwm(struct amdgpu_device *adev,
drivers/gpu/drm/radeon/radeon_kms.c +1 -0
@@ -71,6 +71,7 @@ void radeon_driver_unload_kms(struct drm_device *dev)if (radeon_is_px (dev)) {pm_runtime_get_sync (dev->dev);pm_runtime_forbid (dev->dev); +pm_runtime_dont_use_autosuspend (dev->dev); }radeon_acpi_fini (rdev);
drivers/i2c/busses/i2c-bcm-iproc.c +10 -1
@@ -811,7 +811,16 @@ static int bcm_iproc_i2c_xfer_wait(struct bcm_iproc_i2c_dev *iproc_i2c, }if (!time_left && !iproc_i2c->xfer_is_done) { -dev_err (iproc_i2c->device,"transaction timed out\n" ); +/* +* The controller may fail to clear START_BUSY after a timeout, +* reset the controller to recover in that case. +*/ +if (!!(iproc_i2c_rd_reg (iproc_i2c,M_CMD_OFFSET ) & +BIT (M_CMD_START_BUSY_SHIFT ))) { +bcm_iproc_i2c_enable_disable (iproc_i2c, false); +bcm_iproc_i2c_init (iproc_i2c); +bcm_iproc_i2c_enable_disable (iproc_i2c, true); + }/* flush both TX/RX FIFOs */ val =BIT (M_FIFO_RX_FLUSH_SHIFT ) |BIT (M_FIFO_TX_FLUSH_SHIFT );
drivers/input/joystick/iforce/iforce-packets.c +10 -1
@@ -161,6 +161,9 @@ void iforce_process_packet(struct iforce *iforce,switch (packet_id) {case 0x01 :/* joystick position data */ +if (len <7 ) +break ; +input_report_abs (dev,ABS_X , (__s16 )get_unaligned_le16 (data)); input_report_abs(dev, ABS_Y,
@@ -176,6 +179,9 @@ void iforce_process_packet(struct iforce *iforce,break ;case 0x03 :/* wheel position data */ +if (len <7 ) +break ; +input_report_abs (dev,ABS_WHEEL , (__s16 )get_unaligned_le16 (data));input_report_abs (dev,ABS_GAS ,255 - data[2 ]);
@@ -187,6 +193,9 @@ void iforce_process_packet(struct iforce *iforce,break ;case 0x02 :/* status report */ +if (len <2 ) +break ; +input_report_key (dev,BTN_DEAD , data[0 ] &0x02 );input_sync (dev);
@@ -206,7 +215,7 @@ void iforce_process_packet(struct iforce *iforce, } } -for (j =3 ; j < len; j +=2 ) +for (j =3 ; j +sizeof (u16) <= len; j +=sizeof (u16))mark_core_as_ready (iforce,get_unaligned_le16 (data + j));break ;
drivers/input/joystick/iforce/iforce-usb.c +3 -0
@@ -159,6 +159,9 @@ static void iforce_usb_irq(struct urb *urb) goto exit; } +if (!urb->actual_length) + goto exit; +iforce_process_packet (iforce, iforce_usb->data_in[0 ], iforce_usb->data_in +1 , urb->actual_length -1 );
drivers/input/joystick/psxpad-spi.c +1 -0
@@ -369,6 +369,7 @@ static int psxpad_spi_probe(struct spi_device *spi)return err; } +spi_set_drvdata (spi, pad);pm_runtime_enable (&spi->dev);return 0 ;
drivers/input/joystick/xpad.c +2 -0
@@ -417,6 +417,7 @@ static const struct xpad_device { { 0x3285, 0x0646, "Nacon Pro Compact", 0, XTYPE_XBOXONE }, { 0x3285, 0x0662, "Nacon Revolution5 Pro", 0, XTYPE_XBOX360 }, { 0x3285, 0x0663, "Nacon Evol-X", 0, XTYPE_XBOXONE }, + { 0x3507, 0x000b, "ZENAIM LEVERLESS", 0, XTYPE_XBOX360 }, { 0x3537, 0x1004, "GameSir T4 Kaleid", 0, XTYPE_XBOX360 }, { 0x3537, 0x100f, "GameSir Nova 2 Lite", 0, XTYPE_XBOX360 }, { 0x3537, 0x1010, "GameSir G7 SE", 0, XTYPE_XBOXONE },
@@ -575,6 +576,7 @@ static const struct usb_device_id xpad_table[] = {XPAD_XBOX360_VENDOR (0x31e3 ),/* Wooting Keyboards */ XPAD_XBOX360_VENDOR (0x3285 ),/* Nacon GC-100 */ XPAD_XBOXONE_VENDOR (0x3285 ),/* Nacon Evol-X */ +XPAD_XBOX360_VENDOR (0x3507 ),/* ZENAIM Controllers */ XPAD_XBOX360_VENDOR (0x3537 ),/* GameSir Controllers */ XPAD_XBOXONE_VENDOR (0x3537 ),/* GameSir Controllers */ XPAD_XBOX360_VENDOR(0x413d), /* Black Shark Green Ghost Controller */
drivers/input/keyboard/atkbd.c +8 -0
@@ -1959,6 +1959,14 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { }, .callback = atkbd_deactivate_fixup, }, + { + /* Xiaomi Book Pro 14 (TM2424) */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "XIAOMI"), + DMI_MATCH(DMI_PRODUCT_NAME, "Xiaomi Book Pro 14"), + }, + .callback = atkbd_deactivate_fixup, + }, { } };
drivers/input/mouse/focaltech.c +1 -1
@@ -197,7 +197,7 @@ static void focaltech_process_rel_packet(struct psmouse *psmouse, {struct focaltech_data *priv = psmouse->private;struct focaltech_hw_state *state = &priv->state; -int finger1, finger2; +unsigned int finger1, finger2; state->pressed = packet[0 ] >>7 ; finger1 = ((packet[0 ] >>4 ) &0x7 ) -1 ;
drivers/input/rmi4/rmi_f54.c +32 -11
104 lines not on this page · raw message
drivers/input/rmi4/rmi_f55.c +2 -2
@@ -54,10 +54,10 @@ static int rmi_f55_detect(struct rmi_function *fn) f55->num_tx_electrodes = f55->qry[F55_NUM_TX_OFFSET ]; f55->cfg_num_rx_electrodes = f55->num_rx_electrodes; - f55->cfg_num_tx_electrodes = f55->num_rx_electrodes; + f55->cfg_num_tx_electrodes = f55->num_tx_electrodes; drv_data->num_rx_electrodes = f55->cfg_num_rx_electrodes; - drv_data->num_tx_electrodes = f55->cfg_num_rx_electrodes; + drv_data->num_tx_electrodes = f55->cfg_num_tx_electrodes;if (f55->qry[F55_PHYS_CHAR_OFFSET ] &F55_CAP_SENSOR_ASSIGN ) {int i, total;
drivers/input/touchscreen/hynitron_cstxxx.c +10 -3
@@ -313,6 +313,12 @@ static void cst3xx_touch_report(struct i2c_client *client)return ; touch_cnt = buf[5 ] &CST3XX_TOUCH_COUNT_MASK ; +if (touch_cnt > ts_data->chip->max_touch_num) { +dev_err (&client->dev,"cst3xx invalid touch count (%d vs %d max)\n" , + touch_cnt, ts_data->chip->max_touch_num); +return ; + } +/* * Check the check bit of the last touch slot. The check bit is * always present after touch point 1 for valid data, and then
@@ -335,9 +341,10 @@ static void cst3xx_touch_report(struct i2c_client *client) finger_id = (buf[idx] >>4 ) &0x0f ;/* Sanity check we don't have more fingers than we expect */ -if (ts_data->chip->max_touch_num < finger_id) { -dev_err (&client->dev,"cst3xx touch read failure\n" ); -break ; +if (finger_id >= ts_data->chip->max_touch_num) { +dev_err (&client->dev, +"cst3xx invalid finger id %d\n" , finger_id); +return ; }/* sw value of 0 means no touch, 0x03 means touch */
drivers/input/touchscreen/sur40.c +13 -10
@@ -725,21 +725,13 @@ static int sur40_probe(struct usb_interface *interface, goto err_free_input; } -/* register the polled input device */ - error =input_register_device (input); -if (error) { -dev_err (&interface->dev, -"Unable to register polled input device." ); - goto err_free_buffer; - } -/* register the video master device */ snprintf (sur40->v4l2.name,sizeof (sur40->v4l2.name),"%s" ,DRIVER_LONG ); error =v4l2_device_register (sur40->dev, &sur40->v4l2);if (error) {dev_err (&interface->dev,"Unable to register video master device." ); - goto err_unreg_v4l2; + goto err_free_buffer; }/* initialize the lock and subdevice */
@@ -795,6 +787,14 @@ static int sur40_probe(struct usb_interface *interface,if (error) {dev_err (&interface->dev,"Unable to register video subdevice." ); + goto err_free_ctrl; + } + +/* register the polled input device */ + error =input_register_device (input); +if (error) { +dev_err (&interface->dev, +"Unable to register polled input device." ); goto err_unreg_video; }
@@ -806,6 +806,8 @@ static int sur40_probe(struct usb_interface *interface, err_unreg_video:video_unregister_device (&sur40->vdev); +err_free_ctrl: +v4l2_ctrl_handler_free (&sur40->hdl); err_unreg_v4l2:v4l2_device_unregister (&sur40->v4l2); err_free_buffer:
@@ -823,11 +825,12 @@ static void sur40_disconnect(struct usb_interface *interface) {struct sur40_state *sur40 =usb_get_intfdata (interface); +input_unregister_device (sur40->input); +v4l2_ctrl_handler_free (&sur40->hdl);video_unregister_device (&sur40->vdev);v4l2_device_unregister (&sur40->v4l2); -input_unregister_device (sur40->input);kfree (sur40->bulk_in_buffer);kfree (sur40);
drivers/mmc/host/omap_hsmmc.c +1 -1
@@ -1358,7 +1358,7 @@ omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req)if (req->data ==NULL ) {OMAP_HSMMC_WRITE (host->base,BLK ,0 );if (req->cmd->flags &MMC_RSP_BUSY ) { - timeout = req->cmd->busy_timeout *NSEC_PER_MSEC ; + timeout = (u64 )req->cmd->busy_timeout *NSEC_PER_MSEC ;/* * Set an arbitrary 100ms data timeout for commands with
drivers/mmc/host/sdhci.c +16 -0
@@ -4152,6 +4152,14 @@ void __sdhci_read_caps(struct sdhci_host *host, const u16 *ver, }EXPORT_SYMBOL_GPL (__sdhci_read_caps); +static void sdhci_unmap_bounce_buffer (void *data) +{ +struct sdhci_host *host = data; + +dma_unmap_single (mmc_dev (host->mmc), host->bounce_addr, + host->bounce_buffer_size,DMA_BIDIRECTIONAL ); +} +static void sdhci_allocate_bounce_buffer (struct sdhci_host *host) {struct mmc_host *mmc = host->mmc;
@@ -4206,6 +4214,14 @@ static void sdhci_allocate_bounce_buffer(struct sdhci_host *host) } host->bounce_buffer_size = bounce_size; + ret =devm_add_action_or_reset (mmc_dev (mmc), + sdhci_unmap_bounce_buffer, host); +if (ret) { +devm_kfree (mmc_dev (mmc), host->bounce_buffer); + host->bounce_buffer =NULL ; + host->bounce_buffer_size =0 ; +return ; + }/* Lie about this since we're bouncing */ mmc->max_segs = max_blocks;
drivers/mmc/host/sdhci.h +1 -1
@@ -606,7 +606,7 @@ struct sdhci_host {unsigned int tuning_count;/* Timer count for re-tuning */ unsigned int tuning_mode;/* Re-tuning mode supported by host */ -unsigned int tuning_err;/* Error code for re-tuning */ +int tuning_err;/* Error code for re-tuning */ #define SDHCI_TUNING_MODE_1 0#define SDHCI_TUNING_MODE_2 1#define SDHCI_TUNING_MODE_3 2
drivers/net/can/rcar/rcar_canfd.c +14 -14
@@ -1999,27 +1999,27 @@ static int rcar_canfd_probe(struct platform_device *pdev) } } - err =reset_control_reset (gpriv->rstc1); -if (err) - goto fail_dev; - err =reset_control_reset (gpriv->rstc2); -if (err) { -reset_control_assert (gpriv->rstc1); - goto fail_dev; - } -/* Enable peripheral clock for register access */ err =clk_prepare_enable (gpriv->clkp);if (err) {dev_err (dev,"failed to enable peripheral clock: %pe\n" ,ERR_PTR (err)); - goto fail_reset; + goto fail_dev; + } + + err =reset_control_reset (gpriv->rstc1); +if (err) + goto fail_clk; + err =reset_control_reset (gpriv->rstc2); +if (err) { +reset_control_assert (gpriv->rstc1); + goto fail_clk; } err =rcar_canfd_reset_controller (gpriv);if (err) {dev_err (dev,"reset controller failed: %pe\n" ,ERR_PTR (err)); - goto fail_clk; + goto fail_reset; }/* Controller in Global reset & Channel reset mode */
@@ -2070,11 +2070,11 @@ static int rcar_canfd_probe(struct platform_device *pdev)rcar_canfd_channel_remove (gpriv, ch); fail_mode:rcar_canfd_disable_global_interrupts (gpriv); -fail_clk: -clk_disable_unprepare (gpriv->clkp); fail_reset:reset_control_assert (gpriv->rstc1);reset_control_assert (gpriv->rstc2); +fail_clk: +clk_disable_unprepare (gpriv->clkp); fail_dev:return err; }
@@ -2094,9 +2094,9 @@ static void rcar_canfd_remove(struct platform_device *pdev)/* Enter global sleep mode */ rcar_canfd_set_bit (gpriv->base,RCANFD_GCTR ,RCANFD_GCTR_GSLPR ); -clk_disable_unprepare (gpriv->clkp);reset_control_assert (gpriv->rstc1);reset_control_assert (gpriv->rstc2); +clk_disable_unprepare (gpriv->clkp); }static int __maybe_unused rcar_canfd_suspend (struct device *dev)
drivers/net/ethernet/intel/ice/ice_vf_lib.c +27 -0
@@ -832,6 +832,30 @@ static void ice_notify_vf_reset(struct ice_vf *vf) NULL); } +/** +* ice_reset_interrupts - clear all queue interrupt configuration for a VSI +* @vsi: the VSI whose interrupt registers should be cleared +* +* Zero the QINT_RQCTL and QINT_TQCTL registers for all allocated queues +* in the VSI. This clears the entire register including MSIX_INDX, ITR_INDX, +* CAUSE_ENA and NEXTQ fields, unlike ice_vf_dis_rxq_interrupt() which only +* clears the CAUSE_ENA bit. +*/ +void ice_reset_interrupts (struct ice_vsi *vsi) +{ +struct ice_pf *pf = vsi->back; +struct ice_hw *hw = &pf->hw; +int i; + +ice_for_each_alloc_rxq (vsi, i) +wr32 (hw,QINT_RQCTL (vsi->rxq_map[i]),0 ); + +ice_for_each_alloc_txq (vsi, i) +wr32 (hw,QINT_TQCTL (vsi->txq_map[i]),0 ); + +ice_flush (hw); +} +/** * ice_reset_vf - Reset a particular VF * @vf: pointer to the VF structure
@@ -914,6 +938,9 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)ice_dis_vf_qs (vf); +/* cleanup interrupt registers */ +ice_reset_interrupts (vsi); +/* Call Disable LAN Tx queue AQ whether or not queues are * enabled. This is needed for successful completion of VFR. */
drivers/net/ethernet/intel/ice/ice_vf_lib_private.h +1 -0
@@ -26,6 +26,7 @@void ice_initialize_vf_entry (struct ice_vf *vf);void ice_deinitialize_vf_entry (struct ice_vf *vf);void ice_dis_vf_qs (struct ice_vf *vf); +void ice_reset_interrupts (struct ice_vsi *vsi);int ice_check_vf_init (struct ice_vf *vf);enum virtchnl_status_code ice_err_to_virt_err (int err);struct ice_port_info *ice_vf_get_port_info (struct ice_vf *vf);
drivers/net/ethernet/intel/ice/ice_virtchnl.c +21 -0
@@ -1215,6 +1215,24 @@ static void ice_vf_ena_rxq_interrupt(struct ice_vsi *vsi, u32 q_idx)wr32 (hw,QINT_RQCTL (pfq), reg |QINT_RQCTL_CAUSE_ENA_M ); } +/** +* ice_vf_dis_rxq_interrupt - disable Rx queue interrupt via QINT_RQCTL +* @vsi: VSI of the VF to configure +* @q_idx: VF queue index used to determine the queue in the PF's space +*/ +static void ice_vf_dis_rxq_interrupt (struct ice_vsi *vsi,u32 q_idx) +{ +struct ice_hw *hw = &vsi->back->hw; +u32 pfq = vsi->rxq_map[q_idx]; +u32 reg; + + reg =rd32 (hw,QINT_RQCTL (pfq)); + reg &= ~QINT_RQCTL_CAUSE_ENA_M ; +wr32 (hw,QINT_RQCTL (pfq), reg); + +ice_flush (hw); +} +/** * ice_vc_ena_qs_msg * @vf: pointer to the VF info
@@ -1408,6 +1426,8 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg) goto error_param; } +for_each_set_bit (vf_q_id, &q_map,ICE_MAX_RSS_QS_PER_VF ) +ice_vf_dis_rxq_interrupt (vsi, vf_q_id);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 ) {
@@ -1428,6 +1448,7 @@ static int ice_vc_dis_qs_msg(struct ice_vf *vf, u8 *msg) goto error_param; } +ice_vf_dis_rxq_interrupt (vsi, vf_q_id);/* Clear enabled queues flag */ clear_bit (vf_q_id, vf->rxq_ena); }
drivers/net/ethernet/intel/igc/igc_main.c +0 -1
@@ -5085,7 +5085,6 @@ void igc_down(struct igc_adapter *adapter)for (i =0 ; i < adapter->num_q_vectors; i++) {if (adapter->q_vector[i]) { -napi_synchronize (&adapter->q_vector[i]->napi);napi_disable (&adapter->q_vector[i]->napi); } }
drivers/net/ethernet/microsoft/mana/mana_en.c +2 -2
@@ -2931,7 +2931,7 @@ void mana_remove(struct gdma_dev *gd, bool suspending)if (!ndev) {if (i ==0 )dev_err (dev,"No net device to remove\n" ); - goto out; +break ; }/* All cleanup actions should stay after rtnl_lock(), otherwise
@@ -2958,7 +2958,7 @@ void mana_remove(struct gdma_dev *gd, bool suspending) }mana_destroy_eq (ac); -out: +mana_gd_deregister_device (gd);if (suspending)
drivers/net/ethernet/ti/am65-cpsw-nuss.c +2 -0
@@ -753,6 +753,8 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_common *common,k3_udma_glue_rx_cppi5_to_dma_addr (rx_chn->rx_chn, &buf_dma); pkt_len =cppi5_hdesc_get_pktlen (desc_rx);cppi5_desc_get_tags_ids (&desc_rx->hdr, &port_id,NULL ); +/* Port ID is contained in the lower 8-bits of the 16-bit Source Tag */ + port_id &=0xFF ;dev_dbg (dev,"%s rx port_id:%d\n" , __func__, port_id); port =am65_common_get_port (common, port_id); ndev = port->ndev;
drivers/net/ipvlan/ipvlan_main.c +4 -0
@@ -144,6 +144,8 @@ static int ipvlan_init(struct net_device *dev) dev->hw_enc_features |= dev->features;netif_inherit_tso_max (dev, phy_dev); dev->hard_header_len = phy_dev->hard_header_len; + dev->needed_headroom = phy_dev->needed_headroom; + dev->needed_tailroom = phy_dev->needed_tailroom;netdev_lockdep_set_classes (dev);
@@ -767,6 +769,8 @@ static int ipvlan_device_event(struct notifier_block *unused,case NETDEV_FEAT_CHANGE :list_for_each_entry (ipvlan, &port->ipvlans, pnode) {netif_inherit_tso_max (ipvlan->dev, dev); + ipvlan->dev->needed_headroom = dev->needed_headroom; + ipvlan->dev->needed_tailroom = dev->needed_tailroom;netdev_update_features (ipvlan->dev); }break ;
drivers/net/macvlan.c +4 -0
@@ -940,6 +940,8 @@ static int macvlan_init(struct net_device *dev) dev->hw_enc_features |= dev->features;netif_inherit_tso_max (dev, lowerdev); dev->hard_header_len = lowerdev->hard_header_len; + dev->needed_headroom = lowerdev->needed_headroom; + dev->needed_tailroom = lowerdev->needed_tailroom;macvlan_set_lockdep_class (dev); vlan->pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
@@ -1822,6 +1824,8 @@ static int macvlan_device_event(struct notifier_block *unused,case NETDEV_FEAT_CHANGE :list_for_each_entry (vlan, &port->vlans, list) {netif_inherit_tso_max (vlan->dev, dev); + vlan->dev->needed_headroom = dev->needed_headroom; + vlan->dev->needed_tailroom = dev->needed_tailroom;netdev_update_features (vlan->dev); }break ;
drivers/net/veth.c +2 -2
@@ -731,7 +731,7 @@ static int veth_convert_skb_to_xdp_buff(struct veth_rq *rq,u32 frame_sz;if (skb_shared (skb) ||skb_head_is_locked (skb) || -skb_shinfo (skb)->nr_frags || +skb_is_nonlinear (skb) ||skb_headroom (skb) <XDP_PACKET_HEADROOM ) {u32 size, len, max_head_size, off;struct sk_buff *nskb;
@@ -808,7 +808,7 @@ static int veth_convert_skb_to_xdp_buff(struct veth_rq *rq,xdp_prepare_buff (xdp, skb->head,skb_headroom (skb),skb_headlen (skb), true); -if (skb_is_nonlinear (skb)) { +if (skb_shinfo (skb)->nr_frags) {skb_shinfo (skb)->xdp_frags_size = skb->data_len;xdp_buff_set_frags_flag (xdp); }else {
drivers/net/vrf.c +17 -32
93 lines not on this page · raw message
drivers/net/vxlan/vxlan_core.c +18 -27
150 lines not on this page · raw message
drivers/net/vxlan/vxlan_mdb.c +2 -2
@@ -1326,7 +1326,7 @@ struct vxlan_mdb_entry *vxlan_mdb_entry_skb_get(struct vxlan_dev *vxlan,switch (skb->protocol) {case htons (ETH_P_IP ): -if (!pskb_may_pull (skb,sizeof (struct iphdr ))) +if (!pskb_network_may_pull (skb,sizeof (struct iphdr )))return NULL ; group.dst.sa.sa_family =AF_INET ; group.dst.sin.sin_addr.s_addr =ip_hdr (skb)->daddr;
@@ -1335,7 +1335,7 @@ struct vxlan_mdb_entry *vxlan_mdb_entry_skb_get(struct vxlan_dev *vxlan,break ;#if IS_ENABLED (CONFIG_IPV6 )case htons (ETH_P_IPV6 ): -if (!pskb_may_pull (skb,sizeof (struct ipv6hdr ))) +if (!pskb_network_may_pull (skb,sizeof (struct ipv6hdr )))return NULL ; group.dst.sa.sa_family =AF_INET6 ; group.dst.sin6.sin6_addr =ipv6_hdr (skb)->daddr;
drivers/s390/cio/vfio_ccw_async.c +16 -0
@@ -8,6 +8,7 @@*/ #include <linux/vfio.h> +#include <linux/nospec.h> #include "vfio_ccw_private.h"
@@ -24,11 +25,20 @@ static ssize_t vfio_ccw_async_region_read(struct vfio_ccw_private *private,return -EINVAL ;mutex_lock (&private->io_mutex); + +if (i >= private->num_regions) { + ret = -EINVAL ; + goto out_unlock; + } + + i =array_index_nospec (i, private->num_regions); region = private->region[i].data;if (copy_to_user (buf, (void *)region + pos, count)) ret = -EFAULT ;else ret = count; + +out_unlock:mutex_unlock (&private->io_mutex);return ret; }
@@ -48,6 +58,12 @@ static ssize_t vfio_ccw_async_region_write(struct vfio_ccw_private *private,if (!mutex_trylock (&private->io_mutex))return -EAGAIN ; +if (i >= private->num_regions) { + ret = -EINVAL ; + goto out_unlock; + } + + i =array_index_nospec (i, private->num_regions); region = private->region[i].data;if (copy_from_user ((void *)region + pos, buf, count)) { ret = -EFAULT ;
drivers/s390/cio/vfio_ccw_chp.c +16 -1
@@ -9,6 +9,7 @@*/ #include <linux/slab.h> +#include <linux/nospec.h> #include <linux/vfio.h> #include "vfio_ccw_private.h"
@@ -26,6 +27,13 @@ static ssize_t vfio_ccw_schib_region_read(struct vfio_ccw_private *private,return -EINVAL ;mutex_lock (&private->io_mutex); + +if (i >= private->num_regions) { + ret = -EINVAL ; + goto out; + } + + i =array_index_nospec (i, private->num_regions); region = private->region[i].data;if (cio_update_schib (sch)) {
@@ -90,13 +98,19 @@ static ssize_t vfio_ccw_crw_region_read(struct vfio_ccw_private *private,if (pos + count >sizeof (*region))return -EINVAL ; +mutex_lock (&private->io_mutex); crw =list_first_entry_or_null (&private->crw, struct vfio_ccw_crw, next);if (crw)list_del (&crw->next); -mutex_lock (&private->io_mutex); +if (i >= private->num_regions) { + ret = -EINVAL ; + goto out; + } + + i =array_index_nospec (i, private->num_regions); region = private->region[i].data;if (crw)
@@ -109,6 +123,7 @@ static ssize_t vfio_ccw_crw_region_read(struct vfio_ccw_private *private, region->crw =0 ; +out:mutex_unlock (&private->io_mutex);kfree (crw);
drivers/s390/cio/vfio_ccw_cp.c +18 -13
@@ -331,6 +331,7 @@ static struct ccwchain *ccwchain_alloc(struct channel_program *cp, int len) goto out_err;list_add_tail (&chain->next, &cp->ccwchain_list); + cp->ccwchain_count++;return chain;
@@ -375,11 +376,9 @@ static void ccwchain_cda_free(struct ccwchain *chain, int idx)static int ccwchain_calc_length (u64 iova,struct channel_program *cp) {struct ccw1 *ccw = cp->guest_cp; -int cnt =0 ; - - do { - cnt++; +int cnt; +for (cnt =1 ; cnt <=CCWCHAIN_LEN_MAX ; cnt++, ccw++) {/* * We want to keep counting if the current CCW has the * command-chaining flag enabled, or if it is a TIC CCW
@@ -389,15 +388,10 @@ static int ccwchain_calc_length(u64 iova, struct channel_program *cp)* after the TIC, depending on the results of its operation. */ if (!ccw_is_chain (ccw) && !is_tic_within_range (ccw, iova, cnt)) -break ; - - ccw++; - }while (cnt <CCWCHAIN_LEN_MAX +1 ); - -if (cnt ==CCWCHAIN_LEN_MAX +1 ) - cnt = -EINVAL ; +return cnt; + } -return cnt; +return -EINVAL ; }static int tic_target_chain_exists (struct ccw1 *tic,struct channel_program *cp)
@@ -438,6 +432,10 @@ static int ccwchain_handle_ccw(u32 cda, struct channel_program *cp)if (len <0 )return len; +/* Limit number of chains in a single channel program */ +if (cp->ccwchain_count >=CCWCHAIN_COUNT_MAX ) +return -EINVAL ; +/* Need alloc a new chain for this one. */ chain =ccwchain_alloc (cp, len);if (!chain)
@@ -725,6 +723,7 @@ int cp_init(struct channel_program *cp, union orb *orb) vdev->dev, "Prefetching channel program even though prefetch not specified in ORB"); + cp->ccwchain_count =0 ;INIT_LIST_HEAD (&cp->ccwchain_list);memcpy (&cp->orb, orb,sizeof (*orb));
@@ -940,17 +939,23 @@ void cp_update_scsw(struct channel_program *cp, union scsw *scsw)*/ bool cp_iova_pinned (struct channel_program *cp,u64 iova,u64 length) { +struct vfio_ccw_private *private = + container_of(cp, struct vfio_ccw_private, cp);struct ccwchain *chain;int i;if (!cp->initialized)return false; +mutex_lock (&private->io_mutex);list_for_each_entry (chain, &cp->ccwchain_list, next) {for (i =0 ; i < chain->ch_len; i++) -if (page_array_iova_pinned (&chain->ch_pa[i], iova, length)) +if (page_array_iova_pinned (&chain->ch_pa[i], iova, length)) { +mutex_unlock (&private->io_mutex);return true; + } } +mutex_unlock (&private->io_mutex);return false; }
drivers/s390/cio/vfio_ccw_cp.h +8 -0
@@ -23,11 +23,18 @@*/ #define CCWCHAIN_LEN_MAX 256 +/* +* Maximum number of chains +*/ +#define CCWCHAIN_COUNT_MAX 16 +/** * struct channel_program - manage information for channel program * @ccwchain_list: list head of ccwchains * @orb: orb for the currently processed ssch request * @initialized: whether this instance is actually initialized +* @guest_cp: copy of guest channel program +* @ccwchain_count: number of channel program segments (linked by TIC) * * @ccwchain_list is the head of a ccwchain list, that contents the * translated result of the guest channel program that pointed out by
@@ -38,6 +45,7 @@ struct channel_program {union orb orb;bool initialized;struct ccw1 *guest_cp; +unsigned int ccwchain_count; };int cp_init (struct channel_program *cp,union orb *orb);
drivers/s390/cio/vfio_ccw_drv.c +13 -2
@@ -91,6 +91,7 @@ void vfio_ccw_sch_io_todo(struct work_struct *work) is_final = !(scsw_actl (&irb->scsw) & (SCSW_ACTL_DEVACT |SCSW_ACTL_SCHACT )); +mutex_lock (&private->io_mutex);if (scsw_is_solicited (&irb->scsw)) {cp_update_scsw (&private->cp, &irb->scsw);if (is_final && private->state ==VFIO_CCW_STATE_CP_PENDING ) {
@@ -98,9 +99,7 @@ void vfio_ccw_sch_io_todo(struct work_struct *work) cp_is_finished = true; } } -mutex_lock (&private->io_mutex);memcpy (private->io_region->irb_area, irb,sizeof (*irb)); -mutex_unlock (&private->io_mutex);/* * Reset to IDLE only if processing of a channel program
@@ -110,6 +109,7 @@ void vfio_ccw_sch_io_todo(struct work_struct *work)*/ if (cp_is_finished) private->state =VFIO_CCW_STATE_IDLE ; +mutex_unlock (&private->io_mutex);if (private->io_trigger)eventfd_signal (private->io_trigger,1 );
@@ -125,6 +125,17 @@ void vfio_ccw_crw_todo(struct work_struct *work)eventfd_signal (private->crw_trigger,1 ); } +void vfio_ccw_notoper_todo (struct work_struct *work) +{ +struct vfio_ccw_private *private; + + private = container_of(work, struct vfio_ccw_private, notoper_work); + +mutex_lock (&private->io_mutex); +cp_free (&private->cp); +mutex_unlock (&private->io_mutex); +} +/* * Css driver callbacks */
drivers/s390/cio/vfio_ccw_fsm.c +6 -2
@@ -170,8 +170,8 @@ static void fsm_notoper(struct vfio_ccw_private *private,css_sched_sch_todo (sch,SCH_TODO_UNREG ); private->state =VFIO_CCW_STATE_NOT_OPER ; -/* This is usually handled during CLOSE event */ -cp_free (&private->cp); +/* This routine could be called from IRQ context, so defer */ +queue_work (vfio_ccw_work_q, &private->notoper_work); }/*
@@ -410,7 +410,11 @@ static void fsm_close(struct vfio_ccw_private *private, private->state =VFIO_CCW_STATE_STANDBY ;spin_unlock_irq (&sch->lock); + +mutex_lock (&private->io_mutex);cp_free (&private->cp); +mutex_unlock (&private->io_mutex); +return ; err_unlock:
drivers/s390/cio/vfio_ccw_ops.c +31 -4
@@ -54,6 +54,7 @@ static int vfio_ccw_mdev_init_dev(struct vfio_device *vdev)INIT_LIST_HEAD (&private->crw);INIT_WORK (&private->io_work, vfio_ccw_sch_io_todo);INIT_WORK (&private->crw_work, vfio_ccw_crw_todo); +INIT_WORK (&private->notoper_work, vfio_ccw_notoper_todo); private->cp.guest_cp =kcalloc (CCWCHAIN_LEN_MAX ,sizeof (struct ccw1 ),GFP_KERNEL );
@@ -132,6 +133,20 @@ static void vfio_ccw_mdev_release_dev(struct vfio_device *vdev) container_of(vdev, struct vfio_ccw_private, vdev);struct vfio_ccw_crw *crw, *temp; +/* +* Ensure these work items are fully drained, so none can +* fire after being released. +* +* notoper_work should have nothing to do here, because only +* open devices could have channel_program resources in use +* and those would be released during close. Nevertheless, +* call flush here as well to be certain anything that was +* allocated is freed. +*/ +cancel_work_sync (&private->io_work); +cancel_work_sync (&private->crw_work); +flush_work (&private->notoper_work); +list_for_each_entry_safe (crw, temp, &private->crw, next) {list_del (&crw->next);kfree (crw);
@@ -203,6 +218,19 @@ static void vfio_ccw_mdev_close_device(struct vfio_device *vdev) container_of(vdev, struct vfio_ccw_private, vdev);vfio_ccw_fsm_event (private,VFIO_CCW_EVENT_CLOSE ); + +/* +* Ensure these work items are drained, in the event the +* device is re-opened instead of released. +* +* notoper_work needs to be given a chance to run if it +* is queued, so any memory associated with the channel +* program can be returned. +*/ +cancel_work_sync (&private->io_work); +cancel_work_sync (&private->crw_work); +flush_work (&private->notoper_work); +vfio_ccw_unregister_dev_regions (private); }
@@ -244,6 +272,7 @@ static ssize_t vfio_ccw_mdev_read(struct vfio_device *vdev,return vfio_ccw_mdev_read_io_region (private, buf, count, ppos);default : index -=VFIO_CCW_NUM_REGIONS ; + index =array_index_nospec (index, private->num_regions);return private->region[index].ops->read (private, buf, count, ppos); }
@@ -296,6 +325,7 @@ static ssize_t vfio_ccw_mdev_write(struct vfio_device *vdev,return vfio_ccw_mdev_write_io_region (private, buf, count, ppos);default : index -=VFIO_CCW_NUM_REGIONS ; + index =array_index_nospec (index, private->num_regions);return private->region[index].ops->write (private, buf, count, ppos); }
@@ -338,11 +368,8 @@ static int vfio_ccw_mdev_get_region_info(struct vfio_ccw_private *private, VFIO_CCW_NUM_REGIONS + private->num_regions)return -EINVAL ; - info->index =array_index_nospec (info->index, -VFIO_CCW_NUM_REGIONS + - private->num_regions); - i = info->index -VFIO_CCW_NUM_REGIONS ; + i =array_index_nospec (i, private->num_regions); info->offset =VFIO_CCW_INDEX_TO_OFFSET (info->index); info->size = private->region[i].size;
drivers/s390/cio/vfio_ccw_private.h +5 -1
@@ -88,7 +88,8 @@ struct vfio_ccw_parent {* @state: internal state of the device * @completion: synchronization helper of the I/O completion * @io_region: MMIO region to input/output I/O arguments/results -* @io_mutex: protect against concurrent update of I/O regions +* @io_mutex: protect against concurrent update of I/O resources +* and @cp lifecycle * @region: additional regions for other subchannel operations * @cmd_region: MMIO region for asynchronous I/O commands other than START * @schib_region: MMIO region for SCHIB information
@@ -102,6 +103,7 @@ struct vfio_ccw_parent {* @req_trigger: eventfd ctx for signaling userspace to return device * @io_work: work for deferral process of I/O handling * @crw_work: work for deferral process of CRW handling +* @notoper_work: work for deferred processing in not-operational state */ struct vfio_ccw_private {struct vfio_device vdev;
@@ -125,11 +127,13 @@ struct vfio_ccw_private {struct eventfd_ctx *req_trigger;struct work_struct io_work;struct work_struct crw_work; +struct work_struct notoper_work; }__aligned(8) ;int vfio_ccw_sch_quiesce (struct subchannel *sch);void vfio_ccw_sch_io_todo (struct work_struct *work);void vfio_ccw_crw_todo (struct work_struct *work); +void vfio_ccw_notoper_todo (struct work_struct *work);extern struct mdev_driver vfio_ccw_mdev_driver;
drivers/s390/net/qeth_core_main.c +3 -0
@@ -4710,6 +4710,9 @@ static int qeth_snmp_command(struct qeth_card *card, char __user *udata)if (req_len >QETH_BUFSIZE )return -EINVAL ; +if (qinfo.udata_len <sizeof (struct qeth_snmp_ureq_hdr )) +return -EINVAL ; + iob =qeth_get_adapter_cmd (card,IPA_SETADP_SET_SNMP_CONTROL , req_len);if (!iob)return -ENOMEM ;
drivers/s390/net/qeth_l3_main.c +5 -0
@@ -1415,6 +1415,11 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) rc = -EFAULT ; goto out; } + +if (qinfo.udata_len <QETH_QARP_ENTRIES_OFFSET ) { + rc = -EINVAL ; + goto out; + } qinfo.udata =kzalloc (qinfo.udata_len,GFP_KERNEL );if (!qinfo.udata) { rc = -ENOMEM ;
drivers/video/fbdev/core/fb_io_fops.c +8 -0
@@ -57,6 +57,14 @@ ssize_t fb_io_read(struct fb_info *info, char __user *buf, size_t count, loff_t buf += c; cnt += c; count -= c; + +/* +* If there was a partial copy, the user buffer is faulty. +* Break out to avoid over-advancing the src pointer and +* reading out of bounds in the next iteration. +*/ +if (trailing) +break ; }kfree (buffer);
fs/binfmt_elf.c +2 -2
@@ -1287,7 +1287,7 @@ static int load_elf_binary(struct linux_binprm *bprm) } reloc_func_desc = interp_load_addr; -allow_write_access (interpreter); +exe_file_allow_write_access (interpreter);fput (interpreter);kfree (interp_elf_ex);
@@ -1396,7 +1396,7 @@ static int load_elf_binary(struct linux_binprm *bprm)kfree (interp_elf_ex);kfree (interp_elf_phdata); out_free_file: -allow_write_access (interpreter); +exe_file_allow_write_access (interpreter);if (interpreter)fput (interpreter); out_free_ph:
fs/binfmt_elf_fdpic.c +2 -2
@@ -398,7 +398,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm) goto error; } -allow_write_access (interpreter); +exe_file_allow_write_access (interpreter);fput (interpreter); interpreter =NULL ; }
@@ -471,7 +471,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm) error:if (interpreter) { -allow_write_access (interpreter); +exe_file_allow_write_access (interpreter);fput (interpreter); }kfree (interpreter_name);
fs/binfmt_misc.c +11 -3
@@ -163,8 +163,10 @@ static Node *get_binfmt_handler(struct linux_binprm *bprm)static void put_binfmt_handler (Node *e) {if (refcount_dec_and_test (&e->users)) { -if (e->flags &MISC_FMT_OPEN_FILE ) +if (e->flags &MISC_FMT_OPEN_FILE ) { +exe_file_allow_write_access (e->interp_file);filp_close (e->interp_file,NULL ); + }kfree (e); } }
@@ -218,8 +220,14 @@ static int load_misc_binary(struct linux_binprm *bprm)if (fmt->flags &MISC_FMT_OPEN_FILE ) { interp_file =file_clone_open (fmt->interp_file); -if (!IS_ERR (interp_file)) -deny_write_access (interp_file); +if (!IS_ERR (interp_file)) { +int err =exe_file_deny_write_access (interp_file); + +if (err) { +fput (interp_file); + interp_file =ERR_PTR (err); + } + } }else { interp_file =open_exec (fmt->interpreter); }
fs/btrfs/block-group.c +36 -25
123 lines not on this page · raw message
fs/btrfs/block-group.h +2 -1
@@ -327,7 +327,8 @@ int btrfs_add_reserved_bytes(struct btrfs_block_group *cache, bool force_wrong_size_class);void btrfs_free_reserved_bytes (struct btrfs_block_group *cache,u64 num_bytes,int delalloc); -int btrfs_chunk_alloc (struct btrfs_trans_handle *trans,u64 flags, +int btrfs_chunk_alloc (struct btrfs_trans_handle *trans, +struct btrfs_space_info *space_info,u64 flags,enum btrfs_chunk_alloc_enum force);int btrfs_force_chunk_alloc (struct btrfs_trans_handle *trans,u64 type);void check_system_chunk (struct btrfs_trans_handle *trans,const u64 type);
fs/btrfs/extent-tree.c +4 -2
@@ -4034,6 +4034,7 @@ static int can_allocate_chunk(struct btrfs_fs_info *fs_info,static int find_free_extent_update_loop (struct btrfs_fs_info *fs_info,struct btrfs_key *ins,struct find_free_extent_ctl *ffe_ctl, +struct btrfs_space_info *space_info,bool full_search) {struct btrfs_root *root = fs_info->chunk_root;
@@ -4088,7 +4089,7 @@ static int find_free_extent_update_loop(struct btrfs_fs_info *fs_info,return ret; } - ret =btrfs_chunk_alloc (trans, ffe_ctl->flags, + ret =btrfs_chunk_alloc (trans, space_info, ffe_ctl->flags,CHUNK_ALLOC_FORCE_FOR_EXTENT );/* Do not bail out on ENOSPC since we can do more. */
@@ -4488,7 +4489,8 @@ static noinline int find_free_extent(struct btrfs_root *root, }up_read (&space_info->groups_sem); - ret =find_free_extent_update_loop (fs_info, ins, ffe_ctl, full_search); + ret =find_free_extent_update_loop (fs_info, ins, ffe_ctl, space_info, + full_search);if (ret >0 ) goto search;
fs/btrfs/messages.h +7 -0
@@ -181,6 +181,13 @@ do { \#define ASSERT (expr) (void)(expr)#endif +#ifdef CONFIG_BTRFS_DEBUG +/* Verbose warning only under debug build. */ +#define DEBUG_WARN(args...) WARN(1, KERN_ERR args) +#else +#define DEBUG_WARN (...) do {} while(0) +#endif + __printf(5, 6)__cold void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,
fs/btrfs/space-info.c +1 -1
@@ -807,7 +807,7 @@ static void flush_space(struct btrfs_fs_info *fs_info, ret =PTR_ERR (trans);break ; } - ret =btrfs_chunk_alloc (trans, + ret =btrfs_chunk_alloc (trans, space_info,btrfs_get_alloc_profile (fs_info, space_info->flags), (state ==ALLOC_CHUNK ) ?CHUNK_ALLOC_NO_FORCE :CHUNK_ALLOC_FORCE );
fs/btrfs/transaction.c +3 -2
@@ -729,9 +729,10 @@ start_transaction(struct btrfs_root *root, unsigned int num_items,* value here. */ if (do_chunk_alloc && num_bytes) { -u64 flags = h->block_rsv->space_info->flags; +struct btrfs_space_info *space_info = h->block_rsv->space_info; +u64 flags = space_info->flags; -btrfs_chunk_alloc (h,btrfs_get_alloc_profile (fs_info, flags), +btrfs_chunk_alloc (h, space_info,btrfs_get_alloc_profile (fs_info, flags),CHUNK_ALLOC_NO_FORCE ); }
fs/btrfs/zoned.c +2 -3
@@ -2457,10 +2457,9 @@ int btrfs_zone_finish_one_bg(struct btrfs_fs_info *fs_info)return ret <0 ? ret :1 ; } -int btrfs_zoned_activate_one_bg (struct btrfs_fs_info *fs_info, -struct btrfs_space_info *space_info, -bool do_finish) +int btrfs_zoned_activate_one_bg (struct btrfs_space_info *space_info,bool do_finish) { +struct btrfs_fs_info *fs_info = space_info->fs_info;struct btrfs_block_group *bg;int index;
fs/btrfs/zoned.h +2 -4
@@ -81,8 +81,7 @@ bool btrfs_zoned_should_reclaim(const struct btrfs_fs_info *fs_info);void btrfs_zoned_release_data_reloc_bg (struct btrfs_fs_info *fs_info,u64 logical,u64 length);int btrfs_zone_finish_one_bg (struct btrfs_fs_info *fs_info); -int btrfs_zoned_activate_one_bg (struct btrfs_fs_info *fs_info, -struct btrfs_space_info *space_info,bool do_finish); +int btrfs_zoned_activate_one_bg (struct btrfs_space_info *space_info,bool do_finish);void btrfs_check_active_zone_reservation (struct btrfs_fs_info *fs_info);#else /* CONFIG_BLK_DEV_ZONED */ static inline int btrfs_get_dev_zone(struct btrfs_device *device, u64 pos,
@@ -253,8 +252,7 @@ static inline int btrfs_zone_finish_one_bg(struct btrfs_fs_info *fs_info)return 1 ; } -static inline int btrfs_zoned_activate_one_bg (struct btrfs_fs_info *fs_info, -struct btrfs_space_info *space_info, +static inline int btrfs_zoned_activate_one_bg (struct btrfs_space_info *space_info,bool do_finish) {/* Consider all the block groups are active */
fs/ceph/addr.c +14 -40
107 lines not on this page · raw message
fs/ceph/caps.c +15 -2
@@ -3091,7 +3091,19 @@ int __ceph_get_caps(struct inode *inode, struct ceph_file_info *fi, int need, ret = -ERESTARTSYS ;break ; } -wait_woken (&wait,TASK_INTERRUPTIBLE ,MAX_SCHEDULE_TIMEOUT ); + +/* +* If a cap update is lost after +* mds_wanted was raised, waiting +* forever will never make progress. +* Retry the renew path periodically +* so we can resend synchronously. +*/ +if (!wait_woken (&wait,TASK_INTERRUPTIBLE , +CEPH_GET_CAPS_WAIT_TIMEOUT )) { + ret = -EUCLEAN ; +break ; + } }remove_wait_queue (&ci->i_cap_wq, &wait);
@@ -3123,7 +3135,8 @@ int __ceph_get_caps(struct inode *inode, struct ceph_file_info *fi, int need,continue ; }if (ret == -EUCLEAN ) { -/* session was killed, try renew caps */ +/* session was killed or a waited cap +* request needs a retry */ ret =ceph_renew_caps (inode, flags);if (ret ==0 )continue ;
fs/ceph/file.c +5 -4
@@ -294,7 +294,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode) }/* -* try renew caps after session gets killed. +* Retry cap acquisition after a stale session or a lost cap update. */ int ceph_renew_caps (struct inode *inode,int fmode) {
@@ -302,14 +302,15 @@ int ceph_renew_caps(struct inode *inode, int fmode)struct ceph_client *cl = mdsc->fsc->client;struct ceph_inode_info *ci =ceph_inode (inode);struct ceph_mds_request *req; -int err, flags, wanted; +int err, flags, wanted, issued;spin_lock (&ci->i_ceph_lock);__ceph_touch_fmode (ci, mdsc, fmode); wanted =__ceph_caps_file_wanted (ci); + issued =__ceph_caps_issued (ci,NULL );if (__ceph_is_any_real_caps (ci) && - (!(wanted &CEPH_CAP_ANY_WR ) || ci->i_auth_cap)) { -int issued =__ceph_caps_issued (ci,NULL ); + (!(wanted &CEPH_CAP_ANY_WR ) || ci->i_auth_cap) && + (issued & wanted) == wanted) {spin_unlock (&ci->i_ceph_lock); doutc(cl, "%p %llx.%llx want %s issued %s updating mds_wanted\n", inode, ceph_vinop(inode), ceph_cap_string(wanted),
fs/ceph/mds_client.c +11 -0
@@ -6,6 +6,7 @@#include <linux/slab.h> #include <linux/gfp.h> #include <linux/sched.h> +#include <linux/sched/mm.h> #include <linux/debugfs.h> #include <linux/seq_file.h> #include <linux/ratelimit.h>
@@ -3675,6 +3676,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)struct ceph_mds_reply_head *head = msg->front.iov_base;struct ceph_mds_reply_info_parsed *rinfo;/* parsed reply info */ struct ceph_snap_realm *realm; +unsigned int nofs_flags;u64 tid;int err, result;int mds = session->s_mds;
@@ -3817,6 +3819,14 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)/* insert trace into our cache */ mutex_lock (&req->r_fill_mutex); + +/* disable fs reclaim while we are using current->journal_info +* for our own purposes, or else shrinkers of other +* filesystems might dereference this pointer as a different +* type +*/ + nofs_flags =memalloc_nofs_save (); + current->journal_info = req; err =ceph_fill_trace (mdsc->fsc->sb, req);if (err ==0 ) {
@@ -3825,6 +3835,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) err =ceph_readdir_prepopulate (req, req->r_session); } current->journal_info =NULL ; +memalloc_nofs_restore (nofs_flags);mutex_unlock (&req->r_fill_mutex);up_read (&mdsc->snap_rwsem);
fs/ceph/mds_client.h +2 -0
@@ -68,6 +68,8 @@ enum ceph_feature_type {struct ceph_fs_client ;struct ceph_cap ; +#define CEPH_GET_CAPS_WAIT_TIMEOUT (5 * HZ) +/* * parsed info about a single inode. pointers are into the encoded * on-wire structures within the mds reply message payload.
fs/ceph/mdsmap.c +1 -1
@@ -15,7 +15,7 @@#include "super.h" #define CEPH_MDS_IS_READY (i, ignore_laggy) \ - (m->m_info[i].state > 0 && ignore_laggy ? true : !m->m_info[i].laggy) + (m->m_info[i].state > 0 && (ignore_laggy ? true : !m->m_info[i].laggy))static int __mdsmap_get_random_mds (struct ceph_mdsmap *m,bool ignore_laggy) {
fs/erofs/Kconfig +2 -1
@@ -103,7 +103,8 @@ config EROFS_FS_ZIP_LZMA config EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS int "EROFS LZMA default maximum decompression streams" depends on EROFS_FS_ZIP_LZMA - range 1 NR_CPUS + range 1 NR_CPUS if SMP + range 1 1 if !SMP default 16 help By default EROFS allocates one LZMA decompression stream per CPU.
fs/exec.c +3 -3
@@ -935,7 +935,7 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) path_noexec(&file->f_path)) goto exit; - err =deny_write_access (file); + err =exe_file_deny_write_access (file);if (err) goto exit;
@@ -1521,7 +1521,7 @@ static void free_bprm(struct linux_binprm *bprm)abort_creds (bprm->cred); }if (bprm->file) { -allow_write_access (bprm->file); +exe_file_allow_write_access (bprm->file);fput (bprm->file); }if (bprm->executable)
@@ -1824,7 +1824,7 @@ static int exec_binprm(struct linux_binprm *bprm) bprm->file = bprm->interpreter; bprm->interpreter =NULL ; -allow_write_access (exec); +exe_file_allow_write_access (exec);if (unlikely (bprm->have_execfd)) {if (bprm->executable) {fput (exec);
fs/f2fs/data.c +1 -1
@@ -948,7 +948,7 @@ int f2fs_merge_page_bio(struct f2fs_io_info *fio)if (fio->io_wbc)wbc_account_cgroup_owner (fio->io_wbc, fio->page,PAGE_SIZE ); -inc_page_count (fio->sbi,WB_DATA_TYPE (page, false)); +inc_page_count (fio->sbi,WB_DATA_TYPE (fio->page, false)); *fio->last_block = fio->new_blkaddr; *fio->bio = bio;
fs/iomap/buffered-io.c +25 -17
68 lines not on this page · raw message
fs/smb/client/cifsglob.h +0 -27
@@ -606,27 +606,6 @@ struct smb_version_operations { const char *symname); }; -struct smb_version_values { -char *version_string; -__u16 protocol_id; -__u32 req_capabilities; -__u32 large_lock_type; -__u32 exclusive_lock_type; -__u32 shared_lock_type; -__u32 unlock_lock_type; -size_t header_preamble_size; -size_t header_size; -size_t max_header_size; -size_t read_rsp_size; -__le16 lock_cmd; -unsigned int cap_unix; -unsigned int cap_nt_find; -unsigned int cap_large_files; -__u16 signing_enabled; -__u16 signing_required; -size_t create_lease_size; -}; -#define HEADER_SIZE (server) (server->vals->header_size)#define MAX_HEADER_SIZE (server) (server->vals->max_header_size)#define HEADER_PREAMBLE_SIZE (server) (server->vals->header_preamble_size)
@@ -664,12 +643,6 @@ struct cifs_mnt_data {int flags; }; -static inline unsigned int -get_rfc1002_length (void *buf) -{ -return be32_to_cpu (*((__be32 *)buf)) &0xffffff ; -} -struct TCP_Server_Info {struct list_head tcp_ses_list;struct list_head smb_ses_list;
fs/smb/client/cifssmb.c +3 -3
@@ -595,7 +595,7 @@ CIFSSMBEcho(struct TCP_Server_Info *server) iov[0 ].iov_len =4 ; iov[0 ].iov_base = smb; - iov[1 ].iov_len =get_rfc1002_length (smb); + iov[1 ].iov_len =get_rfc1002_len (smb); iov[1 ].iov_base = (char *)smb +4 ; rc = cifs_call_async(server, &rqst, NULL, cifs_echo_callback, NULL,
@@ -1363,7 +1363,7 @@ cifs_async_readv(struct cifs_readdata *rdata) rdata->iov[0 ].iov_base = smb; rdata->iov[0 ].iov_len =4 ; rdata->iov[1 ].iov_base = (char *)smb +4 ; - rdata->iov[1 ].iov_len =get_rfc1002_length (smb); + rdata->iov[1 ].iov_len =get_rfc1002_len (smb);kref_get (&rdata->refcount); rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive,
@@ -1707,7 +1707,7 @@ cifs_async_writev(struct cifs_writedata *wdata,/* 4 for RFC1001 length + 1 for BCC */ iov[0 ].iov_len =4 ; iov[0 ].iov_base = smb; - iov[1 ].iov_len =get_rfc1002_length (smb) +1 ; + iov[1 ].iov_len =get_rfc1002_len (smb) +1 ; iov[1 ].iov_base = (char *)smb +4 ; rqst.rq_iov = iov;
fs/smb/client/connect.c +1 -1
@@ -1230,7 +1230,7 @@ cifs_demultiplex_thread(void *p)* The right amount was read from socket - 4 bytes, * so we can now interpret the length field. */ - pdu_length =get_rfc1002_length (buf); + pdu_length =get_rfc1002_len (buf);cifs_dbg (FYI ,"RFC1002 header 0x%x\n" , pdu_length);if (!is_smb_response (server, buf[0 ]))
fs/smb/client/transport.c +4 -4
@@ -882,7 +882,7 @@ SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses,int resp_buf_type; iov[0 ].iov_base = in_buf; - iov[0 ].iov_len =get_rfc1002_length (in_buf) +4 ; + iov[0 ].iov_len =get_rfc1002_len (in_buf) +4 ; flags |=CIFS_NO_RSP_BUF ; rc =SendReceive2 (xid, ses, iov,1 , &resp_buf_type, flags, &rsp_iov);cifs_dbg (NOISY ,"SendRcvNoRsp flags %d rc %d\n" , flags, rc);
@@ -942,7 +942,7 @@ int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, bool log_error) { - unsigned int len = get_rfc1002_length(mid->resp_buf) + 4; + unsigned int len = get_rfc1002_len(mid->resp_buf) + 4;dump_smb (mid->resp_buf,min_t (u32,92 , len));
@@ -1462,7 +1462,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses, goto out; } - *pbytes_returned =get_rfc1002_length (midQ->resp_buf); + *pbytes_returned =get_rfc1002_len (midQ->resp_buf);memcpy (out_buf, midQ->resp_buf, *pbytes_returned +4 ); rc =cifs_check_receive (midQ, server,0 ); out:
@@ -1647,7 +1647,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon, goto out; } - *pbytes_returned =get_rfc1002_length (midQ->resp_buf); + *pbytes_returned =get_rfc1002_len (midQ->resp_buf);memcpy (out_buf, midQ->resp_buf, *pbytes_returned +4 ); rc =cifs_check_receive (midQ, server,0 ); out:
fs/smb/common/cifsglob.h +36 -0
@@ -9,6 +9,42 @@#ifndef _COMMON_CIFS_GLOB_H#define _COMMON_CIFS_GLOB_H +struct smb_version_values { +char *version_string; +__u16 protocol_id; +__le16 lock_cmd; +__u32 req_capabilities; +__u32 max_read_size; +__u32 max_write_size; +__u32 max_trans_size; +__u32 max_credits; +__u32 large_lock_type; +__u32 exclusive_lock_type; +__u32 shared_lock_type; +__u32 unlock_lock_type; +size_t header_preamble_size; +size_t header_size; +size_t max_header_size; +size_t read_rsp_size; +unsigned int cap_unix; +unsigned int cap_nt_find; +unsigned int cap_large_files; +unsigned int cap_unicode; +__u16 signing_enabled; +__u16 signing_required; +size_t create_lease_size; +size_t create_durable_size; +size_t create_durable_v2_size; +size_t create_mxac_size; +size_t create_disk_id_size; +size_t create_posix_size; +}; + +static inline unsigned int get_rfc1002_len (void *buf) +{ +return be32_to_cpu (*((__be32 *)buf)) &0xffffff ; +} +static inline void inc_rfc1001_len (void *buf,int count) {be32_add_cpu ((__be32 *)buf, count);
fs/smb/server/auth.c +2 -2
@@ -920,7 +920,7 @@ int ksmbd_gen_preauth_integrity_hash(struct ksmbd_conn *conn, char *buf, __u8 *pi_hash) {int rc; -struct smb2_hdr *rcv_hdr =smb2_get_msg (buf); +struct smb2_hdr *rcv_hdr =smb_get_msg (buf);char *all_bytes_msg = (char *)&rcv_hdr->ProtocolId;int msg_size =get_rfc1002_len (buf);struct ksmbd_crypto_ctx *ctx =NULL ;
@@ -1107,7 +1107,7 @@ int ksmbd_crypt_message(struct ksmbd_work *work, struct kvec *iov, unsigned int nvec, int enc) {struct ksmbd_conn *conn = work->conn; -struct smb2_transform_hdr *tr_hdr =smb2_get_msg (iov[0 ].iov_base); +struct smb2_transform_hdr *tr_hdr =smb_get_msg (iov[0 ].iov_base);unsigned int assoc_data_len =sizeof (struct smb2_transform_hdr ) -20 ;int rc;DECLARE_CRYPTO_WAIT (wait);
fs/smb/server/connection.c +15 -8
@@ -376,8 +376,11 @@ bool ksmbd_conn_alive(struct ksmbd_conn *conn)return true; } -#define SMB1_MIN_SUPPORTED_HEADER_SIZE (sizeof(struct smb_hdr)) -#define SMB2_MIN_SUPPORTED_HEADER_SIZE (sizeof(struct smb2_hdr) + 4) +/* "+2" for BCC field (ByteCount, 2 bytes) */ +#define SMB1_MIN_SUPPORTED_PDU_SIZE (sizeof(struct smb_hdr) + 2) +#define SMB2_MIN_SUPPORTED_PDU_SIZE (sizeof(struct smb2_pdu)) +#define SMB2_TRANSFORM_MIN_SUPPORTED_PDU_SIZE \ + (sizeof(struct smb2_transform_hdr) + sizeof(struct smb2_hdr))/** * ksmbd_conn_handler_loop() - session thread to listen on new smb requests
@@ -392,6 +395,7 @@ int ksmbd_conn_handler_loop(void *p)struct ksmbd_conn *conn = (struct ksmbd_conn *)p;struct ksmbd_transport *t = conn->transport;unsigned int pdu_size, max_allowed_pdu_size, max_req; +__le32 proto;char hdr_buf[4 ] = {0 ,};int size;
@@ -444,7 +448,7 @@ int ksmbd_conn_handler_loop(void *p)if (pdu_size >MAX_STREAM_PROT_LEN )break ; -if (pdu_size <SMB1_MIN_SUPPORTED_HEADER_SIZE ) +if (pdu_size <SMB1_MIN_SUPPORTED_PDU_SIZE )break ;/* 4 for rfc1002 length field */
@@ -475,11 +479,14 @@ int ksmbd_conn_handler_loop(void *p)if (!ksmbd_smb_request (conn))break ; -if (((struct smb2_hdr *)smb2_get_msg (conn->request_buf))->ProtocolId == -SMB2_PROTO_NUMBER ) { -if (pdu_size <SMB2_MIN_SUPPORTED_HEADER_SIZE ) -break ; - } + proto = *(__le32 *)smb_get_msg (conn->request_buf); +if (proto ==SMB2_PROTO_NUMBER && + pdu_size <SMB2_MIN_SUPPORTED_PDU_SIZE ) +break ; + +if (proto ==SMB2_TRANSFORM_PROTO_NUM && + pdu_size <SMB2_TRANSFORM_MIN_SUPPORTED_PDU_SIZE ) +break ;if (!default_conn_ops.process_fn) {pr_err ("No connection request callback\n" );
fs/smb/server/connection.h +5 -0
@@ -194,6 +194,11 @@ void ksmbd_conn_r_count_dec(struct ksmbd_conn *conn);* This is a hack. We will move status to a proper place once we land * a multi-sessions support. */ +static inline bool ksmbd_conn_new (struct ksmbd_conn *conn) +{ +return READ_ONCE (conn->status) ==KSMBD_SESS_NEW ; +} +static inline bool ksmbd_conn_good (struct ksmbd_conn *conn) {return READ_ONCE (conn->status) ==KSMBD_SESS_GOOD ;
fs/smb/server/oplock.c +4 -4
@@ -663,7 +663,7 @@ static void __smb2_oplock_break_noti(struct work_struct *wk) goto out; } - rsp_hdr =smb2_get_msg (work->response_buf); + rsp_hdr =smb_get_msg (work->response_buf);memset (rsp_hdr,0 ,sizeof (struct smb2_hdr ) +2 ); rsp_hdr->ProtocolId =SMB2_PROTO_NUMBER ; rsp_hdr->StructureSize =SMB2_HEADER_STRUCTURE_SIZE ;
@@ -677,7 +677,7 @@ static void __smb2_oplock_break_noti(struct work_struct *wk) rsp_hdr->SessionId =0 ;memset (rsp_hdr->Signature,0 ,16 ); - rsp =smb2_get_msg (work->response_buf); + rsp =smb_get_msg (work->response_buf); rsp->StructureSize =cpu_to_le16 (24 ); if (!br_info->open_trunc &&
@@ -776,7 +776,7 @@ static void __smb2_lease_break_noti(struct work_struct *wk) goto out; } - rsp_hdr =smb2_get_msg (work->response_buf); + rsp_hdr =smb_get_msg (work->response_buf);memset (rsp_hdr,0 ,sizeof (struct smb2_hdr ) +2 ); rsp_hdr->ProtocolId =SMB2_PROTO_NUMBER ; rsp_hdr->StructureSize =SMB2_HEADER_STRUCTURE_SIZE ;
@@ -790,7 +790,7 @@ static void __smb2_lease_break_noti(struct work_struct *wk) rsp_hdr->SessionId =0 ;memset (rsp_hdr->Signature,0 ,16 ); - rsp =smb2_get_msg (work->response_buf); + rsp =smb_get_msg (work->response_buf); rsp->StructureSize =cpu_to_le16 (44 ); rsp->Epoch = br_info->epoch; rsp->Flags =0 ;
fs/smb/server/smb2misc.c +1 -1
@@ -465,7 +465,7 @@ int ksmbd_smb2_check_message(struct ksmbd_work *work) } validate_credit: -if ((work->conn->vals->capabilities &SMB2_GLOBAL_CAP_LARGE_MTU ) && +if ((work->conn->vals->req_capabilities &SMB2_GLOBAL_CAP_LARGE_MTU ) &&smb2_validate_credit_charge (work->conn, hdr))return 1 ;
fs/smb/server/smb2ops.c +16 -16
@@ -15,7 +15,7 @@static struct smb_version_values smb21_server_values = { .version_string =SMB21_VERSION_STRING , .protocol_id =SMB21_PROT_ID , - .capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , + .req_capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , .max_read_size =SMB21_DEFAULT_IOSIZE , .max_write_size =SMB21_DEFAULT_IOSIZE , .max_trans_size =SMB21_DEFAULT_IOSIZE ,
@@ -41,7 +41,7 @@ static struct smb_version_values smb21_server_values = {static struct smb_version_values smb30_server_values = { .version_string =SMB30_VERSION_STRING , .protocol_id =SMB30_PROT_ID , - .capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , + .req_capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , .max_read_size =SMB3_DEFAULT_IOSIZE , .max_write_size =SMB3_DEFAULT_IOSIZE , .max_trans_size =SMB3_DEFAULT_TRANS_SIZE ,
@@ -68,7 +68,7 @@ static struct smb_version_values smb30_server_values = {static struct smb_version_values smb302_server_values = { .version_string =SMB302_VERSION_STRING , .protocol_id =SMB302_PROT_ID , - .capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , + .req_capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , .max_read_size =SMB3_DEFAULT_IOSIZE , .max_write_size =SMB3_DEFAULT_IOSIZE , .max_trans_size =SMB3_DEFAULT_TRANS_SIZE ,
@@ -95,7 +95,7 @@ static struct smb_version_values smb302_server_values = {static struct smb_version_values smb311_server_values = { .version_string =SMB311_VERSION_STRING , .protocol_id =SMB311_PROT_ID , - .capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , + .req_capabilities =SMB2_GLOBAL_CAP_LARGE_MTU , .max_read_size =SMB3_DEFAULT_IOSIZE , .max_write_size =SMB3_DEFAULT_IOSIZE , .max_trans_size =SMB3_DEFAULT_TRANS_SIZE ,
@@ -204,7 +204,7 @@ void init_smb2_1_server(struct ksmbd_conn *conn) conn->signing_algorithm =SIGNING_ALG_HMAC_SHA256_LE ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_LEASES ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_LEASING ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_LEASING ; }/**
@@ -221,20 +221,20 @@ void init_smb3_0_server(struct ksmbd_conn *conn) conn->signing_algorithm =SIGNING_ALG_AES_CMAC_LE ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_LEASES ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_LEASING | + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_LEASING |SMB2_GLOBAL_CAP_DIRECTORY_LEASING ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION && conn->cli_cap &SMB2_GLOBAL_CAP_ENCRYPTION ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION || (!(server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF ) && conn->cli_cap &SMB2_GLOBAL_CAP_ENCRYPTION )) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ; }/**
@@ -251,19 +251,19 @@ void init_smb3_02_server(struct ksmbd_conn *conn) conn->signing_algorithm =SIGNING_ALG_AES_CMAC_LE ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_LEASES ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_LEASING | + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_LEASING |SMB2_GLOBAL_CAP_DIRECTORY_LEASING ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION || (!(server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF ) && conn->cli_cap &SMB2_GLOBAL_CAP_ENCRYPTION )) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_ENCRYPTION ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_DURABLE_HANDLE ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_PERSISTENT_HANDLES ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_PERSISTENT_HANDLES ; }/**
@@ -280,14 +280,14 @@ int init_smb3_11_server(struct ksmbd_conn *conn) conn->signing_algorithm =SIGNING_ALG_AES_CMAC_LE ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB2_LEASES ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_LEASING | + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_LEASING |SMB2_GLOBAL_CAP_DIRECTORY_LEASING ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_DURABLE_HANDLE ) - conn->vals->capabilities |=SMB2_GLOBAL_CAP_PERSISTENT_HANDLES ; + conn->vals->req_capabilities |=SMB2_GLOBAL_CAP_PERSISTENT_HANDLES ;INIT_LIST_HEAD (&conn->preauth_sess_table);return 0 ;
fs/smb/server/smb2pdu.c +42 -46
45 lines not on this page · raw message
fs/smb/server/smb_common.c +33 -10
43 lines not on this page · raw message
fs/smb/server/smb_common.h +9 -34
43 lines not on this page · raw message
include/linux/netdevice.h +46 -6
52 lines not on this page · raw message
include/net/tcp.h +30 -28
58 lines not on this page · raw message
mm/huge_memory.c +29 -14
43 lines not on this page · raw message
mm/pagewalk.c +73 -9
82 lines not on this page · raw message
mm/vmalloc.c +40 -9
49 lines not on this page · raw message
net/core/pktgen.c +24 -19
43 lines not on this page · raw message
net/ipv4/tcp_input.c +43 -13
56 lines not on this page · raw message
net/mptcp/options.c +65 -2
67 lines not on this page · raw message
net/netfilter/ipset/ip_set_bitmap_gen.h +1 -1
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_join.sh +2 -2
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.