Changes in 5.15.75
Revert "fs: check FMODE_LSEEK to control internal pipe splicing"
ALSA: oss: Fix potential deadlock at unregistration
ALSA: rawmidi: Drop register_mutex in snd_rawmidi_free()
ALSA: usb-audio: Fix potential memory leaks
ALSA: usb-audio: Fix NULL dererence at error path
ALSA: hda/realtek: remove ALC289_FIXUP_DUAL_SPK for Dell 5530
ALSA: hda/realtek: Correct pin configs for ASUS G533Z
ALSA: hda/realtek: Add quirk for ASUS GV601R laptop
ALSA: hda/realtek: Add Intel Reference SSID to support headset keys
mtd: rawnand: atmel: Unmap streaming DMA mappings
io_uring/net: don't update msg_name if not provided
hv_netvsc: Fix race between VF offering and VF association message from host
cifs: destage dirty pages before re-reading them for cache=none
cifs: Fix the error length of VALIDATE_NEGOTIATE_INFO message
iio: dac: ad5593r: Fix i2c read protocol requirements
iio: ltc2497: Fix reading conversion results
iio: adc: ad7923: fix channel readings for some variants
iio: pressure: dps310: Refactor startup procedure
iio: pressure: dps310: Reset chip after timeout
xhci: dbc: Fix memory leak in xhci_alloc_dbc()
usb: add quirks for Lenovo OneLink+ Dock
can: kvaser_usb: Fix use of uninitialized completion
can: kvaser_usb_leaf: Fix overread with an invalid command
can: kvaser_usb_leaf: Fix TX queue out of sync after restart
can: kvaser_usb_leaf: Fix CAN state after restart
mmc: sdhci-sprd: Fix minimum clock limit
i2c: designware: Fix handling of real but unexpected device interrupts
fs: dlm: fix race between test_bit() and queue_work()
fs: dlm: handle -EBUSY first in lock arg validation
HID: multitouch: Add memory barriers
quota: Check next/prev free block number after reading from quota file
platform/chrome: cros_ec_proto: Update version on GET_NEXT_EVENT failure
ASoC: wcd9335: fix order of Slimbus unprepare/disable
ASoC: wcd934x: fix order of Slimbus unprepare/disable
hwmon: (gsc-hwmon) Call of_node_get() before of_find_xxx API
net: thunderbolt: Enable DMA paths only after rings are enabled
regulator: qcom_rpm: Fix circular deferral regression
arm64: topology: move store_cpu_topology() to shared code
riscv: topology: fix default topology reporting
RISC-V: Make port I/O string accessors actually work
parisc: fbdev/stifb: Align graphics memory size to 4MB
riscv: Allow PROT_WRITE-only mmap()
riscv: Make VM_WRITE imply VM_READ
riscv: always honor the CONFIG_CMDLINE_FORCE when parsing dtb
riscv: Pass -mno-relax only on lld < 15.0.0
UM: cpuinfo: Fix a warning for CONFIG_CPUMASK_OFFSTACK
nvmem: core: Fix memleak in nvmem_register()
nvme-multipath: fix possible hang in live ns resize with ANA access
nvme-pci: set min_align_mask before calculating max_hw_sectors
Revert "drm/amdgpu: use dirty framebuffer helper"
dmaengine: mxs: use platform_driver_register
drm/virtio: Check whether transferred 2D BO is shmem
drm/virtio: Unlock reservations on virtio_gpu_object_shmem_init() error
drm/virtio: Use appropriate atomic state in virtio_gpu_plane_cleanup_fb()
drm/udl: Restore display mode on resume
arm64: errata: Add Cortex-A55 to the repeat tlbi list
mm/damon: validate if the pmd entry is present before accessing
mm/mmap: undo ->mmap() when arch_validate_flags() fails
xen/gntdev: Prevent leaking grants
xen/gntdev: Accommodate VMA splitting
PCI: Sanitise firmware BAR assignments behind a PCI-PCI bridge
serial: 8250: Let drivers request full 16550A feature probing
serial: 8250: Request full 16550A feature probing for OxSemi PCIe devices
NFSD: Protect against send buffer overflow in NFSv3 READDIR
NFSD: Protect against send buffer overflow in NFSv2 READ
NFSD: Protect against send buffer overflow in NFSv3 READ
powercap: intel_rapl: Use standard Energy Unit for SPR Dram RAPL domain
powerpc/boot: Explicitly disable usage of SPE instructions
slimbus: qcom-ngd: use correct error in message of pdr_add_lookup() failure
slimbus: qcom-ngd: cleanup in probe error path
scsi: qedf: Populate sysfs attributes for vport
gpio: rockchip: request GPIO mux to pinctrl when setting direction
pinctrl: rockchip: add pinmux_ops.gpio_set_direction callback
fbdev: smscufx: Fix use-after-free in ufx_ops_open()
ksmbd: fix endless loop when encryption for response fails
ksmbd: Fix wrong return value and message length check in smb2_ioctl()
ksmbd: Fix user namespace mapping
fs: record I_DIRTY_TIME even if inode already has I_DIRTY_INODE
btrfs: fix race between quota enable and quota rescan ioctl
btrfs: set generation before calling btrfs_clean_tree_block in btrfs_init_new_buffer
f2fs: complete checkpoints during remount
f2fs: flush pending checkpoints when freezing super
f2fs: increase the limit for reserve_root
f2fs: fix to do sanity check on destination blkaddr during recovery
f2fs: fix to do sanity check on summary info
hardening: Avoid harmless Clang option under CONFIG_INIT_STACK_ALL_ZERO
hardening: Remove Clang's enable flag for -ftrivial-auto-var-init=zero
jbd2: wake up journal waiters in FIFO order, not LIFO
jbd2: fix potential buffer head reference count leak
jbd2: fix potential use-after-free in jbd2_fc_wait_bufs
jbd2: add miss release buffer head in fc_do_one_pass()
ext4: avoid crash when inline data creation follows DIO write
ext4: fix null-ptr-deref in ext4_write_info
ext4: make ext4_lazyinit_thread freezable
ext4: fix check for block being out of directory size
ext4: don't increase iversion counter for ea_inodes
ext4: ext4_read_bh_lock() should submit IO if the buffer isn't uptodate
ext4: place buffer head allocation before handle start
ext4: fix dir corruption when ext4_dx_add_entry() fails
ext4: fix miss release buffer head in ext4_fc_write_inode
ext4: fix potential memory leak in ext4_fc_record_modified_inode()
ext4: fix potential memory leak in ext4_fc_record_regions()
ext4: update 'state->fc_regions_size' after successful memory allocation
livepatch: fix race between fork and KLP transition
ftrace: Properly unset FTRACE_HASH_FL_MOD
ring-buffer: Allow splice to read previous partially read pages
ring-buffer: Have the shortest_full queue be the shortest not longest
ring-buffer: Check pending waiters when doing wake ups as well
ring-buffer: Add ring_buffer_wake_waiters()
ring-buffer: Fix race between reset page and reading page
tracing: Disable interrupt or preemption before acquiring arch_spinlock_t
tracing: Wake up ring buffer waiters on closing of the file
tracing: Wake up waiters when tracing is disabled
tracing: Add ioctl() to force ring buffer waiters to wake up
tracing: Move duplicate code of trace_kprobe/eprobe.c into header
tracing: Add "(fault)" name injection to kernel probes
tracing: Fix reading strings from synthetic events
thunderbolt: Explicitly enable lane adapter hotplug events at startup
efi: libstub: drop pointless get_memory_map() call
media: cedrus: Set the platform driver data earlier
media: cedrus: Fix endless loop in cedrus_h265_skip_bits()
blk-wbt: call rq_qos_add() after wb_normal is initialized
KVM: x86/emulator: Fix handing of POP SS to correctly set interruptibility
KVM: nVMX: Unconditionally purge queued/injected events on nested "exit"
KVM: nVMX: Don't propagate vmcs12's PERF_GLOBAL_CTRL settings to vmcs02
KVM: VMX: Drop bits 31:16 when shoving exception error code into VMCS
staging: greybus: audio_helper: remove unused and wrong debugfs usage
drm/nouveau/kms/nv140-: Disable interlacing
drm/nouveau: fix a use-after-free in nouveau_gem_prime_import_sg_table()
drm/i915: Fix watermark calculations for gen12+ RC CCS modifier
drm/i915: Fix watermark calculations for gen12+ MC CCS modifier
drm/i915: Fix watermark calculations for gen12+ CCS+CC modifier
drm/amd/display: Fix vblank refcount in vrr transition
smb3: must initialize two ACL struct fields to zero
selinux: use "grep -E" instead of "egrep"
ima: fix blocking of security.ima xattrs of unsupported algorithms
userfaultfd: open userfaultfds with O_RDONLY
ntfs3: rework xattr handlers and switch to POSIX ACL VFS helpers
thermal: cpufreq_cooling: Check the policy first in cpufreq_cooling_register()
sh: machvec: Use char[] for section boundaries
MIPS: SGI-IP27: Free some unused memory
MIPS: SGI-IP27: Fix platform-device leak in bridge_platform_create()
ARM: 9244/1: dump: Fix wrong pg_level in walk_pmd()
ARM: 9247/1: mm: set readonly for MT_MEMORY_RO with ARM_LPAE
objtool: Preserve special st_shndx indexes in elf_update_symbol
nfsd: Fix a memory leak in an error handling path
SUNRPC: Fix svcxdr_init_decode's end-of-buffer calculation
SUNRPC: Fix svcxdr_init_encode's buflen calculation
NFSD: Protect against send buffer overflow in NFSv2 READDIR
NFSD: Fix handling of oversized NFSv4 COMPOUND requests
wifi: rtlwifi: 8192de: correct checking of IQK reload
wifi: ath10k: add peer map clean up for peer delete in ath10k_sta_state()
leds: lm3601x: Don't use mutex after it was destroyed
bpf: Fix reference state management for synchronous callbacks
wifi: mac80211: allow bw change during channel switch in mesh
bpftool: Fix a wrong type cast in btf_dumper_int
spi: mt7621: Fix an error message in mt7621_spi_probe()
x86/resctrl: Fix to restore to original value when re-enabling hardware prefetch register
xsk: Fix backpressure mechanism on Tx
bpf: Disable preemption when increasing per-cpu map_locked
bpf: Propagate error from htab_lock_bucket() to userspace
bpf: Use this_cpu_{inc|dec|inc_return} for bpf_task_storage_busy
Bluetooth: btusb: mediatek: fix WMT failure during runtime suspend
wifi: rtl8xxxu: tighten bounds checking in rtl8xxxu_read_efuse()
wifi: rtw88: add missing destroy_workqueue() on error path in rtw_core_init()
selftests/xsk: Avoid use-after-free on ctx
spi: qup: add missing clk_disable_unprepare on error in spi_qup_resume()
spi: qup: add missing clk_disable_unprepare on error in spi_qup_pm_resume_runtime()
wifi: rtl8xxxu: Fix skb misuse in TX queue selection
spi: meson-spicc: do not rely on busy flag in pow2 clk ops
bpf: btf: fix truncated last_member_type_id in btf_struct_resolve
wifi: rtl8xxxu: gen2: Fix mistake in path B IQ calibration
wifi: rtl8xxxu: Remove copy-paste leftover in gen2_update_rate_mask
wifi: mt76: sdio: fix transmitting packet hangs
wifi: mt76: mt7615: add mt7615_mutex_acquire/release in mt7615_sta_set_decap_offload
wifi: mt76: mt7915: do not check state before configuring implicit beamform
Bluetooth: RFCOMM: Fix possible deadlock on socket shutdown/release
net: fs_enet: Fix wrong check in do_pd_setup
bpf: Ensure correct locking around vulnerable function find_vpid()
Bluetooth: hci_{ldisc,serdev}: check percpu_init_rwsem() failure
netfilter: conntrack: fix the gc rescheduling delay
netfilter: conntrack: revisit the gc initial rescheduling bias
wifi: ath11k: fix number of VHT beamformee spatial streams
x86/microcode/AMD: Track patch allocation size explicitly
x86/cpu: Include the header of init_ia32_feat_ctl()'s prototype
spi: dw: Fix PM disable depth imbalance in dw_spi_bt1_probe
spi/omap100k:Fix PM disable depth imbalance in omap1_spi100k_probe
skmsg: Schedule psock work if the cached skb exists on the psock
i2c: mlxbf: support lock mechanism
Bluetooth: hci_core: Fix not handling link timeouts propertly
xfrm: Reinject transport-mode packets through workqueue
netfilter: nft_fib: Fix for rpath check with VRF devices
spi: s3c64xx: Fix large transfers with DMA
wifi: rtl8xxxu: Fix AIFS written to REG_EDCA_*_PARAM
vhost/vsock: Use kvmalloc/kvfree for larger packets.
eth: alx: take rtnl_lock on resume
mISDN: fix use-after-free bugs in l1oip timer handlers
sctp: handle the error returned from sctp_auth_asoc_init_active_key
tcp: fix tcp_cwnd_validate() to not forget is_cwnd_limited
spi: Ensure that sg_table won't be used after being freed
hwmon: (pmbus/mp2888) Fix sensors readouts for MPS Multi-phase mp2888 controller
net: rds: don't hold sock lock when cancelling work from rds_tcp_reset_callbacks()
bnx2x: fix potential memory leak in bnx2x_tpa_stop()
net: wwan: iosm: Call mutex_init before locking it
net/ieee802154: reject zero-sized raw_sendmsg()
once: add DO_ONCE_SLOW() for sleepable contexts
net: mvpp2: fix mvpp2 debugfs leak
drm: bridge: adv7511: fix CEC power down control register offset
drm: bridge: adv7511: unregister cec i2c device after cec adapter
drm/bridge: Avoid uninitialized variable warning
drm/mipi-dsi: Detach devices when removing the host
drm/virtio: Correct drm_gem_shmem_get_sg_table() error handling
drm/bridge: parade-ps8640: Fix regulator supply order
drm/dp_mst: fix drm_dp_dpcd_read return value checks
drm:pl111: Add of_node_put() when breaking out of for_each_available_child_of_node()
ASoC: mt6359: fix tests for platform_get_irq() failure
platform/chrome: fix double-free in chromeos_laptop_prepare()
platform/chrome: fix memory corruption in ioctl
ASoC: tas2764: Allow mono streams
ASoC: tas2764: Drop conflicting set_bias_level power setting
ASoC: tas2764: Fix mute/unmute
platform/x86: msi-laptop: Fix old-ec check for backlight registering
platform/x86: msi-laptop: Fix resource cleanup
platform/chrome: cros_ec_typec: Correct alt mode index
drm/amdgpu: add missing pci_disable_device() in amdgpu_pmops_runtime_resume()
drm/bridge: megachips: Fix a null pointer dereference bug
ASoC: rsnd: Add check for rsnd_mod_power_on
ALSA: hda: beep: Simplify keep-power-at-enable behavior
drm/bochs: fix blanking
drm/omap: dss: Fix refcount leak bugs
drm/amdgpu: Fix memory leak in hpd_rx_irq_create_workqueue()
mmc: au1xmmc: Fix an error handling path in au1xmmc_probe()
ASoC: eureka-tlv320: Hold reference returned from of_find_xxx API
drm/msm/dpu: index dpu_kms->hw_vbif using vbif_idx
drm/msm/dp: correct 1.62G link rate at dp_catalog_ctrl_config_msa()
drm/vmwgfx: Fix memory leak in vmw_mksstat_add_ioctl()
ASoC: codecs: tx-macro: fix kcontrol put
ASoC: da7219: Fix an error handling path in da7219_register_dai_clks()
ALSA: dmaengine: increment buffer pointer atomically
mmc: wmt-sdmmc: Fix an error handling path in wmt_mci_probe()
ASoC: wm8997: Fix PM disable depth imbalance in wm8997_probe
ASoC: wm5110: Fix PM disable depth imbalance in wm5110_probe
ASoC: wm5102: Fix PM disable depth imbalance in wm5102_probe
ASoC: mt6660: Fix PM disable depth imbalance in mt6660_i2c_probe
ALSA: hda/hdmi: Don't skip notification handling during PM operation
memory: pl353-smc: Fix refcount leak bug in pl353_smc_probe()
memory: of: Fix refcount leak bug in of_get_ddr_timings()
memory: of: Fix refcount leak bug in of_lpddr3_get_ddr_timings()
locks: fix TOCTOU race when granting write lease
soc: qcom: smsm: Fix refcount leak bugs in qcom_smsm_probe()
soc: qcom: smem_state: Add refcounting for the 'state->of_node'
ARM: dts: imx6qdl-kontron-samx6i: hook up DDC i2c bus
ARM: dts: turris-omnia: Fix mpp26 pin name and comment
ARM: dts: kirkwood: lsxl: fix serial line
ARM: dts: kirkwood: lsxl: remove first ethernet port
ia64: export memory_add_physaddr_to_nid to fix cxl build error
soc/tegra: fuse: Drop Kconfig dependency on TEGRA20_APB_DMA
arm64: dts: ti: k3-j7200: fix main pinmux range
ARM: dts: exynos: correct s5k6a3 reset polarity on Midas family
ARM: Drop CMDLINE_* dependency on ATAGS
ext4: don't run ext4lazyinit for read-only filesystems
arm64: ftrace: fix module PLTs with mcount
ARM: dts: exynos: fix polarity of VBUS GPIO of Origen
iio: adc: at91-sama5d2_adc: fix AT91_SAMA5D2_MR_TRACKTIM_MAX
iio: adc: at91-sama5d2_adc: check return status for pressure and touch
iio: adc: at91-sama5d2_adc: lock around oversampling and sample freq
iio: adc: at91-sama5d2_adc: disable/prepare buffer on suspend/resume
iio: inkern: only release the device node when done with it
iio: inkern: fix return value in devm_of_iio_channel_get_by_name()
iio: ABI: Fix wrong format of differential capacitance channel ABI.
iio: magnetometer: yas530: Change data type of hard_offsets to signed
RDMA/mlx5: Don't compare mkey tags in DEVX indirect mkey
usb: common: debug: Check non-standard control requests
clk: meson: Hold reference returned by of_get_parent()
clk: oxnas: Hold reference returned by of_get_parent()
clk: qoriq: Hold reference returned by of_get_parent()
clk: berlin: Add of_node_put() for of_get_parent()
clk: sprd: Hold reference returned by of_get_parent()
clk: tegra: Fix refcount leak in tegra210_clock_init
clk: tegra: Fix refcount leak in tegra114_clock_init
clk: tegra20: Fix refcount leak in tegra20_clock_init
HSI: omap_ssi: Fix refcount leak in ssi_probe
HSI: omap_ssi_port: Fix dma_map_sg error check
media: exynos4-is: fimc-is: Add of_node_put() when breaking out of loop
tty: xilinx_uartps: Fix the ignore_status
media: meson: vdec: add missing clk_disable_unprepare on error in vdec_hevc_start()
media: uvcvideo: Fix memory leak in uvc_gpio_parse
media: uvcvideo: Use entity get_cur in uvc_ctrl_set
media: xilinx: vipp: Fix refcount leak in xvip_graph_dma_init
RDMA/rxe: Fix "kernel NULL pointer dereference" error
RDMA/rxe: Fix the error caused by qp->sk
misc: ocxl: fix possible refcount leak in afu_ioctl()
fpga: prevent integer overflow in dfl_feature_ioctl_set_irq()
dmaengine: hisilicon: Disable channels when unregister hisi_dma
dmaengine: hisilicon: Fix CQ head update
dmaengine: hisilicon: Add multi-thread support for a DMA channel
dyndbg: fix static_branch manipulation
dyndbg: fix module.dyndbg handling
dyndbg: let query-modname override actual module name
dyndbg: drop EXPORTed dynamic_debug_exec_queries
clk: qcom: sm6115: Select QCOM_GDSC
mtd: devices: docg3: check the return value of devm_ioremap() in the probe
phy: amlogic: phy-meson-axg-mipi-pcie-analog: Hold reference returned by of_get_parent()
phy: phy-mtk-tphy: fix the phy type setting issue
mtd: rawnand: intel: Read the chip-select line from the correct OF node
mtd: rawnand: intel: Remove undocumented compatible string
mtd: rawnand: fsl_elbc: Fix none ECC mode
RDMA/irdma: Align AE id codes to correct flush code and event
RDMA/srp: Fix srp_abort()
RDMA/siw: Always consume all skbuf data in sk_data_ready() upcall.
RDMA/siw: Fix QP destroy to wait for all references dropped.
ata: fix ata_id_sense_reporting_enabled() and ata_id_has_sense_reporting()
ata: fix ata_id_has_devslp()
ata: fix ata_id_has_ncq_autosense()
ata: fix ata_id_has_dipm()
mtd: rawnand: meson: fix bit map use in meson_nfc_ecc_correct()
md: Replace snprintf with scnprintf
md/raid5: Ensure stripe_fill happens on non-read IO with journal
md/raid5: Remove unnecessary bio_put() in raid5_read_one_chunk()
RDMA/cm: Use SLID in the work completion as the DLID in responder side
IB: Set IOVA/LENGTH on IB_MR in core/uverbs layers
xhci: Don't show warning for reinit on known broken suspend
usb: gadget: function: fix dangling pnp_string in f_printer.c
drivers: serial: jsm: fix some leaks in probe
serial: 8250: Toggle IER bits on only after irq has been set up
tty: serial: fsl_lpuart: disable dma rx/tx use flags in lpuart_dma_shutdown
phy: qualcomm: call clk_disable_unprepare in the error handling
staging: vt6655: fix some erroneous memory clean-up loops
slimbus: qcom-ngd-ctrl: allow compile testing without QCOM_RPROC_COMMON
firmware: google: Test spinlock on panic path to avoid lockups
serial: 8250: Fix restoring termios speed after suspend
scsi: libsas: Fix use-after-free bug in smp_execute_task_sg()
scsi: iscsi: Rename iscsi_conn_queue_work()
scsi: iscsi: Add recv workqueue helpers
scsi: iscsi: Run recv path from workqueue
scsi: iscsi: iscsi_tcp: Fix null-ptr-deref while calling getpeername()
clk: qcom: apss-ipq6018: mark apcs_alias0_core_clk as critical
clk: qcom: gcc-sm6115: Override default Alpha PLL regs
RDMA/rxe: Fix resize_finish() in rxe_queue.c
fsi: core: Check error number after calling ida_simple_get
mfd: intel_soc_pmic: Fix an error handling path in intel_soc_pmic_i2c_probe()
mfd: fsl-imx25: Fix an error handling path in mx25_tsadc_setup_irq()
mfd: lp8788: Fix an error handling path in lp8788_probe()
mfd: lp8788: Fix an error handling path in lp8788_irq_init() and lp8788_irq_init()
mfd: fsl-imx25: Fix check for platform_get_irq() errors
mfd: sm501: Add check for platform_driver_register()
clk: mediatek: mt8183: mfgcfg: Propagate rate changes to parent
dmaengine: ioat: stop mod_timer from resurrecting deleted timer in __cleanup()
usb: mtu3: fix failed runtime suspend in host only mode
spmi: pmic-arb: correct duplicate APID to PPID mapping logic
clk: vc5: Fix 5P49V6901 outputs disabling when enabling FOD
clk: baikal-t1: Fix invalid xGMAC PTP clock divider
clk: baikal-t1: Add shared xGMAC ref/ptp clocks internal parent
clk: baikal-t1: Add SATA internal ref clock buffer
clk: bcm2835: fix bcm2835_clock_rate_from_divisor declaration
clk: imx: scu: fix memleak on platform_device_add() fails
clk: ti: dra7-atl: Fix reference leak in of_dra7_atl_clk_probe
clk: ast2600: BCLK comes from EPLL
mailbox: mpfs: fix handling of the reg property
mailbox: mpfs: account for mbox offsets while sending
mailbox: bcm-ferxrm-mailbox: Fix error check for dma_map_sg
powerpc/configs: Properly enable PAPR_SCM in pseries_defconfig
powerpc/math_emu/efp: Include module.h
powerpc/sysdev/fsl_msi: Add missing of_node_put()
powerpc/pci_dn: Add missing of_node_put()
powerpc/powernv: add missing of_node_put() in opal_export_attrs()
powerpc: Fix fallocate and fadvise64_64 compat parameter combination
x86/hyperv: Fix 'struct hv_enlightened_vmcs' definition
powerpc/64s: Fix GENERIC_CPU build flags for PPC970 / G5
powerpc: Fix SPE Power ISA properties for e500v1 platforms
powerpc/kprobes: Fix null pointer reference in arch_prepare_kprobe()
powerpc/pseries/vas: Pass hw_cpu_id to node associativity HCALL
crypto: sahara - don't sleep when in softirq
crypto: hisilicon/zip - fix mismatch in get/set sgl_sge_nr
hwrng: arm-smccc-trng - fix NO_ENTROPY handling
cgroup: Honor caller's cgroup NS when resolving path
hwrng: imx-rngc - Moving IRQ handler registering after imx_rngc_irq_mask_clear()
crypto: qat - fix default value of WDT timer
crypto: hisilicon/qm - fix missing put dfx access
cgroup/cpuset: Enable update_tasks_cpumask() on top_cpuset
iommu/omap: Fix buffer overflow in debugfs
crypto: akcipher - default implementation for setting a private key
crypto: ccp - Release dma channels before dmaengine unrgister
crypto: inside-secure - Change swab to swab32
crypto: qat - fix DMA transfer direction
cifs: return correct error in ->calc_signature()
iommu/iova: Fix module config properly
tracing: kprobe: Fix kprobe event gen test module on exit
tracing: kprobe: Make gen test module work in arm and riscv
tracing/osnoise: Fix possible recursive locking in stop_per_cpu_kthreads
kbuild: remove the target in signal traps when interrupted
kbuild: rpm-pkg: fix breakage when V=1 is used
crypto: marvell/octeontx - prevent integer overflows
crypto: cavium - prevent integer overflow loading firmware
thermal/drivers/qcom/tsens-v0_1: Fix MSM8939 fourth sensor hw_id
ACPI: APEI: do not add task_work to kernel thread to avoid memory leak
f2fs: fix race condition on setting FI_NO_EXTENT flag
f2fs: fix to account FS_CP_DATA_IO correctly
selftest: tpm2: Add Client.__del__() to close /dev/tpm* handle
fs: dlm: fix race in lowcomms
rcu: Avoid triggering strict-GP irq-work when RCU is idle
rcu: Back off upon fill_page_cache_func() allocation failure
rcu-tasks: Convert RCU_LOCKDEP_WARN() to WARN_ONCE()
ACPI: video: Add Toshiba Satellite/Portege Z830 quirk
ACPI: tables: FPDT: Don't call acpi_os_map_memory() on invalid phys address
cpufreq: intel_pstate: Add Tigerlake support in no-HWP mode
MIPS: BCM47XX: Cast memcmp() of function to (void *)
powercap: intel_rapl: fix UBSAN shift-out-of-bounds issue
thermal: intel_powerclamp: Use get_cpu() instead of smp_processor_id() to avoid crash
ARM: decompressor: Include .data.rel.ro.local
ACPI: x86: Add a quirk for Dell Inspiron 14 2-in-1 for StorageD3Enable
x86/entry: Work around Clang __bdos() bug
NFSD: Return nfserr_serverfault if splice_ok but buf->pages have data
NFSD: fix use-after-free on source server when doing inter-server copy
wifi: brcmfmac: fix invalid address access when enabling SCAN log level
bpftool: Clear errno after libcap's checks
ice: set tx_tstamps when creating new Tx rings via ethtool
net: ethernet: ti: davinci_mdio: Add workaround for errata i2329
openvswitch: Fix double reporting of drops in dropwatch
openvswitch: Fix overreporting of drops in dropwatch
tcp: annotate data-race around tcp_md5sig_pool_populated
x86/mce: Retrieve poison range from hardware
wifi: ath9k: avoid uninit memory read in ath9k_htc_rx_msg()
thunderbolt: Add back Intel Falcon Ridge end-to-end flow control workaround
xfrm: Update ipcomp_scratches with NULL when freed
iavf: Fix race between iavf_close and iavf_reset_task
wifi: brcmfmac: fix use-after-free bug in brcmf_netdev_start_xmit()
Bluetooth: btintel: Mark Intel controller to support LE_STATES quirk
regulator: core: Prevent integer underflow
wifi: mt76: mt7921: reset msta->airtime_ac while clearing up hw value
Bluetooth: L2CAP: initialize delayed works at l2cap_chan_create()
Bluetooth: hci_sysfs: Fix attempting to call device_add multiple times
can: bcm: check the result of can_send() in bcm_can_tx()
wifi: rt2x00: don't run Rt5592 IQ calibration on MT7620
wifi: rt2x00: set correct TX_SW_CFG1 MAC register for MT7620
wifi: rt2x00: set VGC gain for both chains of MT7620
wifi: rt2x00: set SoC wmac clock register
wifi: rt2x00: correctly set BBP register 86 for MT7620
hwmon: (sht4x) do not overflow clamping operation on 32-bit platforms
net: If sock is dead don't access sock's sk_wq in sk_stream_wait_memory
Bluetooth: L2CAP: Fix user-after-free
r8152: Rate limit overflow messages
drm/nouveau/nouveau_bo: fix potential memory leak in nouveau_bo_alloc()
drm: Use size_t type for len variable in drm_copy_field()
drm: Prevent drm_copy_field() to attempt copying a NULL pointer
drm/komeda: Fix handling of atomic commits in the atomic_commit_tail hook
gpu: lontium-lt9611: Fix NULL pointer dereference in lt9611_connector_init()
drm/amd/display: fix overflow on MIN_I64 definition
udmabuf: Set ubuf->sg = NULL if the creation of sg table fails
drm: bridge: dw_hdmi: only trigger hotplug event on link change
ALSA: usb-audio: Register card at the last interface
drm/vc4: vec: Fix timings for VEC modes
drm: panel-orientation-quirks: Add quirk for Anbernic Win600
platform/chrome: cros_ec: Notify the PM of wake events during resume
platform/x86: msi-laptop: Change DMI match / alias strings to fix module autoloading
ASoC: SOF: pci: Change DMI match info to support all Chrome platforms
drm/amdgpu: fix initial connector audio value
drm/meson: reorder driver deinit sequence to fix use-after-free bug
drm/meson: explicitly remove aggregate driver at module unload time
mmc: sdhci-msm: add compatible string check for sdm670
drm/dp: Don't rewrite link config when setting phy test pattern
drm/amd/display: Remove interface for periodic interrupt 1
ARM: dts: imx7d-sdb: config the max pressure for tsc2046
ARM: dts: imx6q: add missing properties for sram
ARM: dts: imx6dl: add missing properties for sram
ARM: dts: imx6qp: add missing properties for sram
ARM: dts: imx6sl: add missing properties for sram
ARM: dts: imx6sll: add missing properties for sram
ARM: dts: imx6sx: add missing properties for sram
kselftest/arm64: Fix validatation termination record after EXTRA_CONTEXT
arm64: dts: imx8mq-librem5: Add bq25895 as max17055's power supply
btrfs: dump extra info if one free space cache has more bitmaps than it should
btrfs: scrub: try to fix super block errors
btrfs: don't print information about space cache or tree every remount
ARM: 9242/1: kasan: Only map modules if CONFIG_KASAN_VMALLOC=n
clk: zynqmp: Fix stack-out-of-bounds in strncpy`
media: cx88: Fix a null-ptr-deref bug in buffer_prepare()
media: platform: fix some double free in meson-ge2d and mtk-jpeg and s5p-mfc
clk: zynqmp: pll: rectify rate rounding in zynqmp_pll_round_rate
usb: host: xhci-plat: suspend and resume clocks
usb: host: xhci-plat: suspend/resume clks for brcm
dmaengine: ti: k3-udma: Reset UDMA_CHAN_RT byte counters to prevent overflow
scsi: 3w-9xxx: Avoid disabling device if failing to enable it
nbd: Fix hung when signal interrupts nbd_start_device_ioctl()
iommu/arm-smmu-v3: Make default domain type of HiSilicon PTT device to identity
power: supply: adp5061: fix out-of-bounds read in adp5061_get_chg_type()
staging: vt6655: fix potential memory leak
blk-throttle: prevent overflow while calculating wait time
ata: libahci_platform: Sanity check the DT child nodes number
bcache: fix set_at_max_writeback_rate() for multiple attached devices
soundwire: cadence: Don't overwrite msg->buf during write commands
soundwire: intel: fix error handling on dai registration issues
HID: roccat: Fix use-after-free in roccat_read()
eventfd: guard wake_up in eventfd fs calls as well
md/raid5: Wait for MD_SB_CHANGE_PENDING in raid5d
usb: host: xhci: Fix potential memory leak in xhci_alloc_stream_info()
usb: musb: Fix musb_gadget.c rxstate overflow bug
arm64: dts: imx8mp: Add snps,gfladj-refclk-lpm-sel quirk to USB nodes
usb: dwc3: core: Enable GUCTL1 bit 10 for fixing termination error after resume bug
Revert "usb: storage: Add quirk for Samsung Fit flash"
staging: rtl8723bs: fix potential memory leak in rtw_init_drv_sw()
staging: rtl8723bs: fix a potential memory leak in rtw_init_cmd_priv()
scsi: tracing: Fix compile error in trace_array calls when TRACING is disabled
ext2: Use kvmalloc() for group descriptor array
nvme: copy firmware_rev on each init
nvmet-tcp: add bounds check on Transfer Tag
usb: idmouse: fix an uninit-value in idmouse_open
clk: bcm2835: Make peripheral PLLC critical
clk: bcm2835: Round UART input clock up
perf intel-pt: Fix segfault in intel_pt_print_info() with uClibc
io_uring/af_unix: defer registered files gc to io_uring release
io_uring: correct pinned_vm accounting
io_uring/rw: fix short rw error handling
io_uring/rw: fix error'ed retry return values
io_uring/rw: fix unexpected link breakage
mm: hugetlb: fix UAF in hugetlb_handle_userfault
net: ieee802154: return -EINVAL for unknown addr type
ALSA: usb-audio: Fix last interface check for registration
blk-wbt: fix that 'rwb->wc' is always set to 1 in wbt_init()
net: ethernet: ti: davinci_mdio: fix build for mdio bitbang uses
Revert "net/ieee802154: reject zero-sized raw_sendmsg()"
net/ieee802154: don't warn zero-sized raw_sendmsg()
drm/amd/display: Fix build breakage with CONFIG_DEBUG_FS=n
Kconfig.debug: simplify the dependency of DEBUG_INFO_DWARF4/5
Kconfig.debug: add toolchain checks for DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
lib/Kconfig.debug: Add check for non-constant .{s,u}leb128 support to DWARF5
ext4: continue to expand file system when the target size doesn't reach
thermal: intel_powerclamp: Use first online CPU as control_cpu
gcov: support GCC 12.1 and newer compilers
io-wq: Fix memory leak in worker creation
Linux 5.15.75
Change-Id: I5a3ef9688fb31003940d7e1828f863b9d50f1da9
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
637 lines
14 KiB
C
637 lines
14 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
|
|
* Copyright (C) 2018 Samsung Electronics Co., Ltd.
|
|
*/
|
|
|
|
#include "glob.h"
|
|
#include "oplock.h"
|
|
#include "misc.h"
|
|
#include <linux/sched/signal.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/sysfs.h>
|
|
#include <linux/module.h>
|
|
#include <linux/moduleparam.h>
|
|
|
|
#include "server.h"
|
|
#include "smb_common.h"
|
|
#include "smbstatus.h"
|
|
#include "connection.h"
|
|
#include "transport_ipc.h"
|
|
#include "mgmt/user_session.h"
|
|
#include "crypto_ctx.h"
|
|
#include "auth.h"
|
|
|
|
int ksmbd_debug_types;
|
|
|
|
struct ksmbd_server_config server_conf;
|
|
|
|
enum SERVER_CTRL_TYPE {
|
|
SERVER_CTRL_TYPE_INIT,
|
|
SERVER_CTRL_TYPE_RESET,
|
|
};
|
|
|
|
struct server_ctrl_struct {
|
|
int type;
|
|
struct work_struct ctrl_work;
|
|
};
|
|
|
|
static DEFINE_MUTEX(ctrl_lock);
|
|
|
|
static int ___server_conf_set(int idx, char *val)
|
|
{
|
|
if (idx >= ARRAY_SIZE(server_conf.conf))
|
|
return -EINVAL;
|
|
|
|
if (!val || val[0] == 0x00)
|
|
return -EINVAL;
|
|
|
|
kfree(server_conf.conf[idx]);
|
|
server_conf.conf[idx] = kstrdup(val, GFP_KERNEL);
|
|
if (!server_conf.conf[idx])
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
int ksmbd_set_netbios_name(char *v)
|
|
{
|
|
return ___server_conf_set(SERVER_CONF_NETBIOS_NAME, v);
|
|
}
|
|
|
|
int ksmbd_set_server_string(char *v)
|
|
{
|
|
return ___server_conf_set(SERVER_CONF_SERVER_STRING, v);
|
|
}
|
|
|
|
int ksmbd_set_work_group(char *v)
|
|
{
|
|
return ___server_conf_set(SERVER_CONF_WORK_GROUP, v);
|
|
}
|
|
|
|
char *ksmbd_netbios_name(void)
|
|
{
|
|
return server_conf.conf[SERVER_CONF_NETBIOS_NAME];
|
|
}
|
|
|
|
char *ksmbd_server_string(void)
|
|
{
|
|
return server_conf.conf[SERVER_CONF_SERVER_STRING];
|
|
}
|
|
|
|
char *ksmbd_work_group(void)
|
|
{
|
|
return server_conf.conf[SERVER_CONF_WORK_GROUP];
|
|
}
|
|
|
|
/**
|
|
* check_conn_state() - check state of server thread connection
|
|
* @work: smb work containing server thread information
|
|
*
|
|
* Return: 0 on valid connection, otherwise 1 to reconnect
|
|
*/
|
|
static inline int check_conn_state(struct ksmbd_work *work)
|
|
{
|
|
struct smb_hdr *rsp_hdr;
|
|
|
|
if (ksmbd_conn_exiting(work) || ksmbd_conn_need_reconnect(work)) {
|
|
rsp_hdr = work->response_buf;
|
|
rsp_hdr->Status.CifsError = STATUS_CONNECTION_DISCONNECTED;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#define SERVER_HANDLER_CONTINUE 0
|
|
#define SERVER_HANDLER_ABORT 1
|
|
|
|
static int __process_request(struct ksmbd_work *work, struct ksmbd_conn *conn,
|
|
u16 *cmd)
|
|
{
|
|
struct smb_version_cmds *cmds;
|
|
u16 command;
|
|
int ret;
|
|
|
|
if (check_conn_state(work))
|
|
return SERVER_HANDLER_CONTINUE;
|
|
|
|
if (ksmbd_verify_smb_message(work))
|
|
return SERVER_HANDLER_ABORT;
|
|
|
|
command = conn->ops->get_cmd_val(work);
|
|
*cmd = command;
|
|
|
|
andx_again:
|
|
if (command >= conn->max_cmds) {
|
|
conn->ops->set_rsp_status(work, STATUS_INVALID_PARAMETER);
|
|
return SERVER_HANDLER_CONTINUE;
|
|
}
|
|
|
|
cmds = &conn->cmds[command];
|
|
if (!cmds->proc) {
|
|
ksmbd_debug(SMB, "*** not implemented yet cmd = %x\n", command);
|
|
conn->ops->set_rsp_status(work, STATUS_NOT_IMPLEMENTED);
|
|
return SERVER_HANDLER_CONTINUE;
|
|
}
|
|
|
|
if (work->sess && conn->ops->is_sign_req(work, command)) {
|
|
ret = conn->ops->check_sign_req(work);
|
|
if (!ret) {
|
|
conn->ops->set_rsp_status(work, STATUS_ACCESS_DENIED);
|
|
return SERVER_HANDLER_CONTINUE;
|
|
}
|
|
}
|
|
|
|
ret = cmds->proc(work);
|
|
|
|
if (ret < 0)
|
|
ksmbd_debug(CONN, "Failed to process %u [%d]\n", command, ret);
|
|
/* AndX commands - chained request can return positive values */
|
|
else if (ret > 0) {
|
|
command = ret;
|
|
*cmd = command;
|
|
goto andx_again;
|
|
}
|
|
|
|
if (work->send_no_response)
|
|
return SERVER_HANDLER_ABORT;
|
|
return SERVER_HANDLER_CONTINUE;
|
|
}
|
|
|
|
static void __handle_ksmbd_work(struct ksmbd_work *work,
|
|
struct ksmbd_conn *conn)
|
|
{
|
|
u16 command = 0;
|
|
int rc;
|
|
|
|
if (conn->ops->allocate_rsp_buf(work))
|
|
return;
|
|
|
|
if (conn->ops->is_transform_hdr &&
|
|
conn->ops->is_transform_hdr(work->request_buf)) {
|
|
rc = conn->ops->decrypt_req(work);
|
|
if (rc < 0) {
|
|
conn->ops->set_rsp_status(work, STATUS_DATA_ERROR);
|
|
goto send;
|
|
}
|
|
|
|
work->encrypted = true;
|
|
}
|
|
|
|
rc = conn->ops->init_rsp_hdr(work);
|
|
if (rc) {
|
|
/* either uid or tid is not correct */
|
|
conn->ops->set_rsp_status(work, STATUS_INVALID_HANDLE);
|
|
goto send;
|
|
}
|
|
|
|
if (conn->ops->check_user_session) {
|
|
rc = conn->ops->check_user_session(work);
|
|
if (rc < 0) {
|
|
command = conn->ops->get_cmd_val(work);
|
|
conn->ops->set_rsp_status(work,
|
|
STATUS_USER_SESSION_DELETED);
|
|
goto send;
|
|
} else if (rc > 0) {
|
|
rc = conn->ops->get_ksmbd_tcon(work);
|
|
if (rc < 0) {
|
|
conn->ops->set_rsp_status(work,
|
|
STATUS_NETWORK_NAME_DELETED);
|
|
goto send;
|
|
}
|
|
}
|
|
}
|
|
|
|
do {
|
|
rc = __process_request(work, conn, &command);
|
|
if (rc == SERVER_HANDLER_ABORT)
|
|
break;
|
|
|
|
/*
|
|
* Call smb2_set_rsp_credits() function to set number of credits
|
|
* granted in hdr of smb2 response.
|
|
*/
|
|
if (conn->ops->set_rsp_credits) {
|
|
spin_lock(&conn->credits_lock);
|
|
rc = conn->ops->set_rsp_credits(work);
|
|
spin_unlock(&conn->credits_lock);
|
|
if (rc < 0) {
|
|
conn->ops->set_rsp_status(work,
|
|
STATUS_INVALID_PARAMETER);
|
|
goto send;
|
|
}
|
|
}
|
|
|
|
if (work->sess &&
|
|
(work->sess->sign || smb3_11_final_sess_setup_resp(work) ||
|
|
conn->ops->is_sign_req(work, command)))
|
|
conn->ops->set_sign_rsp(work);
|
|
} while (is_chained_smb2_message(work));
|
|
|
|
if (work->send_no_response)
|
|
return;
|
|
|
|
send:
|
|
smb3_preauth_hash_rsp(work);
|
|
if (work->sess && work->sess->enc && work->encrypted &&
|
|
conn->ops->encrypt_resp) {
|
|
rc = conn->ops->encrypt_resp(work);
|
|
if (rc < 0)
|
|
conn->ops->set_rsp_status(work, STATUS_DATA_ERROR);
|
|
}
|
|
|
|
ksmbd_conn_write(work);
|
|
}
|
|
|
|
/**
|
|
* handle_ksmbd_work() - process pending smb work requests
|
|
* @wk: smb work containing request command buffer
|
|
*
|
|
* called by kworker threads to processing remaining smb work requests
|
|
*/
|
|
static void handle_ksmbd_work(struct work_struct *wk)
|
|
{
|
|
struct ksmbd_work *work = container_of(wk, struct ksmbd_work, work);
|
|
struct ksmbd_conn *conn = work->conn;
|
|
|
|
atomic64_inc(&conn->stats.request_served);
|
|
|
|
__handle_ksmbd_work(work, conn);
|
|
|
|
ksmbd_conn_try_dequeue_request(work);
|
|
ksmbd_free_work_struct(work);
|
|
atomic_dec(&conn->r_count);
|
|
}
|
|
|
|
/**
|
|
* queue_ksmbd_work() - queue a smb request to worker thread queue
|
|
* for proccessing smb command and sending response
|
|
* @conn: connection instance
|
|
*
|
|
* read remaining data from socket create and submit work.
|
|
*/
|
|
static int queue_ksmbd_work(struct ksmbd_conn *conn)
|
|
{
|
|
struct ksmbd_work *work;
|
|
|
|
work = ksmbd_alloc_work_struct();
|
|
if (!work) {
|
|
pr_err("allocation for work failed\n");
|
|
return -ENOMEM;
|
|
}
|
|
|
|
work->conn = conn;
|
|
work->request_buf = conn->request_buf;
|
|
conn->request_buf = NULL;
|
|
|
|
if (ksmbd_init_smb_server(work)) {
|
|
ksmbd_free_work_struct(work);
|
|
return -EINVAL;
|
|
}
|
|
|
|
ksmbd_conn_enqueue_request(work);
|
|
atomic_inc(&conn->r_count);
|
|
/* update activity on connection */
|
|
conn->last_active = jiffies;
|
|
INIT_WORK(&work->work, handle_ksmbd_work);
|
|
ksmbd_queue_work(work);
|
|
return 0;
|
|
}
|
|
|
|
static int ksmbd_server_process_request(struct ksmbd_conn *conn)
|
|
{
|
|
return queue_ksmbd_work(conn);
|
|
}
|
|
|
|
static int ksmbd_server_terminate_conn(struct ksmbd_conn *conn)
|
|
{
|
|
ksmbd_sessions_deregister(conn);
|
|
destroy_lease_table(conn);
|
|
return 0;
|
|
}
|
|
|
|
static void ksmbd_server_tcp_callbacks_init(void)
|
|
{
|
|
struct ksmbd_conn_ops ops;
|
|
|
|
ops.process_fn = ksmbd_server_process_request;
|
|
ops.terminate_fn = ksmbd_server_terminate_conn;
|
|
|
|
ksmbd_conn_init_server_callbacks(&ops);
|
|
}
|
|
|
|
static void server_conf_free(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(server_conf.conf); i++) {
|
|
kfree(server_conf.conf[i]);
|
|
server_conf.conf[i] = NULL;
|
|
}
|
|
}
|
|
|
|
static int server_conf_init(void)
|
|
{
|
|
WRITE_ONCE(server_conf.state, SERVER_STATE_STARTING_UP);
|
|
server_conf.enforced_signing = 0;
|
|
server_conf.min_protocol = ksmbd_min_protocol();
|
|
server_conf.max_protocol = ksmbd_max_protocol();
|
|
server_conf.auth_mechs = KSMBD_AUTH_NTLMSSP;
|
|
#ifdef CONFIG_SMB_SERVER_KERBEROS5
|
|
server_conf.auth_mechs |= KSMBD_AUTH_KRB5 |
|
|
KSMBD_AUTH_MSKRB5;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
static void server_ctrl_handle_init(struct server_ctrl_struct *ctrl)
|
|
{
|
|
int ret;
|
|
|
|
ret = ksmbd_conn_transport_init();
|
|
if (ret) {
|
|
server_queue_ctrl_reset_work();
|
|
return;
|
|
}
|
|
|
|
WRITE_ONCE(server_conf.state, SERVER_STATE_RUNNING);
|
|
}
|
|
|
|
static void server_ctrl_handle_reset(struct server_ctrl_struct *ctrl)
|
|
{
|
|
ksmbd_ipc_soft_reset();
|
|
ksmbd_conn_transport_destroy();
|
|
server_conf_free();
|
|
server_conf_init();
|
|
WRITE_ONCE(server_conf.state, SERVER_STATE_STARTING_UP);
|
|
}
|
|
|
|
static void server_ctrl_handle_work(struct work_struct *work)
|
|
{
|
|
struct server_ctrl_struct *ctrl;
|
|
|
|
ctrl = container_of(work, struct server_ctrl_struct, ctrl_work);
|
|
|
|
mutex_lock(&ctrl_lock);
|
|
switch (ctrl->type) {
|
|
case SERVER_CTRL_TYPE_INIT:
|
|
server_ctrl_handle_init(ctrl);
|
|
break;
|
|
case SERVER_CTRL_TYPE_RESET:
|
|
server_ctrl_handle_reset(ctrl);
|
|
break;
|
|
default:
|
|
pr_err("Unknown server work type: %d\n", ctrl->type);
|
|
}
|
|
mutex_unlock(&ctrl_lock);
|
|
kfree(ctrl);
|
|
module_put(THIS_MODULE);
|
|
}
|
|
|
|
static int __queue_ctrl_work(int type)
|
|
{
|
|
struct server_ctrl_struct *ctrl;
|
|
|
|
ctrl = kmalloc(sizeof(struct server_ctrl_struct), GFP_KERNEL);
|
|
if (!ctrl)
|
|
return -ENOMEM;
|
|
|
|
__module_get(THIS_MODULE);
|
|
ctrl->type = type;
|
|
INIT_WORK(&ctrl->ctrl_work, server_ctrl_handle_work);
|
|
queue_work(system_long_wq, &ctrl->ctrl_work);
|
|
return 0;
|
|
}
|
|
|
|
int server_queue_ctrl_init_work(void)
|
|
{
|
|
return __queue_ctrl_work(SERVER_CTRL_TYPE_INIT);
|
|
}
|
|
|
|
int server_queue_ctrl_reset_work(void)
|
|
{
|
|
return __queue_ctrl_work(SERVER_CTRL_TYPE_RESET);
|
|
}
|
|
|
|
static ssize_t stats_show(struct class *class, struct class_attribute *attr,
|
|
char *buf)
|
|
{
|
|
/*
|
|
* Inc this each time you change stats output format,
|
|
* so user space will know what to do.
|
|
*/
|
|
static int stats_version = 2;
|
|
static const char * const state[] = {
|
|
"startup",
|
|
"running",
|
|
"reset",
|
|
"shutdown"
|
|
};
|
|
|
|
ssize_t sz = scnprintf(buf, PAGE_SIZE, "%d %s %d %lu\n", stats_version,
|
|
state[server_conf.state], server_conf.tcp_port,
|
|
server_conf.ipc_last_active / HZ);
|
|
return sz;
|
|
}
|
|
|
|
static ssize_t kill_server_store(struct class *class,
|
|
struct class_attribute *attr, const char *buf,
|
|
size_t len)
|
|
{
|
|
if (!sysfs_streq(buf, "hard"))
|
|
return len;
|
|
|
|
pr_info("kill command received\n");
|
|
mutex_lock(&ctrl_lock);
|
|
WRITE_ONCE(server_conf.state, SERVER_STATE_RESETTING);
|
|
__module_get(THIS_MODULE);
|
|
server_ctrl_handle_reset(NULL);
|
|
module_put(THIS_MODULE);
|
|
mutex_unlock(&ctrl_lock);
|
|
return len;
|
|
}
|
|
|
|
static const char * const debug_type_strings[] = {"smb", "auth", "vfs",
|
|
"oplock", "ipc", "conn",
|
|
"rdma"};
|
|
|
|
static ssize_t debug_show(struct class *class, struct class_attribute *attr,
|
|
char *buf)
|
|
{
|
|
ssize_t sz = 0;
|
|
int i, pos = 0;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(debug_type_strings); i++) {
|
|
if ((ksmbd_debug_types >> i) & 1) {
|
|
pos = scnprintf(buf + sz,
|
|
PAGE_SIZE - sz,
|
|
"[%s] ",
|
|
debug_type_strings[i]);
|
|
} else {
|
|
pos = scnprintf(buf + sz,
|
|
PAGE_SIZE - sz,
|
|
"%s ",
|
|
debug_type_strings[i]);
|
|
}
|
|
sz += pos;
|
|
}
|
|
sz += scnprintf(buf + sz, PAGE_SIZE - sz, "\n");
|
|
return sz;
|
|
}
|
|
|
|
static ssize_t debug_store(struct class *class, struct class_attribute *attr,
|
|
const char *buf, size_t len)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(debug_type_strings); i++) {
|
|
if (sysfs_streq(buf, "all")) {
|
|
if (ksmbd_debug_types == KSMBD_DEBUG_ALL)
|
|
ksmbd_debug_types = 0;
|
|
else
|
|
ksmbd_debug_types = KSMBD_DEBUG_ALL;
|
|
break;
|
|
}
|
|
|
|
if (sysfs_streq(buf, debug_type_strings[i])) {
|
|
if (ksmbd_debug_types & (1 << i))
|
|
ksmbd_debug_types &= ~(1 << i);
|
|
else
|
|
ksmbd_debug_types |= (1 << i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return len;
|
|
}
|
|
|
|
static CLASS_ATTR_RO(stats);
|
|
static CLASS_ATTR_WO(kill_server);
|
|
static CLASS_ATTR_RW(debug);
|
|
|
|
static struct attribute *ksmbd_control_class_attrs[] = {
|
|
&class_attr_stats.attr,
|
|
&class_attr_kill_server.attr,
|
|
&class_attr_debug.attr,
|
|
NULL,
|
|
};
|
|
ATTRIBUTE_GROUPS(ksmbd_control_class);
|
|
|
|
static struct class ksmbd_control_class = {
|
|
.name = "ksmbd-control",
|
|
.owner = THIS_MODULE,
|
|
.class_groups = ksmbd_control_class_groups,
|
|
};
|
|
|
|
static int ksmbd_server_shutdown(void)
|
|
{
|
|
WRITE_ONCE(server_conf.state, SERVER_STATE_SHUTTING_DOWN);
|
|
|
|
class_unregister(&ksmbd_control_class);
|
|
ksmbd_workqueue_destroy();
|
|
ksmbd_ipc_release();
|
|
ksmbd_conn_transport_destroy();
|
|
ksmbd_crypto_destroy();
|
|
ksmbd_free_global_file_table();
|
|
destroy_lease_table(NULL);
|
|
ksmbd_work_pool_destroy();
|
|
ksmbd_exit_file_cache();
|
|
server_conf_free();
|
|
return 0;
|
|
}
|
|
|
|
static int __init ksmbd_server_init(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = class_register(&ksmbd_control_class);
|
|
if (ret) {
|
|
pr_err("Unable to register ksmbd-control class\n");
|
|
return ret;
|
|
}
|
|
|
|
ksmbd_server_tcp_callbacks_init();
|
|
|
|
ret = server_conf_init();
|
|
if (ret)
|
|
goto err_unregister;
|
|
|
|
ret = ksmbd_work_pool_init();
|
|
if (ret)
|
|
goto err_unregister;
|
|
|
|
ret = ksmbd_init_file_cache();
|
|
if (ret)
|
|
goto err_destroy_work_pools;
|
|
|
|
ret = ksmbd_ipc_init();
|
|
if (ret)
|
|
goto err_exit_file_cache;
|
|
|
|
ret = ksmbd_init_global_file_table();
|
|
if (ret)
|
|
goto err_ipc_release;
|
|
|
|
ret = ksmbd_inode_hash_init();
|
|
if (ret)
|
|
goto err_destroy_file_table;
|
|
|
|
ret = ksmbd_crypto_create();
|
|
if (ret)
|
|
goto err_release_inode_hash;
|
|
|
|
ret = ksmbd_workqueue_init();
|
|
if (ret)
|
|
goto err_crypto_destroy;
|
|
|
|
pr_warn_once("The ksmbd server is experimental, use at your own risk.\n");
|
|
|
|
return 0;
|
|
|
|
err_crypto_destroy:
|
|
ksmbd_crypto_destroy();
|
|
err_release_inode_hash:
|
|
ksmbd_release_inode_hash();
|
|
err_destroy_file_table:
|
|
ksmbd_free_global_file_table();
|
|
err_ipc_release:
|
|
ksmbd_ipc_release();
|
|
err_exit_file_cache:
|
|
ksmbd_exit_file_cache();
|
|
err_destroy_work_pools:
|
|
ksmbd_work_pool_destroy();
|
|
err_unregister:
|
|
class_unregister(&ksmbd_control_class);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* ksmbd_server_exit() - shutdown forker thread and free memory at module exit
|
|
*/
|
|
static void __exit ksmbd_server_exit(void)
|
|
{
|
|
ksmbd_server_shutdown();
|
|
ksmbd_release_inode_hash();
|
|
}
|
|
|
|
MODULE_AUTHOR("Namjae Jeon <linkinjeon@kernel.org>");
|
|
MODULE_VERSION(KSMBD_VERSION);
|
|
MODULE_DESCRIPTION("Linux kernel CIFS/SMB SERVER");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
|
|
MODULE_SOFTDEP("pre: ecb");
|
|
MODULE_SOFTDEP("pre: hmac");
|
|
MODULE_SOFTDEP("pre: md4");
|
|
MODULE_SOFTDEP("pre: md5");
|
|
MODULE_SOFTDEP("pre: nls");
|
|
MODULE_SOFTDEP("pre: aes");
|
|
MODULE_SOFTDEP("pre: cmac");
|
|
MODULE_SOFTDEP("pre: sha256");
|
|
MODULE_SOFTDEP("pre: sha512");
|
|
MODULE_SOFTDEP("pre: aead2");
|
|
MODULE_SOFTDEP("pre: ccm");
|
|
MODULE_SOFTDEP("pre: gcm");
|
|
MODULE_SOFTDEP("pre: crc32");
|
|
module_init(ksmbd_server_init)
|
|
module_exit(ksmbd_server_exit)
|