Linux 6.1.71
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.71 kernel.
All users of the 6.1 kernel series must upgrade.
The updated 6.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.1.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm/boot/dts/am33xx.dtsi | 1 drivers/base/property.c | 11 drivers/iio/imu/adis16475.c | 117 ++-- drivers/spi/spi-atmel.c | 82 ++- drivers/spi/spi.c | 92 ++- drivers/usb/host/fotg210-hcd.c | 3 fs/namei.c | 125 +++- fs/nfsd/nfsctl.c | 9 fs/nfsd/nfsd.h | 8 fs/nfsd/nfssvc.c | 57 -- fs/smb/common/smb2pdu.h | 1 fs/smb/server/Kconfig | 10 fs/smb/server/asn1.c | 27 fs/smb/server/auth.c | 11 fs/smb/server/connection.c | 74 -- fs/smb/server/connection.h | 2 fs/smb/server/ksmbd_netlink.h | 4 fs/smb/server/ksmbd_work.c | 100 +++ fs/smb/server/ksmbd_work.h | 36 - fs/smb/server/mgmt/share_config.h | 29 - fs/smb/server/mgmt/tree_connect.c | 53 + fs/smb/server/mgmt/tree_connect.h | 14 fs/smb/server/mgmt/user_config.h | 1 fs/smb/server/mgmt/user_session.c | 38 - fs/smb/server/mgmt/user_session.h | 3 fs/smb/server/oplock.c | 147 ++++- fs/smb/server/oplock.h | 8 fs/smb/server/server.c | 36 - fs/smb/server/smb2misc.c | 19 fs/smb/server/smb2ops.c | 19 fs/smb/server/smb2pdu.c | 1033 ++++++++++++++++---------------------- fs/smb/server/smb2pdu.h | 3 fs/smb/server/smb_common.c | 19 fs/smb/server/smb_common.h | 14 fs/smb/server/smbacl.c | 20 fs/smb/server/smbacl.h | 2 fs/smb/server/transport_ipc.c | 4 fs/smb/server/transport_rdma.c | 44 + fs/smb/server/unicode.c | 193 ++++--- fs/smb/server/vfs.c | 608 +++++++++++----------- fs/smb/server/vfs.h | 52 - fs/smb/server/vfs_cache.c | 63 +- fs/smb/server/vfs_cache.h | 18 include/linux/blkdev.h | 2 include/linux/export-internal.h | 1 include/linux/module.h | 9 include/linux/namei.h | 7 include/linux/property.h | 7 include/linux/spi/spi.h | 23 kernel/module/kallsyms.c | 2 kernel/trace/ring_buffer.c | 140 +---- kernel/trace/trace.c | 20 kernel/trace/trace_kprobe.c | 25 mm/filemap.c | 9 mm/memory-failure.c | 8 mm/migrate.c | 9 net/netfilter/nf_tables_api.c | 2 58 files changed, 1981 insertions(+), 1495 deletions(-)
Al Viro (1):
fs: introduce lock_rename_child() helper
Amit Kumar Mahapatra (1):
spi: Add APIs in spi core to set/get spi->chip_select and spi->cs_gpiod
Andrii Nakryiko (1):
tracing/kprobes: Fix symbol counting logic by looking at modules as well
Andy Shevchenko (2):
spi: Introduce spi_get_device_match_data() helper device property: Allow const parameter to dev_fwnode()
Atte Heikkilä (1):
ksmbd: fix force create mode' and force directory mode'
Baokun Li (1):
mm/filemap: avoid buffered read/write race to read inconsistent data
Charan Teja Kalla (1):
mm: migrate high-order folios in swap cache correctly
Cheng-Han Wu (1):
ksmbd: Remove unused field in ksmbd_user struct
Christoph Hellwig (1):
block: renumber QUEUE_FLAG_HW_WC
Colin Ian King (1):
ksmbd: Fix spelling mistake "excceed" -> "exceeded"
Dan Carpenter (1):
usb: fotg210-hcd: delete an incorrect bounds test
David Disseldorp (3):
ksmbd: set NegotiateContextCount once instead of every inc
ksmbd: avoid duplicate negotiate ctx offset increments
ksmbd: remove unused compression negotiate ctx packing
Dawei Li (3):
ksmbd: Implements sess->rpc_handle_list as xarray
ksmbd: fix typo, syncronous->synchronous
ksmbd: Remove duplicated codesGeert Uytterhoeven (1):
spi: Constify spi parameters of chip select APIs
Greg Kroah-Hartman (1):
Linux 6.1.71
Gustavo A. R. Silva (3):
ksmbd: replace one-element arrays with flexible-array members
ksmbd: Use struct_size() helper in ksmbd_negotiate_smb_dialect()
ksmbd: Replace one-element array with flexible-array member
Helge Deller (1):
linux/export: Ensure natural alignment of kcrctab array
Jeff Layton (1):
ksmbd: use F_SETLK when unlocking a file
Jiapeng Chong (1):
ksmbd: Fix parameter name and comment mismatch
Jiri Olsa (1):
kallsyms: Make module_kallsyms_on_each_symbol generally available
Kangjing Huang (1):
ksmbd: fix missing RDMA-capable flag for IPoIB device in ksmbd_rdma_capable_netdev()
Louis Chauvet (1):
spi: atmel: Fix clock issue when using devices with different polarities
Lu Hongfei (2):
ksmbd: Change the return value of ksmbd_vfs_query_maximal_access to void
ksmbd: Replace the ternary conditional operator with min()
Marios Makassikis (2):
ksmbd: Fix resource leak in smb2_lock()
ksmbd: fix recursive locking in vfs helpers
Matthew Wilcox (Oracle) (2):
mm/memory-failure: cast index to loff_t before shifting it mm/memory-failure: check the mapcount of the precise page
Namjae Jeon (46):
ksmbd: set SMB2_SESSION_FLAG_ENCRYPT_DATA when enforcing data encryption for this share
ksmbd: delete asynchronous work from list
ksmbd: fix racy issue from using ->d_parent and ->d_name
ksmbd: fix uninitialized pointer read in ksmbd_vfs_rename()
ksmbd: fix uninitialized pointer read in smb2_create_link()
ksmbd: call putname after using the last component
ksmbd: fix posix_acls and acls dereferencing possible ERR_PTR()
ksmbd: add mnt_want_write to ksmbd vfs functions
ksmbd: remove unused ksmbd_tree_conn_share function
ksmbd: use kzalloc() instead of __GFP_ZERO
ksmbd: return a literal instead of 'err' in ksmbd_vfs_kern_path_locked()
ksmbd: use kvzalloc instead of kvmalloc
ksmbd: check if a mount point is crossed during path lookup
ksmbd: add support for read compound
ksmbd: fix wrong interim response on compound
ksmbd: add missing calling smb2_set_err_rsp() on error
ksmbd: remove unneeded mark_inode_dirty in set_info_sec()
ksmbd: fix passing freed memory 'aux_payload_buf'
ksmbd: return invalid parameter error response if smb2 request is invalid
ksmbd: check iov vector index in ksmbd_conn_write()
ksmbd: fix race condition with fp
ksmbd: fix race condition from parallel smb2 logoff requests
ksmbd: fix race condition from parallel smb2 lock requests
ksmbd: fix race condition between tree conn lookup and disconnect
ksmbd: fix wrong error response status by using set_smb2_rsp_status()
ksmbd: fix Null pointer dereferences in ksmbd_update_fstate()
ksmbd: fix potential double free on smb2_read_pipe() error path
ksmbd: reorganize ksmbd_iov_pin_rsp()
ksmbd: fix kernel-doc comment of ksmbd_vfs_setxattr()
ksmbd: add support for surrogate pair conversion
ksmbd: no need to wait for binded connection termination at logoff
ksmbd: fix kernel-doc comment of ksmbd_vfs_kern_path_locked()
ksmbd: fix possible deadlock in smb2_open
ksmbd: separately allocate ci per dentry
ksmbd: move oplock handling after unlock parent dir
ksmbd: release interim response after sending status pending response
ksmbd: move setting SMB2_FLAGS_ASYNC_COMMAND and AsyncId
ksmbd: don't update ->op_state as OPLOCK_STATE_NONE on error
ksmbd: set epoch in create context v2 lease
ksmbd: set v2 lease capability
ksmbd: downgrade RWH lease caching state to RH for directory
ksmbd: send v2 lease break notification for directory
ksmbd: lazy v2 lease break on smb2_write()
ksmbd: avoid duplicate opinfo_put() call on error of smb21_lease_break_ack()
ksmbd: fix wrong allocation size update in smb2_open()
ksmbd: fix slab-out-of-bounds in smb_strndup_from_utf16()
NeilBrown (3):
nfsd: separate nfsd_last_thread() from nfsd_put()
nfsd: call nfsd_last_thread() before final nfsd_put()
NFSD: fix possible oops when nfsd/pool_stats is closed.
Nuno Sa (1):
iio: imu: adis16475: add spi_device_id table
Pablo Neira Ayuso (1):
netfilter: nf_tables: skip set commit for deleted/destroyed sets
Shin'ichiro Kawasaki (2):
platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe Revert "platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe"
Steve French (2):
ksmbd: update Kconfig to note Kerberos support and fix indentation
ksmbd: remove experimental warning
Steven Rostedt (Google) (4):
ring-buffer: Fix wake ups when buffer_percent is set to 100
tracing: Fix blocked reader of snapshot buffer
ring-buffer: Remove useless update to write_stamp in rb_try_to_discard()
ring-buffer: Fix slowpath of interrupted event
Tom Rix (1):
ksmbd: remove unused is_char_allowed function
Tony Lindgren (1):
ARM: dts: Fix occasional boot hang for am3 usb
Tudor Ambarus (1):
spi: Reintroduce spi_set_cs_timing()
Wang Ming (1):
ksmbd: Fix unsigned expression compared with zero
Yang Li (1):
ksmbd: Fix one kernel-doc comment
Yang Yingliang (1):
ksmbd: switch to use kmemdup_nul() helper
Zongmin Zhou (1):
ksmbd: prevent memory leak on error return
ye xingchen (1):
ksmbd: Convert to use sysfs_emit()/sysfs_emit_at() APIs
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 70 +SUBLEVEL = 71 EXTRAVERSION = NAME = Curry Ramen
arch/arm/boot/dts/am33xx.dtsi +1 -0
@@ -349,6 +349,7 @@ usb: target-module@47400000 { <SYSC_IDLE_NO>, <SYSC_IDLE_SMART>, <SYSC_IDLE_SMART_WKUP>; + ti,sysc-delay-us = <2>; clocks = <&l3s_clkctrl AM3_L3S_USB_OTG_HS_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>;
drivers/base/property.c +9 -2
@@ -17,12 +17,19 @@#include <linux/property.h> #include <linux/phy.h> -struct fwnode_handle *dev_fwnode (const struct device *dev) +struct fwnode_handle *__dev_fwnode (struct device *dev) {return IS_ENABLED (CONFIG_OF ) && dev->of_node ?of_fwnode_handle (dev->of_node) : dev->fwnode; } -EXPORT_SYMBOL_GPL (dev_fwnode); +EXPORT_SYMBOL_GPL (__dev_fwnode); + +const struct fwnode_handle *__dev_fwnode_const (const struct device *dev) +{ +return IS_ENABLED (CONFIG_OF ) && dev->of_node ? +of_fwnode_handle (dev->of_node) : dev->fwnode; +} +EXPORT_SYMBOL_GPL (__dev_fwnode_const);/** * device_property_present - check if a property of a device is present
drivers/iio/imu/adis16475.c +72 -45
141 lines not on this page · raw message
drivers/spi/spi-atmel.c +81 -1
122 lines not on this page · raw message
drivers/spi/spi.c +70 -22
208 lines not on this page · raw message
drivers/usb/host/fotg210-hcd.c +0 -3
@@ -429,8 +429,6 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, temp = size; size -= temp; next += temp; -if (temp == size) - goto done; } temp =snprintf (next, size,"\n" );
@@ -440,7 +438,6 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, size -= temp; next += temp; -done: *sizep = size; *nextp = next; }
fs/namei.c +102 -23
226 lines not on this page · raw message
fs/nfsd/nfsctl.c +7 -2
@@ -716,8 +716,10 @@ static ssize_t __write_ports_addfd(char *buf, struct net *net, const struct cred err =svc_addsock (nn->nfsd_serv, net, fd, buf,SIMPLE_TRANSACTION_LIMIT , cred); -if (err >=0 && - !nn->nfsd_serv->sv_nrthreads && !xchg (&nn->keep_active,1 )) +if (err <0 && !nn->nfsd_serv->sv_nrthreads && !nn->keep_active) +nfsd_last_thread (net); +else if (err >=0 && + !nn->nfsd_serv->sv_nrthreads && !xchg (&nn->keep_active,1 ))svc_get (nn->nfsd_serv);nfsd_put (net);
@@ -767,6 +769,9 @@ static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct crsvc_xprt_put (xprt); } out_err: +if (!nn->nfsd_serv->sv_nrthreads && !nn->keep_active) +nfsd_last_thread (net); +nfsd_put (net);return err; }
fs/nfsd/nfsd.h +7 -1
@@ -97,7 +97,12 @@ int nfsd_pool_stats_open(struct inode *, struct file *);int nfsd_pool_stats_release (struct inode *,struct file *);void nfsd_shutdown_threads (struct net *net); -void nfsd_put (struct net *net); +static inline void nfsd_put (struct net *net) +{ +struct nfsd_net *nn =net_generic (net, nfsd_net_id); + +svc_put (nn->nfsd_serv); +}bool i_am_nfsd (void );
@@ -134,6 +139,7 @@ int nfsd_vers(struct nfsd_net *nn, int vers, enum vers_op change);int nfsd_minorversion (struct nfsd_net *nn,u32 minorversion,enum vers_op change);void nfsd_reset_versions (struct nfsd_net *nn);int nfsd_create_serv (struct net *net); +void nfsd_last_thread (struct net *net);extern int nfsd_max_blksize;
fs/nfsd/nfssvc.c +22 -35
128 lines not on this page · raw message
fs/smb/common/smb2pdu.h +1 -0
@@ -1196,6 +1196,7 @@ struct create_posix {#define SMB2_LEASE_WRITE_CACHING_LE cpu_to_le32(0x04)#define SMB2_LEASE_FLAG_BREAK_IN_PROGRESS_LE cpu_to_le32(0x02) +#define SMB2_LEASE_FLAG_PARENT_LEASE_KEY_SET_LE cpu_to_le32(0x04)#define SMB2_LEASE_KEY_SIZE 16
fs/smb/server/Kconfig +7 -3
@@ -1,5 +1,5 @@ config SMB_SERVER - tristate "SMB3 server support (EXPERIMENTAL)" + tristate "SMB3 server support" depends on INET depends on MULTIUSER depends on FILE_LOCKING
@@ -33,14 +33,16 @@ config SMB_SERVER in ksmbd-tools, available from https://github.com/cifsd-team/ksmbd-tools. More detail about how to run the ksmbd kernel server is - available via README file + available via the README file (https://github.com/cifsd-team/ksmbd-tools/blob/master/README). ksmbd kernel server includes support for auto-negotiation, Secure negotiate, Pre-authentication integrity, oplock/lease, compound requests, multi-credit, packet signing, RDMA(smbdirect), smb3 encryption, copy-offload, secure per-user session - establishment via NTLM or NTLMv2. + establishment via Kerberos or NTLMv2. + +if SMB_SERVER config SMB_SERVER_SMBDIRECT bool "Support for SMB Direct protocol"
@@ -54,6 +56,8 @@ config SMB_SERVER_SMBDIRECT SMB Direct allows transferring SMB packets over RDMA. If unsure, say N. +endif + config SMB_SERVER_CHECK_CAP_NET_ADMIN bool "Enable check network administration capability" depends on SMB_SERVER
fs/smb/server/asn1.c +12 -15
@@ -208,32 +208,29 @@ int ksmbd_neg_token_init_mech_type(void *context, size_t hdrlen,return 0 ; } -int ksmbd_neg_token_init_mech_token (void *context,size_t hdrlen, -unsigned char tag,const void *value, -size_t vlen) +static int ksmbd_neg_token_alloc (void *context,size_t hdrlen, +unsigned char tag,const void *value, +size_t vlen) {struct ksmbd_conn *conn = context; - conn->mechToken =kmalloc (vlen +1 ,GFP_KERNEL ); + conn->mechToken =kmemdup_nul (value, vlen,GFP_KERNEL );if (!conn->mechToken)return -ENOMEM ; -memcpy (conn->mechToken, value, vlen); - conn->mechToken[vlen] ='\0' ;return 0 ; } -int ksmbd_neg_token_targ_resp_token (void *context,size_t hdrlen, +int ksmbd_neg_token_init_mech_token (void *context,size_t hdrlen,unsigned char tag,const void *value,size_t vlen) { -struct ksmbd_conn *conn = context; - - conn->mechToken =kmalloc (vlen +1 ,GFP_KERNEL ); -if (!conn->mechToken) -return -ENOMEM ; +return ksmbd_neg_token_alloc (context, hdrlen, tag, value, vlen); +} -memcpy (conn->mechToken, value, vlen); - conn->mechToken[vlen] ='\0' ; -return 0 ; +int ksmbd_neg_token_targ_resp_token (void *context,size_t hdrlen, +unsigned char tag,const void *value, +size_t vlen) +{ +return ksmbd_neg_token_alloc (context, hdrlen, tag, value, vlen); }
fs/smb/server/auth.c +9 -2
@@ -1032,11 +1032,15 @@ static struct scatterlist *ksmbd_init_sg(struct kvec *iov, unsigned int nvec, {struct scatterlist *sg;unsigned int assoc_data_len =sizeof (struct smb2_transform_hdr ) -20 ; -int i, nr_entries[3 ] = {0 }, total_entries =0 , sg_idx =0 ; +int i, *nr_entries, total_entries =0 , sg_idx =0 ;if (!nvec)return NULL ; + nr_entries =kcalloc (nvec,sizeof (int ),GFP_KERNEL ); +if (!nr_entries) +return NULL ; +for (i =0 ; i < nvec -1 ; i++) {unsigned long kaddr = (unsigned long )iov[i +1 ].iov_base;
@@ -1054,8 +1058,10 @@ static struct scatterlist *ksmbd_init_sg(struct kvec *iov, unsigned int nvec, total_entries +=2 ; sg =kmalloc_array (total_entries,sizeof (struct scatterlist ),GFP_KERNEL ); -if (!sg) +if (!sg) { +kfree (nr_entries);return NULL ; + }sg_init_table (sg, total_entries);smb2_sg_set_buf (&sg[sg_idx++], iov[0 ].iov_base +24 , assoc_data_len);
@@ -1089,6 +1095,7 @@ static struct scatterlist *ksmbd_init_sg(struct kvec *iov, unsigned int nvec, } }smb2_sg_set_buf (&sg[sg_idx], sign,SMB2_SIGNATURE_SIZE ); +kfree (nr_entries);return sg; }
fs/smb/server/connection.c +17 -57
125 lines not on this page · raw message
fs/smb/server/connection.h +1 -1
@@ -159,7 +159,7 @@ int ksmbd_conn_rdma_write(struct ksmbd_conn *conn,struct smb2_buffer_desc_v1 *desc, unsigned int desc_len);void ksmbd_conn_enqueue_request (struct ksmbd_work *work); -int ksmbd_conn_try_dequeue_request (struct ksmbd_work *work); +void ksmbd_conn_try_dequeue_request (struct ksmbd_work *work);void ksmbd_conn_init_server_callbacks (struct ksmbd_conn_ops *ops);int ksmbd_conn_handler_loop (void *p);int ksmbd_conn_transport_init (void );
fs/smb/server/ksmbd_netlink.h +3 -1
@@ -74,6 +74,7 @@ struct ksmbd_heartbeat {#define KSMBD_GLOBAL_FLAG_SMB2_LEASES BIT(0)#define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION BIT(1)#define KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL BIT(2) +#define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF BIT(3)/* * IPC request for ksmbd server startup
@@ -351,7 +352,8 @@ enum KSMBD_TREE_CONN_STATUS {#define KSMBD_SHARE_FLAG_STREAMS BIT(11)#define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS BIT(12)#define KSMBD_SHARE_FLAG_ACL_XATTR BIT(13) -#define KSMBD_SHARE_FLAG_UPDATE BIT(14) +#define KSMBD_SHARE_FLAG_UPDATE BIT(14) +#define KSMBD_SHARE_FLAG_CROSSMNT BIT(15)/* * Tree connect request flags.
fs/smb/server/ksmbd_work.c +99 -1
120 lines not on this page · raw message
fs/smb/server/ksmbd_work.h +27 -9
@@ -19,6 +19,11 @@ enum { KSMBD_WORK_CLOSED, }; +struct aux_read { +void *buf; +struct list_head entry; +}; +/* one of these for every pending CIFS request at the connection */ struct ksmbd_work {/* Server corresponding to this mid */
@@ -31,13 +36,19 @@ struct ksmbd_work {/* Response buffer */ void *response_buf; -/* Read data buffer */ -void *aux_payload_buf; +struct list_head aux_read_list; + +struct kvec *iov; +int iov_alloc_cnt; +int iov_cnt; +int iov_idx;/* Next cmd hdr in compound req buf*/ int next_smb2_rcv_hdr_off;/* Next cmd hdr in compound rsp buf*/ int next_smb2_rsp_hdr_off; +/* Current cmd hdr in compound rsp buf*/ +int curr_smb2_rsp_hdr_off;/* * Current Local FID assigned compound response if SMB2 CREATE
@@ -53,22 +64,17 @@ struct ksmbd_work {unsigned int credits_granted;/* response smb header size */ -unsigned int resp_hdr_sz;unsigned int response_sz; -/* Read data count */ -unsigned int aux_payload_sz;void *tr_buf;unsigned char state; -/* Multiple responses for one request e.g. SMB ECHO */ - bool multiRsp:1;/* No response for cancelled request */ bool send_no_response:1;/* Request is encrypted */ bool encrypted:1;/* Is this SYNC or ASYNC ksmbd_work */ - bool syncronous:1; + bool asynchronous:1; bool need_invalidate_rkey:1;unsigned int remote_key;
@@ -95,6 +101,15 @@ static inline void *ksmbd_resp_buf_next(struct ksmbd_work *work)return work->response_buf + work->next_smb2_rsp_hdr_off +4 ; } +/** +* ksmbd_resp_buf_curr - Get current buffer on compound response. +* @work: smb work containing response buffer +*/ +static inline void *ksmbd_resp_buf_curr (struct ksmbd_work *work) +{ +return work->response_buf + work->curr_smb2_rsp_hdr_off +4 ; +} +/** * ksmbd_req_buf_next - Get next buffer on compound request. * @work: smb work containing response buffer
@@ -113,5 +128,8 @@ int ksmbd_work_pool_init(void);int ksmbd_workqueue_init (void );void ksmbd_workqueue_destroy (void );bool ksmbd_queue_work (struct ksmbd_work *work); - +int ksmbd_iov_pin_rsp_read (struct ksmbd_work *work,void *ib,int len, +void *aux_buf,unsigned int aux_size); +int ksmbd_iov_pin_rsp (struct ksmbd_work *work,void *ib,int len); +int allocate_interim_rsp_buf (struct ksmbd_work *work);#endif /* __KSMBD_WORK_H__ */
fs/smb/server/mgmt/share_config.h +11 -18
@@ -34,29 +34,22 @@ struct ksmbd_share_config {#define KSMBD_SHARE_INVALID_UID ((__u16)-1)#define KSMBD_SHARE_INVALID_GID ((__u16)-1) -static inline int share_config_create_mode (struct ksmbd_share_config *share, -umode_t posix_mode) +static inline umode_t +share_config_create_mode (struct ksmbd_share_config *share, +umode_t posix_mode) { -if (!share->force_create_mode) { -if (!posix_mode) -return share->create_mask; -else -return posix_mode & share->create_mask; - } -return share->force_create_mode & share->create_mask; +umode_t mode = (posix_mode ?: (umode_t)-1 ) & share->create_mask; + +return mode | share->force_create_mode; } -static inline int share_config_directory_mode (struct ksmbd_share_config *share, -umode_t posix_mode) +static inline umode_t +share_config_directory_mode (struct ksmbd_share_config *share, +umode_t posix_mode) { -if (!share->force_directory_mode) { -if (!posix_mode) -return share->directory_mask; -else -return posix_mode & share->directory_mask; - } +umode_t mode = (posix_mode ?: (umode_t)-1 ) & share->directory_mask; -return share->force_directory_mode & share->directory_mask; +return mode | share->force_directory_mode; } static inline int test_share_config_flag(struct ksmbd_share_config *share,
fs/smb/server/mgmt/tree_connect.c +39 -14
94 lines not on this page · raw message
fs/smb/server/mgmt/tree_connect.h +9 -5
@@ -14,7 +14,11 @@ struct ksmbd_share_config;struct ksmbd_user ;struct ksmbd_conn ; -#define TREE_CONN_EXPIRE 1 +enum { +TREE_NEW =0 , +TREE_CONNECTED , +TREE_DISCONNECTED +};struct ksmbd_tree_connect {int id;
@@ -27,7 +31,9 @@ struct ksmbd_tree_connect {int maximal_access;bool posix_extensions; -unsigned long status; +atomic_t refcount; +wait_queue_head_t refcount_q; +unsigned int t_state; };struct ksmbd_tree_conn_status {
@@ -46,6 +52,7 @@ struct ksmbd_session;struct ksmbd_tree_conn_status ksmbd_tree_conn_connect (struct ksmbd_conn *conn,struct ksmbd_session *sess,const char *share_name); +void ksmbd_tree_connect_put (struct ksmbd_tree_connect *tcon);int ksmbd_tree_conn_disconnect (struct ksmbd_session *sess,struct ksmbd_tree_connect *tree_conn);
@@ -53,9 +60,6 @@ int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,struct ksmbd_tree_connect *ksmbd_tree_conn_lookup (struct ksmbd_session *sess,unsigned int id); -struct ksmbd_share_config *ksmbd_tree_conn_share (struct ksmbd_session *sess, -unsigned int id); -int ksmbd_tree_conn_session_logoff (struct ksmbd_session *sess);#endif /* __TREE_CONNECT_MANAGEMENT_H__ */
fs/smb/server/mgmt/user_config.h +0 -1
@@ -18,7 +18,6 @@ struct ksmbd_user {size_t passkey_sz;char *passkey; -unsigned int failed_login_count; };static inline bool user_guest (struct ksmbd_user *user)
fs/smb/server/mgmt/user_session.c +15 -23
@@ -25,7 +25,6 @@ static DECLARE_RWSEM(sessions_table_lock);struct ksmbd_session_rpc {int id;unsigned int method; -struct list_head list; };static void free_channel_list (struct ksmbd_session *sess)
@@ -58,15 +57,14 @@ static void __session_rpc_close(struct ksmbd_session *sess,static void ksmbd_session_rpc_clear_list (struct ksmbd_session *sess) {struct ksmbd_session_rpc *entry; +long index; -while (!list_empty (&sess->rpc_handle_list)) { - entry =list_entry (sess->rpc_handle_list.next, - struct ksmbd_session_rpc, - list); - -list_del (&entry->list); +xa_for_each (&sess->rpc_handle_list, index, entry) { +xa_erase (&sess->rpc_handle_list, index);__session_rpc_close (sess, entry); } + +xa_destroy (&sess->rpc_handle_list); }static int __rpc_method (char *rpc_name)
@@ -102,13 +100,13 @@ int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name) entry =kzalloc (sizeof (struct ksmbd_session_rpc ),GFP_KERNEL );if (!entry) -return -EINVAL ; +return -ENOMEM ; -list_add (&entry->list, &sess->rpc_handle_list); entry->method = method; entry->id =ksmbd_ipc_id_alloc ();if (entry->id <0 ) goto free_entry; +xa_store (&sess->rpc_handle_list, entry->id, entry,GFP_KERNEL ); resp =ksmbd_rpc_open (sess, entry->id);if (!resp)
@@ -117,9 +115,9 @@ int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name)kvfree (resp);return entry->id; free_id: +xa_erase (&sess->rpc_handle_list, entry->id);ksmbd_rpc_id_free (entry->id); free_entry: -list_del (&entry->list);kfree (entry);return -EINVAL ; }
@@ -128,24 +126,17 @@ void ksmbd_session_rpc_close(struct ksmbd_session *sess, int id) {struct ksmbd_session_rpc *entry; -list_for_each_entry (entry, &sess->rpc_handle_list, list) { -if (entry->id == id) { -list_del (&entry->list); -__session_rpc_close (sess, entry); -break ; - } - } + entry =xa_erase (&sess->rpc_handle_list, id); +if (entry) +__session_rpc_close (sess, entry); }int ksmbd_session_rpc_method (struct ksmbd_session *sess,int id) {struct ksmbd_session_rpc *entry; -list_for_each_entry (entry, &sess->rpc_handle_list, list) { -if (entry->id == id) -return entry->method; - } -return 0 ; + entry =xa_load (&sess->rpc_handle_list, id); +return entry ? entry->method :0 ; }void ksmbd_session_destroy (struct ksmbd_session *sess)
@@ -362,8 +353,9 @@ static struct ksmbd_session *__session_create(int protocol)set_session_flag (sess, protocol);xa_init (&sess->tree_conns);xa_init (&sess->ksmbd_chann_list); -INIT_LIST_HEAD (&sess->rpc_handle_list); +xa_init (&sess->rpc_handle_list); sess->sequence_number =1 ; +rwlock_init (&sess->tree_conns_lock); ret =__init_smb2_session (sess);if (ret)
fs/smb/server/mgmt/user_session.h +2 -1
@@ -52,7 +52,7 @@ struct ksmbd_session {struct xarray ksmbd_chann_list;struct xarray tree_conns;struct ida tree_conn_ida; -struct list_head rpc_handle_list; +struct xarray rpc_handle_list;__u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE ];__u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE ];
@@ -60,6 +60,7 @@ struct ksmbd_session {struct ksmbd_file_table file_table;unsigned long last_active; +rwlock_t tree_conns_lock; };static inline int test_session_flag (struct ksmbd_session *sess,int bit)
fs/smb/server/oplock.c +114 -33
278 lines not on this page · raw message
fs/smb/server/oplock.h +7 -1
@@ -34,7 +34,9 @@ struct lease_ctx_info {__le32 flags;__le64 duration;__u8 parent_lease_key[SMB2_LEASE_KEY_SIZE ]; +__le16 epoch;int version; +bool is_dir; };struct lease_table {
@@ -53,6 +55,7 @@ struct lease {__u8 parent_lease_key[SMB2_LEASE_KEY_SIZE ];int version;unsigned short epoch; +bool is_dir;struct lease_table *l_lb; };
@@ -108,7 +111,7 @@ void opinfo_put(struct oplock_info *opinfo);/* Lease related functions */ void create_lease_buf (u8 *rbuf,struct lease *lease); -struct lease_ctx_info *parse_lease_state (void *open_req); +struct lease_ctx_info *parse_lease_state (void *open_req,bool is_dir);__u8 smb2_map_lease_to_oplock (__le32 lease_state);int lease_read_to_write (struct oplock_info *opinfo);
@@ -124,4 +127,7 @@ struct oplock_info *lookup_lease_in_table(struct ksmbd_conn *conn,int find_same_lease_key (struct ksmbd_session *sess,struct ksmbd_inode *ci,struct lease_ctx_info *lctx);void destroy_lease_table (struct ksmbd_conn *conn); +void smb_send_parent_lease_break_noti (struct ksmbd_file *fp, +struct lease_ctx_info *lctx); +void smb_lazy_parent_lease_break_close (struct ksmbd_file *fp);#endif /* __KSMBD_OPLOCK_H */
fs/smb/server/server.c +15 -21
@@ -115,8 +115,10 @@ static int __process_request(struct ksmbd_work *work, struct ksmbd_conn *conn,if (check_conn_state (work))return SERVER_HANDLER_CONTINUE ; -if (ksmbd_verify_smb_message (work)) +if (ksmbd_verify_smb_message (work)) { + conn->ops->set_rsp_status (work,STATUS_INVALID_PARAMETER );return SERVER_HANDLER_ABORT ; + } command = conn->ops->get_cmd_val (work); *cmd = command;
@@ -163,6 +165,7 @@ static void __handle_ksmbd_work(struct ksmbd_work *work, {u16 command =0 ;int rc; +bool is_chained = false;if (conn->ops->allocate_rsp_buf (work))return ;
@@ -229,16 +232,17 @@ static void __handle_ksmbd_work(struct ksmbd_work *work, } } + is_chained =is_chained_smb2_message (work); +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 ; + }while (is_chained == true); send: +if (work->tcon) +ksmbd_tree_connect_put (work->tcon);smb3_preauth_hash_rsp (work);if (work->sess && work->sess->enc && work->encrypted && conn->ops->encrypt_resp) {
@@ -442,11 +446,9 @@ static ssize_t stats_show(struct class *class, struct class_attribute *attr,"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; +return sysfs_emit (buf,"%d %s %d %lu\n" , stats_version, + state[server_conf.state], server_conf.tcp_port, + server_conf.ipc_last_active /HZ ); } static ssize_t kill_server_store(struct class *class,
@@ -478,19 +480,13 @@ static ssize_t debug_show(struct class *class, struct class_attribute *attr,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]); + pos =sysfs_emit_at (buf, sz,"[%s] " , debug_type_strings[i]); }else { - pos =scnprintf (buf + sz, -PAGE_SIZE - sz, -"%s " , - debug_type_strings[i]); + pos =sysfs_emit_at (buf, sz,"%s " , debug_type_strings[i]); } sz += pos; } - sz +=scnprintf (buf + sz,PAGE_SIZE - sz,"\n" ); + sz +=sysfs_emit_at (buf, sz,"\n" );return sz; }
@@ -599,8 +595,6 @@ static int __init ksmbd_server_init(void)if (ret) goto err_crypto_destroy; -pr_warn_once ("The ksmbd server is experimental\n" ); -return 0 ; err_crypto_destroy:
fs/smb/server/smb2misc.c +13 -6
@@ -106,16 +106,25 @@ static int smb2_get_data_area_len(unsigned int *off, unsigned int *len,break ;case SMB2_CREATE : { +unsigned short int name_off = +le16_to_cpu (((struct smb2_create_req *)hdr)->NameOffset); +unsigned short int name_len = +le16_to_cpu (((struct smb2_create_req *)hdr)->NameLength); +if (((struct smb2_create_req *)hdr)->CreateContextsLength) { *off =le32_to_cpu (((struct smb2_create_req *) hdr)->CreateContextsOffset); *len =le32_to_cpu (((struct smb2_create_req *) hdr)->CreateContextsLength); -break ; +if (!name_len) +break ; + +if (name_off + name_len < (u64)*off + *len) +break ; } - *off =le16_to_cpu (((struct smb2_create_req *)hdr)->NameOffset); - *len =le16_to_cpu (((struct smb2_create_req *)hdr)->NameLength); + *off = name_off; + *len = name_len;break ; }case SMB2_QUERY_INFO :
@@ -440,10 +449,8 @@ int ksmbd_smb2_check_message(struct ksmbd_work *work) validate_credit:if ((work->conn->vals->capabilities &SMB2_GLOBAL_CAP_LARGE_MTU ) && -smb2_validate_credit_charge (work->conn, hdr)) { - work->conn->ops->set_rsp_status (work,STATUS_INVALID_PARAMETER ); +smb2_validate_credit_charge (work->conn, hdr))return 1 ; - }return 0 ; }
fs/smb/server/smb2ops.c +14 -5
@@ -221,7 +221,8 @@ 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->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 )
@@ -245,10 +246,12 @@ 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->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 ) +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 ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL )
@@ -269,7 +272,13 @@ 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->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 ;if (server_conf.flags &KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL ) conn->vals->capabilities |=SMB2_GLOBAL_CAP_MULTI_CHANNEL ;
fs/smb/server/smb2pdu.c +457 -576
864 lines not on this page · raw message
fs/smb/server/transport_rdma.c +31 -13
44 lines not on this page · raw message
fs/smb/server/unicode.c +132 -61
193 lines not on this page · raw message
fs/smb/server/vfs.c +312 -296
608 lines not on this page · raw message
fs/smb/server/vfs.h +26 -26
52 lines not on this page · raw message
fs/smb/server/vfs_cache.c +42 -21
63 lines not on this page · raw message
kernel/trace/ring_buffer.c +44 -96
140 lines not on this page · 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.