From 2bb10d87a3fe6aacaf019b61e0730c771fc23718 Mon Sep 17 00:00:00 2001
From: Robert Nelson <robertcnelson@gmail.com>
Date: Thu, 29 Jun 2023 16:37:59 -0500
Subject: [PATCH] Merge TI Branch;
 https://github.com/RobertCNelson/ti-linux-kernel/compare/1ada48a6cf0b8b731b835b9f1e1e4af89f8fb791...2b6f5746de558d954e42749b898fcdb4227dce5a
 TI SDK: 09.00.00.004 BBDTBS:
 https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/77c6a96c094519bb9d9cab0508db7eab6df42776
 AUFS:
 https://github.com/sfjro/aufs-standalone/commit/80bbd686e8be627d87bfa0ede768c2a52843647f
 WIRELESS_REGDB:
 https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/commit/?id=9dc0800cdd7aeeae273b983973a1749f73008291
 KSMBD:
 https://github.com/cifsd-team/ksmbd/commit/11aa06fbc7307b3ff68ebbdb96d42484d9b5ae6a
 WPANUSB:
 https://git.beagleboard.org/beagleconnect/linux/wpanusb/-/commit/6aa9bf65b9d88a2c9a111e7b4aed03de2be9413d
 BCFSERIAL:
 https://git.beagleboard.org/beagleconnect/linux/bcfserial/-/commit/db467023bd136c97c2e13c3a8b9e41dbdfafbc66

Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
---
 patch.sh                                      |   10 +-
 .../0001-backports-uio-from-linux.git.patch   |    6 +-
 patches/defconfig                             |    4 +-
 .../aufs/0001-merge-aufs-kbuild.patch         |    8 +-
 .../external/aufs/0002-merge-aufs-base.patch  |   10 +-
 .../external/aufs/0003-merge-aufs-mmap.patch  |    4 +-
 .../aufs/0004-merge-aufs-standalone.patch     |    6 +-
 patches/external/aufs/0005-merge-aufs.patch   |    4 +-
 ...https-git.beagleboard.org-beagleconn.patch |    4 +-
 patches/external/git/BBDTBS                   |    2 +-
 ...bd-https-github.com-cifsd-team-ksmbd.patch | 1956 ++++-------------
 ...01-merge-CONFIG_PREEMPT_RT-Patch-Set.patch |  202 +-
 ...eless-regdb-regulatory-database-file.patch |    4 +-
 ...tps-git.beagleboard.org-beagleconnec.patch |    4 +-
 patches/ref_defconfig                         |   69 +-
 ...-BeagleBoard.org-Device-Tree-Changes.patch |   31 +-
 version.sh                                    |   12 +-
 17 files changed, 621 insertions(+), 1715 deletions(-)

diff --git a/patch.sh b/patch.sh
index b2a6713fb..957ab79eb 100644
--- a/patch.sh
+++ b/patch.sh
@@ -502,7 +502,7 @@ patch_backports () {
 }
 
 backports () {
-	backport_tag="v5.10.185"
+	backport_tag="v5.10.186"
 
 	subsystem="uio"
 	#regenerate="enable"
@@ -518,7 +518,7 @@ backports () {
 		dir 'drivers/ti/uio'
 	fi
 
-	backport_tag="v6.1.35"
+	backport_tag="v6.1.36"
 
 	subsystem="iio"
 	#regenerate="enable"
@@ -532,13 +532,13 @@ backports () {
 
 		post_backports
 		exit 2
-	else
+	#else
 		patch_backports
 		${git} "${DIR}/patches/backports/${subsystem}/0003-dt-bindings-iio-adc-ti-adc128s052-Add-adc08c-and-adc.patch"
 		${git} "${DIR}/patches/backports/${subsystem}/0004-iio-adc-ti-adc128s052-Add-lower-resolution-devices-s.patch"
 	fi
 
-	backport_tag="v6.1.35"
+	backport_tag="v6.1.36"
 
 	subsystem="it66121"
 	#regenerate="enable"
@@ -606,7 +606,7 @@ backports
 packaging () {
 	#do_backport="enable"
 	if [ "x${do_backport}" = "xenable" ] ; then
-		backport_tag="v6.1.35"
+		backport_tag="v6.1.36"
 
 		subsystem="bindeb-pkg"
 		#regenerate="enable"
diff --git a/patches/backports/uio/0001-backports-uio-from-linux.git.patch b/patches/backports/uio/0001-backports-uio-from-linux.git.patch
index e3f812fbb..6f1932aef 100644
--- a/patches/backports/uio/0001-backports-uio-from-linux.git.patch
+++ b/patches/backports/uio/0001-backports-uio-from-linux.git.patch
@@ -1,9 +1,9 @@
-From c89cc73f58cf20358d1cb84340d1867f5d7ca671 Mon Sep 17 00:00:00 2001
+From 43c20fd841b28ec05c989d93c87cec3e61ea9129 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:49:20 -0500
+Date: Thu, 29 Jun 2023 16:18:16 -0500
 Subject: [PATCH] backports: uio: from: linux.git
 
-Reference: v5.10.185
+Reference: v5.10.186
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
  drivers/uio/uio_pruss.c | 44 +++++++++++++++++++++++++++++++----------
diff --git a/patches/defconfig b/patches/defconfig
index b8e6f3284..bc884958c 100644
--- a/patches/defconfig
+++ b/patches/defconfig
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/arm64 6.1.26 Kernel Configuration
+# Linux/arm64 6.1.33 Kernel Configuration
 #
 CONFIG_CC_VERSION_TEXT="aarch64-linux-gcc (GCC) 12.3.0"
 CONFIG_CC_IS_GCC=y
@@ -7295,6 +7295,7 @@ CONFIG_RPMSG_CTRL=m
 CONFIG_RPMSG_NS=m
 # CONFIG_RPMSG_QCOM_GLINK_RPM is not set
 CONFIG_RPMSG_VIRTIO=m
+CONFIG_RPMSG_PRU=m
 # end of Rpmsg drivers
 
 #
@@ -8852,6 +8853,7 @@ CONFIG_CRYPTO_DEV_CCREE=m
 # CONFIG_CRYPTO_DEV_HISI_SEC is not set
 # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
 CONFIG_CRYPTO_DEV_SA2UL=m
+CONFIG_CRYPTO_DEV_TI_MCRC64=m
 CONFIG_ASYMMETRIC_KEY_TYPE=y
 CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
 CONFIG_X509_CERTIFICATE_PARSER=y
diff --git a/patches/external/aufs/0001-merge-aufs-kbuild.patch b/patches/external/aufs/0001-merge-aufs-kbuild.patch
index af92034c9..ef6d88472 100644
--- a/patches/external/aufs/0001-merge-aufs-kbuild.patch
+++ b/patches/external/aufs/0001-merge-aufs-kbuild.patch
@@ -1,6 +1,6 @@
-From e764310f172e5f10974c90aa281db64feb90336b Mon Sep 17 00:00:00 2001
+From 93627c3362446dbd723d9bf3cd38c3a007d17868 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:44:51 -0500
+Date: Thu, 29 Jun 2023 16:04:31 -0500
 Subject: [PATCH 1/5] merge: aufs-kbuild
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
@@ -22,10 +22,10 @@ index 2685a4d0d353..a2df3d4bb3aa 100644
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index 4dea17840761..9795cbfdd0bf 100644
+index 80ab0154419e..09b5897b518a 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -137,3 +137,4 @@ obj-$(CONFIG_EFIVAR_FS)		+= efivarfs/
+@@ -136,3 +136,4 @@ obj-$(CONFIG_EFIVAR_FS)		+= efivarfs/
  obj-$(CONFIG_EROFS_FS)		+= erofs/
  obj-$(CONFIG_VBOXSF_FS)		+= vboxsf/
  obj-$(CONFIG_ZONEFS_FS)		+= zonefs/
diff --git a/patches/external/aufs/0002-merge-aufs-base.patch b/patches/external/aufs/0002-merge-aufs-base.patch
index d929f634a..b88f749e2 100644
--- a/patches/external/aufs/0002-merge-aufs-base.patch
+++ b/patches/external/aufs/0002-merge-aufs-base.patch
@@ -1,6 +1,6 @@
-From 260bc6cef3cbd41aaed42e95ef5498c5d149e3d4 Mon Sep 17 00:00:00 2001
+From 16ddb6ca9ca02398188a644e2a267ef05e0a30bd Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:44:52 -0500
+Date: Thu, 29 Jun 2023 16:04:31 -0500
 Subject: [PATCH 2/5] merge: aufs-base
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
@@ -19,10 +19,10 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  11 files changed, 61 insertions(+), 8 deletions(-)
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 170e7640f010..61fb17c67b30 100644
+index bdd3dc4a300e..f5e72a76d7d1 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -3455,6 +3455,19 @@ F:	include/uapi/linux/audit.h
+@@ -3454,6 +3454,19 @@ F:	include/uapi/linux/audit.h
  F:	kernel/audit*
  F:	lib/*audit.c
  
@@ -152,7 +152,7 @@ index 5969b7a1d353..21db9b057d60 100644
  	unsigned int p_space;
  	int ret;
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index f14ecbeab2a9..a6b5e21801f6 100644
+index a2b5592c6828..c6340d530620 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
 @@ -1370,6 +1370,7 @@ extern void fasync_free(struct fasync_struct *);
diff --git a/patches/external/aufs/0003-merge-aufs-mmap.patch b/patches/external/aufs/0003-merge-aufs-mmap.patch
index fc9e18715..fdc67940e 100644
--- a/patches/external/aufs/0003-merge-aufs-mmap.patch
+++ b/patches/external/aufs/0003-merge-aufs-mmap.patch
@@ -1,6 +1,6 @@
-From 004208827e7032f8f10d7d855c23fb25dd1205b0 Mon Sep 17 00:00:00 2001
+From 228ae051c92401d68810efbc9449ca387ec376fe Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:44:52 -0500
+Date: Thu, 29 Jun 2023 16:04:32 -0500
 Subject: [PATCH 3/5] merge: aufs-mmap
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
diff --git a/patches/external/aufs/0004-merge-aufs-standalone.patch b/patches/external/aufs/0004-merge-aufs-standalone.patch
index 039f989f8..cea2aa574 100644
--- a/patches/external/aufs/0004-merge-aufs-standalone.patch
+++ b/patches/external/aufs/0004-merge-aufs-standalone.patch
@@ -1,6 +1,6 @@
-From 339290cb6914afba38da9e7aee61a5f284724b0d Mon Sep 17 00:00:00 2001
+From 124300f53e8b317b5c290c657178799bd33c662e Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:44:52 -0500
+Date: Thu, 29 Jun 2023 16:04:33 -0500
 Subject: [PATCH 4/5] merge: aufs-standalone
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
@@ -117,7 +117,7 @@ index 1de6631a3925..3008eb37a18d 100644
  /*
   * Drop a reference to a group.  Free it if it's through.
 diff --git a/fs/open.c b/fs/open.c
-index 20717ec510c0..2fc6dc614f72 100644
+index 9541430ec5b3..e9eaeee049df 100644
 --- a/fs/open.c
 +++ b/fs/open.c
 @@ -66,6 +66,7 @@ int do_truncate(struct user_namespace *mnt_userns, struct dentry *dentry,
diff --git a/patches/external/aufs/0005-merge-aufs.patch b/patches/external/aufs/0005-merge-aufs.patch
index 22c66b319..d69f0a607 100644
--- a/patches/external/aufs/0005-merge-aufs.patch
+++ b/patches/external/aufs/0005-merge-aufs.patch
@@ -1,6 +1,6 @@
-From 7156dd0edf844003a7bb09dfebddb0d48b5b62fc Mon Sep 17 00:00:00 2001
+From 48c306c9f1cec2933ccd5f7e12637ea846bcab94 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:44:53 -0500
+Date: Thu, 29 Jun 2023 16:04:34 -0500
 Subject: [PATCH 5/5] merge: aufs
 
 https://github.com/sfjro/aufs-standalone/commit/80bbd686e8be627d87bfa0ede768c2a52843647f
diff --git a/patches/external/bcfserial/0001-merge-bcfserial-https-git.beagleboard.org-beagleconn.patch b/patches/external/bcfserial/0001-merge-bcfserial-https-git.beagleboard.org-beagleconn.patch
index 805e28b3a..25cb3ac41 100644
--- a/patches/external/bcfserial/0001-merge-bcfserial-https-git.beagleboard.org-beagleconn.patch
+++ b/patches/external/bcfserial/0001-merge-bcfserial-https-git.beagleboard.org-beagleconn.patch
@@ -1,6 +1,6 @@
-From c00f22b82d082a8a4b66752497a722ecaa36b691 Mon Sep 17 00:00:00 2001
+From cf1fea8c2cabba7f6d67a15bba69c9091eb1add8 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:45:55 -0500
+Date: Thu, 29 Jun 2023 16:10:55 -0500
 Subject: [PATCH] merge: bcfserial:
  https://git.beagleboard.org/beagleconnect/linux/bcfserial.git
 
diff --git a/patches/external/git/BBDTBS b/patches/external/git/BBDTBS
index 0f29e745a..cd6ff8028 100644
--- a/patches/external/git/BBDTBS
+++ b/patches/external/git/BBDTBS
@@ -1 +1 @@
-BBDTBS: https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/4d2b84c736306da75ca9b22ff95018a197a234da
+BBDTBS: https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/77c6a96c094519bb9d9cab0508db7eab6df42776
diff --git a/patches/external/ksmbd/0001-merge-ksmbd-https-github.com-cifsd-team-ksmbd.patch b/patches/external/ksmbd/0001-merge-ksmbd-https-github.com-cifsd-team-ksmbd.patch
index 08562f960..6cffbc916 100644
--- a/patches/external/ksmbd/0001-merge-ksmbd-https-github.com-cifsd-team-ksmbd.patch
+++ b/patches/external/ksmbd/0001-merge-ksmbd-https-github.com-cifsd-team-ksmbd.patch
@@ -1,6 +1,6 @@
-From 862bf3b68618dcfb67f9bd6941fd5e0734334237 Mon Sep 17 00:00:00 2001
+From 981dd413909131970282211bb05e1a10c91d2880 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:46:20 -0500
+Date: Thu, 29 Jun 2023 16:12:05 -0500
 Subject: [PATCH] merge: ksmbd: https://github.com/cifsd-team/ksmbd
 
 https://github.com/cifsd-team/ksmbd/commit/11aa06fbc7307b3ff68ebbdb96d42484d9b5ae6a
@@ -10,11 +10,10 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/ksmbd/Makefile            |   63 +-
  fs/ksmbd/README.md           |  170 +
  fs/ksmbd/asn1.c              |  165 +-
- fs/ksmbd/auth.c              |  360 +-
+ fs/ksmbd/auth.c              |  341 +-
  fs/ksmbd/auth.h              |   16 +-
  fs/ksmbd/build_ksmbd.sh      |  177 +
- fs/ksmbd/connection.c        |  101 +-
- fs/ksmbd/connection.h        |   58 +-
+ fs/ksmbd/connection.c        |   30 +-
  fs/ksmbd/crypto_ctx.c        |   16 +
  fs/ksmbd/crypto_ctx.h        |    8 +
  fs/ksmbd/dkms.conf           |    6 +
@@ -24,26 +23,26 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/ksmbd/ksmbd_work.h        |    2 +-
  fs/ksmbd/mgmt/ksmbd_ida.c    |   17 +-
  fs/ksmbd/mgmt/ksmbd_ida.h    |    6 +
- fs/ksmbd/mgmt/tree_connect.c |   20 +-
- fs/ksmbd/mgmt/tree_connect.h |    6 +-
- fs/ksmbd/mgmt/user_session.c |  198 +-
- fs/ksmbd/mgmt/user_session.h |   13 +-
+ fs/ksmbd/mgmt/tree_connect.c |   11 -
+ fs/ksmbd/mgmt/tree_connect.h |    3 -
+ fs/ksmbd/mgmt/user_session.c |  102 +-
+ fs/ksmbd/mgmt/user_session.h |    8 +-
  fs/ksmbd/misc.c              |  107 +
  fs/ksmbd/ndr.c               |   36 +-
  fs/ksmbd/ndr.h               |    4 +
  fs/ksmbd/netmisc.c           |  606 +++
  fs/ksmbd/ntlmssp.h           |    6 +-
- fs/ksmbd/oplock.c            |  368 +-
- fs/ksmbd/oplock.h            |   13 +-
- fs/ksmbd/server.c            |   47 +-
+ fs/ksmbd/oplock.c            |  291 +-
+ fs/ksmbd/oplock.h            |   11 +
+ fs/ksmbd/server.c            |   43 +-
  fs/ksmbd/smb1misc.c          |  297 ++
  fs/ksmbd/smb1ops.c           |   89 +
  fs/ksmbd/smb1pdu.c           | 8516 ++++++++++++++++++++++++++++++++++
  fs/ksmbd/smb1pdu.h           | 1631 +++++++
- fs/ksmbd/smb2misc.c          |    6 +-
+ fs/ksmbd/smb2misc.c          |    1 +
  fs/ksmbd/smb2ops.c           |   69 +-
- fs/ksmbd/smb2pdu.c           |  819 +++-
- fs/ksmbd/smb2pdu.h           | 1193 ++++-
+ fs/ksmbd/smb2pdu.c           |  729 ++-
+ fs/ksmbd/smb2pdu.h           | 1191 ++++-
  fs/ksmbd/smb_common.c        |   66 +-
  fs/ksmbd/smb_common.h        |   77 +-
  fs/ksmbd/smbacl.c            |  212 +-
@@ -51,7 +50,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/ksmbd/smberr.h            |  235 +
  fs/ksmbd/transport_ipc.c     |    3 +-
  fs/ksmbd/transport_rdma.c    |   42 +-
- fs/ksmbd/transport_tcp.c     |   48 +-
+ fs/ksmbd/transport_tcp.c     |   46 +-
  fs/ksmbd/unicode.c           |   18 +
  fs/ksmbd/unicode.h           |    3 +
  fs/ksmbd/vfs.c               | 1868 ++++++--
@@ -59,7 +58,7 @@ Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  fs/ksmbd/vfs_cache.c         |   68 +-
  fs/ksmbd/vfs_cache.h         |   18 +
  fs/ksmbd/xattr.h             |    2 +-
- 53 files changed, 17338 insertions(+), 958 deletions(-)
+ 52 files changed, 17055 insertions(+), 798 deletions(-)
  create mode 100644 fs/ksmbd/README.md
  create mode 100755 fs/ksmbd/build_ksmbd.sh
  create mode 100644 fs/ksmbd/dkms.conf
@@ -584,7 +583,7 @@ index c03eba090368..2276624e47ef 100644
 +	return ksmbd_neg_token_alloc(context, hdrlen, tag, value, vlen);
  }
 diff --git a/fs/ksmbd/auth.c b/fs/ksmbd/auth.c
-index cead696b656a..0dbbc48c29d7 100644
+index df8fb076f6f1..0dbbc48c29d7 100644
 --- a/fs/ksmbd/auth.c
 +++ b/fs/ksmbd/auth.c
 @@ -29,7 +29,6 @@
@@ -767,53 +766,7 @@ index cead696b656a..0dbbc48c29d7 100644
  /**
   * ksmbd_auth_ntlmv2() - NTLMv2 authentication handler
   * @sess:	session of connection
-@@ -221,22 +378,22 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
- {
- 	char ntlmv2_hash[CIFS_ENCPWD_SIZE];
- 	char ntlmv2_rsp[CIFS_HMAC_MD5_HASH_SIZE];
--	struct ksmbd_crypto_ctx *ctx;
-+	struct ksmbd_crypto_ctx *ctx = NULL;
- 	char *construct = NULL;
- 	int rc, len;
- 
--	ctx = ksmbd_crypto_ctx_find_hmacmd5();
--	if (!ctx) {
--		ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
--		return -ENOMEM;
--	}
--
- 	rc = calc_ntlmv2_hash(conn, sess, ntlmv2_hash, domain_name);
- 	if (rc) {
- 		ksmbd_debug(AUTH, "could not get v2 hash rc %d\n", rc);
- 		goto out;
- 	}
- 
-+	ctx = ksmbd_crypto_ctx_find_hmacmd5();
-+	if (!ctx) {
-+		ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
-+		return -ENOMEM;
-+	}
-+
- 	rc = crypto_shash_setkey(CRYPTO_HMACMD5_TFM(ctx),
- 				 ntlmv2_hash,
- 				 CIFS_HMAC_MD5_HASH_SIZE);
-@@ -272,6 +429,8 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
- 		ksmbd_debug(AUTH, "Could not generate md5 hash\n");
- 		goto out;
- 	}
-+	ksmbd_release_crypto_ctx(ctx);
-+	ctx = NULL;
- 
- 	rc = ksmbd_gen_sess_key(sess, ntlmv2_hash, ntlmv2_rsp);
- 	if (rc) {
-@@ -282,11 +441,111 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
- 	if (memcmp(ntlmv2->ntlmv2_hash, ntlmv2_rsp, CIFS_HMAC_MD5_HASH_SIZE) != 0)
- 		rc = -EINVAL;
- out:
--	ksmbd_release_crypto_ctx(ctx);
-+	if (ctx)
-+		ksmbd_release_crypto_ctx(ctx);
- 	kfree(construct);
+@@ -290,6 +447,105 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
  	return rc;
  }
  
@@ -919,7 +872,7 @@ index cead696b656a..0dbbc48c29d7 100644
  /**
   * ksmbd_decode_ntlmssp_auth_blob() - helper function to construct
   * authenticate blob
-@@ -303,6 +562,10 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
+@@ -306,6 +562,10 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
  	char *domain_name;
  	unsigned int nt_off, dn_off;
  	unsigned short nt_len, dn_len;
@@ -930,7 +883,7 @@ index cead696b656a..0dbbc48c29d7 100644
  	int ret;
  
  	if (blob_len < sizeof(struct authenticate_message)) {
-@@ -319,6 +582,7 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
+@@ -322,6 +582,7 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
  
  	nt_off = le32_to_cpu(authblob->NtChallengeResponse.BufferOffset);
  	nt_len = le16_to_cpu(authblob->NtChallengeResponse.Length);
@@ -938,7 +891,7 @@ index cead696b656a..0dbbc48c29d7 100644
  	dn_off = le32_to_cpu(authblob->DomainName.BufferOffset);
  	dn_len = le16_to_cpu(authblob->DomainName.Length);
  
-@@ -326,6 +590,26 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
+@@ -329,6 +590,26 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
  	    nt_len < CIFS_ENCPWD_SIZE)
  		return -EINVAL;
  
@@ -965,7 +918,7 @@ index cead696b656a..0dbbc48c29d7 100644
  	/* TODO : use domain name that imported from configuration file */
  	domain_name = smb_strndup_from_utf16((const char *)authblob + dn_off,
  					     dn_len, true, conn->local_nls);
-@@ -360,7 +644,12 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
+@@ -363,7 +644,12 @@ int ksmbd_decode_ntlmssp_auth_blob(struct authenticate_message *authblob,
  				 SMB2_NTLMV2_SESSKEY_SIZE);
  		cifs_arc4_crypt(ctx_arc4, sess->sess_key,
  				(char *)authblob + sess_key_off, sess_key_len);
@@ -978,7 +931,7 @@ index cead696b656a..0dbbc48c29d7 100644
  	}
  
  	return ret;
-@@ -557,6 +846,59 @@ int ksmbd_krb5_authenticate(struct ksmbd_session *sess, char *in_blob,
+@@ -560,6 +846,59 @@ int ksmbd_krb5_authenticate(struct ksmbd_session *sess, char *in_blob,
  }
  #endif
  
@@ -1261,7 +1214,7 @@ index 000000000000..4b10f0417d84
 +
 +main $1
 diff --git a/fs/ksmbd/connection.c b/fs/ksmbd/connection.c
-index b8f9d627f241..4b9665f104aa 100644
+index b371754540f9..4b9665f104aa 100644
 --- a/fs/ksmbd/connection.c
 +++ b/fs/ksmbd/connection.c
 @@ -10,6 +10,9 @@
@@ -1274,34 +1227,7 @@ index b8f9d627f241..4b9665f104aa 100644
  #include "mgmt/ksmbd_ida.h"
  #include "connection.h"
  #include "transport_tcp.h"
-@@ -20,7 +23,7 @@ static DEFINE_MUTEX(init_lock);
- static struct ksmbd_conn_ops default_conn_ops;
- 
- LIST_HEAD(conn_list);
--DEFINE_RWLOCK(conn_list_lock);
-+DECLARE_RWSEM(conn_list_lock);
- 
- /**
-  * ksmbd_conn_free() - free resources of the connection instance
-@@ -32,9 +35,9 @@ DEFINE_RWLOCK(conn_list_lock);
-  */
- void ksmbd_conn_free(struct ksmbd_conn *conn)
- {
--	write_lock(&conn_list_lock);
-+	down_write(&conn_list_lock);
- 	list_del(&conn->conns_list);
--	write_unlock(&conn_list_lock);
-+	up_write(&conn_list_lock);
- 
- 	xa_destroy(&conn->sessions);
- 	kvfree(conn->request_buf);
-@@ -56,12 +59,16 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
- 		return NULL;
- 
- 	conn->need_neg = true;
--	conn->status = KSMBD_SESS_NEW;
-+	ksmbd_conn_set_new(conn);
- 	conn->local_nls = load_nls("utf8");
+@@ -61,7 +64,11 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
  	if (!conn->local_nls)
  		conn->local_nls = load_nls_default();
  	if (IS_ENABLED(CONFIG_UNICODE))
@@ -1313,36 +1239,6 @@ index b8f9d627f241..4b9665f104aa 100644
  	else
  		conn->um = ERR_PTR(-EOPNOTSUPP);
  	if (IS_ERR(conn->um))
-@@ -84,9 +91,9 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
- 	spin_lock_init(&conn->llist_lock);
- 	INIT_LIST_HEAD(&conn->lock_list);
- 
--	write_lock(&conn_list_lock);
-+	down_write(&conn_list_lock);
- 	list_add(&conn->conns_list, &conn_list);
--	write_unlock(&conn_list_lock);
-+	up_write(&conn_list_lock);
- 	return conn;
- }
- 
-@@ -95,7 +102,7 @@ bool ksmbd_conn_lookup_dialect(struct ksmbd_conn *c)
- 	struct ksmbd_conn *t;
- 	bool ret = false;
- 
--	read_lock(&conn_list_lock);
-+	down_read(&conn_list_lock);
- 	list_for_each_entry(t, &conn_list, conns_list) {
- 		if (memcmp(t->ClientGUID, c->ClientGUID, SMB2_CLIENT_GUID_SIZE))
- 			continue;
-@@ -103,7 +110,7 @@ bool ksmbd_conn_lookup_dialect(struct ksmbd_conn *c)
- 		ret = true;
- 		break;
- 	}
--	read_unlock(&conn_list_lock);
-+	up_read(&conn_list_lock);
- 	return ret;
- }
- 
 @@ -111,11 +118,20 @@ void ksmbd_conn_enqueue_request(struct ksmbd_work *work)
  {
  	struct ksmbd_conn *conn = work->conn;
@@ -1367,7 +1263,7 @@ index b8f9d627f241..4b9665f104aa 100644
  
  	if (requests_queue) {
  		atomic_inc(&conn->req_running);
-@@ -136,32 +152,60 @@ int ksmbd_conn_try_dequeue_request(struct ksmbd_work *work)
+@@ -136,14 +152,14 @@ int ksmbd_conn_try_dequeue_request(struct ksmbd_work *work)
  
  	if (!work->multiRsp)
  		atomic_dec(&conn->req_running);
@@ -1386,245 +1282,6 @@ index b8f9d627f241..4b9665f104aa 100644
  
  	wake_up_all(&conn->req_running_q);
  	return ret;
- }
- 
--static void ksmbd_conn_lock(struct ksmbd_conn *conn)
-+void ksmbd_conn_lock(struct ksmbd_conn *conn)
- {
- 	mutex_lock(&conn->srv_mutex);
- }
- 
--static void ksmbd_conn_unlock(struct ksmbd_conn *conn)
-+void ksmbd_conn_unlock(struct ksmbd_conn *conn)
- {
- 	mutex_unlock(&conn->srv_mutex);
- }
- 
--void ksmbd_conn_wait_idle(struct ksmbd_conn *conn)
-+void ksmbd_all_conn_set_status(u64 sess_id, u32 status)
- {
-+	struct ksmbd_conn *conn;
-+
-+	down_read(&conn_list_lock);
-+	list_for_each_entry(conn, &conn_list, conns_list) {
-+		if (conn->binding || xa_load(&conn->sessions, sess_id))
-+			WRITE_ONCE(conn->status, status);
-+	}
-+	up_read(&conn_list_lock);
-+}
-+
-+void ksmbd_conn_wait_idle(struct ksmbd_conn *conn, u64 sess_id)
-+{
-+	struct ksmbd_conn *bind_conn;
-+
- 	wait_event(conn->req_running_q, atomic_read(&conn->req_running) < 2);
-+
-+	down_read(&conn_list_lock);
-+	list_for_each_entry(bind_conn, &conn_list, conns_list) {
-+		if (bind_conn == conn)
-+			continue;
-+
-+		if ((bind_conn->binding || xa_load(&bind_conn->sessions, sess_id)) &&
-+		    !ksmbd_conn_releasing(bind_conn) &&
-+		    atomic_read(&bind_conn->req_running)) {
-+			wait_event(bind_conn->req_running_q,
-+				atomic_read(&bind_conn->req_running) == 0);
-+		}
-+	}
-+	up_read(&conn_list_lock);
- }
- 
- int ksmbd_conn_write(struct ksmbd_work *work)
-@@ -245,7 +289,7 @@ bool ksmbd_conn_alive(struct ksmbd_conn *conn)
- 	if (!ksmbd_server_running())
- 		return false;
- 
--	if (conn->status == KSMBD_SESS_EXITING)
-+	if (ksmbd_conn_exiting(conn))
- 		return false;
- 
- 	if (kthread_should_stop())
-@@ -305,7 +349,7 @@ int ksmbd_conn_handler_loop(void *p)
- 		pdu_size = get_rfc1002_len(hdr_buf);
- 		ksmbd_debug(CONN, "RFC1002 header %u bytes\n", pdu_size);
- 
--		if (conn->status == KSMBD_SESS_GOOD)
-+		if (ksmbd_conn_good(conn))
- 			max_allowed_pdu_size =
- 				SMB3_MAX_MSGSIZE + conn->vals->max_write_size;
- 		else
-@@ -314,7 +358,7 @@ int ksmbd_conn_handler_loop(void *p)
- 		if (pdu_size > max_allowed_pdu_size) {
- 			pr_err_ratelimited("PDU length(%u) excceed maximum allowed pdu size(%u) on connection(%d)\n",
- 					pdu_size, max_allowed_pdu_size,
--					conn->status);
-+					READ_ONCE(conn->status));
- 			break;
- 		}
- 
-@@ -325,7 +369,8 @@ int ksmbd_conn_handler_loop(void *p)
- 			break;
- 
- 		/* 4 for rfc1002 length field */
--		size = pdu_size + 4;
-+		/* 1 for implied bcc[0] */
-+		size = pdu_size + 4 + 1;
- 		conn->request_buf = kvmalloc(size, GFP_KERNEL);
- 		if (!conn->request_buf)
- 			break;
-@@ -362,10 +407,10 @@ int ksmbd_conn_handler_loop(void *p)
- 	}
- 
- out:
-+	ksmbd_conn_set_releasing(conn);
- 	/* Wait till all reference dropped to the Server object*/
- 	wait_event(conn->r_count_q, atomic_read(&conn->r_count) == 0);
- 
--
- 	if (IS_ENABLED(CONFIG_UNICODE))
- 		utf8_unload(conn->um);
- 	unload_nls(conn->local_nls);
-@@ -409,7 +454,7 @@ static void stop_sessions(void)
- 	struct ksmbd_transport *t;
- 
- again:
--	read_lock(&conn_list_lock);
-+	down_read(&conn_list_lock);
- 	list_for_each_entry(conn, &conn_list, conns_list) {
- 		struct task_struct *task;
- 
-@@ -418,14 +463,14 @@ static void stop_sessions(void)
- 		if (task)
- 			ksmbd_debug(CONN, "Stop session handler %s/%d\n",
- 				    task->comm, task_pid_nr(task));
--		conn->status = KSMBD_SESS_EXITING;
-+		ksmbd_conn_set_exiting(conn);
- 		if (t->ops->shutdown) {
--			read_unlock(&conn_list_lock);
-+			up_read(&conn_list_lock);
- 			t->ops->shutdown(t);
--			read_lock(&conn_list_lock);
-+			down_read(&conn_list_lock);
- 		}
- 	}
--	read_unlock(&conn_list_lock);
-+	up_read(&conn_list_lock);
- 
- 	if (!list_empty(&conn_list)) {
- 		schedule_timeout_interruptible(HZ / 10); /* 100ms */
-diff --git a/fs/ksmbd/connection.h b/fs/ksmbd/connection.h
-index 0e3a848defaf..ad8dfaa48ffb 100644
---- a/fs/ksmbd/connection.h
-+++ b/fs/ksmbd/connection.h
-@@ -26,7 +26,8 @@ enum {
- 	KSMBD_SESS_GOOD,
- 	KSMBD_SESS_EXITING,
- 	KSMBD_SESS_NEED_RECONNECT,
--	KSMBD_SESS_NEED_NEGOTIATE
-+	KSMBD_SESS_NEED_NEGOTIATE,
-+	KSMBD_SESS_RELEASING
- };
- 
- struct ksmbd_stats {
-@@ -140,10 +141,10 @@ struct ksmbd_transport {
- #define KSMBD_TCP_PEER_SOCKADDR(c)	((struct sockaddr *)&((c)->peer_addr))
- 
- extern struct list_head conn_list;
--extern rwlock_t conn_list_lock;
-+extern struct rw_semaphore conn_list_lock;
- 
- bool ksmbd_conn_alive(struct ksmbd_conn *conn);
--void ksmbd_conn_wait_idle(struct ksmbd_conn *conn);
-+void ksmbd_conn_wait_idle(struct ksmbd_conn *conn, u64 sess_id);
- struct ksmbd_conn *ksmbd_conn_alloc(void);
- void ksmbd_conn_free(struct ksmbd_conn *conn);
- bool ksmbd_conn_lookup_dialect(struct ksmbd_conn *c);
-@@ -162,6 +163,8 @@ void ksmbd_conn_init_server_callbacks(struct ksmbd_conn_ops *ops);
- int ksmbd_conn_handler_loop(void *p);
- int ksmbd_conn_transport_init(void);
- void ksmbd_conn_transport_destroy(void);
-+void ksmbd_conn_lock(struct ksmbd_conn *conn);
-+void ksmbd_conn_unlock(struct ksmbd_conn *conn);
- 
- /*
-  * WARNING
-@@ -169,43 +172,60 @@ void ksmbd_conn_transport_destroy(void);
-  * This is a hack. We will move status to a proper place once we land
-  * a multi-sessions support.
-  */
--static inline bool ksmbd_conn_good(struct ksmbd_work *work)
-+static inline bool ksmbd_conn_good(struct ksmbd_conn *conn)
- {
--	return work->conn->status == KSMBD_SESS_GOOD;
-+	return READ_ONCE(conn->status) == KSMBD_SESS_GOOD;
- }
- 
--static inline bool ksmbd_conn_need_negotiate(struct ksmbd_work *work)
-+static inline bool ksmbd_conn_need_negotiate(struct ksmbd_conn *conn)
- {
--	return work->conn->status == KSMBD_SESS_NEED_NEGOTIATE;
-+	return READ_ONCE(conn->status) == KSMBD_SESS_NEED_NEGOTIATE;
- }
- 
--static inline bool ksmbd_conn_need_reconnect(struct ksmbd_work *work)
-+static inline bool ksmbd_conn_need_reconnect(struct ksmbd_conn *conn)
- {
--	return work->conn->status == KSMBD_SESS_NEED_RECONNECT;
-+	return READ_ONCE(conn->status) == KSMBD_SESS_NEED_RECONNECT;
- }
- 
--static inline bool ksmbd_conn_exiting(struct ksmbd_work *work)
-+static inline bool ksmbd_conn_exiting(struct ksmbd_conn *conn)
- {
--	return work->conn->status == KSMBD_SESS_EXITING;
-+	return READ_ONCE(conn->status) == KSMBD_SESS_EXITING;
- }
- 
--static inline void ksmbd_conn_set_good(struct ksmbd_work *work)
-+static inline bool ksmbd_conn_releasing(struct ksmbd_conn *conn)
- {
--	work->conn->status = KSMBD_SESS_GOOD;
-+	return READ_ONCE(conn->status) == KSMBD_SESS_RELEASING;
- }
- 
--static inline void ksmbd_conn_set_need_negotiate(struct ksmbd_work *work)
-+static inline void ksmbd_conn_set_new(struct ksmbd_conn *conn)
- {
--	work->conn->status = KSMBD_SESS_NEED_NEGOTIATE;
-+	WRITE_ONCE(conn->status, KSMBD_SESS_NEW);
- }
- 
--static inline void ksmbd_conn_set_need_reconnect(struct ksmbd_work *work)
-+static inline void ksmbd_conn_set_good(struct ksmbd_conn *conn)
- {
--	work->conn->status = KSMBD_SESS_NEED_RECONNECT;
-+	WRITE_ONCE(conn->status, KSMBD_SESS_GOOD);
- }
- 
--static inline void ksmbd_conn_set_exiting(struct ksmbd_work *work)
-+static inline void ksmbd_conn_set_need_negotiate(struct ksmbd_conn *conn)
- {
--	work->conn->status = KSMBD_SESS_EXITING;
-+	WRITE_ONCE(conn->status, KSMBD_SESS_NEED_NEGOTIATE);
- }
-+
-+static inline void ksmbd_conn_set_need_reconnect(struct ksmbd_conn *conn)
-+{
-+	WRITE_ONCE(conn->status, KSMBD_SESS_NEED_RECONNECT);
-+}
-+
-+static inline void ksmbd_conn_set_exiting(struct ksmbd_conn *conn)
-+{
-+	WRITE_ONCE(conn->status, KSMBD_SESS_EXITING);
-+}
-+
-+static inline void ksmbd_conn_set_releasing(struct ksmbd_conn *conn)
-+{
-+	WRITE_ONCE(conn->status, KSMBD_SESS_RELEASING);
-+}
-+
-+void ksmbd_all_conn_set_status(u64 sess_id, u32 status);
- #endif /* __CONNECTION_H__ */
 diff --git a/fs/ksmbd/crypto_ctx.c b/fs/ksmbd/crypto_ctx.c
 index 81488d04199d..5f4b1008d17e 100644
 --- a/fs/ksmbd/crypto_ctx.c
@@ -2019,67 +1676,32 @@ index 2bc07b16cfde..e7df7786f431 100644
  int ksmbd_acquire_async_msg_id(struct ida *ida);
  
 diff --git a/fs/ksmbd/mgmt/tree_connect.c b/fs/ksmbd/mgmt/tree_connect.c
-index 8ce17b3fb8da..408cddf2f094 100644
+index f07a05f37651..408cddf2f094 100644
 --- a/fs/ksmbd/mgmt/tree_connect.c
 +++ b/fs/ksmbd/mgmt/tree_connect.c
-@@ -109,18 +109,15 @@ int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,
- struct ksmbd_tree_connect *ksmbd_tree_conn_lookup(struct ksmbd_session *sess,
- 						  unsigned int id)
- {
--	return xa_load(&sess->tree_conns, id);
--}
-+	struct ksmbd_tree_connect *tcon;
+@@ -120,17 +120,6 @@ struct ksmbd_tree_connect *ksmbd_tree_conn_lookup(struct ksmbd_session *sess,
+ 	return tcon;
+ }
  
 -struct ksmbd_share_config *ksmbd_tree_conn_share(struct ksmbd_session *sess,
 -						 unsigned int id)
 -{
 -	struct ksmbd_tree_connect *tc;
-+	tcon = xa_load(&sess->tree_conns, id);
-+	if (tcon) {
-+		if (test_bit(TREE_CONN_EXPIRE, &tcon->status))
-+			tcon = NULL;
-+	}
- 
+-
 -	tc = ksmbd_tree_conn_lookup(sess, id);
 -	if (tc)
 -		return tc->share_conf;
 -	return NULL;
-+	return tcon;
- }
- 
+-}
+-
  int ksmbd_tree_conn_session_logoff(struct ksmbd_session *sess)
-@@ -129,6 +126,9 @@ int ksmbd_tree_conn_session_logoff(struct ksmbd_session *sess)
- 	struct ksmbd_tree_connect *tc;
- 	unsigned long id;
- 
-+	if (!sess)
-+		return -EINVAL;
-+
- 	xa_for_each(&sess->tree_conns, id, tc)
- 		ret |= ksmbd_tree_conn_disconnect(sess, tc);
- 	xa_destroy(&sess->tree_conns);
+ {
+ 	int ret = 0;
 diff --git a/fs/ksmbd/mgmt/tree_connect.h b/fs/ksmbd/mgmt/tree_connect.h
-index 0f97ddc1e39c..562d647ad9fa 100644
+index 700df36cf3e3..562d647ad9fa 100644
 --- a/fs/ksmbd/mgmt/tree_connect.h
 +++ b/fs/ksmbd/mgmt/tree_connect.h
-@@ -14,6 +14,8 @@ struct ksmbd_share_config;
- struct ksmbd_user;
- struct ksmbd_conn;
- 
-+#define TREE_CONN_EXPIRE		1
-+
- struct ksmbd_tree_connect {
- 	int				id;
- 
-@@ -25,6 +27,7 @@ struct ksmbd_tree_connect {
- 
- 	int				maximal_access;
- 	bool				posix_extensions;
-+	unsigned long			status;
- };
- 
- struct ksmbd_tree_conn_status {
-@@ -50,9 +53,6 @@ int ksmbd_tree_conn_disconnect(struct ksmbd_session *sess,
+@@ -53,9 +53,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);
  
@@ -2090,10 +1712,10 @@ index 0f97ddc1e39c..562d647ad9fa 100644
  
  #endif /* __TREE_CONNECT_MANAGEMENT_H__ */
 diff --git a/fs/ksmbd/mgmt/user_session.c b/fs/ksmbd/mgmt/user_session.c
-index 92b1603b5abe..25fb3ee32488 100644
+index ea4b56d570fb..25fb3ee32488 100644
 --- a/fs/ksmbd/mgmt/user_session.c
 +++ b/fs/ksmbd/mgmt/user_session.c
-@@ -25,20 +25,19 @@ static DECLARE_RWSEM(sessions_table_lock);
+@@ -25,7 +25,6 @@ static DECLARE_RWSEM(sessions_table_lock);
  struct ksmbd_session_rpc {
  	int			id;
  	unsigned int		method;
@@ -2101,25 +1723,6 @@ index 92b1603b5abe..25fb3ee32488 100644
  };
  
  static void free_channel_list(struct ksmbd_session *sess)
- {
--	struct channel *chann, *tmp;
-+	struct channel *chann;
-+	unsigned long index;
- 
--	write_lock(&sess->chann_lock);
--	list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list,
--				 chann_list) {
--		list_del(&chann->chann_list);
-+	xa_for_each(&sess->ksmbd_chann_list, index, chann) {
-+		xa_erase(&sess->ksmbd_chann_list, index);
- 		kfree(chann);
- 	}
--	write_unlock(&sess->chann_lock);
-+
-+	xa_destroy(&sess->ksmbd_chann_list);
- }
- 
- static void __session_rpc_close(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)
  {
@@ -2198,179 +1801,46 @@ index 92b1603b5abe..25fb3ee32488 100644
  }
  
  void ksmbd_session_destroy(struct ksmbd_session *sess)
-@@ -153,10 +144,6 @@ void ksmbd_session_destroy(struct ksmbd_session *sess)
- 	if (!sess)
- 		return;
- 
--	down_write(&sessions_table_lock);
--	hash_del(&sess->hlist);
--	up_write(&sessions_table_lock);
--
- 	if (sess->user)
- 		ksmbd_free_user(sess->user);
- 
-@@ -174,76 +161,116 @@ static struct ksmbd_session *__session_lookup(unsigned long long id)
- 	struct ksmbd_session *sess;
- 
- 	hash_for_each_possible(sessions_table, sess, hlist, id) {
--		if (id == sess->id)
-+		if (id == sess->id) {
-+			sess->last_active = jiffies;
- 			return sess;
-+		}
- 	}
- 	return NULL;
- }
- 
-+static void ksmbd_expire_session(struct ksmbd_conn *conn)
-+{
-+	unsigned long id;
-+	struct ksmbd_session *sess;
-+
-+	down_write(&sessions_table_lock);
-+	xa_for_each(&conn->sessions, id, sess) {
-+		if (sess->state != SMB2_SESSION_VALID ||
-+		    time_after(jiffies,
-+			       sess->last_active + SMB2_SESSION_TIMEOUT)) {
-+			xa_erase(&conn->sessions, sess->id);
+@@ -189,7 +180,12 @@ static void ksmbd_expire_session(struct ksmbd_conn *conn)
+ 		    time_after(jiffies,
+ 			       sess->last_active + SMB2_SESSION_TIMEOUT)) {
+ 			xa_erase(&conn->sessions, sess->id);
 +#ifdef CONFIG_SMB_INSECURE_SERVER
 +			if (hash_hashed(&sess->hlist))
 +				hash_del(&sess->hlist);
 +#else
-+			hash_del(&sess->hlist);
+ 			hash_del(&sess->hlist);
 +#endif
-+			ksmbd_session_destroy(sess);
-+			continue;
-+		}
-+	}
-+	up_write(&sessions_table_lock);
-+}
-+
- int ksmbd_session_register(struct ksmbd_conn *conn,
- 			   struct ksmbd_session *sess)
- {
- 	sess->dialect = conn->dialect;
- 	memcpy(sess->ClientGUID, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE);
-+	ksmbd_expire_session(conn);
- 	return xa_err(xa_store(&conn->sessions, sess->id, sess, GFP_KERNEL));
- }
- 
- static int ksmbd_chann_del(struct ksmbd_conn *conn, struct ksmbd_session *sess)
- {
--	struct channel *chann, *tmp;
--
--	write_lock(&sess->chann_lock);
--	list_for_each_entry_safe(chann, tmp, &sess->ksmbd_chann_list,
--				 chann_list) {
--		if (chann->conn == conn) {
--			list_del(&chann->chann_list);
--			kfree(chann);
--			write_unlock(&sess->chann_lock);
--			return 0;
--		}
--	}
--	write_unlock(&sess->chann_lock);
-+	struct channel *chann;
-+
-+	chann = xa_erase(&sess->ksmbd_chann_list, (long)conn);
-+	if (!chann)
-+		return -ENOENT;
- 
--	return -ENOENT;
-+	kfree(chann);
-+	return 0;
- }
- 
- void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
- {
- 	struct ksmbd_session *sess;
-+	unsigned long id;
- 
-+	down_write(&sessions_table_lock);
- 	if (conn->binding) {
- 		int bkt;
--
--		down_write(&sessions_table_lock);
--		hash_for_each(sessions_table, bkt, sess, hlist) {
--			if (!ksmbd_chann_del(conn, sess)) {
--				up_write(&sessions_table_lock);
--				goto sess_destroy;
-+		struct hlist_node *tmp;
-+
-+		hash_for_each_safe(sessions_table, bkt, tmp, sess, hlist) {
-+			if (!ksmbd_chann_del(conn, sess) &&
-+			    xa_empty(&sess->ksmbd_chann_list)) {
+ 			ksmbd_session_destroy(sess);
+ 			continue;
+ 		}
+@@ -231,7 +227,12 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
+ 		hash_for_each_safe(sessions_table, bkt, tmp, sess, hlist) {
+ 			if (!ksmbd_chann_del(conn, sess) &&
+ 			    xa_empty(&sess->ksmbd_chann_list)) {
 +#ifdef CONFIG_SMB_INSECURE_SERVER
 +			if (hash_hashed(&sess->hlist))
 +				hash_del(&sess->hlist);
 +#else
-+				hash_del(&sess->hlist);
+ 				hash_del(&sess->hlist);
 +#endif
-+				ksmbd_session_destroy(sess);
+ 				ksmbd_session_destroy(sess);
  			}
  		}
--		up_write(&sessions_table_lock);
--	} else {
--		unsigned long id;
--
--		xa_for_each(&conn->sessions, id, sess) {
--			if (!ksmbd_chann_del(conn, sess))
--				goto sess_destroy;
--		}
- 	}
- 
--	return;
-+	xa_for_each(&conn->sessions, id, sess) {
-+		unsigned long chann_id;
-+		struct channel *chann;
- 
--sess_destroy:
--	if (list_empty(&sess->ksmbd_chann_list)) {
--		xa_erase(&conn->sessions, sess->id);
--		ksmbd_session_destroy(sess);
-+		xa_for_each(&sess->ksmbd_chann_list, chann_id, chann) {
-+			if (chann->conn != conn)
-+				ksmbd_conn_set_exiting(chann->conn);
-+		}
-+
-+		ksmbd_chann_del(conn, sess);
-+		if (xa_empty(&sess->ksmbd_chann_list)) {
-+			xa_erase(&conn->sessions, sess->id);
+@@ -249,7 +250,12 @@ void ksmbd_sessions_deregister(struct ksmbd_conn *conn)
+ 		ksmbd_chann_del(conn, sess);
+ 		if (xa_empty(&sess->ksmbd_chann_list)) {
+ 			xa_erase(&conn->sessions, sess->id);
 +#ifdef CONFIG_SMB_INSECURE_SERVER
 +			if (hash_hashed(&sess->hlist))
 +				hash_del(&sess->hlist);
 +#else
-+			hash_del(&sess->hlist);
+ 			hash_del(&sess->hlist);
 +#endif
-+			ksmbd_session_destroy(sess);
-+		}
+ 			ksmbd_session_destroy(sess);
+ 		}
  	}
-+	up_write(&sessions_table_lock);
- }
- 
- struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,
- 					   unsigned long long id)
- {
--	return xa_load(&conn->sessions, id);
-+	struct ksmbd_session *sess;
-+
-+	sess = xa_load(&conn->sessions, id);
-+	if (sess)
-+		sess->last_active = jiffies;
-+	return sess;
- }
- 
- struct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id)
-@@ -252,6 +279,8 @@ struct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id)
- 
- 	down_read(&sessions_table_lock);
- 	sess = __session_lookup(id);
-+	if (sess)
-+		sess->last_active = jiffies;
- 	up_read(&sessions_table_lock);
- 
- 	return sess;
-@@ -305,6 +334,18 @@ struct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn,
+@@ -328,6 +334,18 @@ struct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn,
  	return NULL;
  }
  
@@ -2389,31 +1859,57 @@ index 92b1603b5abe..25fb3ee32488 100644
  static int __init_smb2_session(struct ksmbd_session *sess)
  {
  	int id = ksmbd_acquire_smb2_uid(&session_ida);
-@@ -327,14 +368,20 @@ static struct ksmbd_session *__session_create(int protocol)
- 	if (ksmbd_init_file_table(&sess->file_table))
- 		goto error;
+@@ -343,9 +361,6 @@ static struct ksmbd_session *__session_create(int protocol)
+ 	struct ksmbd_session *sess;
+ 	int ret;
  
-+	sess->last_active = jiffies;
-+	sess->state = SMB2_SESSION_IN_PROGRESS;
+-	if (protocol != CIFDS_SESSION_FLAG_SMB2)
+-		return NULL;
+-
+ 	sess = kzalloc(sizeof(struct ksmbd_session), GFP_KERNEL);
+ 	if (!sess)
+ 		return NULL;
+@@ -358,19 +373,33 @@ static struct ksmbd_session *__session_create(int protocol)
  	set_session_flag(sess, protocol);
  	xa_init(&sess->tree_conns);
--	INIT_LIST_HEAD(&sess->ksmbd_chann_list);
+ 	xa_init(&sess->ksmbd_chann_list);
 -	INIT_LIST_HEAD(&sess->rpc_handle_list);
-+	xa_init(&sess->ksmbd_chann_list);
 +	xa_init(&sess->rpc_handle_list);
  	sess->sequence_number = 1;
--	rwlock_init(&sess->chann_lock);
  
- 	switch (protocol) {
+-	ret = __init_smb2_session(sess);
++	switch (protocol) {
 +#ifdef CONFIG_SMB_INSECURE_SERVER
 +	case CIFDS_SESSION_FLAG_SMB1:
 +		ret = __init_smb1_session(sess);
 +		break;
 +#endif
- 	case CIFDS_SESSION_FLAG_SMB2:
- 		ret = __init_smb2_session(sess);
- 		break;
-@@ -360,6 +407,13 @@ static struct ksmbd_session *__session_create(int protocol)
++	case CIFDS_SESSION_FLAG_SMB2:
++		ret = __init_smb2_session(sess);
++		break;
++	default:
++		ret = -EINVAL;
++		break;
++	}
++
+ 	if (ret)
+ 		goto error;
+ 
+ 	ida_init(&sess->tree_conn_ida);
+ 
+-	down_write(&sessions_table_lock);
+-	hash_add(sessions_table, &sess->hlist, sess->id);
+-	up_write(&sessions_table_lock);
+-
++	if (protocol == CIFDS_SESSION_FLAG_SMB2) {
++		down_write(&sessions_table_lock);
++		hash_add(sessions_table, &sess->hlist, sess->id);
++		up_write(&sessions_table_lock);
++	}
+ 	return sess;
+ 
+ error:
+@@ -378,6 +407,13 @@ static struct ksmbd_session *__session_create(int protocol)
  	return NULL;
  }
  
@@ -2427,7 +1923,7 @@ index 92b1603b5abe..25fb3ee32488 100644
  struct ksmbd_session *ksmbd_smb2_session_create(void)
  {
  	return __session_create(CIFDS_SESSION_FLAG_SMB2);
-@@ -369,6 +423,10 @@ int ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess)
+@@ -387,6 +423,10 @@ int ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess)
  {
  	int id = -EINVAL;
  
@@ -2439,7 +1935,7 @@ index 92b1603b5abe..25fb3ee32488 100644
  		id = ksmbd_acquire_smb2_tid(&sess->tree_conn_ida);
  
 diff --git a/fs/ksmbd/mgmt/user_session.h b/fs/ksmbd/mgmt/user_session.h
-index 8934b8ee275b..bbe28be40feb 100644
+index 51f38e5b61ab..bbe28be40feb 100644
 --- a/fs/ksmbd/mgmt/user_session.h
 +++ b/fs/ksmbd/mgmt/user_session.h
 @@ -12,6 +12,9 @@
@@ -2452,21 +1948,8 @@ index 8934b8ee275b..bbe28be40feb 100644
  #define CIFDS_SESSION_FLAG_SMB2		BIT(1)
  
  #define PREAUTH_HASHVALUE_SIZE		64
-@@ -21,7 +24,6 @@ struct ksmbd_file_table;
- struct channel {
- 	__u8			smb3signingkey[SMB3_SIGN_KEY_SIZE];
- 	struct ksmbd_conn	*conn;
--	struct list_head	chann_list;
- };
- 
- struct preauth_session {
-@@ -50,17 +52,17 @@ struct ksmbd_session {
- 	char				sess_key[CIFS_KEY_SIZE];
- 
- 	struct hlist_node		hlist;
--	rwlock_t			chann_lock;
--	struct list_head		ksmbd_chann_list;
-+	struct xarray			ksmbd_chann_list;
+@@ -52,7 +55,7 @@ struct ksmbd_session {
+ 	struct xarray			ksmbd_chann_list;
  	struct xarray			tree_conns;
  	struct ida			tree_conn_ida;
 -	struct list_head		rpc_handle_list;
@@ -2474,14 +1957,7 @@ index 8934b8ee275b..bbe28be40feb 100644
  
  	__u8				smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE];
  	__u8				smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE];
- 	__u8				smb3signingkey[SMB3_SIGN_KEY_SIZE];
- 
- 	struct ksmbd_file_table		file_table;
-+	unsigned long			last_active;
- };
- 
- static inline int test_session_flag(struct ksmbd_session *sess, int bit)
-@@ -78,6 +80,9 @@ static inline void clear_session_flag(struct ksmbd_session *sess, int bit)
+@@ -77,6 +80,9 @@ static inline void clear_session_flag(struct ksmbd_session *sess, int bit)
  	sess->flags &= ~bit;
  }
  
@@ -3361,7 +2837,7 @@ index f13153c18b4e..adaf4c0cbe8f 100644
  
  struct ntlmv2_resp {
 diff --git a/fs/ksmbd/oplock.c b/fs/ksmbd/oplock.c
-index d7d47b82451d..e3299bb75b3a 100644
+index cbfed03a1e5c..e3299bb75b3a 100644
 --- a/fs/ksmbd/oplock.c
 +++ b/fs/ksmbd/oplock.c
 @@ -10,6 +10,9 @@
@@ -3384,52 +2860,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	INIT_LIST_HEAD(&opinfo->op_entry);
  	INIT_LIST_HEAD(&opinfo->interim_list);
  	init_waitqueue_head(&opinfo->oplock_q);
-@@ -157,13 +163,42 @@ static struct oplock_info *opinfo_get_list(struct ksmbd_inode *ci)
- 	rcu_read_lock();
- 	opinfo = list_first_or_null_rcu(&ci->m_op_list, struct oplock_info,
- 					op_entry);
--	if (opinfo && !atomic_inc_not_zero(&opinfo->refcount))
--		opinfo = NULL;
-+	if (opinfo) {
-+		if (!atomic_inc_not_zero(&opinfo->refcount))
-+			opinfo = NULL;
-+		else {
-+			atomic_inc(&opinfo->conn->r_count);
-+			if (ksmbd_conn_releasing(opinfo->conn)) {
-+				atomic_dec(&opinfo->conn->r_count);
-+				atomic_dec(&opinfo->refcount);
-+				opinfo = NULL;
-+			}
-+		}
-+	}
-+
- 	rcu_read_unlock();
- 
- 	return opinfo;
- }
- 
-+static void opinfo_conn_put(struct oplock_info *opinfo)
-+{
-+	struct ksmbd_conn *conn;
-+
-+	if (!opinfo)
-+		return;
-+
-+	conn = opinfo->conn;
-+	/*
-+	 * Checking waitqueue to dropping pending requests on
-+	 * disconnection. waitqueue_active is safe because it
-+	 * uses atomic operation for condition.
-+	 */
-+	if (!atomic_dec_return(&conn->r_count) && waitqueue_active(&conn->r_count_q))
-+		wake_up(&conn->r_count_q);
-+	opinfo_put(opinfo);
-+}
-+
- void opinfo_put(struct oplock_info *opinfo)
- {
- 	if (!atomic_dec_and_test(&opinfo->refcount))
-@@ -229,6 +264,28 @@ int opinfo_write_to_read(struct oplock_info *opinfo)
+@@ -258,6 +264,28 @@ int opinfo_write_to_read(struct oplock_info *opinfo)
  {
  	struct lease *lease = opinfo->o_lease;
  
@@ -3458,7 +2889,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
  	      opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
  		pr_err("bad oplock(0x%x)\n", opinfo->level);
-@@ -240,6 +297,7 @@ int opinfo_write_to_read(struct oplock_info *opinfo)
+@@ -269,6 +297,7 @@ int opinfo_write_to_read(struct oplock_info *opinfo)
  
  	if (opinfo->is_lease)
  		lease->state = lease->new_state;
@@ -3466,7 +2897,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	return 0;
  }
  
-@@ -268,6 +326,27 @@ int opinfo_write_to_none(struct oplock_info *opinfo)
+@@ -297,6 +326,27 @@ int opinfo_write_to_none(struct oplock_info *opinfo)
  {
  	struct lease *lease = opinfo->o_lease;
  
@@ -3494,7 +2925,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	if (!(opinfo->level == SMB2_OPLOCK_LEVEL_BATCH ||
  	      opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE)) {
  		pr_err("bad oplock(0x%x)\n", opinfo->level);
-@@ -278,6 +357,7 @@ int opinfo_write_to_none(struct oplock_info *opinfo)
+@@ -307,6 +357,7 @@ int opinfo_write_to_none(struct oplock_info *opinfo)
  	opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
  	if (opinfo->is_lease)
  		lease->state = lease->new_state;
@@ -3502,7 +2933,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	return 0;
  }
  
-@@ -291,6 +371,25 @@ int opinfo_read_to_none(struct oplock_info *opinfo)
+@@ -320,6 +371,25 @@ int opinfo_read_to_none(struct oplock_info *opinfo)
  {
  	struct lease *lease = opinfo->o_lease;
  
@@ -3528,7 +2959,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	if (opinfo->level != SMB2_OPLOCK_LEVEL_II) {
  		pr_err("bad oplock(0x%x)\n", opinfo->level);
  		if (opinfo->is_lease)
-@@ -300,6 +399,7 @@ int opinfo_read_to_none(struct oplock_info *opinfo)
+@@ -329,6 +399,7 @@ int opinfo_read_to_none(struct oplock_info *opinfo)
  	opinfo->level = SMB2_OPLOCK_LEVEL_NONE;
  	if (opinfo->is_lease)
  		lease->state = lease->new_state;
@@ -3536,7 +2967,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  	return 0;
  }
  
-@@ -403,10 +503,24 @@ static void grant_write_oplock(struct oplock_info *opinfo_new, int req_oplock,
+@@ -432,10 +503,24 @@ static void grant_write_oplock(struct oplock_info *opinfo_new, int req_oplock,
  {
  	struct lease *lease = opinfo_new->o_lease;
  
@@ -3561,7 +2992,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  	if (lctx) {
  		lease->state = lctx->req_state;
-@@ -426,7 +540,14 @@ static void grant_read_oplock(struct oplock_info *opinfo_new,
+@@ -455,7 +540,14 @@ static void grant_read_oplock(struct oplock_info *opinfo_new,
  {
  	struct lease *lease = opinfo_new->o_lease;
  
@@ -3576,7 +3007,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  	if (lctx) {
  		lease->state = SMB2_LEASE_READ_CACHING_LE;
-@@ -448,7 +569,14 @@ static void grant_none_oplock(struct oplock_info *opinfo_new,
+@@ -477,7 +569,14 @@ static void grant_none_oplock(struct oplock_info *opinfo_new,
  {
  	struct lease *lease = opinfo_new->o_lease;
  
@@ -3591,7 +3022,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  	if (lctx) {
  		lease->state = 0;
-@@ -568,7 +696,7 @@ static void wake_up_oplock_break(struct oplock_info *opinfo)
+@@ -597,7 +696,7 @@ static void wake_up_oplock_break(struct oplock_info *opinfo)
  
  static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level)
  {
@@ -3600,7 +3031,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  		wait_on_bit(&opinfo->pending_break, 0, TASK_UNINTERRUPTIBLE);
  
  		/* Not immediately break to none. */
-@@ -596,6 +724,109 @@ static inline int allocate_oplock_break_buf(struct ksmbd_work *work)
+@@ -625,6 +724,109 @@ static inline int allocate_oplock_break_buf(struct ksmbd_work *work)
  	return 0;
  }
  
@@ -3708,53 +3139,9 @@ index d7d47b82451d..e3299bb75b3a 100644
 +#endif
 +
  /**
-  * __smb2_oplock_break_noti() - send smb2 oplock break cmd from conn
-  * to client
-@@ -666,13 +897,6 @@ static void __smb2_oplock_break_noti(struct work_struct *wk)
- 
- out:
- 	ksmbd_free_work_struct(work);
--	/*
--	 * Checking waitqueue to dropping pending requests on
--	 * disconnection. waitqueue_active is safe because it
--	 * uses atomic operation for condition.
--	 */
--	if (!atomic_dec_return(&conn->r_count) && waitqueue_active(&conn->r_count_q))
--		wake_up(&conn->r_count_q);
- }
- 
- /**
-@@ -706,7 +930,6 @@ static int smb2_oplock_break_noti(struct oplock_info *opinfo)
- 	work->conn = conn;
- 	work->sess = opinfo->sess;
- 
--	atomic_inc(&conn->r_count);
- 	if (opinfo->op_state == OPLOCK_ACK_WAIT) {
- 		INIT_WORK(&work->work, __smb2_oplock_break_noti);
- 		ksmbd_queue_work(work);
-@@ -776,13 +999,6 @@ static void __smb2_lease_break_noti(struct work_struct *wk)
- 
- out:
- 	ksmbd_free_work_struct(work);
--	/*
--	 * Checking waitqueue to dropping pending requests on
--	 * disconnection. waitqueue_active is safe because it
--	 * uses atomic operation for condition.
--	 */
--	if (!atomic_dec_return(&conn->r_count) && waitqueue_active(&conn->r_count_q))
--		wake_up(&conn->r_count_q);
- }
- 
- /**
-@@ -822,7 +1038,6 @@ static int smb2_lease_break_noti(struct oplock_info *opinfo)
- 	work->conn = conn;
- 	work->sess = opinfo->sess;
- 
--	atomic_inc(&conn->r_count);
- 	if (opinfo->op_state == OPLOCK_ACK_WAIT) {
- 		list_for_each_safe(tmp, t, &opinfo->interim_list) {
- 			struct ksmbd_work *in_work;
-@@ -920,10 +1135,20 @@ static int oplock_break(struct oplock_info *brk_opinfo, int req_op_level)
+  * __smb2_oplock_break_noti() - send smb2 oplock break cmd from conn
+  * to client
+@@ -933,10 +1135,20 @@ static int oplock_break(struct oplock_info *brk_opinfo, int req_op_level)
  			brk_opinfo->op_state = OPLOCK_ACK_WAIT;
  	}
  
@@ -3775,7 +3162,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  	ksmbd_debug(OPLOCK, "oplock granted = %d\n", brk_opinfo->level);
  	if (brk_opinfo->op_state == OPLOCK_CLOSING)
-@@ -1065,6 +1290,10 @@ static void set_oplock_level(struct oplock_info *opinfo, int level,
+@@ -1078,6 +1290,10 @@ static void set_oplock_level(struct oplock_info *opinfo, int level,
  			     struct lease_ctx_info *lctx)
  {
  	switch (level) {
@@ -3786,69 +3173,9 @@ index d7d47b82451d..e3299bb75b3a 100644
  	case SMB2_OPLOCK_LEVEL_BATCH:
  	case SMB2_OPLOCK_LEVEL_EXCLUSIVE:
  		grant_write_oplock(opinfo, level, lctx);
-@@ -1144,8 +1373,10 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
- 	}
- 	prev_opinfo = opinfo_get_list(ci);
- 	if (!prev_opinfo ||
--	    (prev_opinfo->level == SMB2_OPLOCK_LEVEL_NONE && lctx))
-+	    (prev_opinfo->level == SMB2_OPLOCK_LEVEL_NONE && lctx)) {
-+		opinfo_conn_put(prev_opinfo);
- 		goto set_lev;
-+	}
- 	prev_op_has_lease = prev_opinfo->is_lease;
- 	if (prev_op_has_lease)
- 		prev_op_state = prev_opinfo->o_lease->state;
-@@ -1153,19 +1384,19 @@ int smb_grant_oplock(struct ksmbd_work *work, int req_op_level, u64 pid,
- 	if (share_ret < 0 &&
- 	    prev_opinfo->level == SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
- 		err = share_ret;
--		opinfo_put(prev_opinfo);
-+		opinfo_conn_put(prev_opinfo);
- 		goto err_out;
- 	}
- 
- 	if (prev_opinfo->level != SMB2_OPLOCK_LEVEL_BATCH &&
- 	    prev_opinfo->level != SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
--		opinfo_put(prev_opinfo);
-+		opinfo_conn_put(prev_opinfo);
- 		goto op_break_not_needed;
- 	}
- 
- 	list_add(&work->interim_entry, &prev_opinfo->interim_list);
- 	err = oplock_break(prev_opinfo, SMB2_OPLOCK_LEVEL_II);
--	opinfo_put(prev_opinfo);
-+	opinfo_conn_put(prev_opinfo);
- 	if (err == -ENOENT)
- 		goto set_lev;
- 	/* Check all oplock was freed by close */
-@@ -1228,14 +1459,14 @@ static void smb_break_all_write_oplock(struct ksmbd_work *work,
- 		return;
- 	if (brk_opinfo->level != SMB2_OPLOCK_LEVEL_BATCH &&
- 	    brk_opinfo->level != SMB2_OPLOCK_LEVEL_EXCLUSIVE) {
--		opinfo_put(brk_opinfo);
-+		opinfo_conn_put(brk_opinfo);
- 		return;
- 	}
- 
- 	brk_opinfo->open_trunc = is_trunc;
- 	list_add(&work->interim_entry, &brk_opinfo->interim_list);
- 	oplock_break(brk_opinfo, SMB2_OPLOCK_LEVEL_II);
--	opinfo_put(brk_opinfo);
-+	opinfo_conn_put(brk_opinfo);
- }
+@@ -1286,14 +1502,44 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
+ 		}
  
- /**
-@@ -1263,15 +1494,52 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
- 	list_for_each_entry_rcu(brk_op, &ci->m_op_list, op_entry) {
- 		if (!atomic_inc_not_zero(&brk_op->refcount))
- 			continue;
-+
-+		atomic_inc(&brk_op->conn->r_count);
-+		if (ksmbd_conn_releasing(brk_op->conn)) {
-+			atomic_dec(&brk_op->conn->r_count);
-+			continue;
-+		}
-+
  		rcu_read_unlock();
 -		if (brk_op->is_lease && (brk_op->o_lease->state &
 -		    (~(SMB2_LEASE_READ_CACHING_LE |
@@ -3896,7 +3223,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  			ksmbd_debug(OPLOCK, "unexpected oplock(0x%x)\n",
  				    brk_op->level);
  			goto next;
-@@ -1282,6 +1550,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -1304,6 +1550,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
  		    brk_op->o_lease->new_state == SMB2_LEASE_NONE_LE &&
  		    atomic_read(&brk_op->breaking_cnt))
  			goto next;
@@ -3904,39 +3231,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  		if (op && op->is_lease && brk_op->is_lease &&
  		    !memcmp(conn->ClientGUID, brk_op->conn->ClientGUID,
-@@ -1292,7 +1561,7 @@ void smb_break_all_levII_oplock(struct ksmbd_work *work, struct ksmbd_file *fp,
- 		brk_op->open_trunc = is_trunc;
- 		oplock_break(brk_op, SMB2_OPLOCK_LEVEL_NONE);
- next:
--		opinfo_put(brk_op);
-+		opinfo_conn_put(brk_op);
- 		rcu_read_lock();
- 	}
- 	rcu_read_unlock();
-@@ -1449,11 +1718,12 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
-  * smb2_find_context_vals() - find a particular context info in open request
-  * @open_req:	buffer containing smb2 file open(create) request
-  * @tag:	context name to search for
-+ * @tag_len:	the length of tag
-  *
-  * Return:	pointer to requested context, NULL if @str context not found
-  *		or error pointer if name length is invalid.
-  */
--struct create_context *smb2_find_context_vals(void *open_req, const char *tag)
-+struct create_context *smb2_find_context_vals(void *open_req, const char *tag, int tag_len)
- {
- 	struct create_context *cc;
- 	unsigned int next = 0;
-@@ -1492,7 +1762,7 @@ struct create_context *smb2_find_context_vals(void *open_req, const char *tag)
- 			return ERR_PTR(-EINVAL);
- 
- 		name = (char *)cc + name_off;
--		if (memcmp(name, tag, name_len) == 0)
-+		if (name_len == tag_len && !memcmp(name, tag, name_len))
- 			return cc;
- 
- 		remain_len -= next;
-@@ -1608,9 +1878,19 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
+@@ -1631,9 +1878,19 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
  {
  	struct create_posix_rsp *buf;
  	struct inode *inode = file_inode(fp->filp);
@@ -3956,7 +3251,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  
  	buf = (struct create_posix_rsp *)cc;
  	memset(buf, 0, sizeof(struct create_posix_rsp));
-@@ -1648,13 +1928,31 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
+@@ -1671,13 +1928,31 @@ void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp)
  	/*
  	 * SidBuffer(44) contain two sids(Domain sid(28), UNIX group sid(16)).
  	 * Domain sid(28) = revision(1) + num_subauth(1) + authority(6) +
@@ -3991,7 +3286,7 @@ index d7d47b82451d..e3299bb75b3a 100644
  }
  
 diff --git a/fs/ksmbd/oplock.h b/fs/ksmbd/oplock.h
-index 09753448f779..94395e4804ce 100644
+index 4b0fe6da7694..94395e4804ce 100644
 --- a/fs/ksmbd/oplock.h
 +++ b/fs/ksmbd/oplock.h
 @@ -11,6 +11,14 @@
@@ -4019,30 +3314,11 @@ index 09753448f779..94395e4804ce 100644
  	bool			open_trunc;	/* truncate on open */
  	struct lease		*o_lease;
  	struct list_head        interim_list;
-@@ -118,7 +129,7 @@ void create_durable_v2_rsp_buf(char *cc, struct ksmbd_file *fp);
- void create_mxac_rsp_buf(char *cc, int maximal_access);
- void create_disk_id_rsp_buf(char *cc, __u64 file_id, __u64 vol_id);
- void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp);
--struct create_context *smb2_find_context_vals(void *open_req, const char *str);
-+struct create_context *smb2_find_context_vals(void *open_req, const char *tag, int tag_len);
- struct oplock_info *lookup_lease_in_table(struct ksmbd_conn *conn,
- 					  char *lease_key);
- int find_same_lease_key(struct ksmbd_session *sess, struct ksmbd_inode *ci,
 diff --git a/fs/ksmbd/server.c b/fs/ksmbd/server.c
-index 651d1d01234b..a730869ac32b 100644
+index 8a0ad399f245..a730869ac32b 100644
 --- a/fs/ksmbd/server.c
 +++ b/fs/ksmbd/server.c
-@@ -93,7 +93,8 @@ 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)) {
-+	if (ksmbd_conn_exiting(work->conn) ||
-+	    ksmbd_conn_need_reconnect(work->conn)) {
- 		rsp_hdr = work->response_buf;
- 		rsp_hdr->Status.CifsError = STATUS_CONNECTION_DISCONNECTED;
- 		return 1;
-@@ -415,7 +416,11 @@ int server_queue_ctrl_reset_work(void)
+@@ -416,7 +416,11 @@ int server_queue_ctrl_reset_work(void)
  	return __queue_ctrl_work(SERVER_CTRL_TYPE_RESET);
  }
  
@@ -4054,7 +3330,7 @@ index 651d1d01234b..a730869ac32b 100644
  			  char *buf)
  {
  	/*
-@@ -429,15 +434,18 @@ static ssize_t stats_show(struct class *class, struct class_attribute *attr,
+@@ -430,15 +434,18 @@ static ssize_t stats_show(struct class *class, struct class_attribute *attr,
  		"reset",
  		"shutdown"
  	};
@@ -4078,7 +3354,7 @@ index 651d1d01234b..a730869ac32b 100644
  				 size_t len)
  {
  	if (!sysfs_streq(buf, "hard"))
-@@ -457,7 +465,11 @@ static const char * const debug_type_strings[] = {"smb", "auth", "vfs",
+@@ -458,7 +465,11 @@ static const char * const debug_type_strings[] = {"smb", "auth", "vfs",
  						  "oplock", "ipc", "conn",
  						  "rdma"};
  
@@ -4090,7 +3366,7 @@ index 651d1d01234b..a730869ac32b 100644
  			  char *buf)
  {
  	ssize_t sz = 0;
-@@ -465,23 +477,21 @@ static ssize_t debug_show(struct class *class, struct class_attribute *attr,
+@@ -466,23 +477,21 @@ 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) {
@@ -4121,7 +3397,7 @@ index 651d1d01234b..a730869ac32b 100644
  			   const char *buf, size_t len)
  {
  	int i;
-@@ -521,7 +531,9 @@ ATTRIBUTE_GROUPS(ksmbd_control_class);
+@@ -522,7 +531,9 @@ ATTRIBUTE_GROUPS(ksmbd_control_class);
  
  static struct class ksmbd_control_class = {
  	.name		= "ksmbd-control",
@@ -4131,7 +3407,7 @@ index 651d1d01234b..a730869ac32b 100644
  	.class_groups	= ksmbd_control_class_groups,
  };
  
-@@ -585,9 +597,6 @@ static int __init ksmbd_server_init(void)
+@@ -586,9 +597,6 @@ static int __init ksmbd_server_init(void)
  	ret = ksmbd_workqueue_init();
  	if (ret)
  		goto err_crypto_destroy;
@@ -4141,15 +3417,7 @@ index 651d1d01234b..a730869ac32b 100644
  	return 0;
  
  err_crypto_destroy:
-@@ -614,6 +623,7 @@ static int __init ksmbd_server_init(void)
- static void __exit ksmbd_server_exit(void)
- {
- 	ksmbd_server_shutdown();
-+	rcu_barrier();
- 	ksmbd_release_inode_hash();
- }
- 
-@@ -623,6 +633,7 @@ MODULE_DESCRIPTION("Linux kernel CIFS/SMB SERVER");
+@@ -625,6 +633,7 @@ MODULE_DESCRIPTION("Linux kernel CIFS/SMB SERVER");
  MODULE_LICENSE("GPL");
  MODULE_SOFTDEP("pre: ecb");
  MODULE_SOFTDEP("pre: hmac");
@@ -14715,7 +13983,7 @@ index 000000000000..e470c8e94e68
 +extern int smb_process_exit(struct ksmbd_work *work);
 +#endif /* __SMB1PDU_H */
 diff --git a/fs/ksmbd/smb2misc.c b/fs/ksmbd/smb2misc.c
-index fbdde426dd01..dc09d815d3e5 100644
+index 0ffe663b7590..dc09d815d3e5 100644
 --- a/fs/ksmbd/smb2misc.c
 +++ b/fs/ksmbd/smb2misc.c
 @@ -6,6 +6,7 @@
@@ -14726,19 +13994,6 @@ index fbdde426dd01..dc09d815d3e5 100644
  #include "smb_common.h"
  #include "smbstatus.h"
  #include "mgmt/user_session.h"
-@@ -416,8 +417,11 @@ int ksmbd_smb2_check_message(struct ksmbd_work *work)
- 
- 		/*
- 		 * Allow a message that padded to 8byte boundary.
-+		 * Linux 4.19.217 with smb 3.0.2 are sometimes
-+		 * sending messages where the cls_len is exactly
-+		 * 8 bytes less than len.
- 		 */
--		if (clc_len < len && (len - clc_len) < 8)
-+		if (clc_len < len && (len - clc_len) <= 8)
- 			goto validate_credit;
- 
- 		pr_err_ratelimited(
 diff --git a/fs/ksmbd/smb2ops.c b/fs/ksmbd/smb2ops.c
 index ab23da2120b9..8c26b11c33bb 100644
 --- a/fs/ksmbd/smb2ops.c
@@ -14869,7 +14124,7 @@ index ab23da2120b9..8c26b11c33bb 100644
  	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
  		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
 diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c
-index 5de7b41d6404..273dd9cfd663 100644
+index 01887570efe8..273dd9cfd663 100644
 --- a/fs/ksmbd/smb2pdu.c
 +++ b/fs/ksmbd/smb2pdu.c
 @@ -11,9 +11,15 @@
@@ -14888,56 +14143,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  #include "smbfsctl.h"
  #include "oplock.h"
  #include "smbacl.h"
-@@ -74,14 +80,7 @@ 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)
- {
--	struct channel *chann;
--
--	list_for_each_entry(chann, &sess->ksmbd_chann_list, chann_list) {
--		if (chann->conn == conn)
--			return chann;
--	}
--
--	return NULL;
-+	return xa_load(&sess->ksmbd_chann_list, (long)conn);
- }
- 
- /**
-@@ -254,7 +253,7 @@ int init_smb2_neg_rsp(struct ksmbd_work *work)
- 
- 	rsp = smb2_get_msg(work->response_buf);
- 
--	WARN_ON(ksmbd_conn_good(work));
-+	WARN_ON(ksmbd_conn_good(conn));
- 
- 	rsp->StructureSize = cpu_to_le16(65);
- 	ksmbd_debug(SMB, "conn->dialect 0x%x\n", conn->dialect);
-@@ -284,7 +283,7 @@ int init_smb2_neg_rsp(struct ksmbd_work *work)
- 		rsp->SecurityMode |= SMB2_NEGOTIATE_SIGNING_REQUIRED_LE;
- 	conn->use_spnego = true;
- 
--	ksmbd_conn_set_need_negotiate(work);
-+	ksmbd_conn_set_need_negotiate(conn);
- 	return 0;
- }
- 
-@@ -333,13 +332,9 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
- 	if (hdr->Command == SMB2_NEGOTIATE)
- 		aux_max = 1;
- 	else
--		aux_max = conn->vals->max_credits - credit_charge;
-+		aux_max = conn->vals->max_credits - conn->total_credits;
- 	credits_granted = min_t(unsigned short, credits_requested, aux_max);
- 
--	if (conn->vals->max_credits - conn->total_credits < credits_granted)
--		credits_granted = conn->vals->max_credits -
--			conn->total_credits;
--
- 	conn->total_credits += credits_granted;
- 	work->credits_granted += credits_granted;
- 
-@@ -502,12 +497,6 @@ int init_smb2_rsp_hdr(struct ksmbd_work *work)
+@@ -491,12 +497,6 @@ int init_smb2_rsp_hdr(struct ksmbd_work *work)
  	rsp_hdr->SessionId = rcv_hdr->SessionId;
  	memcpy(rsp_hdr->Signature, rcv_hdr->Signature, 16);
  
@@ -14950,34 +14156,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	return 0;
  }
  
-@@ -574,7 +563,7 @@ int smb2_check_user_session(struct ksmbd_work *work)
- 	    cmd == SMB2_SESSION_SETUP_HE)
- 		return 0;
- 
--	if (!ksmbd_conn_good(work))
-+	if (!ksmbd_conn_good(conn))
- 		return -EINVAL;
- 
- 	sess_id = le64_to_cpu(req_hdr->SessionId);
-@@ -592,6 +581,7 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
- 	struct ksmbd_session *prev_sess = ksmbd_session_lookup_slowpath(id);
- 	struct ksmbd_user *prev_user;
- 	struct channel *chann;
-+	long index;
- 
- 	if (!prev_sess)
- 		return;
-@@ -605,14 +595,13 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
- 		return;
- 
- 	prev_sess->state = SMB2_SESSION_EXPIRED;
--	write_lock(&prev_sess->chann_lock);
--	list_for_each_entry(chann, &prev_sess->ksmbd_chann_list, chann_list)
--		chann->conn->status = KSMBD_SESS_EXITING;
--	write_unlock(&prev_sess->chann_lock);
-+	xa_for_each(&prev_sess->ksmbd_chann_list, index, chann)
-+		ksmbd_conn_set_exiting(chann->conn);
- }
+@@ -601,6 +601,7 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
  
  /**
   * smb2_get_name() - get filename string from on the wire smb format
@@ -14985,7 +14164,7 @@ index 5de7b41d6404..273dd9cfd663 100644
   * @src:	source buffer
   * @maxlen:	maxlen of source string
   * @local_nls:	nls_table pointer
-@@ -620,7 +609,8 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
+@@ -608,7 +609,8 @@ static void destroy_previous_session(struct ksmbd_conn *conn,
   * Return:      matching converted filename on success, otherwise error ptr
   */
  static char *
@@ -14995,7 +14174,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  {
  	char *name;
  
-@@ -649,7 +639,7 @@ int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg)
+@@ -637,7 +639,7 @@ int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg)
  		pr_err("Failed to alloc async message id\n");
  		return id;
  	}
@@ -15004,7 +14183,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	work->async_id = id;
  	rsp_hdr->Id.AsyncId = cpu_to_le64(id);
  
-@@ -669,6 +659,24 @@ int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg)
+@@ -657,6 +659,24 @@ int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), void **arg)
  	return 0;
  }
  
@@ -15029,7 +14208,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status)
  {
  	struct smb2_hdr *rsp_hdr;
-@@ -714,17 +722,17 @@ static int smb2_get_dos_mode(struct kstat *stat, int attribute)
+@@ -702,17 +722,17 @@ static int smb2_get_dos_mode(struct kstat *stat, int attribute)
  	int attr = 0;
  
  	if (S_ISDIR(stat->mode)) {
@@ -15053,7 +14232,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  
  	return attr;
-@@ -752,19 +760,6 @@ static void build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt,
+@@ -740,19 +760,6 @@ static void build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt,
  	pneg_ctxt->Ciphers[0] = cipher_type;
  }
  
@@ -15073,7 +14252,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  static void build_sign_cap_ctxt(struct smb2_signing_capabilities *pneg_ctxt,
  				__le16 sign_algo)
  {
-@@ -804,7 +799,7 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn,
+@@ -792,7 +799,7 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn,
  				  struct smb2_negotiate_rsp *rsp,
  				  void *smb2_buf_len)
  {
@@ -15082,7 +14261,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			le32_to_cpu(rsp->NegotiateContextOffset);
  	int neg_ctxt_cnt = 1;
  	int ctxt_size;
-@@ -813,80 +808,61 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn,
+@@ -801,107 +808,79 @@ static void assemble_neg_contexts(struct ksmbd_conn *conn,
  		    "assemble SMB2_PREAUTH_INTEGRITY_CAPABILITIES context\n");
  	build_preauth_ctxt((struct smb2_preauth_neg_context *)pneg_ctxt,
  			   conn->preauth_info->Preauth_HashId);
@@ -15159,14 +14338,15 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  static __le32 decode_preauth_ctxt(struct ksmbd_conn *conn,
 -				  struct smb2_preauth_neg_context *pneg_ctxt,
--				  int len_of_ctxts)
+-				  int ctxt_len)
 +				  struct smb2_preauth_neg_context *pneg_ctxt)
  {
 -	/*
 -	 * sizeof(smb2_preauth_neg_context) assumes SMB311_SALT_SIZE Salt,
 -	 * which may not be present. Only check for used HashAlgorithms[1].
 -	 */
--	if (len_of_ctxts < MIN_PREAUTH_CTXT_DATA_LEN)
+-	if (ctxt_len <
+-	    sizeof(struct smb2_neg_context) + MIN_PREAUTH_CTXT_DATA_LEN)
 -		return STATUS_INVALID_PARAMETER;
 +	__le32 err = STATUS_NO_PREAUTH_INTEGRITY_HASH_OVERLAP;
  
@@ -15184,7 +14364,29 @@ index 5de7b41d6404..273dd9cfd663 100644
  }
  
  static void decode_encrypt_ctxt(struct ksmbd_conn *conn,
-@@ -904,7 +880,7 @@ static void decode_encrypt_ctxt(struct ksmbd_conn *conn,
+ 				struct smb2_encryption_neg_context *pneg_ctxt,
+-				int ctxt_len)
++				int len_of_ctxts)
+ {
+-	int cph_cnt;
+-	int i, cphs_size;
+-
+-	if (sizeof(struct smb2_encryption_neg_context) > ctxt_len) {
+-		pr_err("Invalid SMB2_ENCRYPTION_CAPABILITIES context size\n");
+-		return;
+-	}
++	int cph_cnt = le16_to_cpu(pneg_ctxt->CipherCount);
++	int i, cphs_size = cph_cnt * sizeof(__le16);
+ 
+ 	conn->cipher_type = 0;
+ 
+-	cph_cnt = le16_to_cpu(pneg_ctxt->CipherCount);
+-	cphs_size = cph_cnt * sizeof(__le16);
+-
+ 	if (sizeof(struct smb2_encryption_neg_context) + cphs_size >
+-	    ctxt_len) {
++	    len_of_ctxts) {
+ 		pr_err("Invalid cipher count(%d)\n", cph_cnt);
  		return;
  	}
  
@@ -15193,7 +14395,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		return;
  
  	for (i = 0; i < cph_cnt; i++) {
-@@ -940,7 +916,7 @@ bool smb3_encryption_negotiated(struct ksmbd_conn *conn)
+@@ -937,36 +916,29 @@ bool smb3_encryption_negotiated(struct ksmbd_conn *conn)
  }
  
  static void decode_compress_ctxt(struct ksmbd_conn *conn,
@@ -15202,7 +14404,31 @@ index 5de7b41d6404..273dd9cfd663 100644
  {
  	conn->compress_algorithm = SMB3_COMPRESS_NONE;
  }
-@@ -961,8 +937,8 @@ static void decode_sign_cap_ctxt(struct ksmbd_conn *conn,
+ 
+ static void decode_sign_cap_ctxt(struct ksmbd_conn *conn,
+ 				 struct smb2_signing_capabilities *pneg_ctxt,
+-				 int ctxt_len)
++				 int len_of_ctxts)
+ {
+-	int sign_algo_cnt;
+-	int i, sign_alos_size;
+-
+-	if (sizeof(struct smb2_signing_capabilities) > ctxt_len) {
+-		pr_err("Invalid SMB2_SIGNING_CAPABILITIES context length\n");
+-		return;
+-	}
++	int sign_algo_cnt = le16_to_cpu(pneg_ctxt->SigningAlgorithmCount);
++	int i, sign_alos_size = sign_algo_cnt * sizeof(__le16);
+ 
+ 	conn->signing_negotiated = false;
+-	sign_algo_cnt = le16_to_cpu(pneg_ctxt->SigningAlgorithmCount);
+-	sign_alos_size = sign_algo_cnt * sizeof(__le16);
+ 
+ 	if (sizeof(struct smb2_signing_capabilities) + sign_alos_size >
+-	    ctxt_len) {
++	    len_of_ctxts) {
+ 		pr_err("Invalid signing algorithm count(%d)\n", sign_algo_cnt);
+ 		return;
  	}
  
  	for (i = 0; i < sign_algo_cnt; i++) {
@@ -15213,17 +14439,49 @@ index 5de7b41d6404..273dd9cfd663 100644
  			ksmbd_debug(SMB, "Signing Algorithm ID = 0x%x\n",
  				    pneg_ctxt->SigningAlgorithms[i]);
  			conn->signing_negotiated = true;
-@@ -1014,8 +990,7 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
+@@ -997,16 +969,18 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
+ 	len_of_ctxts = len_of_smb - offset;
+ 
+ 	while (i++ < neg_ctxt_cnt) {
+-		int clen, ctxt_len;
++		int clen;
++
++		/* check that offset is not beyond end of SMB */
++		if (len_of_ctxts == 0)
++			break;
+ 
+ 		if (len_of_ctxts < sizeof(struct smb2_neg_context))
+ 			break;
+ 
+ 		pctx = (struct smb2_neg_context *)((char *)pctx + offset);
+ 		clen = le16_to_cpu(pctx->DataLength);
+-		ctxt_len = clen + sizeof(struct smb2_neg_context);
+-
+-		if (ctxt_len > len_of_ctxts)
++		if (clen + sizeof(struct smb2_neg_context) > len_of_ctxts)
+ 			break;
+ 
+ 		if (pctx->ContextType == SMB2_PREAUTH_INTEGRITY_CAPABILITIES) {
+@@ -1016,8 +990,7 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
  				break;
  
  			status = decode_preauth_ctxt(conn,
 -						     (struct smb2_preauth_neg_context *)pctx,
--						     len_of_ctxts);
+-						     ctxt_len);
 +						     (struct smb2_preauth_neg_context *)pctx);
  			if (status != STATUS_SUCCESS)
  				break;
  		} else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) {
-@@ -1034,7 +1009,7 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
+@@ -1028,7 +1001,7 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
+ 
+ 			decode_encrypt_ctxt(conn,
+ 					    (struct smb2_encryption_neg_context *)pctx,
+-					    ctxt_len);
++					    len_of_ctxts);
+ 		} else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) {
+ 			ksmbd_debug(SMB,
+ 				    "deassemble SMB2_COMPRESSION_CAPABILITIES context\n");
+@@ -1036,7 +1009,7 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
  				break;
  
  			decode_compress_ctxt(conn,
@@ -15232,16 +14490,41 @@ index 5de7b41d6404..273dd9cfd663 100644
  		} else if (pctx->ContextType == SMB2_NETNAME_NEGOTIATE_CONTEXT_ID) {
  			ksmbd_debug(SMB,
  				    "deassemble SMB2_NETNAME_NEGOTIATE_CONTEXT_ID context\n");
-@@ -1075,7 +1050,7 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
- 
- 	ksmbd_debug(SMB, "Received negotiate request\n");
- 	conn->need_neg = false;
--	if (ksmbd_conn_good(work)) {
-+	if (ksmbd_conn_good(conn)) {
- 		pr_err("conn->tcp_status is already in CifsGood State\n");
- 		work->send_no_response = 1;
+@@ -1047,10 +1020,9 @@ static __le32 deassemble_neg_contexts(struct ksmbd_conn *conn,
+ 		} else if (pctx->ContextType == SMB2_SIGNING_CAPABILITIES) {
+ 			ksmbd_debug(SMB,
+ 				    "deassemble SMB2_SIGNING_CAPABILITIES context\n");
+-
+ 			decode_sign_cap_ctxt(conn,
+ 					     (struct smb2_signing_capabilities *)pctx,
+-					     ctxt_len);
++					     len_of_ctxts);
+ 		}
+ 
+ 		/* offsets must be 8 byte aligned */
+@@ -1084,16 +1056,16 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
  		return rc;
-@@ -1174,6 +1149,13 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
+ 	}
+ 
+-	smb2_buf_len = get_rfc1002_len(work->request_buf);
+-	smb2_neg_size = offsetof(struct smb2_negotiate_req, Dialects);
+-	if (smb2_neg_size > smb2_buf_len) {
++	if (req->DialectCount == 0) {
++		pr_err("malformed packet\n");
+ 		rsp->hdr.Status = STATUS_INVALID_PARAMETER;
+ 		rc = -EINVAL;
+ 		goto err_out;
+ 	}
+ 
+-	if (req->DialectCount == 0) {
+-		pr_err("malformed packet\n");
++	smb2_buf_len = get_rfc1002_len(work->request_buf);
++	smb2_neg_size = offsetof(struct smb2_negotiate_req, Dialects);
++	if (smb2_neg_size > smb2_buf_len) {
+ 		rsp->hdr.Status = STATUS_INVALID_PARAMETER;
+ 		rc = -EINVAL;
+ 		goto err_out;
+@@ -1177,6 +1149,13 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
  	case SMB21_PROT_ID:
  		init_smb2_1_server(conn);
  		break;
@@ -15255,7 +14538,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	case SMB2X_PROT_ID:
  	case BAD_PROT_ID:
  	default:
-@@ -1192,9 +1174,11 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
+@@ -1195,9 +1174,11 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
  	rsp->MaxReadSize = cpu_to_le32(conn->vals->max_read_size);
  	rsp->MaxWriteSize = cpu_to_le32(conn->vals->max_write_size);
  
@@ -15270,54 +14553,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	rsp->StructureSize = cpu_to_le16(65);
  	rsp->DialectRevision = cpu_to_le16(conn->dialect);
-@@ -1230,7 +1214,7 @@ int smb2_handle_negotiate(struct ksmbd_work *work)
- 	}
- 
- 	conn->srv_sec_mode = le16_to_cpu(rsp->SecurityMode);
--	ksmbd_conn_set_need_negotiate(work);
-+	ksmbd_conn_set_need_negotiate(conn);
- 
- err_out:
- 	if (rc < 0)
-@@ -1381,7 +1365,7 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
- 	struct authenticate_message *authblob;
- 	struct ksmbd_user *user;
- 	char *name;
--	unsigned int auth_msg_len, name_off, name_len, secbuf_len;
-+	unsigned int name_off, name_len, secbuf_len;
- 
- 	secbuf_len = le16_to_cpu(req->SecurityBufferLength);
- 	if (secbuf_len < sizeof(struct authenticate_message)) {
-@@ -1391,9 +1375,8 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
- 	authblob = user_authblob(conn, req);
- 	name_off = le32_to_cpu(authblob->UserName.BufferOffset);
- 	name_len = le16_to_cpu(authblob->UserName.Length);
--	auth_msg_len = le16_to_cpu(req->SecurityBufferOffset) + secbuf_len;
- 
--	if (auth_msg_len < (u64)name_off + name_len)
-+	if (secbuf_len < (u64)name_off + name_len)
- 		return NULL;
- 
- 	name = smb_strndup_from_utf16((const char *)authblob + name_off,
-@@ -1456,7 +1439,7 @@ static int ntlm_authenticate(struct ksmbd_work *work)
- 		 * Reuse session if anonymous try to connect
- 		 * on reauthetication.
- 		 */
--		if (ksmbd_anonymous_user(user)) {
-+		if (conn->binding == false && ksmbd_anonymous_user(user)) {
- 			ksmbd_free_user(user);
- 			return 0;
- 		}
-@@ -1470,7 +1453,7 @@ static int ntlm_authenticate(struct ksmbd_work *work)
- 		sess->user = user;
- 	}
- 
--	if (user_guest(sess->user)) {
-+	if (conn->binding == false && user_guest(sess->user)) {
- 		rsp->SessionFlags = SMB2_SESSION_FLAG_IS_GUEST_LE;
- 	} else {
- 		struct authenticate_message *authblob;
-@@ -1510,7 +1493,8 @@ static int ntlm_authenticate(struct ksmbd_work *work)
+@@ -1512,7 +1493,8 @@ static int ntlm_authenticate(struct ksmbd_work *work)
  			return -EINVAL;
  		}
  		sess->enc = true;
@@ -15327,28 +14563,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		/*
  		 * signing is disable if encryption is enable
  		 * on this session
-@@ -1520,19 +1504,14 @@ static int ntlm_authenticate(struct ksmbd_work *work)
- 
- binding_session:
- 	if (conn->dialect >= SMB30_PROT_ID) {
--		read_lock(&sess->chann_lock);
- 		chann = lookup_chann_list(sess, conn);
--		read_unlock(&sess->chann_lock);
- 		if (!chann) {
- 			chann = kmalloc(sizeof(struct channel), GFP_KERNEL);
- 			if (!chann)
- 				return -ENOMEM;
- 
- 			chann->conn = conn;
--			INIT_LIST_HEAD(&chann->chann_list);
--			write_lock(&sess->chann_lock);
--			list_add(&chann->chann_list, &sess->ksmbd_chann_list);
--			write_unlock(&sess->chann_lock);
-+			xa_store(&sess->ksmbd_chann_list, (long)conn, chann, GFP_KERNEL);
- 		}
- 	}
- 
-@@ -1544,9 +1523,11 @@ static int ntlm_authenticate(struct ksmbd_work *work)
+@@ -1541,9 +1523,11 @@ static int ntlm_authenticate(struct ksmbd_work *work)
  		}
  	}
  
@@ -15363,7 +14578,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  	return 0;
  }
-@@ -1601,24 +1582,20 @@ static int krb5_authenticate(struct ksmbd_work *work)
+@@ -1598,7 +1582,8 @@ static int krb5_authenticate(struct ksmbd_work *work)
  			return -EINVAL;
  		}
  		sess->enc = true;
@@ -15373,25 +14588,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		sess->sign = false;
  	}
  
- 	if (conn->dialect >= SMB30_PROT_ID) {
--		read_lock(&sess->chann_lock);
- 		chann = lookup_chann_list(sess, conn);
--		read_unlock(&sess->chann_lock);
- 		if (!chann) {
- 			chann = kmalloc(sizeof(struct channel), GFP_KERNEL);
- 			if (!chann)
- 				return -ENOMEM;
- 
- 			chann->conn = conn;
--			INIT_LIST_HEAD(&chann->chann_list);
--			write_lock(&sess->chann_lock);
--			list_add(&chann->chann_list, &sess->ksmbd_chann_list);
--			write_unlock(&sess->chann_lock);
-+			xa_store(&sess->ksmbd_chann_list, (long)conn, chann, GFP_KERNEL);
- 		}
- 	}
- 
-@@ -1630,9 +1607,11 @@ static int krb5_authenticate(struct ksmbd_work *work)
+@@ -1622,9 +1607,11 @@ static int krb5_authenticate(struct ksmbd_work *work)
  		}
  	}
  
@@ -15406,187 +14603,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  	return 0;
  }
-@@ -1661,6 +1640,7 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 	rsp->SecurityBufferLength = 0;
- 	inc_rfc1001_len(work->response_buf, 9);
- 
-+	ksmbd_conn_lock(conn);
- 	if (!req->hdr.SessionId) {
- 		sess = ksmbd_smb2_session_create();
- 		if (!sess) {
-@@ -1708,11 +1688,22 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 			goto out_err;
- 		}
- 
-+		if (ksmbd_conn_need_reconnect(conn)) {
-+			rc = -EFAULT;
-+			sess = NULL;
-+			goto out_err;
-+		}
-+
- 		if (ksmbd_session_lookup(conn, sess_id)) {
- 			rc = -EACCES;
- 			goto out_err;
- 		}
- 
-+		if (user_guest(sess->user)) {
-+			rc = -EOPNOTSUPP;
-+			goto out_err;
-+		}
-+
- 		conn->binding = true;
- 	} else if ((conn->dialect < SMB30_PROT_ID ||
- 		    server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL) &&
-@@ -1727,12 +1718,20 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 			rc = -ENOENT;
- 			goto out_err;
- 		}
-+
-+		if (sess->state == SMB2_SESSION_EXPIRED) {
-+			rc = -EFAULT;
-+			goto out_err;
-+		}
-+
-+		if (ksmbd_conn_need_reconnect(conn)) {
-+			rc = -EFAULT;
-+			sess = NULL;
-+			goto out_err;
-+		}
- 	}
- 	work->sess = sess;
- 
--	if (sess->state == SMB2_SESSION_EXPIRED)
--		sess->state = SMB2_SESSION_IN_PROGRESS;
--
- 	negblob_off = le16_to_cpu(req->SecurityBufferOffset);
- 	negblob_len = le16_to_cpu(req->SecurityBufferLength);
- 	if (negblob_off < offsetof(struct smb2_sess_setup_req, Buffer) ||
-@@ -1762,8 +1761,10 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 				goto out_err;
- 			}
- 
--			ksmbd_conn_set_good(work);
--			sess->state = SMB2_SESSION_VALID;
-+			if (!ksmbd_conn_need_reconnect(conn)) {
-+				ksmbd_conn_set_good(conn);
-+				sess->state = SMB2_SESSION_VALID;
-+			}
- 			kfree(sess->Preauth_HashValue);
- 			sess->Preauth_HashValue = NULL;
- 		} else if (conn->preferred_auth_mech == KSMBD_AUTH_NTLMSSP) {
-@@ -1785,8 +1786,10 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 				if (rc)
- 					goto out_err;
- 
--				ksmbd_conn_set_good(work);
--				sess->state = SMB2_SESSION_VALID;
-+				if (!ksmbd_conn_need_reconnect(conn)) {
-+					ksmbd_conn_set_good(conn);
-+					sess->state = SMB2_SESSION_VALID;
-+				}
- 				if (conn->binding) {
- 					struct preauth_session *preauth_sess;
- 
-@@ -1799,6 +1802,10 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 				}
- 				kfree(sess->Preauth_HashValue);
- 				sess->Preauth_HashValue = NULL;
-+			} else {
-+				pr_info_ratelimited("Unknown NTLMSSP message type : 0x%x\n",
-+						le32_to_cpu(negblob->MessageType));
-+				rc = -EINVAL;
- 			}
- 		} else {
- 			/* TODO: need one more negotiation */
-@@ -1821,6 +1828,8 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 		rsp->hdr.Status = STATUS_NETWORK_SESSION_EXPIRED;
- 	else if (rc == -ENOMEM)
- 		rsp->hdr.Status = STATUS_INSUFFICIENT_RESOURCES;
-+	else if (rc == -EOPNOTSUPP)
-+		rsp->hdr.Status = STATUS_NOT_SUPPORTED;
- 	else if (rc)
- 		rsp->hdr.Status = STATUS_LOGON_FAILURE;
- 
-@@ -1848,14 +1857,17 @@ int smb2_sess_setup(struct ksmbd_work *work)
- 			if (sess->user && sess->user->flags & KSMBD_USER_FLAG_DELAY_SESSION)
- 				try_delay = true;
- 
--			xa_erase(&conn->sessions, sess->id);
--			ksmbd_session_destroy(sess);
--			work->sess = NULL;
--			if (try_delay)
-+			sess->last_active = jiffies;
-+			sess->state = SMB2_SESSION_EXPIRED;
-+			if (try_delay) {
-+				ksmbd_conn_set_need_reconnect(conn);
- 				ssleep(5);
-+				ksmbd_conn_set_need_negotiate(conn);
-+			}
- 		}
- 	}
- 
-+	ksmbd_conn_unlock(conn);
- 	return rc;
- }
- 
-@@ -2053,11 +2065,12 @@ int smb2_tree_disconnect(struct ksmbd_work *work)
- 
- 	ksmbd_debug(SMB, "request\n");
- 
--	if (!tcon) {
-+	if (!tcon || test_and_set_bit(TREE_CONN_EXPIRE, &tcon->status)) {
- 		struct smb2_tree_disconnect_req *req =
- 			smb2_get_msg(work->request_buf);
- 
- 		ksmbd_debug(SMB, "Invalid tid %d\n", req->hdr.Id.SyncId.TreeId);
-+
- 		rsp->hdr.Status = STATUS_NETWORK_NAME_DELETED;
- 		smb2_set_err_rsp(work);
- 		return 0;
-@@ -2079,21 +2092,25 @@ int smb2_session_logoff(struct ksmbd_work *work)
- {
- 	struct ksmbd_conn *conn = work->conn;
- 	struct smb2_logoff_rsp *rsp = smb2_get_msg(work->response_buf);
--	struct ksmbd_session *sess = work->sess;
-+	struct ksmbd_session *sess;
-+	struct smb2_logoff_req *req = smb2_get_msg(work->request_buf);
-+	u64 sess_id = le64_to_cpu(req->hdr.SessionId);
- 
- 	rsp->StructureSize = cpu_to_le16(4);
- 	inc_rfc1001_len(work->response_buf, 4);
- 
- 	ksmbd_debug(SMB, "request\n");
- 
--	/* setting CifsExiting here may race with start_tcp_sess */
--	ksmbd_conn_set_need_reconnect(work);
-+	ksmbd_all_conn_set_status(sess_id, KSMBD_SESS_NEED_RECONNECT);
- 	ksmbd_close_session_fds(work);
--	ksmbd_conn_wait_idle(conn);
-+	ksmbd_conn_wait_idle(conn, sess_id);
- 
-+	/*
-+	 * Re-lookup session to validate if session is deleted
-+	 * while waiting request complete
-+	 */
-+	sess = ksmbd_session_lookup_all(conn, sess_id);
- 	if (ksmbd_tree_conn_session_logoff(sess)) {
--		struct smb2_logoff_req *req = smb2_get_msg(work->request_buf);
--
- 		ksmbd_debug(SMB, "Invalid tid %d\n", req->hdr.Id.SyncId.TreeId);
- 		rsp->hdr.Status = STATUS_NETWORK_NAME_DELETED;
- 		smb2_set_err_rsp(work);
-@@ -2105,9 +2122,7 @@ int smb2_session_logoff(struct ksmbd_work *work)
- 
- 	ksmbd_free_user(sess->user);
- 	sess->user = NULL;
--
--	/* let start_tcp_sess free connection info now */
--	ksmbd_conn_set_need_negotiate(work);
-+	ksmbd_all_conn_set_status(sess_id, KSMBD_SESS_NEED_NEGOTIATE);
- 	return 0;
- }
- 
-@@ -2143,7 +2158,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
+@@ -2171,7 +2158,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
  	rsp->hdr.Status = STATUS_SUCCESS;
  	rsp->StructureSize = cpu_to_le16(89);
  	rsp->OplockLevel = SMB2_OPLOCK_LEVEL_NONE;
@@ -15595,7 +14612,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	rsp->CreateAction = cpu_to_le32(FILE_OPENED);
  
  	rsp->CreationTime = cpu_to_le64(0);
-@@ -2151,7 +2166,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
+@@ -2179,7 +2166,7 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
  	rsp->ChangeTime = cpu_to_le64(0);
  	rsp->AllocationSize = cpu_to_le64(0);
  	rsp->EndofFile = cpu_to_le64(0);
@@ -15604,7 +14621,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	rsp->Reserved2 = 0;
  	rsp->VolatileFileId = id;
  	rsp->PersistentFileId = 0;
-@@ -2192,7 +2207,11 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
+@@ -2220,7 +2207,11 @@ static noinline int create_smb2_pipe(struct ksmbd_work *work)
  static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
  		       const struct path *path)
  {
@@ -15616,7 +14633,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	char *attr_name = NULL, *value;
  	int rc = 0;
  	unsigned int next = 0;
-@@ -2228,7 +2247,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
+@@ -2256,7 +2247,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
  		value = (char *)&eabuf->name + eabuf->EaNameLength + 1;
  
  		if (!eabuf->EaValueLength) {
@@ -15628,7 +14645,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						     path->dentry,
  						     attr_name,
  						     XATTR_USER_PREFIX_LEN +
-@@ -2236,7 +2259,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
+@@ -2264,7 +2259,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
  
  			/* delete the EA only when it exits */
  			if (rc > 0) {
@@ -15640,7 +14657,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  							    path->dentry,
  							    attr_name);
  
-@@ -2251,7 +2278,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
+@@ -2279,7 +2278,11 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len,
  			/* if the EA doesn't exist, just do nothing. */
  			rc = 0;
  		} else {
@@ -15652,7 +14669,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						path->dentry, attr_name, value,
  						le16_to_cpu(eabuf->EaValueLength), 0);
  			if (rc < 0) {
-@@ -2281,7 +2312,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
+@@ -2309,7 +2312,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
  					       struct ksmbd_file *fp,
  					       char *stream_name, int s_type)
  {
@@ -15664,7 +14681,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	size_t xattr_stream_size;
  	char *xattr_stream_name;
  	int rc;
-@@ -2297,7 +2332,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
+@@ -2325,7 +2332,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
  	fp->stream.size = xattr_stream_size;
  
  	/* Check if there is stream prefix in xattr space */
@@ -15676,7 +14693,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				     path->dentry,
  				     xattr_stream_name,
  				     xattr_stream_size);
-@@ -2309,7 +2348,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
+@@ -2337,7 +2348,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
  		return -EBADF;
  	}
  
@@ -15688,7 +14705,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				xattr_stream_name, NULL, 0, 0);
  	if (rc < 0)
  		pr_err("Failed to store XATTR stream name :%d\n", rc);
-@@ -2318,7 +2361,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
+@@ -2346,7 +2361,11 @@ static noinline int smb2_set_stream_name_xattr(const struct path *path,
  
  static int smb2_remove_smb_xattrs(const struct path *path)
  {
@@ -15700,7 +14717,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	char *name, *xattr_list = NULL;
  	ssize_t xattr_list_len;
  	int err = 0;
-@@ -2338,8 +2385,13 @@ static int smb2_remove_smb_xattrs(const struct path *path)
+@@ -2366,8 +2385,13 @@ static int smb2_remove_smb_xattrs(const struct path *path)
  		if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
  		    !strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX,
  			     STREAM_PREFIX_LEN)) {
@@ -15714,7 +14731,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			if (err)
  				ksmbd_debug(SMB, "remove xattr failed : %s\n",
  					    name);
-@@ -2385,8 +2437,13 @@ static void smb2_new_xattrs(struct ksmbd_tree_connect *tcon, const struct path *
+@@ -2413,8 +2437,13 @@ static void smb2_new_xattrs(struct ksmbd_tree_connect *tcon, const struct path *
  	da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
  		XATTR_DOSINFO_ITIME;
  
@@ -15728,7 +14745,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	if (rc)
  		ksmbd_debug(SMB, "failed to store file attribute into xattr\n");
  }
-@@ -2397,15 +2454,20 @@ static void smb2_update_xattrs(struct ksmbd_tree_connect *tcon,
+@@ -2425,15 +2454,20 @@ static void smb2_update_xattrs(struct ksmbd_tree_connect *tcon,
  	struct xattr_dos_attrib da;
  	int rc;
  
@@ -15750,16 +14767,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	if (rc > 0) {
  		fp->f_ci->m_fattr = cpu_to_le32(da.attr);
  		fp->create_time = da.create_time;
-@@ -2461,7 +2523,7 @@ static int smb2_create_sd_buffer(struct ksmbd_work *work,
- 		return -ENOENT;
- 
- 	/* Parse SD BUFFER create contexts */
--	context = smb2_find_context_vals(req, SMB2_CREATE_SD_BUFFER);
-+	context = smb2_find_context_vals(req, SMB2_CREATE_SD_BUFFER, 4);
- 	if (!context)
- 		return -ENOENT;
- 	else if (IS_ERR(context))
-@@ -2479,22 +2541,49 @@ static int smb2_create_sd_buffer(struct ksmbd_work *work,
+@@ -2507,22 +2541,49 @@ static int smb2_create_sd_buffer(struct ksmbd_work *work,
  }
  
  static void ksmbd_acls_fattr(struct smb_fattr *fattr,
@@ -15809,7 +14817,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  }
  
-@@ -2515,7 +2604,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2543,7 +2604,11 @@ int smb2_open(struct ksmbd_work *work)
  	struct ksmbd_share_config *share = tcon->share_conf;
  	struct ksmbd_file *fp = NULL;
  	struct file *filp = NULL;
@@ -15821,7 +14829,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	struct kstat stat;
  	struct create_context *context;
  	struct lease_ctx_info *lc = NULL;
-@@ -2559,7 +2652,8 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2587,7 +2652,8 @@ int smb2_open(struct ksmbd_work *work)
  			goto err_out1;
  		}
  
@@ -15831,7 +14839,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				     le16_to_cpu(req->NameLength),
  				     work->conn->local_nls);
  		if (IS_ERR(name)) {
-@@ -2604,7 +2698,7 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2632,7 +2698,7 @@ int smb2_open(struct ksmbd_work *work)
  	if (req_op_level == SMB2_OPLOCK_LEVEL_LEASE)
  		lc = parse_lease_state(req);
  
@@ -15840,7 +14848,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		pr_err("Invalid impersonationlevel : 0x%x\n",
  		       le32_to_cpu(req->ImpersonationLevel));
  		rc = -EIO;
-@@ -2612,7 +2706,7 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2640,7 +2706,7 @@ int smb2_open(struct ksmbd_work *work)
  		goto err_out1;
  	}
  
@@ -15849,7 +14857,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		pr_err("Invalid create options : 0x%x\n",
  		       le32_to_cpu(req->CreateOptions));
  		rc = -EINVAL;
-@@ -2654,7 +2748,7 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2682,7 +2748,7 @@ int smb2_open(struct ksmbd_work *work)
  		goto err_out1;
  	}
  
@@ -15858,43 +14866,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		pr_err("Invalid file attribute : 0x%x\n",
  		       le32_to_cpu(req->FileAttributes));
  		rc = -EINVAL;
-@@ -2663,7 +2757,7 @@ int smb2_open(struct ksmbd_work *work)
- 
- 	if (req->CreateContextsOffset) {
- 		/* Parse non-durable handle create contexts */
--		context = smb2_find_context_vals(req, SMB2_CREATE_EA_BUFFER);
-+		context = smb2_find_context_vals(req, SMB2_CREATE_EA_BUFFER, 4);
- 		if (IS_ERR(context)) {
- 			rc = PTR_ERR(context);
- 			goto err_out1;
-@@ -2683,7 +2777,7 @@ int smb2_open(struct ksmbd_work *work)
- 		}
- 
- 		context = smb2_find_context_vals(req,
--						 SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST);
-+						 SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST, 4);
- 		if (IS_ERR(context)) {
- 			rc = PTR_ERR(context);
- 			goto err_out1;
-@@ -2694,7 +2788,7 @@ int smb2_open(struct ksmbd_work *work)
- 		}
- 
- 		context = smb2_find_context_vals(req,
--						 SMB2_CREATE_TIMEWARP_REQUEST);
-+						 SMB2_CREATE_TIMEWARP_REQUEST, 4);
- 		if (IS_ERR(context)) {
- 			rc = PTR_ERR(context);
- 			goto err_out1;
-@@ -2706,7 +2800,7 @@ int smb2_open(struct ksmbd_work *work)
- 
- 		if (tcon->posix_extensions) {
- 			context = smb2_find_context_vals(req,
--							 SMB2_CREATE_TAG_POSIX);
-+							 SMB2_CREATE_TAG_POSIX, 16);
- 			if (IS_ERR(context)) {
- 				rc = PTR_ERR(context);
- 				goto err_out1;
-@@ -2768,7 +2862,15 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2796,7 +2862,15 @@ int smb2_open(struct ksmbd_work *work)
  		rc = 0;
  	} else {
  		file_present = true;
@@ -15910,7 +14882,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  	if (stream_name) {
  		if (req->CreateOptions & FILE_DIRECTORY_FILE_LE) {
-@@ -2785,7 +2887,7 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2813,7 +2887,7 @@ int smb2_open(struct ksmbd_work *work)
  		}
  
  		if (req->CreateOptions & FILE_DIRECTORY_FILE_LE &&
@@ -15919,7 +14891,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			rsp->hdr.Status = STATUS_NOT_A_DIRECTORY;
  			rc = -EIO;
  		}
-@@ -2831,7 +2933,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2859,7 +2933,11 @@ int smb2_open(struct ksmbd_work *work)
  		if (!file_present) {
  			daccess = cpu_to_le32(GENERIC_ALL_FLAGS);
  		} else {
@@ -15931,7 +14903,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  							    path.dentry,
  							    &daccess);
  			if (rc)
-@@ -2867,7 +2973,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2895,7 +2973,11 @@ int smb2_open(struct ksmbd_work *work)
  		}
  
  		created = true;
@@ -15943,7 +14915,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		if (ea_buf) {
  			if (le32_to_cpu(ea_buf->ccontext.DataLength) <
  			    sizeof(struct smb2_ea_info)) {
-@@ -2889,15 +2999,27 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2917,15 +2999,27 @@ int smb2_open(struct ksmbd_work *work)
  		 * is already granted.
  		 */
  		if (daccess & ~(FILE_READ_ATTRIBUTES_LE | FILE_READ_CONTROL_LE)) {
@@ -15971,7 +14943,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  							  path.dentry);
  				if (rc)
  					goto err_out;
-@@ -2960,9 +3082,15 @@ int smb2_open(struct ksmbd_work *work)
+@@ -2988,9 +3082,15 @@ int smb2_open(struct ksmbd_work *work)
  		int posix_acl_rc;
  		struct inode *inode = d_inode(path.dentry);
  
@@ -15988,7 +14960,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		if (posix_acl_rc)
  			ksmbd_debug(SMB, "inherit posix acl failed : %d\n", posix_acl_rc);
  
-@@ -2976,8 +3104,13 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3004,8 +3104,13 @@ int smb2_open(struct ksmbd_work *work)
  			rc = smb2_create_sd_buffer(work, req, &path);
  			if (rc) {
  				if (posix_acl_rc)
@@ -16003,7 +14975,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  				if (test_share_config_flag(work->tcon->share_conf,
  							   KSMBD_SHARE_FLAG_ACL_XATTR)) {
-@@ -2985,7 +3118,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3013,7 +3118,11 @@ int smb2_open(struct ksmbd_work *work)
  					struct smb_ntsd *pntsd;
  					int pntsd_size, ace_num = 0;
  
@@ -16015,7 +14987,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  					if (fattr.cf_acls)
  						ace_num = fattr.cf_acls->a_count;
  					if (fattr.cf_dacls)
-@@ -3002,7 +3139,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3030,7 +3139,11 @@ int smb2_open(struct ksmbd_work *work)
  						goto err_out;
  					}
  
@@ -16027,7 +14999,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  							    pntsd, NULL, 0,
  							    OWNER_SECINFO |
  							    GROUP_SECINFO |
-@@ -3016,7 +3157,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3044,7 +3157,11 @@ int smb2_open(struct ksmbd_work *work)
  					}
  
  					rc = ksmbd_vfs_set_sd_xattr(conn,
@@ -16039,25 +15011,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  								    path.dentry,
  								    pntsd,
  								    pntsd_size);
-@@ -3105,7 +3250,7 @@ int smb2_open(struct ksmbd_work *work)
- 		struct create_alloc_size_req *az_req;
- 
- 		az_req = (struct create_alloc_size_req *)smb2_find_context_vals(req,
--					SMB2_CREATE_ALLOCATION_SIZE);
-+					SMB2_CREATE_ALLOCATION_SIZE, 4);
- 		if (IS_ERR(az_req)) {
- 			rc = PTR_ERR(az_req);
- 			goto err_out;
-@@ -3132,7 +3277,7 @@ int smb2_open(struct ksmbd_work *work)
- 					    err);
- 		}
- 
--		context = smb2_find_context_vals(req, SMB2_CREATE_QUERY_ON_DISK_ID);
-+		context = smb2_find_context_vals(req, SMB2_CREATE_QUERY_ON_DISK_ID, 4);
- 		if (IS_ERR(context)) {
- 			rc = PTR_ERR(context);
- 			goto err_out;
-@@ -3166,7 +3311,7 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3194,7 +3311,7 @@ int smb2_open(struct ksmbd_work *work)
  	opinfo = rcu_dereference(fp->f_opinfo);
  	rsp->OplockLevel = opinfo != NULL ? opinfo->level : 0;
  	rcu_read_unlock();
@@ -16066,7 +15020,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	rsp->CreateAction = cpu_to_le32(file_info);
  	rsp->CreationTime = cpu_to_le64(fp->create_time);
  	time = ksmbd_UnixTimeToNT(stat.atime);
-@@ -3212,7 +3357,11 @@ int smb2_open(struct ksmbd_work *work)
+@@ -3240,7 +3357,11 @@ int smb2_open(struct ksmbd_work *work)
  		struct create_context *mxac_ccontext;
  
  		if (maximal_access == 0)
@@ -16078,7 +15032,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						       path.dentry,
  						       &maximal_access);
  		mxac_ccontext = (struct create_context *)(rsp->Buffer +
-@@ -3446,7 +3595,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3474,7 +3595,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		goto free_conv_name;
  	}
  
@@ -16087,7 +15041,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	next_entry_offset = ALIGN(struct_sz, KSMBD_DIR_INFO_ALIGNMENT);
  	d_info->last_entry_off_align = next_entry_offset - struct_sz;
  
-@@ -3470,9 +3619,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3498,9 +3619,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		ffdinfo->EaSize =
  			smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
  		if (ffdinfo->EaSize)
@@ -16099,7 +15053,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		memcpy(ffdinfo->FileName, conv_name, conv_len);
  		ffdinfo->NextEntryOffset = cpu_to_le32(next_entry_offset);
  		break;
-@@ -3486,11 +3635,11 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3514,11 +3635,11 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		fbdinfo->EaSize =
  			smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
  		if (fbdinfo->EaSize)
@@ -16113,7 +15067,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		memcpy(fbdinfo->FileName, conv_name, conv_len);
  		fbdinfo->NextEntryOffset = cpu_to_le32(next_entry_offset);
  		break;
-@@ -3502,7 +3651,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3530,7 +3651,7 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		fdinfo = (struct file_directory_info *)kstat;
  		fdinfo->FileNameLength = cpu_to_le32(conv_len);
  		if (d_info->hide_dot_file && d_info->name[0] == '.')
@@ -16122,7 +15076,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		memcpy(fdinfo->FileName, conv_name, conv_len);
  		fdinfo->NextEntryOffset = cpu_to_le32(next_entry_offset);
  		break;
-@@ -3526,11 +3675,11 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3554,11 +3675,11 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		dinfo->EaSize =
  			smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
  		if (dinfo->EaSize)
@@ -16136,7 +15090,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		memcpy(dinfo->FileName, conv_name, conv_len);
  		dinfo->NextEntryOffset = cpu_to_le32(next_entry_offset);
  		break;
-@@ -3544,13 +3693,13 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3572,13 +3693,13 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		fibdinfo->EaSize =
  			smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
  		if (fibdinfo->EaSize)
@@ -16152,7 +15106,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		memcpy(fibdinfo->FileName, conv_name, conv_len);
  		fibdinfo->NextEntryOffset = cpu_to_le32(next_entry_offset);
  		break;
-@@ -3576,14 +3725,13 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
+@@ -3604,14 +3725,13 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
  		posix_info->Mode = cpu_to_le32(ksmbd_kstat->kstat->mode & 0777);
  		posix_info->Inode = cpu_to_le64(ksmbd_kstat->kstat->ino);
  		posix_info->DosAttributes =
@@ -16170,7 +15124,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		 */
  		id_to_sid(from_kuid_munged(&init_user_ns, ksmbd_kstat->kstat->uid),
  			  SIDUNIX_USER, (struct smb_sid *)&posix_info->SidBuffer[0]);
-@@ -3637,7 +3785,11 @@ static void unlock_dir(struct ksmbd_file *dir_fp)
+@@ -3665,7 +3785,11 @@ static void unlock_dir(struct ksmbd_file *dir_fp)
  
  static int process_query_dir_entries(struct smb2_query_dir_private *priv)
  {
@@ -16182,7 +15136,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	struct kstat		kstat;
  	struct ksmbd_kstat	ksmbd_kstat;
  	int			rc;
-@@ -3650,9 +3802,19 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
+@@ -3678,9 +3802,19 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
  			return -EINVAL;
  
  		lock_dir(priv->dir_fp);
@@ -16192,17 +15146,17 @@ index 5de7b41d6404..273dd9cfd663 100644
 +#else
  		dent = lookup_one(user_ns, priv->d_info->name,
 +#endif
- 				  priv->dir_fp->filp->f_path.dentry,
- 				  priv->d_info->name_len);
-+#else
-+		dent = lookup_one_len(priv->d_info->name,
 +				  priv->dir_fp->filp->f_path.dentry,
 +				  priv->d_info->name_len);
++#else
++		dent = lookup_one_len(priv->d_info->name,
+ 				  priv->dir_fp->filp->f_path.dentry,
+ 				  priv->d_info->name_len);
 +#endif
  		unlock_dir(priv->dir_fp);
  
  		if (IS_ERR(dent)) {
-@@ -3671,7 +3833,12 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
+@@ -3699,7 +3833,12 @@ static int process_query_dir_entries(struct smb2_query_dir_private *priv)
  		ksmbd_kstat.kstat = &kstat;
  		if (priv->info_level != FILE_NAMES_INFORMATION)
  			ksmbd_vfs_fill_dentry_attrs(priv->work,
@@ -16215,7 +15169,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						    dent,
  						    &ksmbd_kstat);
  
-@@ -3698,7 +3865,7 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
+@@ -3726,7 +3865,7 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
  		return -EOPNOTSUPP;
  
  	conv_len = (d_info->name_len + 1) * 2;
@@ -16224,7 +15178,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				  KSMBD_DIR_INFO_ALIGNMENT);
  
  	if (next_entry_offset > d_info->out_buf_len) {
-@@ -3793,7 +3960,11 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
+@@ -3821,7 +3960,11 @@ static int reserve_populate_dentry(struct ksmbd_dir_info *d_info,
  	return 0;
  }
  
@@ -16236,7 +15190,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		       loff_t offset, u64 ino, unsigned int d_type)
  {
  	struct ksmbd_readdir_data	*buf;
-@@ -3807,20 +3978,46 @@ static bool __query_dir(struct dir_context *ctx, const char *name, int namlen,
+@@ -3835,20 +3978,46 @@ static bool __query_dir(struct dir_context *ctx, const char *name, int namlen,
  
  	/* dot and dotdot entries are already reserved */
  	if (!strcmp(".", name) || !strcmp("..", name))
@@ -16284,7 +15238,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  }
  
  static int verify_info_level(int info_level)
-@@ -3900,10 +4097,19 @@ int smb2_query_dir(struct ksmbd_work *work)
+@@ -3928,10 +4097,19 @@ int smb2_query_dir(struct ksmbd_work *work)
  		goto err_out2;
  	}
  
@@ -16304,7 +15258,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		pr_err("no right to enumerate directory (%pD)\n", dir_fp->filp);
  		rc = -EACCES;
  		goto err_out2;
-@@ -4167,7 +4373,11 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -4195,7 +4373,11 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
  	ssize_t buf_free_len, alignment_bytes, next_offset, rsp_data_cnt = 0;
  	struct smb2_ea_info_req *ea_req = NULL;
  	const struct path *path;
@@ -16316,7 +15270,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	if (!(fp->daccess & FILE_READ_EA_LE)) {
  		pr_err("Not permitted to read ext attr : 0x%x\n",
-@@ -4247,7 +4457,11 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -4275,7 +4457,11 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp,
  		buf_free_len -= (offsetof(struct smb2_ea_info, name) +
  				name_len + 1);
  		/* bailout if xattr can't fit in buf_free_len */
@@ -16328,7 +15282,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  					       name, &buf);
  		if (value_len <= 0) {
  			rc = -ENOENT;
-@@ -4337,8 +4551,17 @@ static int get_file_basic_info(struct smb2_query_info_rsp *rsp,
+@@ -4365,8 +4551,17 @@ static int get_file_basic_info(struct smb2_query_info_rsp *rsp,
  	}
  
  	basic_info = (struct smb2_file_basic_info *)rsp->Buffer;
@@ -16346,7 +15300,29 @@ index 5de7b41d6404..273dd9cfd663 100644
  	basic_info->CreationTime = cpu_to_le64(fp->create_time);
  	time = ksmbd_UnixTimeToNT(stat.atime);
  	basic_info->LastAccessTime = cpu_to_le64(time);
-@@ -4378,7 +4601,15 @@ static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
+@@ -4382,6 +4577,21 @@ static int get_file_basic_info(struct smb2_query_info_rsp *rsp,
+ 	return 0;
+ }
+ 
++static unsigned long long get_allocation_size(struct inode *inode,
++					      struct kstat *stat)
++{
++	unsigned long long alloc_size = 0;
++
++	if (!S_ISDIR(stat->mode)) {
++		if ((inode->i_blocks << 9) <= stat->size)
++			alloc_size = stat->size;
++		else
++			alloc_size = inode->i_blocks << 9;
++	}
++
++	return alloc_size;
++}
++
+ static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
+ 				   struct ksmbd_file *fp, void *rsp_org)
+ {
+@@ -4391,12 +4601,20 @@ static void get_file_standard_info(struct smb2_query_info_rsp *rsp,
  	struct kstat stat;
  
  	inode = file_inode(fp->filp);
@@ -16362,7 +15338,13 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	sinfo = (struct smb2_file_standard_info *)rsp->Buffer;
  	delete_pending = ksmbd_inode_pending_delete(fp);
-@@ -4432,7 +4663,15 @@ static int get_file_all_info(struct ksmbd_work *work,
+ 
+-	sinfo->AllocationSize = cpu_to_le64(inode->i_blocks << 9);
++	sinfo->AllocationSize = cpu_to_le64(get_allocation_size(inode, &stat));
+ 	sinfo->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
+ 	sinfo->NumberOfLinks = cpu_to_le32(get_nlink(&stat) - delete_pending);
+ 	sinfo->DeletePending = delete_pending;
+@@ -4445,7 +4663,15 @@ static int get_file_all_info(struct ksmbd_work *work,
  		return PTR_ERR(filename);
  
  	inode = file_inode(fp->filp);
@@ -16378,7 +15360,16 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	ksmbd_debug(SMB, "filename = %s\n", filename);
  	delete_pending = ksmbd_inode_pending_delete(fp);
-@@ -4509,8 +4748,17 @@ static void get_file_stream_info(struct ksmbd_work *work,
+@@ -4461,7 +4687,7 @@ static int get_file_all_info(struct ksmbd_work *work,
+ 	file_info->Attributes = fp->f_ci->m_fattr;
+ 	file_info->Pad1 = 0;
+ 	file_info->AllocationSize =
+-		cpu_to_le64(inode->i_blocks << 9);
++		cpu_to_le64(get_allocation_size(inode, &stat));
+ 	file_info->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
+ 	file_info->NumberOfLinks =
+ 			cpu_to_le32(get_nlink(&stat) - delete_pending);
+@@ -4522,8 +4748,17 @@ static void get_file_stream_info(struct ksmbd_work *work,
  	int buf_free_len;
  	struct smb2_query_info_req *req = ksmbd_req_buf_next(work);
  
@@ -16396,7 +15387,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	file_info = (struct smb2_file_stream_info *)rsp->Buffer;
  
  	buf_free_len =
-@@ -4600,8 +4848,17 @@ static void get_file_internal_info(struct smb2_query_info_rsp *rsp,
+@@ -4613,8 +4848,17 @@ static void get_file_internal_info(struct smb2_query_info_rsp *rsp,
  	struct smb2_file_internal_info *file_info;
  	struct kstat stat;
  
@@ -16414,7 +15405,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	file_info = (struct smb2_file_internal_info *)rsp->Buffer;
  	file_info->IndexNumber = cpu_to_le64(stat.ino);
  	rsp->OutputBufferLength =
-@@ -4626,7 +4883,15 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
+@@ -4639,7 +4883,15 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
  	file_info = (struct smb2_file_ntwrk_info *)rsp->Buffer;
  
  	inode = file_inode(fp->filp);
@@ -16430,7 +15421,16 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	file_info->CreationTime = cpu_to_le64(fp->create_time);
  	time = ksmbd_UnixTimeToNT(stat.atime);
-@@ -4687,8 +4952,17 @@ static void get_file_compression_info(struct smb2_query_info_rsp *rsp,
+@@ -4650,7 +4902,7 @@ static int get_file_network_open_info(struct smb2_query_info_rsp *rsp,
+ 	file_info->ChangeTime = cpu_to_le64(time);
+ 	file_info->Attributes = fp->f_ci->m_fattr;
+ 	file_info->AllocationSize =
+-		cpu_to_le64(inode->i_blocks << 9);
++		cpu_to_le64(get_allocation_size(inode, &stat));
+ 	file_info->EndOfFile = S_ISDIR(stat.mode) ? 0 : cpu_to_le64(stat.size);
+ 	file_info->Reserved = cpu_to_le32(0);
+ 	rsp->OutputBufferLength =
+@@ -4700,8 +4952,17 @@ static void get_file_compression_info(struct smb2_query_info_rsp *rsp,
  	struct smb2_file_comp_info *file_info;
  	struct kstat stat;
  
@@ -16448,7 +15448,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	file_info = (struct smb2_file_comp_info *)rsp->Buffer;
  	file_info->CompressedFileSize = cpu_to_le64(stat.blocks << 9);
-@@ -4728,9 +5002,19 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
+@@ -4741,9 +5002,19 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
  {
  	struct smb311_posix_qinfo *file_info;
  	struct inode *inode = file_inode(fp->filp);
@@ -16468,7 +15468,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	u64 time;
  	int out_buf_len = sizeof(struct smb311_posix_qinfo) + 32;
  
-@@ -4749,15 +5033,32 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
+@@ -4762,15 +5033,32 @@ static int find_file_posix_info(struct smb2_query_info_rsp *rsp,
  	file_info->HardLinks = cpu_to_le32(inode->i_nlink);
  	file_info->Mode = cpu_to_le32(inode->i_mode & 0777);
  	file_info->DeviceId = cpu_to_le32(inode->i_rdev);
@@ -16502,17 +15502,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		  SIDUNIX_GROUP, (struct smb_sid *)&file_info->Sids[16]);
  
  	rsp->OutputBufferLength = cpu_to_le32(out_buf_len);
-@@ -4912,6 +5213,9 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work,
- 	int rc = 0, len;
- 	int fs_infoclass_size = 0;
- 
-+	if (!share->path)
-+		return -EIO;
-+
- 	rc = kern_path(share->path, LOOKUP_NO_SYMLINKS, &path);
- 	if (rc) {
- 		pr_err("cannot create vfs path\n");
-@@ -5134,7 +5438,11 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
+@@ -5150,7 +5438,11 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
  			     struct smb2_query_info_rsp *rsp)
  {
  	struct ksmbd_file *fp;
@@ -16524,7 +15514,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	struct smb_ntsd *pntsd = (struct smb_ntsd *)rsp->Buffer, *ppntsd = NULL;
  	struct smb_fattr fattr = {{0}};
  	struct inode *inode;
-@@ -5181,19 +5489,35 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
+@@ -5197,19 +5489,35 @@ static int smb2_get_info_sec(struct ksmbd_work *work,
  	if (!fp)
  		return -ENOENT;
  
@@ -16560,7 +15550,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				    addition_info, &secdesclen, &fattr);
  	posix_acl_release(fattr.cf_acls);
  	posix_acl_release(fattr.cf_dacls);
-@@ -5423,7 +5747,11 @@ int smb2_echo(struct ksmbd_work *work)
+@@ -5439,7 +5747,11 @@ int smb2_echo(struct ksmbd_work *work)
  
  static int smb2_rename(struct ksmbd_work *work,
  		       struct ksmbd_file *fp,
@@ -16572,7 +15562,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		       struct smb2_file_rename_info *file_info,
  		       struct nls_table *local_nls)
  {
-@@ -5454,7 +5782,8 @@ static int smb2_rename(struct ksmbd_work *work,
+@@ -5470,7 +5782,8 @@ static int smb2_rename(struct ksmbd_work *work,
  		goto out;
  	}
  
@@ -16582,7 +15572,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				 le32_to_cpu(file_info->FileNameLength),
  				 local_nls);
  	if (IS_ERR(new_name)) {
-@@ -5486,7 +5815,11 @@ static int smb2_rename(struct ksmbd_work *work,
+@@ -5502,7 +5815,11 @@ static int smb2_rename(struct ksmbd_work *work,
  		if (rc)
  			goto out;
  
@@ -16594,7 +15584,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  					fp->filp->f_path.dentry,
  					xattr_stream_name,
  					NULL, 0, 0);
-@@ -5565,7 +5898,8 @@ static int smb2_create_link(struct ksmbd_work *work,
+@@ -5581,7 +5898,8 @@ static int smb2_create_link(struct ksmbd_work *work,
  	if (!pathname)
  		return -ENOMEM;
  
@@ -16604,7 +15594,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				  le32_to_cpu(file_info->FileNameLength),
  				  local_nls);
  	if (IS_ERR(link_name) || S_ISDIR(file_inode(filp)->i_mode)) {
-@@ -5625,7 +5959,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
+@@ -5641,7 +5959,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
  	struct iattr attrs;
  	struct file *filp;
  	struct inode *inode;
@@ -16616,7 +15606,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	int rc = 0;
  
  	if (!(fp->daccess & FILE_WRITE_ATTRIBUTES_LE))
-@@ -5634,7 +5972,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
+@@ -5650,7 +5972,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
  	attrs.ia_valid = 0;
  	filp = fp->filp;
  	inode = file_inode(filp);
@@ -16628,7 +15618,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	if (file_info->CreationTime)
  		fp->create_time = le64_to_cpu(file_info->CreationTime);
-@@ -5657,14 +5999,14 @@ static int set_file_basic_info(struct ksmbd_file *fp,
+@@ -5673,14 +5999,14 @@ static int set_file_basic_info(struct ksmbd_file *fp,
  
  	if (file_info->Attributes) {
  		if (!S_ISDIR(inode->i_mode) &&
@@ -16646,7 +15636,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  
  	if (test_share_config_flag(share, KSMBD_SHARE_FLAG_STORE_DOS_ATTRS) &&
-@@ -5678,7 +6020,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
+@@ -5694,7 +6020,11 @@ static int set_file_basic_info(struct ksmbd_file *fp,
  		da.flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME |
  			XATTR_DOSINFO_ITIME;
  
@@ -16658,7 +15648,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						    filp->f_path.dentry, &da);
  		if (rc)
  			ksmbd_debug(SMB,
-@@ -5696,8 +6042,18 @@ static int set_file_basic_info(struct ksmbd_file *fp,
+@@ -5712,8 +6042,18 @@ static int set_file_basic_info(struct ksmbd_file *fp,
  		inode_lock(inode);
  		inode->i_ctime = attrs.ia_ctime;
  		attrs.ia_valid &= ~ATTR_CTIME;
@@ -16677,7 +15667,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	}
  	return rc;
  }
-@@ -5789,7 +6145,11 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -5805,7 +6145,11 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
  			   struct smb2_file_rename_info *rename_info,
  			   unsigned int buf_len)
  {
@@ -16689,7 +15679,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	struct ksmbd_file *parent_fp;
  	struct dentry *parent;
  	struct dentry *dentry = fp->filp->f_path.dentry;
-@@ -5804,12 +6164,20 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -5820,12 +6164,20 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
  			le32_to_cpu(rename_info->FileNameLength))
  		return -EINVAL;
  
@@ -16710,7 +15700,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	if (ret) {
  		dput(parent);
  		return ret;
-@@ -5828,7 +6196,11 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
+@@ -5844,7 +6196,11 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp,
  		ksmbd_fd_put(work, parent_fp);
  	}
  next:
@@ -16722,7 +15712,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			   work->conn->local_nls);
  }
  
-@@ -5884,7 +6256,9 @@ static int set_file_mode_info(struct ksmbd_file *fp,
+@@ -5900,7 +6256,9 @@ static int set_file_mode_info(struct ksmbd_file *fp,
  
  	mode = file_info->Mode;
  
@@ -16733,7 +15723,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		pr_err("Mode is not valid : 0x%x\n", le32_to_cpu(mode));
  		return -EINVAL;
  	}
-@@ -6163,7 +6537,7 @@ static noinline int smb2_read_pipe(struct ksmbd_work *work)
+@@ -6179,7 +6537,7 @@ static noinline int smb2_read_pipe(struct ksmbd_work *work)
  	rsp->Reserved = 0;
  	rsp->DataLength = cpu_to_le32(nbytes);
  	rsp->DataRemaining = 0;
@@ -16742,7 +15732,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	inc_rfc1001_len(work->response_buf, nbytes);
  	return 0;
  
-@@ -6339,7 +6713,7 @@ int smb2_read(struct ksmbd_work *work)
+@@ -6355,7 +6713,7 @@ int smb2_read(struct ksmbd_work *work)
  	rsp->Reserved = 0;
  	rsp->DataLength = cpu_to_le32(nbytes);
  	rsp->DataRemaining = cpu_to_le32(remain_bytes);
@@ -16751,7 +15741,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	inc_rfc1001_len(work->response_buf, 16);
  	work->resp_hdr_sz = get_rfc1002_len(work->response_buf) + 4;
  	work->aux_payload_sz = nbytes;
-@@ -6759,7 +7133,7 @@ static int smb2_set_flock_flags(struct file_lock *flock, int flags)
+@@ -6775,7 +7133,7 @@ static int smb2_set_flock_flags(struct file_lock *flock, int flags)
  	case SMB2_LOCKFLAG_UNLOCK:
  		ksmbd_debug(SMB, "received unlock request\n");
  		flock->fl_type = F_UNLCK;
@@ -16760,7 +15750,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		break;
  	}
  
-@@ -6863,6 +7237,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -6879,6 +7237,7 @@ int smb2_lock(struct ksmbd_work *work)
  		if (lock_start > U64_MAX - lock_length) {
  			pr_err("Invalid lock range requested\n");
  			rsp->hdr.Status = STATUS_INVALID_LOCK_RANGE;
@@ -16768,7 +15758,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			goto out;
  		}
  
-@@ -6882,6 +7257,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -6898,6 +7257,7 @@ int smb2_lock(struct ksmbd_work *work)
  				    "the end offset(%llx) is smaller than the start offset(%llx)\n",
  				    flock->fl_end, flock->fl_start);
  			rsp->hdr.Status = STATUS_INVALID_LOCK_RANGE;
@@ -16776,7 +15766,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			goto out;
  		}
  
-@@ -6893,6 +7269,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -6909,6 +7269,7 @@ int smb2_lock(struct ksmbd_work *work)
  				    flock->fl_type != F_UNLCK) {
  					pr_err("conflict two locks in one request\n");
  					err = -EINVAL;
@@ -16784,7 +15774,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  					goto out;
  				}
  			}
-@@ -6901,6 +7278,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -6917,6 +7278,7 @@ int smb2_lock(struct ksmbd_work *work)
  		smb_lock = smb2_lock_init(flock, cmd, flags, &lock_list);
  		if (!smb_lock) {
  			err = -EINVAL;
@@ -16792,60 +15782,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  			goto out;
  		}
  	}
-@@ -6932,7 +7310,7 @@ int smb2_lock(struct ksmbd_work *work)
- 
- 		nolock = 1;
- 		/* check locks in connection list */
--		read_lock(&conn_list_lock);
-+		down_read(&conn_list_lock);
- 		list_for_each_entry(conn, &conn_list, conns_list) {
- 			spin_lock(&conn->llist_lock);
- 			list_for_each_entry_safe(cmp_lock, tmp2, &conn->lock_list, clist) {
-@@ -6949,7 +7327,7 @@ int smb2_lock(struct ksmbd_work *work)
- 						list_del(&cmp_lock->flist);
- 						list_del(&cmp_lock->clist);
- 						spin_unlock(&conn->llist_lock);
--						read_unlock(&conn_list_lock);
-+						up_read(&conn_list_lock);
- 
- 						locks_free_lock(cmp_lock->fl);
- 						kfree(cmp_lock);
-@@ -6971,7 +7349,7 @@ int smb2_lock(struct ksmbd_work *work)
- 				    cmp_lock->start > smb_lock->start &&
- 				    cmp_lock->start < smb_lock->end) {
- 					spin_unlock(&conn->llist_lock);
--					read_unlock(&conn_list_lock);
-+					up_read(&conn_list_lock);
- 					pr_err("previous lock conflict with zero byte lock range\n");
- 					goto out;
- 				}
-@@ -6980,7 +7358,7 @@ int smb2_lock(struct ksmbd_work *work)
- 				    smb_lock->start > cmp_lock->start &&
- 				    smb_lock->start < cmp_lock->end) {
- 					spin_unlock(&conn->llist_lock);
--					read_unlock(&conn_list_lock);
-+					up_read(&conn_list_lock);
- 					pr_err("current lock conflict with zero byte lock range\n");
- 					goto out;
- 				}
-@@ -6991,14 +7369,14 @@ int smb2_lock(struct ksmbd_work *work)
- 				      cmp_lock->end >= smb_lock->end)) &&
- 				    !cmp_lock->zero_len && !smb_lock->zero_len) {
- 					spin_unlock(&conn->llist_lock);
--					read_unlock(&conn_list_lock);
-+					up_read(&conn_list_lock);
- 					pr_err("Not allow lock operation on exclusive lock range\n");
- 					goto out;
- 				}
- 			}
- 			spin_unlock(&conn->llist_lock);
- 		}
--		read_unlock(&conn_list_lock);
-+		up_read(&conn_list_lock);
- out_check_cl:
- 		if (smb_lock->fl->fl_type == F_UNLCK && nolock) {
- 			pr_err("Try to unlock nolocked range\n");
-@@ -7060,13 +7438,9 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -7076,13 +7438,9 @@ int smb2_lock(struct ksmbd_work *work)
  
  				ksmbd_vfs_posix_lock_wait(flock);
  
@@ -16859,7 +15796,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  				if (work->state != KSMBD_WORK_ACTIVE) {
  					list_del(&smb_lock->llist);
-@@ -7084,6 +7458,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -7100,6 +7458,7 @@ int smb2_lock(struct ksmbd_work *work)
  						work->send_no_response = 1;
  						goto out;
  					}
@@ -16867,7 +15804,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  					init_smb2_rsp_hdr(work);
  					smb2_set_err_rsp(work);
  					rsp->hdr.Status =
-@@ -7096,7 +7471,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -7112,7 +7471,7 @@ int smb2_lock(struct ksmbd_work *work)
  				spin_lock(&work->conn->llist_lock);
  				list_del(&smb_lock->clist);
  				spin_unlock(&work->conn->llist_lock);
@@ -16876,7 +15813,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				goto retry;
  			} else if (!rc) {
  				spin_lock(&work->conn->llist_lock);
-@@ -7139,7 +7514,7 @@ int smb2_lock(struct ksmbd_work *work)
+@@ -7155,7 +7514,7 @@ int smb2_lock(struct ksmbd_work *work)
  		rlock->fl_start = smb_lock->start;
  		rlock->fl_end = smb_lock->end;
  
@@ -16885,7 +15822,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  		if (rc)
  			pr_err("rollback unlock fail : %d\n", rc);
  
-@@ -7534,33 +7909,49 @@ static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id,
+@@ -7550,33 +7909,49 @@ static inline int fsctl_set_sparse(struct ksmbd_work *work, u64 id,
  				   struct file_sparse *sparse)
  {
  	struct ksmbd_file *fp;
@@ -16937,7 +15874,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  						     fp->filp->f_path.dentry, &da);
  		if (ret)
  			fp->f_ci->m_fattr = old_fattr;
-@@ -7625,7 +8016,7 @@ int smb2_ioctl(struct ksmbd_work *work)
+@@ -7641,7 +8016,7 @@ int smb2_ioctl(struct ksmbd_work *work)
  		goto out;
  	}
  
@@ -16946,7 +15883,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	ret = smb2_calc_max_out_buf_len(work, 48,
  					le32_to_cpu(req->MaxOutputResponse));
  	if (ret < 0) {
-@@ -7736,7 +8127,7 @@ int smb2_ioctl(struct ksmbd_work *work)
+@@ -7752,7 +8127,7 @@ int smb2_ioctl(struct ksmbd_work *work)
  		rsp->PersistentFileId = req->PersistentFileId;
  		fsctl_copychunk(work,
  				(struct copychunk_ioctl_req *)&req->Buffer[0],
@@ -16955,7 +15892,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  				le32_to_cpu(req->InputCount),
  				req->VolatileFileId,
  				req->PersistentFileId,
-@@ -7907,7 +8298,7 @@ int smb2_ioctl(struct ksmbd_work *work)
+@@ -7923,7 +8298,7 @@ int smb2_ioctl(struct ksmbd_work *work)
  		goto out;
  	}
  
@@ -16964,7 +15901,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	rsp->InputCount = cpu_to_le32(0);
  	rsp->InputOffset = cpu_to_le32(112);
  	rsp->OutputOffset = cpu_to_le32(112);
-@@ -8249,8 +8640,8 @@ int smb2_oplock_break(struct ksmbd_work *work)
+@@ -8265,8 +8640,8 @@ int smb2_oplock_break(struct ksmbd_work *work)
   */
  int smb2_notify(struct ksmbd_work *work)
  {
@@ -16975,37 +15912,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  
  	WORK_BUFFERS(work, req, rsp);
  
-@@ -8413,14 +8804,11 @@ int smb3_check_sign_req(struct ksmbd_work *work)
- 	if (le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) {
- 		signing_key = work->sess->smb3signingkey;
- 	} else {
--		read_lock(&work->sess->chann_lock);
- 		chann = lookup_chann_list(work->sess, conn);
- 		if (!chann) {
--			read_unlock(&work->sess->chann_lock);
- 			return 0;
- 		}
- 		signing_key = chann->smb3signingkey;
--		read_unlock(&work->sess->chann_lock);
- 	}
- 
- 	if (!signing_key) {
-@@ -8480,14 +8868,11 @@ void smb3_set_sign_rsp(struct ksmbd_work *work)
- 	    le16_to_cpu(hdr->Command) == SMB2_SESSION_SETUP_HE) {
- 		signing_key = work->sess->smb3signingkey;
- 	} else {
--		read_lock(&work->sess->chann_lock);
- 		chann = lookup_chann_list(work->sess, work->conn);
- 		if (!chann) {
--			read_unlock(&work->sess->chann_lock);
- 			return;
- 		}
- 		signing_key = chann->smb3signingkey;
--		read_unlock(&work->sess->chann_lock);
- 	}
- 
- 	if (!signing_key)
-@@ -8558,10 +8943,10 @@ static void fill_transform_hdr(void *tr_buf, char *old_buf, __le16 cipher_type)
+@@ -8568,10 +8943,10 @@ static void fill_transform_hdr(void *tr_buf, char *old_buf, __le16 cipher_type)
  	struct smb2_hdr *hdr = smb2_get_msg(old_buf);
  	unsigned int orig_len = get_rfc1002_len(old_buf);
  
@@ -17019,7 +15926,7 @@ index 5de7b41d6404..273dd9cfd663 100644
  	    cipher_type == SMB2_ENCRYPTION_AES256_GCM)
  		get_random_bytes(&tr_hdr->Nonce, SMB3_AES_GCM_NONCE);
 diff --git a/fs/ksmbd/smb2pdu.h b/fs/ksmbd/smb2pdu.h
-index f4baa9800f6e..1719b0cc171c 100644
+index dd10f8031606..1719b0cc171c 100644
 --- a/fs/ksmbd/smb2pdu.h
 +++ b/fs/ksmbd/smb2pdu.h
 @@ -10,24 +10,175 @@
@@ -17260,7 +16167,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  };
  
  /* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */
-@@ -57,10 +257,370 @@ struct preauth_integrity_info {
+@@ -57,12 +257,370 @@ struct preauth_integrity_info {
  #define OFFSET_OF_NEG_CONTEXT	0xd0
  #endif
  
@@ -17373,8 +16280,8 @@ index f4baa9800f6e..1719b0cc171c 100644
  #define SMB2_SESSION_IN_PROGRESS	BIT(0)
  #define SMB2_SESSION_VALID		BIT(1)
  
-+#define SMB2_SESSION_TIMEOUT		(10 * HZ)
-+
+ #define SMB2_SESSION_TIMEOUT		(10 * HZ)
+ 
 +/* Flags */
 +#define SMB2_SESSION_REQ_FLAG_BINDING		0x01
 +#define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA	0x04
@@ -17631,7 +16538,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct create_durable_req_v2 {
  	struct create_context ccontext;
  	__u8   Name[8];
-@@ -121,6 +681,13 @@ struct create_alloc_size_req {
+@@ -123,6 +681,13 @@ struct create_alloc_size_req {
  	__le64 AllocationSize;
  } __packed;
  
@@ -17645,7 +16552,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct create_durable_rsp {
  	struct create_context ccontext;
  	__u8   Name[8];
-@@ -163,14 +730,212 @@ struct create_posix_rsp {
+@@ -165,14 +730,212 @@ struct create_posix_rsp {
  	u8 SidBuffer[44];
  } __packed;
  
@@ -17858,7 +16765,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct smb_sockaddr_in {
  	__be16 Port;
  	__be32 IPv4address;
-@@ -244,6 +1009,204 @@ struct file_sparse {
+@@ -246,6 +1009,204 @@ struct file_sparse {
  	__u8	SetSparse;
  } __packed;
  
@@ -18063,7 +16970,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  /* FILE Info response size */
  #define FILE_DIRECTORY_INFORMATION_SIZE       1
  #define FILE_FULL_DIRECTORY_INFORMATION_SIZE  2
-@@ -299,11 +1262,145 @@ struct fs_type_info {
+@@ -301,11 +1262,145 @@ struct fs_type_info {
  	long		magic_number;
  } __packed;
  
@@ -18210,7 +17117,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct smb2_file_access_info {
  	__le32 AccessFlags;
  } __packed;
-@@ -312,6 +1409,56 @@ struct smb2_file_alignment_info {
+@@ -314,6 +1409,56 @@ struct smb2_file_alignment_info {
  	__le32 AlignmentRequirement;
  } __packed;
  
@@ -18267,7 +17174,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct smb2_file_basic_info { /* data block encoding of response to level 18 */
  	__le64 CreationTime;	/* Beginning of FILE_BASIC_INFO equivalent */
  	__le64 LastAccessTime;
-@@ -323,7 +1470,7 @@ struct smb2_file_basic_info { /* data block encoding of response to level 18 */
+@@ -325,7 +1470,7 @@ struct smb2_file_basic_info { /* data block encoding of response to level 18 */
  
  struct smb2_file_alt_name_info {
  	__le32 FileNameLength;
@@ -18276,7 +17183,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  } __packed;
  
  struct smb2_file_stream_info {
-@@ -331,9 +1478,13 @@ struct smb2_file_stream_info {
+@@ -333,9 +1478,13 @@ struct smb2_file_stream_info {
  	__le32  StreamNameLength;
  	__le64 StreamSize;
  	__le64 StreamAllocationSize;
@@ -18291,7 +17198,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct smb2_file_ntwrk_info {
  	__le64 CreationTime;
  	__le64 LastAccessTime;
-@@ -370,7 +1521,7 @@ struct smb2_file_pos_info {
+@@ -372,7 +1521,7 @@ struct smb2_file_pos_info {
  	__le64 CurrentByteOffset;
  } __packed;
  
@@ -18300,7 +17207,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  
  struct smb2_file_mode_info {
  	__le32 Mode;
-@@ -424,6 +1575,34 @@ struct create_sd_buf_req {
+@@ -426,6 +1575,34 @@ struct create_sd_buf_req {
  	struct smb_ntsd ntsd;
  } __packed;
  
@@ -18335,7 +17242,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  struct smb2_posix_info {
  	__le32 NextEntryOffset;
  	__u32 Ignored;
-@@ -444,7 +1623,7 @@ struct smb2_posix_info {
+@@ -446,7 +1623,7 @@ struct smb2_posix_info {
  	/* SidBuffer contain two sids (UNIX user sid(16), UNIX group sid(16)) */
  	u8 SidBuffer[32];
  	__le32 name_len;
@@ -18344,7 +17251,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  	/*
  	 * var sized owner SID
  	 * var sized group SID
-@@ -454,6 +1633,7 @@ struct smb2_posix_info {
+@@ -456,6 +1633,7 @@ struct smb2_posix_info {
  } __packed;
  
  /* functions */
@@ -18352,7 +17259,7 @@ index f4baa9800f6e..1719b0cc171c 100644
  void init_smb2_1_server(struct ksmbd_conn *conn);
  void init_smb3_0_server(struct ksmbd_conn *conn);
  void init_smb3_02_server(struct ksmbd_conn *conn);
-@@ -486,6 +1666,7 @@ int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects,
+@@ -488,6 +1666,7 @@ int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects,
  struct file_lock *smb_flock_init(struct file *f);
  int setup_async_work(struct ksmbd_work *work, void (*fn)(void **),
  		     void **arg);
@@ -19759,7 +18666,7 @@ index c06efc020bd9..6ca0be788386 100644
  
  static void smb_direct_ib_client_remove(struct ib_device *ib_dev,
 diff --git a/fs/ksmbd/transport_tcp.c b/fs/ksmbd/transport_tcp.c
-index 20e85e2701f2..b5db6b4652a2 100644
+index eff7a1d793f0..b5db6b4652a2 100644
 --- a/fs/ksmbd/transport_tcp.c
 +++ b/fs/ksmbd/transport_tcp.c
 @@ -48,27 +48,55 @@ static struct interface *alloc_iface(char *ifname);
@@ -19832,15 +18739,6 @@ index 20e85e2701f2..b5db6b4652a2 100644
  	KSMBD_TRANS(t)->handler = kthread_run(ksmbd_conn_handler_loop,
  					      KSMBD_TRANS(t)->conn,
  					      "ksmbd:%u",
-@@ -333,7 +361,7 @@ static int ksmbd_tcp_readv(struct tcp_transport *t, struct kvec *iov_orig,
- 		if (length == -EINTR) {
- 			total_read = -ESHUTDOWN;
- 			break;
--		} else if (conn->status == KSMBD_SESS_NEED_RECONNECT) {
-+		} else if (ksmbd_conn_need_reconnect(conn)) {
- 			total_read = -EAGAIN;
- 			break;
- 		} else if (length == -ERESTARTSYS || length == -EAGAIN) {
 @@ -450,11 +478,23 @@ static int create_socket(struct interface *iface)
  	ksmbd_tcp_nodelay(ksmbd_socket);
  	ksmbd_tcp_reuseaddr(ksmbd_socket);
diff --git a/patches/external/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch b/patches/external/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch
index b7e842009..b5c23d253 100644
--- a/patches/external/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch
+++ b/patches/external/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch
@@ -1,9 +1,9 @@
-From 9896ed2836bfa76b52c01ca643ffd580903551a4 Mon Sep 17 00:00:00 2001
+From f3669f9c01ffdc51e26dfd028872e2bbe2e46d70 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:48:14 -0500
+Date: Thu, 29 Jun 2023 16:15:59 -0500
 Subject: [PATCH] merge: CONFIG_PREEMPT_RT Patch Set
 
-patch-6.1.26-rt8.patch.xz
+patch-6.1.33-rt11.patch.xz
 
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
@@ -626,7 +626,7 @@ index a9f57dad6d91..a0b528d4bb7c 100644
  	select HAVE_KVM_IRQFD
  	select HAVE_KVM_IRQ_ROUTING
 diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
-index 561adac69022..61c4c0610aa6 100644
+index 97b026130c71..01b3d19be382 100644
 --- a/arch/powerpc/platforms/pseries/iommu.c
 +++ b/arch/powerpc/platforms/pseries/iommu.c
 @@ -24,6 +24,7 @@
@@ -637,7 +637,7 @@ index 561adac69022..61c4c0610aa6 100644
  #include <asm/io.h>
  #include <asm/prom.h>
  #include <asm/rtas.h>
-@@ -195,7 +196,13 @@ static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift,
+@@ -200,7 +201,13 @@ static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift,
  	return ret;
  }
  
@@ -652,7 +652,7 @@ index 561adac69022..61c4c0610aa6 100644
  
  static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
  				     long npages, unsigned long uaddr,
-@@ -218,9 +225,10 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
+@@ -223,9 +230,10 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
  		                           direction, attrs);
  	}
  
@@ -665,7 +665,7 @@ index 561adac69022..61c4c0610aa6 100644
  
  	/* This is safe to do since interrupts are off when we're called
  	 * from iommu_alloc{,_sg}()
-@@ -229,12 +237,12 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
+@@ -234,12 +242,12 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
  		tcep = (__be64 *)__get_free_page(GFP_ATOMIC);
  		/* If allocation fails, fall back to the loop implementation */
  		if (!tcep) {
@@ -680,7 +680,7 @@ index 561adac69022..61c4c0610aa6 100644
  	}
  
  	rpn = __pa(uaddr) >> tceshift;
-@@ -264,7 +272,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
+@@ -269,7 +277,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
  		tcenum += limit;
  	} while (npages > 0 && !rc);
  
@@ -689,7 +689,7 @@ index 561adac69022..61c4c0610aa6 100644
  
  	if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) {
  		ret = (int)rc;
-@@ -440,16 +448,17 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn,
+@@ -454,16 +462,17 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn,
  				DMA_BIDIRECTIONAL, 0);
  	}
  
@@ -711,7 +711,7 @@ index 561adac69022..61c4c0610aa6 100644
  	}
  
  	proto_tce = TCE_PCI_READ | TCE_PCI_WRITE;
-@@ -492,7 +501,7 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn,
+@@ -506,7 +515,7 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn,
  
  	/* error cleanup: caller will clear whole range */
  
@@ -907,7 +907,7 @@ index a2bda53020fd..ae7950b26db5 100644
  	ktime_t ac_time;
  #endif
 diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
-index ed5dabd3c72d..5d778ea926f3 100644
+index 0d084d6652c4..5d620322bdc2 100644
 --- a/drivers/char/tpm/tpm_tis.c
 +++ b/drivers/char/tpm/tpm_tis.c
 @@ -50,6 +50,31 @@ static inline struct tpm_tis_tcg_phy *to_tpm_tis_tcg_phy(struct tpm_tis_data *da
@@ -942,7 +942,7 @@ index ed5dabd3c72d..5d778ea926f3 100644
  static int interrupts = -1;
  module_param(interrupts, int, 0444);
  MODULE_PARM_DESC(interrupts, "Enable interrupts");
-@@ -186,12 +211,12 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
+@@ -202,12 +227,12 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
  	switch (io_mode) {
  	case TPM_TIS_PHYS_8:
  		while (len--)
@@ -958,7 +958,7 @@ index ed5dabd3c72d..5d778ea926f3 100644
  	}
  
 diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
-index 3a6e176d77aa..43b8bf809962 100644
+index 6b10868ec72f..1fbdb7b4e6e1 100644
 --- a/drivers/gpu/drm/i915/Kconfig
 +++ b/drivers/gpu/drm/i915/Kconfig
 @@ -3,7 +3,6 @@ config DRM_I915
@@ -1656,7 +1656,7 @@ index 38df602f2869..274891a18ae5 100644
  			data[i++] = tmp_tx_bytes;
  			data[i++] = tx->wake_queue;
 diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
-index d3e3ac242bfc..5a229a01f49d 100644
+index 2e5e0a887270..07b2ab8d054c 100644
 --- a/drivers/net/ethernet/google/gve/gve_main.c
 +++ b/drivers/net/ethernet/google/gve/gve_main.c
 @@ -51,10 +51,10 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
@@ -1685,7 +1685,7 @@ index d3e3ac242bfc..5a229a01f49d 100644
  						       start));
  			s->tx_packets += packets;
  			s->tx_bytes += bytes;
-@@ -1273,9 +1273,9 @@ void gve_handle_report_stats(struct gve_priv *priv)
+@@ -1260,9 +1260,9 @@ void gve_handle_report_stats(struct gve_priv *priv)
  			}
  
  			do {
@@ -1792,7 +1792,7 @@ index 2cca9e84e31e..34ab5ff9823b 100644
  		stats->tx_packets += packets;
  		stats->tx_bytes   += bytes;
 diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
-index f6fa63e4253c..1465ed7a6166 100644
+index e632041aed5f..995b2a7c8973 100644
 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
 +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
 @@ -154,7 +154,7 @@ __i40e_add_ethtool_stats(u64 **data, void *pointer,
@@ -1825,7 +1825,7 @@ index f6fa63e4253c..1465ed7a6166 100644
  	/* Once we successfully copy the stats in, update the data pointer */
  	*data += size;
 diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
-index 68f390ce4f6e..6492d87107e1 100644
+index 0e01b1927c1c..9eef9d47efec 100644
 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
 +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
 @@ -419,10 +419,10 @@ static void i40e_get_netdev_stats_struct_tx(struct i40e_ring *ring,
@@ -1925,7 +1925,7 @@ index 83cfc54a4706..6f171d1d85b7 100644
  	/* Once we successfully copy the stats in, update the data pointer */
  	*data += size;
 diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
-index cfc57cfc46e4..14560e166ffe 100644
+index 6a50f8ba3940..dbcaf197ecb5 100644
 --- a/drivers/net/ethernet/intel/ice/ice_main.c
 +++ b/drivers/net/ethernet/intel/ice/ice_main.c
 @@ -6393,10 +6393,10 @@ ice_fetch_u64_stats_per_ring(struct u64_stats_sync *syncp,
@@ -2082,7 +2082,7 @@ index 1d9b70e0ff67..56d611fbeee8 100644
  		packets += _packets;
  	}
 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
-index e88e3dfac8c2..eda7188e8df4 100644
+index 0051aa676e19..1c22ff2dba9b 100644
 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
 @@ -1335,10 +1335,10 @@ static void ixgbe_get_ethtool_stats(struct net_device *netdev,
@@ -2112,10 +2112,10 @@ index e88e3dfac8c2..eda7188e8df4 100644
  	}
  
 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-index faf3a094ac54..4507fba8747a 100644
+index 9b8848daeb43..03e583cf4815 100644
 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-@@ -9047,10 +9047,10 @@ static void ixgbe_get_ring_stats64(struct rtnl_link_stats64 *stats,
+@@ -9051,10 +9051,10 @@ static void ixgbe_get_ring_stats64(struct rtnl_link_stats64 *stats,
  
  	if (ring) {
  		do {
@@ -2128,7 +2128,7 @@ index faf3a094ac54..4507fba8747a 100644
  		stats->tx_packets += packets;
  		stats->tx_bytes   += bytes;
  	}
-@@ -9070,10 +9070,10 @@ static void ixgbe_get_stats64(struct net_device *netdev,
+@@ -9074,10 +9074,10 @@ static void ixgbe_get_stats64(struct net_device *netdev,
  
  		if (ring) {
  			do {
@@ -2525,7 +2525,7 @@ index 8b77582bdfa0..a6b6ca1fd55e 100644
  		stats->tx_bytes += tbytes;
  		stats->tx_packets += tpkts;
 diff --git a/drivers/net/ethernet/nvidia/forcedeth.c b/drivers/net/ethernet/nvidia/forcedeth.c
-index daa028729d44..0605d1ee490d 100644
+index 486cbc8ab224..7a549b834e97 100644
 --- a/drivers/net/ethernet/nvidia/forcedeth.c
 +++ b/drivers/net/ethernet/nvidia/forcedeth.c
 @@ -1734,12 +1734,12 @@ static void nv_get_stats(int cpu, struct fe_priv *np,
@@ -2624,7 +2624,7 @@ index d2c6a5dfdc0e..b7e24ae92525 100644
  	stats->rx_errors      = priv->stats_rx.errors;
  	stats->tx_errors      = priv->stats_tx.errors;
 diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
-index 6d530bbae263..5198326b6e1d 100644
+index 9f0e74635172..f63a837ee138 100644
 --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
 +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
 @@ -1448,12 +1448,12 @@ static void am65_cpsw_nuss_ndo_get_stats(struct net_device *dev,
@@ -3016,10 +3016,10 @@ index 9a1a5b203624..e470e3398abc 100644
  
  static int
 diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
-index 62ade69295a9..d10606f257c4 100644
+index b524bd374d68..555b0b1e9a78 100644
 --- a/drivers/net/team/team.c
 +++ b/drivers/net/team/team.c
-@@ -1865,13 +1865,13 @@ team_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
+@@ -1866,13 +1866,13 @@ team_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
  	for_each_possible_cpu(i) {
  		p = per_cpu_ptr(team->pcpu_stats, i);
  		do {
@@ -3102,10 +3102,10 @@ index a71786b3e7ba..9d42a8c6aab7 100644
  		result->xdp_tx_err += xdp_tx_err;
  		result->xdp_packets += packets;
 diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
-index 3f1883814ce2..c9cf5be14bd8 100644
+index 47788f093551..fe6b567de3e5 100644
 --- a/drivers/net/virtio_net.c
 +++ b/drivers/net/virtio_net.c
-@@ -2075,18 +2075,18 @@ static void virtnet_stats(struct net_device *dev,
+@@ -2105,18 +2105,18 @@ static void virtnet_stats(struct net_device *dev,
  		struct send_queue *sq = &vi->sq[i];
  
  		do {
@@ -3128,7 +3128,7 @@ index 3f1883814ce2..c9cf5be14bd8 100644
  
  		tot->rx_packets += rpackets;
  		tot->tx_packets += tpackets;
-@@ -2697,12 +2697,12 @@ static void virtnet_get_ethtool_stats(struct net_device *dev,
+@@ -2724,12 +2724,12 @@ static void virtnet_get_ethtool_stats(struct net_device *dev,
  
  		stats_base = (u8 *)&rq->stats;
  		do {
@@ -3143,7 +3143,7 @@ index 3f1883814ce2..c9cf5be14bd8 100644
  		idx += VIRTNET_RQ_STATS_LEN;
  	}
  
-@@ -2711,12 +2711,12 @@ static void virtnet_get_ethtool_stats(struct net_device *dev,
+@@ -2738,12 +2738,12 @@ static void virtnet_get_ethtool_stats(struct net_device *dev,
  
  		stats_base = (u8 *)&sq->stats;
  		do {
@@ -3265,7 +3265,7 @@ index 5f9aedd1f0b6..dabe89666efd 100644
  		ret += inc;						\
  	}								\
 diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h
-index 287153d32536..82cbe22a9633 100644
+index 1e8fe44a7099..5e1e0173f610 100644
 --- a/drivers/tty/serial/8250/8250.h
 +++ b/drivers/tty/serial/8250/8250.h
 @@ -177,12 +177,49 @@ static inline void serial_dl_write(struct uart_8250_port *up, int value)
@@ -3342,7 +3342,7 @@ index 9d2a7856784f..7cc6b527c088 100644
  static void aspeed_vuart_set_throttle(struct uart_port *port, bool throttle)
  {
 diff --git a/drivers/tty/serial/8250/8250_bcm7271.c b/drivers/tty/serial/8250/8250_bcm7271.c
-index 89bfcefbea84..147b884d0eb5 100644
+index ffc7f67e27e3..8b211e668bc0 100644
 --- a/drivers/tty/serial/8250/8250_bcm7271.c
 +++ b/drivers/tty/serial/8250/8250_bcm7271.c
 @@ -609,7 +609,7 @@ static int brcmuart_startup(struct uart_port *port)
@@ -3421,7 +3421,7 @@ index 89bfcefbea84..147b884d0eb5 100644
  	spin_unlock_irqrestore(&p->lock, flags);
  	return HRTIMER_NORESTART;
 diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
-index 94fbf0add2ce..196d0c55dfe9 100644
+index 81a5dab1a828..536f639ff56c 100644
 --- a/drivers/tty/serial/8250/8250_core.c
 +++ b/drivers/tty/serial/8250/8250_core.c
 @@ -255,8 +255,11 @@ static void serial8250_timeout(struct timer_list *t)
@@ -3495,10 +3495,10 @@ index 94fbf0add2ce..196d0c55dfe9 100644
  }
  
 diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c
-index 64770c62bbec..c756c30c70c3 100644
+index b406cba10b0e..246c32c75a4c 100644
 --- a/drivers/tty/serial/8250/8250_exar.c
 +++ b/drivers/tty/serial/8250/8250_exar.c
-@@ -185,6 +185,8 @@ static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud,
+@@ -189,6 +189,8 @@ static void xr17v35x_set_divisor(struct uart_port *p, unsigned int baud,
  
  static int xr17v35x_startup(struct uart_port *port)
  {
@@ -3507,7 +3507,7 @@ index 64770c62bbec..c756c30c70c3 100644
  	/*
  	 * First enable access to IER [7:5], ISR [5:4], FCR [5:4],
  	 * MCR [7:5] and MSR [7:0]
-@@ -195,7 +197,7 @@ static int xr17v35x_startup(struct uart_port *port)
+@@ -199,7 +201,7 @@ static int xr17v35x_startup(struct uart_port *port)
  	 * Make sure all interrups are masked until initialization is
  	 * complete and the FIFOs are cleared
  	 */
@@ -3599,7 +3599,7 @@ index fb1d5ec0940e..3e7203909d6a 100644
  
  static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode)
 diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
-index 3f33014022f0..594378d3c065 100644
+index 61a686327d1d..d568b375dd8d 100644
 --- a/drivers/tty/serial/8250/8250_omap.c
 +++ b/drivers/tty/serial/8250/8250_omap.c
 @@ -328,7 +328,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
@@ -3690,10 +3690,10 @@ index 3f33014022f0..594378d3c065 100644
  }
  
 diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
-index 2a3bd6918c77..02323b500f40 100644
+index b8e8a96c3eb6..f16d6e5f0727 100644
 --- a/drivers/tty/serial/8250/8250_port.c
 +++ b/drivers/tty/serial/8250/8250_port.c
-@@ -743,7 +743,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
+@@ -744,7 +744,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
  			serial_out(p, UART_EFR, UART_EFR_ECB);
  			serial_out(p, UART_LCR, 0);
  		}
@@ -3702,7 +3702,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		if (p->capabilities & UART_CAP_EFR) {
  			serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B);
  			serial_out(p, UART_EFR, efr);
-@@ -754,12 +754,29 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
+@@ -755,12 +755,29 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep)
  	serial8250_rpm_put(p);
  }
  
@@ -3736,7 +3736,7 @@ index 2a3bd6918c77..02323b500f40 100644
  }
  
  #ifdef CONFIG_SERIAL_8250_RSA
-@@ -1025,8 +1042,11 @@ static int broken_efr(struct uart_8250_port *up)
+@@ -1026,8 +1043,11 @@ static int broken_efr(struct uart_8250_port *up)
   */
  static void autoconfig_16550a(struct uart_8250_port *up)
  {
@@ -3748,7 +3748,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	up->port.type = PORT_16550A;
  	up->capabilities |= UART_CAP_FIFO;
-@@ -1138,6 +1158,11 @@ static void autoconfig_16550a(struct uart_8250_port *up)
+@@ -1139,6 +1159,11 @@ static void autoconfig_16550a(struct uart_8250_port *up)
  		return;
  	}
  
@@ -3760,7 +3760,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	/*
  	 * Try writing and reading the UART_IER_UUE bit (b6).
  	 * If it works, this is probably one of the Xscale platform's
-@@ -1173,6 +1198,9 @@ static void autoconfig_16550a(struct uart_8250_port *up)
+@@ -1174,6 +1199,9 @@ static void autoconfig_16550a(struct uart_8250_port *up)
  	}
  	serial_out(up, UART_IER, iersave);
  
@@ -3770,7 +3770,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	/*
  	 * We distinguish between 16550A and U6 16550A by counting
  	 * how many bytes are in the FIFO.
-@@ -1195,8 +1223,10 @@ static void autoconfig(struct uart_8250_port *up)
+@@ -1196,8 +1224,10 @@ static void autoconfig(struct uart_8250_port *up)
  	unsigned char status1, scratch, scratch2, scratch3;
  	unsigned char save_lcr, save_mcr;
  	struct uart_port *port = &up->port;
@@ -3781,7 +3781,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	if (!port->iobase && !port->mapbase && !port->membase)
  		return;
-@@ -1214,6 +1244,11 @@ static void autoconfig(struct uart_8250_port *up)
+@@ -1215,6 +1245,11 @@ static void autoconfig(struct uart_8250_port *up)
  	up->bugs = 0;
  
  	if (!(port->flags & UPF_BUGGY_UART)) {
@@ -3793,7 +3793,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		/*
  		 * Do a simple existence test first; if we fail this,
  		 * there's no point trying anything else.
-@@ -1243,6 +1278,10 @@ static void autoconfig(struct uart_8250_port *up)
+@@ -1244,6 +1279,10 @@ static void autoconfig(struct uart_8250_port *up)
  #endif
  		scratch3 = serial_in(up, UART_IER) & 0x0f;
  		serial_out(up, UART_IER, scratch);
@@ -3804,7 +3804,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		if (scratch2 != 0 || scratch3 != 0x0F) {
  			/*
  			 * We failed; there's nothing here
-@@ -1366,7 +1405,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
+@@ -1367,7 +1406,9 @@ static void autoconfig_irq(struct uart_8250_port *up)
  	unsigned char save_mcr, save_ier;
  	unsigned char save_ICP = 0;
  	unsigned int ICP = 0;
@@ -3814,7 +3814,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	int irq;
  
  	if (port->flags & UPF_FOURPORT) {
-@@ -1376,8 +1417,12 @@ static void autoconfig_irq(struct uart_8250_port *up)
+@@ -1377,8 +1418,12 @@ static void autoconfig_irq(struct uart_8250_port *up)
  		inb_p(ICP);
  	}
  
@@ -3828,7 +3828,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	/* forget possible initially masked and pending IRQ */
  	probe_irq_off(probe_irq_on());
-@@ -1409,8 +1454,10 @@ static void autoconfig_irq(struct uart_8250_port *up)
+@@ -1410,8 +1455,10 @@ static void autoconfig_irq(struct uart_8250_port *up)
  	if (port->flags & UPF_FOURPORT)
  		outb_p(save_ICP, ICP);
  
@@ -3840,7 +3840,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	port->irq = (irq > 0) ? irq : 0;
  }
-@@ -1423,7 +1470,7 @@ static void serial8250_stop_rx(struct uart_port *port)
+@@ -1424,7 +1471,7 @@ static void serial8250_stop_rx(struct uart_port *port)
  
  	up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
  	up->port.read_status_mask &= ~UART_LSR_DR;
@@ -3849,7 +3849,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	serial8250_rpm_put(up);
  }
-@@ -1453,7 +1500,7 @@ void serial8250_em485_stop_tx(struct uart_8250_port *p)
+@@ -1454,7 +1501,7 @@ void serial8250_em485_stop_tx(struct uart_8250_port *p)
  		serial8250_clear_and_reinit_fifos(p);
  
  		p->ier |= UART_IER_RLSI | UART_IER_RDI;
@@ -3858,7 +3858,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	}
  }
  EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx);
-@@ -1702,7 +1749,7 @@ static void serial8250_disable_ms(struct uart_port *port)
+@@ -1703,7 +1750,7 @@ static void serial8250_disable_ms(struct uart_port *port)
  	mctrl_gpio_disable_ms(up->gpios);
  
  	up->ier &= ~UART_IER_MSI;
@@ -3867,7 +3867,7 @@ index 2a3bd6918c77..02323b500f40 100644
  }
  
  static void serial8250_enable_ms(struct uart_port *port)
-@@ -1718,7 +1765,7 @@ static void serial8250_enable_ms(struct uart_port *port)
+@@ -1719,7 +1766,7 @@ static void serial8250_enable_ms(struct uart_port *port)
  	up->ier |= UART_IER_MSI;
  
  	serial8250_rpm_get(up);
@@ -3876,7 +3876,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	serial8250_rpm_put(up);
  }
  
-@@ -2166,8 +2213,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
+@@ -2171,8 +2218,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
  	/*
  	 *	First save the IER then disable the interrupts
  	 */
@@ -3886,7 +3886,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
  	/*
-@@ -2180,7 +2226,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
+@@ -2185,7 +2231,7 @@ static void serial8250_put_poll_char(struct uart_port *port,
  	 *	and restore the IER
  	 */
  	wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
@@ -3895,7 +3895,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	serial8250_rpm_put(up);
  }
  
-@@ -2189,8 +2235,10 @@ static void serial8250_put_poll_char(struct uart_port *port,
+@@ -2194,8 +2240,10 @@ static void serial8250_put_poll_char(struct uart_port *port,
  int serial8250_do_startup(struct uart_port *port)
  {
  	struct uart_8250_port *up = up_to_u8250p(port);
@@ -3906,7 +3906,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	int retval;
  	u16 lsr;
  
-@@ -2211,7 +2259,7 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2216,7 +2264,7 @@ int serial8250_do_startup(struct uart_port *port)
  		up->acr = 0;
  		serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
  		serial_port_out(port, UART_EFR, UART_EFR_ECB);
@@ -3915,7 +3915,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		serial_port_out(port, UART_LCR, 0);
  		serial_icr_write(up, UART_CSR, 0); /* Reset the UART */
  		serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B);
-@@ -2221,7 +2269,7 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2226,7 +2274,7 @@ int serial8250_do_startup(struct uart_port *port)
  
  	if (port->type == PORT_DA830) {
  		/* Reset the port */
@@ -3924,7 +3924,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		serial_port_out(port, UART_DA830_PWREMU_MGMT, 0);
  		mdelay(10);
  
-@@ -2320,6 +2368,8 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2325,6 +2373,8 @@ int serial8250_do_startup(struct uart_port *port)
  	if (retval)
  		goto out;
  
@@ -3933,7 +3933,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) {
  		unsigned char iir1;
  
-@@ -2336,6 +2386,9 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2341,6 +2391,9 @@ int serial8250_do_startup(struct uart_port *port)
  		 */
  		spin_lock_irqsave(&port->lock, flags);
  
@@ -3943,7 +3943,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		wait_for_xmitr(up, UART_LSR_THRE);
  		serial_port_out_sync(port, UART_IER, UART_IER_THRI);
  		udelay(1); /* allow THRE to set */
-@@ -2346,6 +2399,9 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2351,6 +2404,9 @@ int serial8250_do_startup(struct uart_port *port)
  		iir = serial_port_in(port, UART_IIR);
  		serial_port_out(port, UART_IER, 0);
  
@@ -3953,7 +3953,7 @@ index 2a3bd6918c77..02323b500f40 100644
  		spin_unlock_irqrestore(&port->lock, flags);
  
  		if (port->irqflags & IRQF_SHARED)
-@@ -2400,10 +2456,14 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2405,10 +2461,14 @@ int serial8250_do_startup(struct uart_port *port)
  	 * Do a quick test to see if we receive an interrupt when we enable
  	 * the TX irq.
  	 */
@@ -3968,7 +3968,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) {
  		if (!(up->bugs & UART_BUG_TXEN)) {
-@@ -2435,7 +2495,7 @@ int serial8250_do_startup(struct uart_port *port)
+@@ -2440,7 +2500,7 @@ int serial8250_do_startup(struct uart_port *port)
  	if (up->dma) {
  		const char *msg = NULL;
  
@@ -3977,7 +3977,7 @@ index 2a3bd6918c77..02323b500f40 100644
  			msg = "forbid DMA for kernel console";
  		else if (serial8250_request_dma(up))
  			msg = "failed to request DMA";
-@@ -2486,7 +2546,7 @@ void serial8250_do_shutdown(struct uart_port *port)
+@@ -2491,7 +2551,7 @@ void serial8250_do_shutdown(struct uart_port *port)
  	 */
  	spin_lock_irqsave(&port->lock, flags);
  	up->ier = 0;
@@ -3986,7 +3986,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	spin_unlock_irqrestore(&port->lock, flags);
  
  	synchronize_irq(port->irq);
-@@ -2852,7 +2912,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
+@@ -2857,7 +2917,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
  	if (up->capabilities & UART_CAP_RTOIE)
  		up->ier |= UART_IER_RTOIE;
  
@@ -3995,7 +3995,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	if (up->capabilities & UART_CAP_EFR) {
  		unsigned char efr = 0;
-@@ -3317,7 +3377,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults);
+@@ -3322,7 +3382,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults);
  
  #ifdef CONFIG_SERIAL_8250_CONSOLE
  
@@ -4004,7 +4004,7 @@ index 2a3bd6918c77..02323b500f40 100644
  {
  	struct uart_8250_port *up = up_to_u8250p(port);
  
-@@ -3325,6 +3385,18 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch)
+@@ -3330,6 +3390,18 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch)
  	serial_port_out(port, UART_TX, ch);
  }
  
@@ -4023,7 +4023,7 @@ index 2a3bd6918c77..02323b500f40 100644
  /*
   *	Restore serial console when h/w power-off detected
   */
-@@ -3351,6 +3423,32 @@ static void serial8250_console_restore(struct uart_8250_port *up)
+@@ -3356,6 +3428,32 @@ static void serial8250_console_restore(struct uart_8250_port *up)
  	serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
  }
  
@@ -4056,7 +4056,7 @@ index 2a3bd6918c77..02323b500f40 100644
  /*
   * Print a string to the serial port using the device FIFO
   *
-@@ -3396,20 +3494,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
+@@ -3401,20 +3499,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
  	struct uart_port *port = &up->port;
  	unsigned long flags;
  	unsigned int ier, use_fifo;
@@ -4079,7 +4079,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	/* check scratch reg to see if port powered off during system sleep */
  	if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) {
-@@ -3443,10 +3536,12 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
+@@ -3448,10 +3541,12 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
  		 */
  		!(up->port.flags & UPF_CONS_FLOW);
  
@@ -4092,7 +4092,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	/*
  	 *	Finally, wait for transmitter to become empty
-@@ -3459,8 +3554,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
+@@ -3464,8 +3559,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
  		if (em485->tx_stopped)
  			up->rs485_stop_tx(up);
  	}
@@ -4102,7 +4102,7 @@ index 2a3bd6918c77..02323b500f40 100644
  
  	/*
  	 *	The receive handling will happen properly because the
-@@ -3472,8 +3566,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
+@@ -3477,8 +3571,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s,
  	if (up->msr_saved_flags)
  		serial8250_modem_status(up);
  
@@ -4112,7 +4112,7 @@ index 2a3bd6918c77..02323b500f40 100644
  }
  
  static unsigned int probe_baud(struct uart_port *port)
-@@ -3493,6 +3586,7 @@ static unsigned int probe_baud(struct uart_port *port)
+@@ -3498,6 +3591,7 @@ static unsigned int probe_baud(struct uart_port *port)
  
  int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
  {
@@ -4120,7 +4120,7 @@ index 2a3bd6918c77..02323b500f40 100644
  	int baud = 9600;
  	int bits = 8;
  	int parity = 'n';
-@@ -3502,6 +3596,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
+@@ -3507,6 +3601,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe)
  	if (!port->iobase && !port->membase)
  		return -ENODEV;
  
@@ -4389,10 +4389,10 @@ index 1f1099dac3f0..1023f349af71 100644
   * To initialize a lockdep_map statically use this macro.
   * Note that _name must not be NULL.
 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index b072449b0f1a..5f818dc98ca3 100644
+index eac51e22a52a..ca0ab5bae817 100644
 --- a/include/linux/netdevice.h
 +++ b/include/linux/netdevice.h
-@@ -3165,7 +3165,11 @@ struct softnet_data {
+@@ -3166,7 +3166,11 @@ struct softnet_data {
  	int			defer_count;
  	int			defer_ipi_scheduled;
  	struct sk_buff		*defer_list;
@@ -6221,10 +6221,10 @@ index 5653560573e2..dcbbcf93d608 100644
  
  static void check_cpu_stall(struct rcu_data *rdp)
 diff --git a/kernel/reboot.c b/kernel/reboot.c
-index 3bba88c7ffc6..57cedc330660 100644
+index 395a0ea3c7a8..b3db54960bc4 100644
 --- a/kernel/reboot.c
 +++ b/kernel/reboot.c
-@@ -82,6 +82,7 @@ void kernel_restart_prepare(char *cmd)
+@@ -84,6 +84,7 @@ void kernel_restart_prepare(char *cmd)
  {
  	blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
  	system_state = SYSTEM_RESTART;
@@ -6232,7 +6232,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  	usermodehelper_disable();
  	device_shutdown();
  }
-@@ -282,6 +283,7 @@ static void kernel_shutdown_prepare(enum system_states state)
+@@ -284,6 +285,7 @@ static void kernel_shutdown_prepare(enum system_states state)
  	blocking_notifier_call_chain(&reboot_notifier_list,
  		(state == SYSTEM_HALT) ? SYS_HALT : SYS_POWER_OFF, NULL);
  	system_state = state;
@@ -6240,7 +6240,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  	usermodehelper_disable();
  	device_shutdown();
  }
-@@ -836,9 +838,11 @@ static int __orderly_reboot(void)
+@@ -840,9 +842,11 @@ static int __orderly_reboot(void)
  	ret = run_cmd(reboot_cmd);
  
  	if (ret) {
@@ -6252,7 +6252,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  	}
  
  	return ret;
-@@ -851,6 +855,7 @@ static int __orderly_poweroff(bool force)
+@@ -855,6 +859,7 @@ static int __orderly_poweroff(bool force)
  	ret = run_cmd(poweroff_cmd);
  
  	if (ret && force) {
@@ -6260,7 +6260,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  		pr_warn("Failed to start orderly shutdown: forcing the issue\n");
  
  		/*
-@@ -860,6 +865,7 @@ static int __orderly_poweroff(bool force)
+@@ -864,6 +869,7 @@ static int __orderly_poweroff(bool force)
  		 */
  		emergency_sync();
  		kernel_power_off();
@@ -6268,7 +6268,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  	}
  
  	return ret;
-@@ -917,6 +923,8 @@ EXPORT_SYMBOL_GPL(orderly_reboot);
+@@ -921,6 +927,8 @@ EXPORT_SYMBOL_GPL(orderly_reboot);
   */
  static void hw_failure_emergency_poweroff_func(struct work_struct *work)
  {
@@ -6277,7 +6277,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  	/*
  	 * We have reached here after the emergency shutdown waiting period has
  	 * expired. This means orderly_poweroff has not been able to shut off
-@@ -933,6 +941,8 @@ static void hw_failure_emergency_poweroff_func(struct work_struct *work)
+@@ -937,6 +945,8 @@ static void hw_failure_emergency_poweroff_func(struct work_struct *work)
  	 */
  	pr_emerg("Hardware protection shutdown failed. Trying emergency restart\n");
  	emergency_restart();
@@ -6286,7 +6286,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  }
  
  static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work,
-@@ -971,11 +981,13 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)
+@@ -975,11 +985,13 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)
  {
  	static atomic_t allow_proceed = ATOMIC_INIT(1);
  
@@ -6301,7 +6301,7 @@ index 3bba88c7ffc6..57cedc330660 100644
  
  	/*
  	 * Queue a backup emergency shutdown in the event of
-@@ -983,6 +995,8 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)
+@@ -987,6 +999,8 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)
  	 */
  	hw_failure_emergency_poweroff(ms_until_forced);
  	orderly_poweroff(true);
@@ -6574,7 +6574,7 @@ index b23dcbeacdf3..8989559d3d3c 100644
  	 * The idle tasks have their own, simple scheduling class:
  	 */
 diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
-index f70c4a7fb4ef..2e2f24075556 100644
+index fa33c441ae86..39b1cd30a868 100644
 --- a/kernel/sched/fair.c
 +++ b/kernel/sched/fair.c
 @@ -4934,7 +4934,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
@@ -6840,10 +6840,10 @@ index e4f0e3b0c4f4..9e2cfba065de 100644
  
  	__hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD);
 diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
-index b0e3c9205946..133e4160ed54 100644
+index a46506f7ec6d..1ae9e4e8a071 100644
 --- a/kernel/time/tick-sched.c
 +++ b/kernel/time/tick-sched.c
-@@ -779,7 +779,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
+@@ -789,7 +789,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
  
  static inline bool local_timer_softirq_pending(void)
  {
@@ -6866,7 +6866,7 @@ index 717fcb9fb14a..e6219da89933 100644
  
  /*
 diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index 3360d638071a..cac47c941e02 100644
+index 5c1087df2f1c..9d7071259f94 100644
 --- a/kernel/trace/trace.c
 +++ b/kernel/trace/trace.c
 @@ -2657,11 +2657,19 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status)
@@ -7063,7 +7063,7 @@ index 247bf0b1582c..701f35f0e2d4 100644
  		return;
  	}
 diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
-index e1bb41a443c4..296d0145932f 100644
+index d3e511e1eba8..0fa52bcc296b 100644
 --- a/net/8021q/vlan_dev.c
 +++ b/net/8021q/vlan_dev.c
 @@ -712,13 +712,13 @@ static void vlan_dev_get_stats64(struct net_device *dev,
@@ -7118,10 +7118,10 @@ index 9ffd40b8270c..bc75fa1e4666 100644
  		u64_stats_add(&stats->rx_packets, rxpackets);
  		u64_stats_add(&stats->rx_bytes, rxbytes);
 diff --git a/net/core/dev.c b/net/core/dev.c
-index a25b8741b159..dec69ba97e5e 100644
+index 93d430693ca0..2181ee13df8e 100644
 --- a/net/core/dev.c
 +++ b/net/core/dev.c
-@@ -4585,15 +4585,6 @@ static void rps_trigger_softirq(void *data)
+@@ -4587,15 +4587,6 @@ static void rps_trigger_softirq(void *data)
  
  #endif /* CONFIG_RPS */
  
@@ -7137,7 +7137,7 @@ index a25b8741b159..dec69ba97e5e 100644
  /*
   * Check if this softnet_data structure is another cpu one
   * If yes, queue it to our IPI list and return 1
-@@ -6651,6 +6642,30 @@ static void skb_defer_free_flush(struct softnet_data *sd)
+@@ -6653,6 +6644,30 @@ static void skb_defer_free_flush(struct softnet_data *sd)
  	}
  }
  
@@ -7168,7 +7168,7 @@ index a25b8741b159..dec69ba97e5e 100644
  static __latent_entropy void net_rx_action(struct softirq_action *h)
  {
  	struct softnet_data *sd = this_cpu_ptr(&softnet_data);
-@@ -10472,12 +10487,12 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
+@@ -10474,12 +10489,12 @@ void dev_fetch_sw_netstats(struct rtnl_link_stats64 *s,
  
  		stats = per_cpu_ptr(netstats, cpu);
  		do {
@@ -7183,7 +7183,7 @@ index a25b8741b159..dec69ba97e5e 100644
  
  		s->rx_packets += rx_packets;
  		s->rx_bytes   += rx_bytes;
-@@ -11392,7 +11407,11 @@ static int __init net_dev_init(void)
+@@ -11394,7 +11409,11 @@ static int __init net_dev_init(void)
  		INIT_CSD(&sd->csd, rps_trigger_softirq, sd);
  		sd->cpu = i;
  #endif
@@ -7297,10 +7297,10 @@ index c8d137ef5980..b71ccaec0991 100644
  
  static int
 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index cd4b3a610961..60ec16b6e97a 100644
+index ef9772b12624..ee4ee477aa3b 100644
 --- a/net/core/skbuff.c
 +++ b/net/core/skbuff.c
-@@ -6662,6 +6662,11 @@ nodefer:	__kfree_skb(skb);
+@@ -6675,6 +6675,11 @@ nodefer:	__kfree_skb(skb);
  	/* Make sure to trigger NET_RX_SOFTIRQ on the remote CPU
  	 * if we are unlucky enough (this seems very unlikely).
  	 */
@@ -7333,10 +7333,10 @@ index 5fe075bf479e..28ee63ec1d1d 100644
  		data[1] += tx_bytes;
  		data[2] += rx_packets;
 diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
-index 5b19b77d5d75..b787ff8a1f58 100644
+index ebb737ac9e89..a757099994bc 100644
 --- a/net/ipv4/af_inet.c
 +++ b/net/ipv4/af_inet.c
-@@ -1700,9 +1700,9 @@ u64 snmp_get_cpu_field64(void __percpu *mib, int cpu, int offt,
+@@ -1702,9 +1702,9 @@ u64 snmp_get_cpu_field64(void __percpu *mib, int cpu, int offt,
  	bhptr = per_cpu_ptr(mib, cpu);
  	syncp = (struct u64_stats_sync *)(bhptr + syncp_offset);
  	do {
@@ -7433,7 +7433,7 @@ index 03af6a2ffd56..fb7cabc71366 100644
  		seq_printf(seq, "%3X %8LX %8LX %8LX %16LX %16LX\n",
  			   i, (u64)conns, (u64)inpkts,
 diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
-index 12d815b9aa13..202b8f907778 100644
+index 31775d54f4b4..3de4bb691e10 100644
 --- a/net/netfilter/nf_tables_api.c
 +++ b/net/netfilter/nf_tables_api.c
 @@ -1546,10 +1546,10 @@ static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats)
diff --git a/patches/external/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch b/patches/external/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
index 1d4143e12..bc247a51f 100644
--- a/patches/external/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
+++ b/patches/external/wireless_regdb/0001-Add-wireless-regdb-regulatory-database-file.patch
@@ -1,6 +1,6 @@
-From 6183156859ae1b7e63fe737aade31572ae38b034 Mon Sep 17 00:00:00 2001
+From 0ae23ffb57fcdc8e140e21758aa337e3d028d113 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:47:12 -0500
+Date: Thu, 29 Jun 2023 16:13:35 -0500
 Subject: [PATCH] Add wireless-regdb regulatory database file
 
 https://git.kernel.org/pub/scm/linux/kernel/git/sforshee/wireless-regdb.git/commit/?id=9dc0800cdd7aeeae273b983973a1749f73008291
diff --git a/patches/external/wpanusb/0001-merge-wpanusb-https-git.beagleboard.org-beagleconnec.patch b/patches/external/wpanusb/0001-merge-wpanusb-https-git.beagleboard.org-beagleconnec.patch
index 933bc8bdc..259e1901e 100644
--- a/patches/external/wpanusb/0001-merge-wpanusb-https-git.beagleboard.org-beagleconnec.patch
+++ b/patches/external/wpanusb/0001-merge-wpanusb-https-git.beagleboard.org-beagleconnec.patch
@@ -1,6 +1,6 @@
-From d934bbc5f989b8d32c34c9d7fc7b6c2af8dd2ed0 Mon Sep 17 00:00:00 2001
+From a0cf77ee2dc5eef1b954b4c50432cbf00cc8da87 Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Tue, 27 Jun 2023 20:45:25 -0500
+Date: Thu, 29 Jun 2023 16:10:10 -0500
 Subject: [PATCH] merge: wpanusb:
  https://git.beagleboard.org/beagleconnect/linux/wpanusb
 
diff --git a/patches/ref_defconfig b/patches/ref_defconfig
index cfa6ca37a..658bd454c 100644
--- a/patches/ref_defconfig
+++ b/patches/ref_defconfig
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/arm64 6.1.26 Kernel Configuration
+# Linux/arm64 6.1.33 Kernel Configuration
 #
 CONFIG_CC_VERSION_TEXT="aarch64-linux-gcc (GCC) 12.3.0"
 CONFIG_CC_IS_GCC=y
@@ -1734,10 +1734,14 @@ CONFIG_PCIE_LAYERSCAPE_GEN4=y
 #
 # Cadence PCIe controllers support
 #
+CONFIG_PCIE_CADENCE=m
+CONFIG_PCIE_CADENCE_HOST=m
+CONFIG_PCIE_CADENCE_EP=m
 # CONFIG_PCIE_CADENCE_PLAT_HOST is not set
 # CONFIG_PCIE_CADENCE_PLAT_EP is not set
-# CONFIG_PCI_J721E_HOST is not set
-# CONFIG_PCI_J721E_EP is not set
+CONFIG_PCI_J721E=m
+CONFIG_PCI_J721E_HOST=m
+CONFIG_PCI_J721E_EP=m
 # end of Cadence PCIe controllers support
 # end of PCI controller drivers
 
@@ -1746,8 +1750,8 @@ CONFIG_PCIE_LAYERSCAPE_GEN4=y
 #
 CONFIG_PCI_ENDPOINT=y
 CONFIG_PCI_ENDPOINT_CONFIGFS=y
-CONFIG_PCI_EPF_TEST=m
-# CONFIG_PCI_EPF_NTB is not set
+CONFIG_PCI_EPF_TEST=y
+CONFIG_PCI_EPF_NTB=y
 # end of PCI Endpoint
 
 #
@@ -1937,13 +1941,13 @@ CONFIG_GNSS_MTK_SERIAL=m
 # CONFIG_GNSS_UBX_SERIAL is not set
 # CONFIG_GNSS_USB is not set
 CONFIG_MTD=y
-# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_TESTS=m
 
 #
 # Partition parsers
 #
 # CONFIG_MTD_AR7_PARTS is not set
-# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_OF_PARTS=y
 CONFIG_MTD_OF_PARTS_BCM4908=y
 # CONFIG_MTD_OF_PARTS_LINKSYS_NS is not set
@@ -2047,6 +2051,9 @@ CONFIG_MTD_RAW_NAND=y
 CONFIG_MTD_NAND_DENALI=y
 # CONFIG_MTD_NAND_DENALI_PCI is not set
 CONFIG_MTD_NAND_DENALI_DT=y
+CONFIG_MTD_NAND_OMAP2=y
+CONFIG_MTD_NAND_OMAP_BCH=y
+CONFIG_MTD_NAND_OMAP_BCH_BUILD=y
 # CONFIG_MTD_NAND_CAFE is not set
 CONFIG_MTD_NAND_MARVELL=y
 CONFIG_MTD_NAND_BRCMNAND=m
@@ -2192,8 +2199,8 @@ CONFIG_PCI_ENDPOINT_TEST=m
 # CONFIG_OPEN_DICE is not set
 # CONFIG_VCPU_STALL_DETECTOR is not set
 CONFIG_DMA_BUF_PHYS=y
-CONFIG_TPS6594_ESM=m
-CONFIG_TPS6594_PFSM=m
+CONFIG_TPS6594_ESM=y
+CONFIG_TPS6594_PFSM=y
 # CONFIG_C2PORT is not set
 
 #
@@ -3892,7 +3899,7 @@ CONFIG_PINCTRL_ROCKCHIP=y
 CONFIG_PINCTRL_SINGLE=y
 # CONFIG_PINCTRL_STMFX is not set
 # CONFIG_PINCTRL_SX150X is not set
-CONFIG_PINCTRL_TPS6594=m
+CONFIG_PINCTRL_TPS6594=y
 CONFIG_PINCTRL_ZYNQMP=y
 CONFIG_PINCTRL_OWL=y
 CONFIG_PINCTRL_S700=y
@@ -4684,8 +4691,8 @@ CONFIG_MFD_TPS65219=y
 # CONFIG_MFD_TPS65910 is not set
 # CONFIG_MFD_TPS65912_I2C is not set
 # CONFIG_MFD_TPS65912_SPI is not set
-CONFIG_MFD_TPS6594=m
-CONFIG_MFD_TPS6594_I2C=m
+CONFIG_MFD_TPS6594=y
+CONFIG_MFD_TPS6594_I2C=y
 # CONFIG_MFD_TPS6594_SPI is not set
 # CONFIG_TWL4030_CORE is not set
 # CONFIG_TWL6040_CORE is not set
@@ -4809,7 +4816,7 @@ CONFIG_REGULATOR_S2MPS11=y
 # CONFIG_REGULATOR_TPS6507X is not set
 CONFIG_REGULATOR_TPS65132=m
 CONFIG_REGULATOR_TPS65219=y
-CONFIG_REGULATOR_TPS6594=m
+CONFIG_REGULATOR_TPS6594=y
 # CONFIG_REGULATOR_TPS6524X is not set
 CONFIG_REGULATOR_UNIPHIER=y
 CONFIG_REGULATOR_VCTRL=m
@@ -5831,7 +5838,7 @@ CONFIG_DRM_LONTIUM_LT8912B=m
 # CONFIG_DRM_LONTIUM_LT9211 is not set
 CONFIG_DRM_LONTIUM_LT9611=m
 CONFIG_DRM_LONTIUM_LT9611UXC=m
-# CONFIG_DRM_ITE_IT66121 is not set
+CONFIG_DRM_ITE_IT66121=m
 # CONFIG_DRM_LVDS_CODEC is not set
 # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
 CONFIG_DRM_NWL_MIPI_DSI=m
@@ -6501,6 +6508,7 @@ CONFIG_SND_SOC_PCM3168A_I2C=m
 CONFIG_SND_SOC_RL6231=m
 # CONFIG_SND_SOC_RT1308_SDW is not set
 # CONFIG_SND_SOC_RT1316_SDW is not set
+# CONFIG_SND_SOC_RT1318_SDW is not set
 CONFIG_SND_SOC_RT5514=m
 CONFIG_SND_SOC_RT5514_SPI=m
 # CONFIG_SND_SOC_RT5616 is not set
@@ -7403,7 +7411,7 @@ CONFIG_RTC_DRV_PCF85363=m
 CONFIG_RTC_DRV_M41T80=m
 # CONFIG_RTC_DRV_M41T80_WDT is not set
 CONFIG_RTC_DRV_BQ32K=m
-CONFIG_RTC_DRV_TPS6594=m
+CONFIG_RTC_DRV_TPS6594=y
 # CONFIG_RTC_DRV_S35390A is not set
 # CONFIG_RTC_DRV_FM3130 is not set
 # CONFIG_RTC_DRV_RX8010 is not set
@@ -8271,15 +8279,16 @@ CONFIG_RPMSG_QCOM_GLINK_RPM=y
 CONFIG_RPMSG_QCOM_GLINK_SMEM=m
 CONFIG_RPMSG_QCOM_SMD=y
 CONFIG_RPMSG_VIRTIO=m
+CONFIG_RPMSG_PRU=m
 # end of Rpmsg drivers
 
 #
 # Rpmsg virtual device drivers
 #
-CONFIG_RPMSG_KDRV=m
+CONFIG_RPMSG_KDRV=y
 # CONFIG_RPMSG_KDRV_DEMO is not set
 # CONFIG_RPMSG_KDRV_DISPLAY is not set
-CONFIG_RPMSG_KDRV_ETH_SWITCH=m
+CONFIG_RPMSG_KDRV_ETH_SWITCH=y
 # end of Rpmsg virtual device drivers
 
 CONFIG_SOUNDWIRE=m
@@ -8522,7 +8531,8 @@ CONFIG_MEMORY=y
 # CONFIG_ARM_PL172_MPMC is not set
 CONFIG_BRCMSTB_DPFE=y
 CONFIG_BRCMSTB_MEMC=y
-# CONFIG_OMAP_GPMC is not set
+CONFIG_OMAP_GPMC=y
+# CONFIG_OMAP_GPMC_DEBUG is not set
 CONFIG_FSL_IFC=y
 CONFIG_MTK_SMI=y
 CONFIG_RENESAS_RPCIF=m
@@ -9098,7 +9108,7 @@ CONFIG_PWM_IMX27=m
 CONFIG_PWM_MESON=m
 CONFIG_PWM_MTK_DISP=m
 CONFIG_PWM_MEDIATEK=m
-# CONFIG_PWM_OMAP_DMTIMER is not set
+CONFIG_PWM_OMAP_DMTIMER=m
 # CONFIG_PWM_PCA9685 is not set
 # CONFIG_PWM_RASPBERRYPI_POE is not set
 CONFIG_PWM_RCAR=m
@@ -9459,7 +9469,12 @@ CONFIG_INTERCONNECT_QCOM_SM8350=m
 CONFIG_INTERCONNECT_QCOM_SM8450=m
 CONFIG_INTERCONNECT_QCOM_SMD_RPM=m
 # CONFIG_INTERCONNECT_SAMSUNG is not set
-# CONFIG_COUNTER is not set
+CONFIG_COUNTER=m
+# CONFIG_INTERRUPT_CNT is not set
+# CONFIG_FTM_QUADDEC is not set
+# CONFIG_MICROCHIP_TCB_CAPTURE is not set
+# CONFIG_INTEL_QEP is not set
+CONFIG_TI_ECAP_CAPTURE=m
 # CONFIG_MOST is not set
 # CONFIG_PECI is not set
 # CONFIG_HTE is not set
@@ -9963,7 +9978,7 @@ CONFIG_CRYPTO_JITTERENTROPY=y
 # Userspace interface
 #
 CONFIG_CRYPTO_USER_API=m
-# CONFIG_CRYPTO_USER_API_HASH is not set
+CONFIG_CRYPTO_USER_API_HASH=m
 # CONFIG_CRYPTO_USER_API_SKCIPHER is not set
 CONFIG_CRYPTO_USER_API_RNG=m
 # CONFIG_CRYPTO_USER_API_RNG_CAVP is not set
@@ -10066,6 +10081,7 @@ CONFIG_CRYPTO_DEV_SA2UL=m
 # CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4 is not set
 # CONFIG_CRYPTO_DEV_KEEMBAY_OCS_ECC is not set
 # CONFIG_CRYPTO_DEV_KEEMBAY_OCS_HCU is not set
+CONFIG_CRYPTO_DEV_TI_MCRC64=m
 CONFIG_ASYMMETRIC_KEY_TYPE=y
 CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
 CONFIG_X509_CERTIFICATE_PARSER=y
@@ -10175,6 +10191,7 @@ CONFIG_DECOMPRESS_LZO=y
 CONFIG_DECOMPRESS_LZ4=y
 CONFIG_DECOMPRESS_ZSTD=y
 CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_BCH=y
 CONFIG_INTERVAL_TREE=y
 CONFIG_XARRAY_MULTI=y
 CONFIG_ASSOCIATIVE_ARRAY=y
@@ -10447,7 +10464,15 @@ CONFIG_HAVE_C_RECORDMCOUNT=y
 CONFIG_TRACE_CLOCK=y
 CONFIG_TRACING_SUPPORT=y
 # CONFIG_FTRACE is not set
-# CONFIG_SAMPLES is not set
+CONFIG_SAMPLES=y
+# CONFIG_SAMPLE_KOBJECT is not set
+# CONFIG_SAMPLE_HW_BREAKPOINT is not set
+# CONFIG_SAMPLE_KFIFO is not set
+# CONFIG_SAMPLE_QMI_CLIENT is not set
+CONFIG_SAMPLE_RPMSG_CLIENT=m
+# CONFIG_SAMPLE_CONFIGFS is not set
+# CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB is not set
+# CONFIG_SAMPLE_CORESIGHT_SYSCFG is not set
 CONFIG_STRICT_DEVMEM=y
 # CONFIG_IO_STRICT_DEVMEM is not set
 
diff --git a/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch b/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
index 68663a4dd..f8bd8bd98 100644
--- a/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
+++ b/patches/soc/ti/beagleboard_dtbs/0001-Add-BeagleBoard.org-Device-Tree-Changes.patch
@@ -1,27 +1,26 @@
-From 4eff39d951db67dae5abffd98c21b9339a5081ca Mon Sep 17 00:00:00 2001
+From 65038d5d9d363c9dcb5954a6fdaee01b0c7cebac Mon Sep 17 00:00:00 2001
 From: Robert Nelson <robertcnelson@gmail.com>
-Date: Wed, 28 Jun 2023 11:31:43 -0500
+Date: Thu, 29 Jun 2023 16:33:56 -0500
 Subject: [PATCH] Add BeagleBoard.org Device Tree Changes
 
 https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/tree/v6.1.x-ti
 
-https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/4d2b84c736306da75ca9b22ff95018a197a234da
+https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/commit/77c6a96c094519bb9d9cab0508db7eab6df42776
 Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
 ---
  arch/arm64/boot/dts/ti/Makefile               |    1 +
  .../boot/dts/ti/k3-j721e-beagleboneai64.dts   | 1055 +++++++++++++++++
  include/dt-bindings/board/am335x-bone-pins.h  |  253 ++++
- include/dt-bindings/pinctrl/k3.h              |    7 -
  include/dt-bindings/pinctrl/omap.h            |    4 +-
- 5 files changed, 1311 insertions(+), 9 deletions(-)
+ 4 files changed, 1311 insertions(+), 2 deletions(-)
  create mode 100644 arch/arm64/boot/dts/ti/k3-j721e-beagleboneai64.dts
  create mode 100644 include/dt-bindings/board/am335x-bone-pins.h
 
 diff --git a/arch/arm64/boot/dts/ti/Makefile b/arch/arm64/boot/dts/ti/Makefile
-index d4c71593494c..fafac79f0678 100644
+index 3fa7da5fc5ad..78ee3d4fe06c 100644
 --- a/arch/arm64/boot/dts/ti/Makefile
 +++ b/arch/arm64/boot/dts/ti/Makefile
-@@ -116,3 +116,4 @@ DTC_FLAGS_k3-j721s2-common-proc-board += -@
+@@ -127,3 +127,4 @@ DTC_FLAGS_k3-j721s2-common-proc-board += -@
  DTC_FLAGS_k3-j721s2-evm-fusion += -@
  DTC_FLAGS_k3-j784s4-evm += -@
  DTC_FLAGS_k3-am642-evm += -@
@@ -1346,24 +1345,6 @@ index 000000000000..54e92664ba79
 +#define P2_35(mode) AM33XX_IOPAD(0x08e0, mode)  /* U5: lcd_vsync */
 +
 +#endif
-diff --git a/include/dt-bindings/pinctrl/k3.h b/include/dt-bindings/pinctrl/k3.h
-index b5aca149664e..6bb9df1a264d 100644
---- a/include/dt-bindings/pinctrl/k3.h
-+++ b/include/dt-bindings/pinctrl/k3.h
-@@ -8,13 +8,6 @@
- #ifndef _DT_BINDINGS_PINCTRL_TI_K3_H
- #define _DT_BINDINGS_PINCTRL_TI_K3_H
- 
--/*
-- * These bindings are deprecated, because they do not match the actual
-- * concept of bindings but rather contain pure register values.
-- * Instead include the header in the DTS source directory.
-- */
--#warning "These bindings are deprecated. Instead, use the header in the DTS source directory."
--
- #define PULLUDEN_SHIFT		(16)
- #define PULLTYPESEL_SHIFT	(17)
- #define RXACTIVE_SHIFT		(18)
 diff --git a/include/dt-bindings/pinctrl/omap.h b/include/dt-bindings/pinctrl/omap.h
 index f48245ff87e5..625718042413 100644
 --- a/include/dt-bindings/pinctrl/omap.h
diff --git a/version.sh b/version.sh
index c6ba3a6ea..c7282ec60 100644
--- a/version.sh
+++ b/version.sh
@@ -45,10 +45,10 @@ toolchain="gcc_12_aarch64"
 
 #Kernel
 KERNEL_REL=6.1
-KERNEL_TAG=${KERNEL_REL}.26
-kernel_rt=".26-rt8"
+KERNEL_TAG=${KERNEL_REL}.33
+kernel_rt=".33-rt11"
 #Kernel Build
-BUILD=${build_prefix}3
+BUILD=${build_prefix}3.1
 
 #v6.X-rcX + upto SHA
 #prev_KERNEL_SHA=""
@@ -59,8 +59,8 @@ BRANCH="${branch_prefix}${KERNEL_REL}${branch_postfix}"
 
 DISTRO=xross
 
-ti_git_old_release="7124dee9779a40c52c52331c3ba6ccc84f357380"
-ti_git_new_release="1ada48a6cf0b8b731b835b9f1e1e4af89f8fb791"
-TISDK="09.00.00.003"
+ti_git_old_release="1ada48a6cf0b8b731b835b9f1e1e4af89f8fb791"
+ti_git_new_release="2b6f5746de558d954e42749b898fcdb4227dce5a"
+TISDK="09.00.00.004"
 
 #
-- 
GitLab