Linux 6.19.1
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.19.1 kernel.
All users of the 6.19 kernel series must upgrade.
The updated 6.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.19.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 drivers/base/base.h | 9 drivers/base/bus.c | 2 drivers/base/dd.c | 2 drivers/bluetooth/btusb.c | 2 drivers/bus/fsl-mc/fsl-mc-bus.c | 6 drivers/crypto/intel/iaa/iaa_crypto_main.c | 12 drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c | 2 drivers/crypto/omap-crypto.c | 2 drivers/crypto/virtio/virtio_crypto_core.c | 5 drivers/crypto/virtio/virtio_crypto_skcipher_algs.c | 2 drivers/gpu/drm/exynos/exynos_drm_vidi.c | 38 + drivers/net/wireless/realtek/rtl8xxxu/core.c | 1 drivers/net/wireless/realtek/rtw88/main.c | 4 drivers/pci/endpoint/pci-ep-cfs.c | 15 drivers/scsi/qla2xxx/qla_gs.c | 41 - drivers/scsi/qla2xxx/qla_init.c | 28 - drivers/scsi/qla2xxx/qla_isr.c | 19 drivers/scsi/qla2xxx/qla_os.c | 3 fs/erofs/fileio.c | 7 fs/hfs/mdb.c | 35 - fs/hfs/super.c | 10 fs/nilfs2/sufile.c | 4 fs/smb/client/cached_dir.h | 8 fs/smb/client/smbdirect.c | 523 +++++++++++++++----- fs/smb/common/smbdirect/smbdirect_socket.h | 18 fs/smb/server/mgmt/user_session.c | 5 fs/smb/server/mgmt/user_session.h | 1 fs/smb/server/server.c | 6 fs/smb/server/smb2pdu.c | 12 fs/smb/server/transport_rdma.c | 147 +++++ fs/smb/server/transport_tcp.c | 3 fs/xfs/scrub/btree.c | 7 io_uring/io-wq.c | 27 - io_uring/io-wq.h | 1 io_uring/tctx.c | 11 kernel/sched/core.c | 7 kernel/sched/sched.h | 6 sound/hda/codecs/conexant.c | 1 39 files changed, 787 insertions(+), 247 deletions(-)
Ali Tariq (1):
wifi: rtl8xxxu: fix slab-out-of-bounds in rtl8xxxu_sta_add
Anil Gurumurthy (4):
scsi: qla2xxx: Validate sp before freeing associated memory
scsi: qla2xxx: Delay module unload while fabric scan in progress
scsi: qla2xxx: Free sp in error path to fix system crash
scsi: qla2xxx: Query FW again before proceeding with login
Bibo Mao (2):
crypto: virtio - Add spinlock protection with virtqueue notification
crypto: virtio - Remove duplicated virtqueue_kick in virtio_crypto_skcipher_crypt_req
Bitterblue Smith (1):
wifi: rtw88: Fix alignment fault in rtw_core_enable_beacon()
Chao Yu (1):
erofs: fix UAF issue for file-backed mounts w/ directio option
Darrick J. Wong (1):
xfs: fix UAF in xchk_btree_check_block_owner
Edward Adam Davis (1):
nilfs2: Fix potential block overflow that cause system hang
Greg Kroah-Hartman (1):
Linux 6.19.1
Gui-Dong Han (2):
driver core: enforce device_lock for driver_match_device()
bus: fsl-mc: fix use-after-free in driver_override_show()
Henrique Carvalho (2):
smb: client: split cached_fid bitfields to avoid shared-byte RMW races
smb: server: fix leak of active_num_conn in ksmbd_tcp_new_connection()
Jeongjun Park (1):
drm/exynos: vidi: use ctx->lock to protect struct vidi_context member variables related to memory alloc/free
Kees Cook (1):
crypto: omap - Allocate OMAP_CRYPTO_FORCE_COPY scatterlists correctly
Li Chen (2):
io_uring/io-wq: add exit-on-idle state
io_uring: allow io-wq workers to exit when unused
Liu Song (1):
PCI: endpoint: Avoid creating sub-groups asynchronously
Mehdi Ben Hadj Khelifa (1):
hfs: ensure sb->s_fs_info is always cleaned up
Namjae Jeon (2):
ksmbd: fix infinite loop caused by next_smb2_rcv_hdr_off reset in error paths
ksmbd: add chann_lock to protect ksmbd_chann_list xarray
Shreyas Deodhar (1):
scsi: qla2xxx: Allow recovery for tape devices
Stefan Metzmacher (20):
smb: smbdirect: introduce smbdirect_socket.recv_io.credits.available
smb: smbdirect: introduce smbdirect_socket.send_io.bcredits.*
smb: server: make use of smbdirect_socket.recv_io.credits.available
smb: server: let recv_done() queue a refill when the peer is low on credits
smb: server: make use of smbdirect_socket.send_io.bcredits
smb: server: fix last send credit problem causing disconnects
smb: server: let send_done handle a completion without IB_SEND_SIGNALED
smb: client: make use of smbdirect_socket.recv_io.credits.available
smb: client: let recv_done() queue a refill when the peer is low on credits
smb: client: let smbd_post_send() make use of request->wr
smb: client: remove pointless sc->recv_io.credits.count rollback
smb: client: remove pointless sc->send_io.pending handling in smbd_post_send_iter()
smb: client: port and use the wait_for_credits logic used by server
smb: client: split out smbd_ib_post_send()
smb: client: introduce and use smbd_{alloc, free}_send_io()
smb: client: use smbdirect_send_batch processing
smb: client: make use of smbdirect_socket.send_io.bcredits
smb: client: fix last send credit problem causing disconnects
smb: client: let smbd_post_send_negotiate_req() use smbd_post_send()
smb: client: let send_done handle a completion without IB_SEND_SIGNALED
Takashi Iwai (1):
ALSA: hda/conexant: Add quirk for HP ZBook Studio G4
Thomas Gleixner (1):
sched/mmcid: Don't assume CID is CPU owned on mode switch
Thorsten Blum (2):
crypto: iaa - Fix out-of-bounds index in find_empty_iaa_compression_mode
crypto: octeontx - Fix length check to avoid truncation in ucode_load_store
Zenm Chen (1):
Bluetooth: btusb: Add USB ID 7392:e611 for Edimax EW-7611UXB
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 19 -SUBLEVEL = 0 +SUBLEVEL = 1 EXTRAVERSION = NAME = Baby Opossum Posse
drivers/base/base.h +9 -0
@@ -182,9 +182,18 @@ void device_set_deferred_probe_reason(const struct device *dev, struct va_formatstatic inline int driver_match_device (const struct device_driver *drv,struct device *dev) { +device_lock_assert (dev); +return drv->bus->match ? drv->bus->match (dev, drv) :1 ; } +static inline int driver_match_device_locked (const struct device_driver *drv, +struct device *dev) +{ +guard (device)(dev); +return driver_match_device (drv, dev); +} +static inline void dev_sync_state (struct device *dev) {if (dev->bus->sync_state)
drivers/base/bus.c +1 -1
@@ -263,7 +263,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf,int err = -ENODEV ; dev =bus_find_device_by_name (bus,NULL , buf); -if (dev &&driver_match_device (drv, dev)) { +if (dev &&driver_match_device_locked (drv, dev)) { err =device_driver_attach (drv, dev);if (!err) {/* success */
drivers/base/dd.c +1 -1
@@ -1180,7 +1180,7 @@ static int __driver_attach(struct device *dev, void *data)* is an error. */ - ret =driver_match_device (drv, dev); + ret =driver_match_device_locked (drv, dev);if (ret ==0 ) {/* no match */ return 0 ;
drivers/bluetooth/btusb.c +2 -0
@@ -527,6 +527,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x2001, 0x332a), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x7392, 0xe611), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, /* Realtek 8852AE Bluetooth devices */ { USB_DEVICE(0x0bda, 0x2852), .driver_info = BTUSB_REALTEK |
drivers/bus/fsl-mc/fsl-mc-bus.c +5 -1
@@ -202,8 +202,12 @@ static ssize_t driver_override_show(struct device *dev, struct device_attribute *attr, char *buf) { struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); +ssize_t len; -return sysfs_emit (buf,"%s\n" , mc_dev->driver_override); +device_lock (dev); + len =sysfs_emit (buf,"%s\n" , mc_dev->driver_override); +device_unlock (dev); +return len; }static DEVICE_ATTR_RW (driver_override);
drivers/crypto/intel/iaa/iaa_crypto_main.c +5 -7
@@ -221,15 +221,13 @@ static struct iaa_compression_mode *iaa_compression_modes[IAA_COMP_MODES_MAX];static int find_empty_iaa_compression_mode (void ) { -int i = -EINVAL ; +int i; -for (i =0 ; i <IAA_COMP_MODES_MAX ; i++) { -if (iaa_compression_modes[i]) -continue ; -break ; - } +for (i =0 ; i <IAA_COMP_MODES_MAX ; i++) +if (!iaa_compression_modes[i]) +return i; -return i; +return -EINVAL ; }static struct iaa_compression_mode *find_iaa_compression_mode (const char *name,int *idx)
drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c +1 -1
@@ -1326,7 +1326,7 @@ static ssize_t ucode_load_store(struct device *dev,int del_grp_idx =-1 ;int ucode_idx =0 ; -if (strlen (buf) >OTX_CPT_UCODE_NAME_LENGTH ) +if (count >=OTX_CPT_UCODE_NAME_LENGTH )return -EINVAL ; eng_grps = container_of(attr, struct otx_cpt_eng_grps, ucode_load_attr);
drivers/crypto/omap-crypto.c +1 -1
@@ -21,7 +21,7 @@ static int omap_crypto_copy_sg_lists(int total, int bs,struct scatterlist *tmp;if (!(flags &OMAP_CRYPTO_FORCE_SINGLE_ENTRY )) { - new_sg =kmalloc_array (n,sizeof (*sg),GFP_KERNEL ); + new_sg =kmalloc_array (n,sizeof (*new_sg),GFP_KERNEL );if (!new_sg)return -ENOMEM ;
drivers/crypto/virtio/virtio_crypto_core.c +5 -0
@@ -75,15 +75,20 @@ static void virtcrypto_done_task(unsigned long data)struct data_queue *data_vq = (struct data_queue *)data;struct virtqueue *vq = data_vq->vq;struct virtio_crypto_request *vc_req; +unsigned long flags;unsigned int len; +spin_lock_irqsave (&data_vq->lock, flags);do {virtqueue_disable_cb (vq);while ((vc_req =virtqueue_get_buf (vq, &len)) !=NULL ) { +spin_unlock_irqrestore (&data_vq->lock, flags);if (vc_req->alg_cb) vc_req->alg_cb (vc_req, len); +spin_lock_irqsave (&data_vq->lock, flags); } }while (!virtqueue_enable_cb (vq)); +spin_unlock_irqrestore (&data_vq->lock, flags); }static void virtcrypto_dataq_callback (struct virtqueue *vq)
drivers/crypto/virtio/virtio_crypto_skcipher_algs.c +0 -2
@@ -541,8 +541,6 @@ int virtio_crypto_skcipher_crypt_req(if (ret <0 )return ret; -virtqueue_kick (data_vq->vq); -return 0 ; }
drivers/gpu/drm/exynos/exynos_drm_vidi.c +32 -6
@@ -187,29 +187,37 @@ static ssize_t vidi_store_connection(struct device *dev, const char *buf, size_t len) {struct vidi_context *ctx =dev_get_drvdata (dev); -int ret; +int ret, new_connected; - ret =kstrtoint (buf,0 , &ctx->connected); + ret =kstrtoint (buf,0 , &new_connected);if (ret)return ret; - -if (ctx->connected >1 ) +if (new_connected >1 )return -EINVAL ; +mutex_lock (&ctx->lock); +/* * Use fake edid data for test. If raw_edid is set then it can't be * tested. */ if (ctx->raw_edid) {DRM_DEV_DEBUG_KMS (dev,"edid data is not fake data.\n" ); -return -EINVAL ; + ret = -EINVAL ; + goto fail; } + ctx->connected = new_connected; +mutex_unlock (&ctx->lock); +DRM_DEV_DEBUG_KMS (dev,"requested connection.\n" );drm_helper_hpd_irq_event (ctx->drm_dev);return len; +fail: +mutex_unlock (&ctx->lock); +return ret; } static DEVICE_ATTR(connection, 0644, vidi_show_connection,
@@ -239,11 +247,14 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,return -EINVAL ; } +mutex_lock (&ctx->lock);if (ctx->connected == vidi->connection) { +mutex_unlock (&ctx->lock);DRM_DEV_DEBUG_KMS (ctx->dev,"same connection request.\n" );return -EINVAL ; } +mutex_unlock (&ctx->lock);if (vidi->connection) {const struct drm_edid *drm_edid;
@@ -263,14 +274,21 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data, "edid data is invalid.\n");return -EINVAL ; } +mutex_lock (&ctx->lock); ctx->raw_edid = drm_edid; +mutex_unlock (&ctx->lock); }else {/* with connection = 0, free raw_edid */ +mutex_lock (&ctx->lock);drm_edid_free (ctx->raw_edid); ctx->raw_edid =NULL ; +mutex_unlock (&ctx->lock); } +mutex_lock (&ctx->lock); ctx->connected = vidi->connection; +mutex_unlock (&ctx->lock); +drm_helper_hpd_irq_event (ctx->drm_dev);return 0 ;
@@ -285,7 +303,7 @@ static enum drm_connector_status vidi_detect(struct drm_connector *connector,* connection request would come from user side * to do hotplug through specific ioctl. */ -return ctx->connected ? connector_status_connected : +return READ_ONCE (ctx->connected) ? connector_status_connected : connector_status_disconnected; }
@@ -308,11 +326,15 @@ static int vidi_get_modes(struct drm_connector *connector)const struct drm_edid *drm_edid;int count; +mutex_lock (&ctx->lock); +if (ctx->raw_edid) drm_edid =drm_edid_dup (ctx->raw_edid);else drm_edid =drm_edid_alloc (fake_edid_info,sizeof (fake_edid_info)); +mutex_unlock (&ctx->lock); +drm_edid_connector_update (connector, drm_edid); count =drm_edid_connector_add_modes (connector);
@@ -457,9 +479,13 @@ static void vidi_remove(struct platform_device *pdev) {struct vidi_context *ctx =platform_get_drvdata (pdev); +mutex_lock (&ctx->lock); +drm_edid_free (ctx->raw_edid); ctx->raw_edid =NULL ; +mutex_unlock (&ctx->lock); +component_del (&pdev->dev, &vidi_component_ops); }
drivers/net/wireless/realtek/rtl8xxxu/core.c +1 -0
@@ -7826,6 +7826,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface, goto err_set_intfdata; hw->vif_data_size =sizeof (struct rtl8xxxu_vif ); + hw->sta_data_size =sizeof (struct rtl8xxxu_sta_info ); hw->wiphy->max_scan_ssids =1 ; hw->wiphy->max_scan_ie_len =IEEE80211_MAX_DATA_LEN ;
drivers/net/wireless/realtek/rtw88/main.c +2 -2
@@ -2444,10 +2444,10 @@ void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable)if (enable) {rtw_write32_set (rtwdev,REG_BCN_CTRL ,BIT_EN_BCN_FUNCTION ); -rtw_write32_clr (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); +rtw_write8_clr (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); }else {rtw_write32_clr (rtwdev,REG_BCN_CTRL ,BIT_EN_BCN_FUNCTION ); -rtw_write32_set (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); +rtw_write8_set (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); } }
drivers/pci/endpoint/pci-ep-cfs.c +5 -10
@@ -23,7 +23,6 @@ struct pci_epf_group {struct config_group group;struct config_group primary_epc_group;struct config_group secondary_epc_group; -struct delayed_work cfs_work;struct pci_epf *epf;int index; };
@@ -103,7 +102,7 @@ static struct config_group secondary_epc_group = &epf_group->secondary_epc_group;config_group_init_type_name (secondary_epc_group,"secondary" , &pci_secondary_epc_type); -configfs_register_group (&epf_group->group, secondary_epc_group); +configfs_add_default_group (secondary_epc_group, &epf_group->group);return secondary_epc_group; }
@@ -166,7 +165,7 @@ static struct config_groupconfig_group_init_type_name (primary_epc_group,"primary" , &pci_primary_epc_type); -configfs_register_group (&epf_group->group, primary_epc_group); +configfs_add_default_group (primary_epc_group, &epf_group->group);return primary_epc_group; }
@@ -570,15 +569,13 @@ static void pci_ep_cfs_add_type_group(struct pci_epf_group *epf_group)return ; } -configfs_register_group (&epf_group->group, group); +configfs_add_default_group (group, &epf_group->group); } -static void pci_epf_cfs_work (struct work_struct *work) +static void pci_epf_cfs_add_sub_groups (struct pci_epf_group *epf_group) { -struct pci_epf_group *epf_group;struct config_group *group; - epf_group = container_of(work, struct pci_epf_group, cfs_work.work); group =pci_ep_cfs_add_primary_group (epf_group);if (IS_ERR (group)) {pr_err ("failed to create 'primary' EPC interface\n" );
@@ -637,9 +634,7 @@ static struct config_group *pci_epf_make(struct config_group *group,kfree (epf_name); -INIT_DELAYED_WORK (&epf_group->cfs_work, pci_epf_cfs_work); -queue_delayed_work (system_wq, &epf_group->cfs_work, -msecs_to_jiffies (1 )); +pci_epf_cfs_add_sub_groups (epf_group);return &epf_group->group;
drivers/scsi/qla2xxx/qla_gs.c +20 -21
60 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_init.c +17 -11
@@ -1859,15 +1859,6 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)case RSCN_PORT_ADDR : fcport =qla2x00_find_fcport_by_nportid (vha, &ea->id,1 );if (fcport) { -if (ql2xfc2target && - fcport->flags &FCF_FCP2_DEVICE && -atomic_read (&fcport->state) ==FCS_ONLINE ) { -ql_dbg (ql_dbg_disc, vha,0x2115 , -"Delaying session delete for FCP2 portid=%06x %8phC " , - fcport->d_id.b24, fcport->port_name); -return ; - } -if (vha->hw->flags.edif_enabled &&DBELL_ACTIVE (vha)) {/* * On ipsec start by remote port, Target port
@@ -2471,8 +2462,23 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) ea->sp->gen1, fcport->rscn_gen, ea->data[0], ea->data[1], ea->iop[0], ea->iop[1]); -if ((fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) || - (fcport->fw_login_state ==DSC_LS_PRLI_PEND )) { +if (fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) { +ql_dbg (ql_dbg_disc, vha,0x20ea , +"%s %d %8phC Remote is trying to login\n" , + __func__, __LINE__, fcport->port_name); +/* +* If we get here, there is port thats already logged in, +* but it's state has not moved ahead. Recheck with FW on +* what state it is in and proceed ahead +*/ +if (!N2N_TOPO (vha->hw)) { + fcport->fw_login_state =DSC_LS_PRLI_COMP ; +qla24xx_post_gpdb_work (vha, fcport,0 ); + } +return ; + } + +if (fcport->fw_login_state ==DSC_LS_PRLI_PEND ) {ql_dbg (ql_dbg_disc, vha,0x20ea ,"%s %d %8phC Remote is trying to login\n" , __func__, __LINE__, fcport->port_name);
drivers/scsi/qla2xxx/qla_isr.c +17 -2
@@ -1676,13 +1676,28 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)/* Port logout */ fcport =qla2x00_find_fcport_by_loopid (vha, mb[1 ]); -if (!fcport) +if (!fcport) { +ql_dbg (ql_dbg_async, vha,0x5011 , +"Could not find fcport:%04x %04x %04x\n" , + mb[1 ], mb[2 ], mb[3 ]);break ; -if (atomic_read (&fcport->state) !=FCS_ONLINE ) + } + +if (atomic_read (&fcport->state) !=FCS_ONLINE ) { +ql_dbg (ql_dbg_async, vha,0x5012 , +"Port state is not online State:0x%x \n" , +atomic_read (&fcport->state)); +ql_dbg (ql_dbg_async, vha,0x5012 , +"Scheduling session for deletion \n" ); + fcport->logout_on_delete =0 ; +qlt_schedule_sess_for_deletion (fcport);break ; + } +ql_dbg (ql_dbg_async, vha,0x508a ,"Marking port lost loopid=%04x portid=%06x.\n" , fcport->loop_id, fcport->d_id.b24); +if (qla_ini_mode_enabled (vha)) { fcport->logout_on_delete =0 ;qlt_schedule_sess_for_deletion (fcport);
drivers/scsi/qla2xxx/qla_os.c +2 -1
@@ -1183,7 +1183,8 @@ qla2x00_wait_for_hba_ready(scsi_qla_host_t *vha)while ((qla2x00_reset_active (vha) || ha->dpc_active || ha->flags.mbox_busy) ||test_bit (FX00_RESET_RECOVERY , &vha->dpc_flags) || -test_bit (FX00_TARGET_SCAN , &vha->dpc_flags)) { +test_bit (FX00_TARGET_SCAN , &vha->dpc_flags) || + (vha->scan.scan_flags &SF_SCANNING )) {if (test_bit (UNLOADING , &base_vha->dpc_flags))break ;msleep (1000 );
fs/erofs/fileio.c +6 -1
@@ -10,6 +10,7 @@ struct erofs_fileio_rq {struct bio bio;struct kiocb iocb;struct super_block *sb; +refcount_t ref; };struct erofs_fileio {
@@ -42,7 +43,8 @@ static void erofs_fileio_ki_complete(struct kiocb *iocb, long ret) }bio_endio (&rq->bio);bio_uninit (&rq->bio); -kfree (rq); +if (refcount_dec_and_test (&rq->ref)) +kfree (rq); }static void erofs_fileio_rq_submit (struct erofs_fileio_rq *rq)
@@ -64,6 +66,8 @@ static void erofs_fileio_rq_submit(struct erofs_fileio_rq *rq) ret =vfs_iocb_iter_read (rq->iocb.ki_filp, &rq->iocb, &iter);if (ret != -EIOCBQUEUED )erofs_fileio_ki_complete (&rq->iocb, ret); +if (refcount_dec_and_test (&rq->ref)) +kfree (rq); }static struct erofs_fileio_rq *erofs_fileio_rq_alloc (struct erofs_map_dev *mdev)
@@ -74,6 +78,7 @@ static struct erofs_fileio_rq *erofs_fileio_rq_alloc(struct erofs_map_dev *mdev)bio_init (&rq->bio,NULL , rq->bvecs,ARRAY_SIZE (rq->bvecs),REQ_OP_READ ); rq->iocb.ki_filp = mdev->m_dif->file; rq->sb = mdev->m_sb; +refcount_set (&rq->ref,2 );return rq; }
fs/hfs/mdb.c +14 -21
@@ -92,7 +92,7 @@ int hfs_mdb_get(struct super_block *sb)/* See if this is an HFS filesystem */ bh =sb_bread512 (sb, part_start +HFS_MDB_BLK , mdb);if (!bh) - goto out; +return -EIO ;if (mdb->drSigWord ==cpu_to_be16 (HFS_SUPER_MAGIC ))break ;
@@ -102,13 +102,14 @@ int hfs_mdb_get(struct super_block *sb)* (should do this only for cdrom/loop though) */ if (hfs_part_find (sb, &part_start, &part_size)) - goto out; +return -EIO ; }HFS_SB (sb)->alloc_blksz = size =be32_to_cpu (mdb->drAlBlkSiz);if (!size || (size & (HFS_SECTOR_SIZE -1 ))) {pr_err ("bad allocation block size %d\n" , size); - goto out_bh; +brelse (bh); +return -EIO ; } size =min (HFS_SB (sb)->alloc_blksz, (u32 )PAGE_SIZE );
@@ -125,14 +126,16 @@ int hfs_mdb_get(struct super_block *sb)brelse (bh);if (!sb_set_blocksize (sb, size)) {pr_err ("unable to set blocksize to %u\n" , size); - goto out; +return -EIO ; } bh =sb_bread512 (sb, part_start +HFS_MDB_BLK , mdb);if (!bh) - goto out; -if (mdb->drSigWord !=cpu_to_be16 (HFS_SUPER_MAGIC )) - goto out_bh; +return -EIO ; +if (mdb->drSigWord !=cpu_to_be16 (HFS_SUPER_MAGIC )) { +brelse (bh); +return -EIO ; + }HFS_SB (sb)->mdb_bh = bh;HFS_SB (sb)->mdb = mdb;
@@ -174,7 +177,7 @@ int hfs_mdb_get(struct super_block *sb)HFS_SB (sb)->bitmap =kzalloc (8192 ,GFP_KERNEL );if (!HFS_SB (sb)->bitmap) - goto out; +return -EIO ;/* read in the bitmap */ block =be16_to_cpu (mdb->drVBMSt) + part_start;
@@ -185,7 +188,7 @@ int hfs_mdb_get(struct super_block *sb) bh =sb_bread (sb, off >> sb->s_blocksize_bits);if (!bh) {pr_err ("unable to read volume bitmap\n" ); - goto out; +return -EIO ; } off2 = off & (sb->s_blocksize -1 ); len =min ((int )sb->s_blocksize - off2, size);
@@ -199,12 +202,12 @@ int hfs_mdb_get(struct super_block *sb)HFS_SB (sb)->ext_tree =hfs_btree_open (sb,HFS_EXT_CNID , hfs_ext_keycmp);if (!HFS_SB (sb)->ext_tree) {pr_err ("unable to open extent tree\n" ); - goto out; +return -EIO ; }HFS_SB (sb)->cat_tree =hfs_btree_open (sb,HFS_CAT_CNID , hfs_cat_keycmp);if (!HFS_SB (sb)->cat_tree) {pr_err ("unable to open catalog tree\n" ); - goto out; +return -EIO ; } attrib = mdb->drAtrb;
@@ -229,12 +232,6 @@ int hfs_mdb_get(struct super_block *sb) }return 0 ; - -out_bh: -brelse (bh); -out: -hfs_mdb_put (sb); -return -EIO ; }/*
@@ -359,8 +356,6 @@ void hfs_mdb_close(struct super_block *sb)* Release the resources associated with the in-core MDB. */ void hfs_mdb_put (struct super_block *sb) { -if (!HFS_SB (sb)) -return ;/* free the B-trees */ hfs_btree_close (HFS_SB (sb)->ext_tree);hfs_btree_close (HFS_SB (sb)->cat_tree);
@@ -373,6 +368,4 @@ void hfs_mdb_put(struct super_block *sb)unload_nls (HFS_SB (sb)->nls_disk);kfree (HFS_SB (sb)->bitmap); -kfree (HFS_SB (sb)); - sb->s_fs_info =NULL ; }
fs/hfs/super.c +9 -1
@@ -431,10 +431,18 @@ static int hfs_init_fs_context(struct fs_context *fc)return 0 ; } +static void hfs_kill_super (struct super_block *sb) +{ +struct hfs_sb_info *hsb =HFS_SB (sb); + +kill_block_super (sb); +kfree (hsb); +} +static struct file_system_type hfs_fs_type = { .owner =THIS_MODULE , .name ="hfs" , - .kill_sb = kill_block_super, + .kill_sb = hfs_kill_super, .fs_flags =FS_REQUIRES_DEV , .init_fs_context = hfs_init_fs_context, };
fs/nilfs2/sufile.c +4 -0
@@ -1093,6 +1093,9 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)else end_block = start_block + len -1 ; +if (end_block < nilfs->ns_first_data_block) + goto out; + segnum =nilfs_get_segnum_of_block (nilfs, start_block); segnum_end =nilfs_get_segnum_of_block (nilfs, end_block);
@@ -1191,6 +1194,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) out_sem:up_read (&NILFS_MDT (sufile)->mi_sem); +out: range->len = ndiscarded << nilfs->ns_blocksize_bits;return ret; }
fs/smb/client/cached_dir.h +4 -4
@@ -36,10 +36,10 @@ struct cached_fid {struct list_head entry;struct cached_fids *cfids;const char *path; - bool has_lease:1; - bool is_open:1; - bool on_list:1; - bool file_all_info_is_valid:1; +bool has_lease; +bool is_open; +bool on_list; +bool file_all_info_is_valid;unsigned long time;/* jiffies of when lease was taken */ unsigned long last_access_time;/* jiffies of when last accessed */ struct kref refcount;
fs/smb/client/smbdirect.c +397 -126
744 lines not on this page · raw message
fs/smb/common/smbdirect/smbdirect_socket.h +18 -0
@@ -162,6 +162,17 @@ struct smbdirect_socket {mempool_t *pool; } mem; +/* +* This is a coordination for smbdirect_send_batch. +* +* There's only one possible credit, which means +* only one instance is running at a time. +*/ +struct { +atomic_t count; +wait_queue_head_t wait_queue; + } bcredits; +/* * The local credit state for ib_post_send() */
@@ -239,6 +250,7 @@ struct smbdirect_socket {*/ struct {u16 target; +atomic_t available;atomic_t count; } credits;
@@ -370,6 +382,9 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)INIT_DELAYED_WORK (&sc->idle.timer_work, __smbdirect_socket_disabled_work);disable_delayed_work_sync (&sc->idle.timer_work); +atomic_set (&sc->send_io.bcredits.count,0 ); +init_waitqueue_head (&sc->send_io.bcredits.wait_queue); +atomic_set (&sc->send_io.lcredits.count,0 );init_waitqueue_head (&sc->send_io.lcredits.wait_queue);
@@ -387,6 +402,7 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)INIT_WORK (&sc->recv_io.posted.refill_work, __smbdirect_socket_disabled_work);disable_work_sync (&sc->recv_io.posted.refill_work); +atomic_set (&sc->recv_io.credits.available,0 );atomic_set (&sc->recv_io.credits.count,0 );INIT_LIST_HEAD (&sc->recv_io.reassembly.list);
@@ -483,6 +499,8 @@ struct smbdirect_send_batch {*/ bool need_invalidate_rkey;u32 remote_key; + +int credit; };struct smbdirect_recv_io {
fs/smb/server/mgmt/user_session.c +5 -0
@@ -32,12 +32,14 @@ static void free_channel_list(struct ksmbd_session *sess)struct channel *chann;unsigned long index; +down_write (&sess->chann_lock);xa_for_each (&sess->ksmbd_chann_list, index, chann) {xa_erase (&sess->ksmbd_chann_list, index);kfree (chann); }xa_destroy (&sess->ksmbd_chann_list); +up_write (&sess->chann_lock); } static void __session_rpc_close(struct ksmbd_session *sess,
@@ -220,7 +222,9 @@ static int ksmbd_chann_del(struct ksmbd_conn *conn, struct ksmbd_session *sess) {struct channel *chann; +down_write (&sess->chann_lock); chann =xa_erase (&sess->ksmbd_chann_list, (long )conn); +up_write (&sess->chann_lock);if (!chann)return -ENOENT ;
@@ -454,6 +458,7 @@ static struct ksmbd_session *__session_create(int protocol)rwlock_init (&sess->tree_conns_lock);atomic_set (&sess->refcnt,2 );init_rwsem (&sess->rpc_lock); +init_rwsem (&sess->chann_lock); ret =__init_smb2_session (sess);if (ret)
fs/smb/server/mgmt/user_session.h +1 -0
@@ -49,6 +49,7 @@ struct ksmbd_session {char sess_key[CIFS_KEY_SIZE ];struct hlist_node hlist; +struct rw_semaphore chann_lock;struct xarray ksmbd_chann_list;struct xarray tree_conns;struct ida tree_conn_ida;
fs/smb/server/server.c +3 -3
@@ -126,21 +126,21 @@ static int __process_request(struct ksmbd_work *work, struct ksmbd_conn *conn, andx_again:if (command >= conn->max_cmds) { conn->ops->set_rsp_status (work,STATUS_INVALID_PARAMETER ); -return SERVER_HANDLER_CONTINUE ; +return SERVER_HANDLER_ABORT ; } 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 ; +return SERVER_HANDLER_ABORT ; }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 ; +return SERVER_HANDLER_ABORT ; } }
fs/smb/server/smb2pdu.c +11 -1
@@ -79,7 +79,13 @@ static inline bool check_session_id(struct ksmbd_conn *conn, u64 id)struct channel *lookup_chann_list (struct ksmbd_session *sess,struct ksmbd_conn *conn) { -return xa_load (&sess->ksmbd_chann_list, (long )conn); +struct channel *chann; + +down_read (&sess->chann_lock); + chann =xa_load (&sess->ksmbd_chann_list, (long )conn); +up_read (&sess->chann_lock); + +return chann; }/**
@@ -1558,8 +1564,10 @@ static int ntlm_authenticate(struct ksmbd_work *work,return -ENOMEM ; chann->conn = conn; +down_write (&sess->chann_lock); old =xa_store (&sess->ksmbd_chann_list, (long )conn, chann,KSMBD_DEFAULT_GFP ); +up_write (&sess->chann_lock);if (xa_is_err (old)) {kfree (chann);return xa_err (old);
@@ -1651,8 +1659,10 @@ static int krb5_authenticate(struct ksmbd_work *work,return -ENOMEM ; chann->conn = conn; +down_write (&sess->chann_lock); old =xa_store (&sess->ksmbd_chann_list, (long )conn, chann,KSMBD_DEFAULT_GFP ); +up_write (&sess->chann_lock);if (xa_is_err (old)) {kfree (chann);return xa_err (old);
fs/smb/server/transport_rdma.c +136 -11
276 lines not on this page · raw message
fs/smb/server/transport_tcp.c +2 -1
@@ -40,6 +40,7 @@ static const struct ksmbd_transport_ops ksmbd_tcp_transport_ops;static void tcp_stop_kthread (struct task_struct *kthread);static struct interface *alloc_iface (char *ifname); +static void ksmbd_tcp_disconnect (struct ksmbd_transport *t);#define KSMBD_TRANS (t) (&(t)->transport)#define TCP_TRANS (t) ((struct tcp_transport *)container_of(t, \
@@ -202,7 +203,7 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)if (IS_ERR (handler)) {pr_err ("cannot start conn thread\n" ); rc =PTR_ERR (handler); -free_transport (t); +ksmbd_tcp_disconnect (KSMBD_TRANS (t)); }return rc; }
fs/xfs/scrub/btree.c +5 -2
@@ -370,12 +370,15 @@ xchk_btree_check_block_owner( {xfs_agnumber_t agno;xfs_agblock_t agbno; +bool is_bnobt, is_rmapbt;bool init_sa;int error =0 ;if (!bs->cur)return 0 ; + is_bnobt =xfs_btree_is_bno (bs->cur->bc_ops); + is_rmapbt =xfs_btree_is_rmap (bs->cur->bc_ops); agno =xfs_daddr_to_agno (bs->cur->bc_mp, daddr); agbno =xfs_daddr_to_agbno (bs->cur->bc_mp, daddr);
@@ -398,11 +401,11 @@ xchk_btree_check_block_owner(* have to nullify it (to shut down further block owner checks) if * self-xref encounters problems. */ -if (!bs->sc->sa.bno_cur &&xfs_btree_is_bno (bs->cur->bc_ops)) +if (!bs->sc->sa.bno_cur && is_bnobt) bs->cur =NULL ;xchk_xref_is_only_owned_by (bs->sc, agbno,1 , bs->oinfo); -if (!bs->sc->sa.rmap_cur &&xfs_btree_is_rmap (bs->cur->bc_ops)) +if (!bs->sc->sa.rmap_cur && is_rmapbt) bs->cur =NULL ; out_free:
io_uring/io-wq.c +25 -2
@@ -34,6 +34,7 @@ enum {enum {IO_WQ_BIT_EXIT =0 ,/* wq exiting */ +IO_WQ_BIT_EXIT_ON_IDLE =1 ,/* allow all workers to exit on idle */ };enum {
@@ -706,9 +707,13 @@ static int io_wq_worker(void *data)raw_spin_lock (&acct->workers_lock);/* * Last sleep timed out. Exit if we're not the last worker, -* or if someone modified our affinity. +* or if someone modified our affinity. If wq is marked +* idle-exit, drop the worker as well. This is used to avoid +* keeping io-wq workers around for tasks that no longer have +* any active io_uring instances. */ -if (last_timeout && (exit_mask || acct->nr_workers >1 )) { +if ((last_timeout && (exit_mask || acct->nr_workers >1 )) || +test_bit (IO_WQ_BIT_EXIT_ON_IDLE , &wq->state)) { acct->nr_workers--;raw_spin_unlock (&acct->workers_lock);__set_current_state (TASK_RUNNING );
@@ -963,6 +968,24 @@ static bool io_wq_worker_wake(struct io_worker *worker, void *data)return false; } +void io_wq_set_exit_on_idle (struct io_wq *wq,bool enable) +{ +if (!wq->task) +return ; + +if (!enable) { +clear_bit (IO_WQ_BIT_EXIT_ON_IDLE , &wq->state); +return ; + } + +if (test_and_set_bit (IO_WQ_BIT_EXIT_ON_IDLE , &wq->state)) +return ; + +rcu_read_lock (); +io_wq_for_each_worker (wq, io_wq_worker_wake,NULL ); +rcu_read_unlock (); +} +static void io_run_cancel (struct io_wq_work *work,struct io_wq *wq) { do {
io_uring/io-wq.h +1 -0
@@ -41,6 +41,7 @@ struct io_wq_data {struct io_wq *io_wq_create (unsigned bounded,struct io_wq_data *data);void io_wq_exit_start (struct io_wq *wq);void io_wq_put_and_exit (struct io_wq *wq); +void io_wq_set_exit_on_idle (struct io_wq *wq,bool enable);void io_wq_enqueue (struct io_wq *wq,struct io_wq_work *work);void io_wq_hash_work (struct io_wq_work *work,void *val);
io_uring/tctx.c +11 -0
@@ -122,6 +122,14 @@ int __io_uring_add_tctx_node(struct io_ring_ctx *ctx)return ret; } } + +/* +* Re-activate io-wq keepalive on any new io_uring usage. The wq may have +* been marked for idle-exit when the task temporarily had no active +* io_uring instances. +*/ +if (tctx->io_wq) +io_wq_set_exit_on_idle (tctx->io_wq, false);if (!xa_load (&tctx->xa, (unsigned long )ctx)) { node =kmalloc (sizeof (*node),GFP_KERNEL );if (!node)
@@ -183,6 +191,9 @@ __cold void io_uring_del_tctx_node(unsigned long index)if (tctx->last == node->ctx) tctx->last =NULL ;kfree (node); + +if (xa_empty (&tctx->xa) && tctx->io_wq) +io_wq_set_exit_on_idle (tctx->io_wq, true); }__cold void io_uring_clean_tctx (struct io_uring_task *tctx)
kernel/sched/core.c +3 -4
@@ -10729,10 +10729,9 @@ void sched_mm_cid_exit(struct task_struct *t)return ;/* * Mode change. The task has the CID unset -* already. The CPU CID is still valid and -* does not have MM_CID_TRANSIT set as the -* mode change has just taken effect under -* mm::mm_cid::lock. Drop it. +* already and dealt with an eventually set +* TRANSIT bit. If the CID is owned by the CPU +* then drop it. */ mm_drop_cid_on_cpu (mm,this_cpu_ptr (mm->mm_cid.pcpu)); }
kernel/sched/sched.h +4 -2
@@ -3758,8 +3758,10 @@ static __always_inline void mm_unset_cid_on_task(struct task_struct *t) static __always_inline void mm_drop_cid_on_cpu(struct mm_struct *mm, struct mm_cid_pcpu *pcp) {/* Clear the ONCPU bit, but do not set UNSET in the per CPU storage */ - pcp->cid =cpu_cid_to_cid (pcp->cid); -mm_drop_cid (mm, pcp->cid); +if (cid_on_cpu (pcp->cid)) { + pcp->cid =cpu_cid_to_cid (pcp->cid); +mm_drop_cid (mm, pcp->cid); + } }static inline unsigned int __mm_get_cid (struct mm_struct *mm,unsigned int max_cids)
sound/hda/codecs/conexant.c +1 -0
@@ -1081,6 +1081,7 @@ static const struct hda_quirk cxt5066_fixups[] = {SND_PCI_QUIRK (0x103c ,0x8174 ,"HP Spectre x360" ,CXT_FIXUP_HP_SPECTRE ),SND_PCI_QUIRK (0x103c ,0x822e ,"HP ProBook 440 G4" ,CXT_FIXUP_MUTE_LED_GPIO ),SND_PCI_QUIRK (0x103c ,0x8231 ,"HP ProBook 450 G4" ,CXT_FIXUP_MUTE_LED_GPIO ), +SND_PCI_QUIRK (0x103c ,0x826b ,"HP ZBook Studio G4" ,CXT_FIXUP_MUTE_LED_GPIO ),SND_PCI_QUIRK (0x103c ,0x828c ,"HP EliteBook 840 G4" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x8299 ,"HP 800 G3 SFF" ,CXT_FIXUP_HP_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE),