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