--- /dev/null
+From f408c6c45013c80d62ed4b793ee79d76e4b582e0 Mon Sep 17 00:00:00 2001
+From: Namjae Jeon <namjae.jeon@samsung.com>
+Date: Wed, 11 Aug 2021 15:21:04 +0900
+Subject: [PATCH] ksmbd: remove select FS_POSIX_ACL in Kconfig
+
+ksmbd is forcing to turn on FS_POSIX_ACL in Kconfig to use vfs acl
+functions(posix_acl_alloc, get_acl, set_posix_acl). OpenWRT and other
+platform doesn't use acl and this config is disable by default in
+kernel. This patch use IS_ENABLED() to know acl config is enable and use
+acl function if it is enable.
+
+Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
+---
+ Kconfig | 1 -
+ smb2pdu.c | 8 +++---
+ smbacl.c | 80 ++++++++++++++++++++++++++++++++-----------------------
+ vfs.c | 9 +++++++
+ 4 files changed, 60 insertions(+), 38 deletions(-)
+
+--- a/Kconfig
++++ b/Kconfig
+@@ -19,7 +19,6 @@ config SMB_SERVER
+ select CRYPTO_GCM
+ select ASN1
+ select OID_REGISTRY
+- select FS_POSIX_ACL
+ default n
+ help
+ Choose Y here if you want to allow SMB3 compliant clients
+--- a/smb2pdu.c
++++ b/smb2pdu.c
+@@ -2387,9 +2387,11 @@ static void ksmbd_acls_fattr(struct smb_
+ fattr->cf_mode = inode->i_mode;
+ fattr->cf_dacls = NULL;
+
+- fattr->cf_acls = get_acl(inode, ACL_TYPE_ACCESS);
+- if (S_ISDIR(inode->i_mode))
+- fattr->cf_dacls = get_acl(inode, ACL_TYPE_DEFAULT);
++ if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
++ fattr->cf_acls = get_acl(inode, ACL_TYPE_ACCESS);
++ if (S_ISDIR(inode->i_mode))
++ fattr->cf_dacls = get_acl(inode, ACL_TYPE_DEFAULT);
++ }
+ }
+
+ /**
+--- a/smbacl.c
++++ b/smbacl.c
+@@ -533,22 +533,29 @@ static void parse_dacl(struct user_names
+
+ if (acl_state.users->n || acl_state.groups->n) {
+ acl_state.mask.allow = 0x07;
+- fattr->cf_acls = posix_acl_alloc(acl_state.users->n +
+- acl_state.groups->n + 4, GFP_KERNEL);
+- if (fattr->cf_acls) {
+- cf_pace = fattr->cf_acls->a_entries;
+- posix_state_to_acl(&acl_state, cf_pace);
++
++ if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
++ fattr->cf_acls =
++ posix_acl_alloc(acl_state.users->n +
++ acl_state.groups->n + 4, GFP_KERNEL);
++ if (fattr->cf_acls) {
++ cf_pace = fattr->cf_acls->a_entries;
++ posix_state_to_acl(&acl_state, cf_pace);
++ }
+ }
+ }
+
+ if (default_acl_state.users->n || default_acl_state.groups->n) {
+ default_acl_state.mask.allow = 0x07;
+- fattr->cf_dacls =
+- posix_acl_alloc(default_acl_state.users->n +
+- default_acl_state.groups->n + 4, GFP_KERNEL);
+- if (fattr->cf_dacls) {
+- cf_pdace = fattr->cf_dacls->a_entries;
+- posix_state_to_acl(&default_acl_state, cf_pdace);
++
++ if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
++ fattr->cf_dacls =
++ posix_acl_alloc(default_acl_state.users->n +
++ default_acl_state.groups->n + 4, GFP_KERNEL);
++ if (fattr->cf_dacls) {
++ cf_pdace = fattr->cf_dacls->a_entries;
++ posix_state_to_acl(&default_acl_state, cf_pdace);
++ }
+ }
+ }
+ free_acl_state(&acl_state);
+@@ -1221,31 +1228,36 @@ int smb_check_perm_dacl(struct ksmbd_con
+ granted = GENERIC_ALL_FLAGS;
+ }
+
+- posix_acls = get_acl(d_inode(path->dentry), ACL_TYPE_ACCESS);
+- if (posix_acls && !found) {
+- unsigned int id = -1;
+-
+- pa_entry = posix_acls->a_entries;
+- for (i = 0; i < posix_acls->a_count; i++, pa_entry++) {
+- if (pa_entry->e_tag == ACL_USER)
+- id = from_kuid(user_ns,
+- pa_entry->e_uid);
+- else if (pa_entry->e_tag == ACL_GROUP)
+- id = from_kgid(user_ns,
+- pa_entry->e_gid);
+- else
+- continue;
+-
+- if (id == uid) {
+- mode_to_access_flags(pa_entry->e_perm, 0777, &access_bits);
+- if (!access_bits)
+- access_bits = SET_MINIMUM_RIGHTS;
+- goto check_access_bits;
++ if (IS_ENABLED(CONFIG_FS_POSIX_ACL)) {
++ posix_acls = get_acl(d_inode(path->dentry), ACL_TYPE_ACCESS);
++ if (posix_acls && !found) {
++ unsigned int id = -1;
++
++ pa_entry = posix_acls->a_entries;
++ for (i = 0; i < posix_acls->a_count; i++, pa_entry++) {
++ if (pa_entry->e_tag == ACL_USER)
++ id = from_kuid(user_ns,
++ pa_entry->e_uid);
++ else if (pa_entry->e_tag == ACL_GROUP)
++ id = from_kgid(user_ns,
++ pa_entry->e_gid);
++ else
++ continue;
++
++ if (id == uid) {
++ mode_to_access_flags(pa_entry->e_perm,
++ 0777,
++ &access_bits);
++ if (!access_bits)
++ access_bits =
++ SET_MINIMUM_RIGHTS;
++ goto check_access_bits;
++ }
+ }
+ }
++ if (posix_acls)
++ posix_acl_release(posix_acls);
+ }
+- if (posix_acls)
+- posix_acl_release(posix_acls);
+
+ if (!found) {
+ if (others_ace) {
+@@ -1308,7 +1320,7 @@ int set_info_sec(struct ksmbd_conn *conn
+
+ ksmbd_vfs_remove_acl_xattrs(user_ns, path->dentry);
+ /* Update posix acls */
+- if (fattr.cf_dacls) {
++ if (IS_ENABLED(CONFIG_FS_POSIX_ACL) && fattr.cf_dacls) {
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
+ rc = set_posix_acl(user_ns, inode,
+ ACL_TYPE_ACCESS,
+--- a/vfs.c
++++ b/vfs.c
+@@ -1508,6 +1508,9 @@ static struct xattr_smb_acl *ksmbd_vfs_m
+ struct xattr_acl_entry *xa_entry;
+ int i;
+
++ if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
++ return NULL;
++
+ posix_acls = get_acl(inode, acl_type);
+ if (!posix_acls)
+ return NULL;
+@@ -2322,6 +2325,9 @@ int ksmbd_vfs_set_init_posix_acl(struct
+ struct posix_acl *acls;
+ int rc;
+
++ if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
++ return -EOPNOTSUPP;
++
+ ksmbd_debug(SMB, "Set posix acls\n");
+ rc = init_acl_state(&acl_state, 1);
+ if (rc)
+@@ -2377,6 +2383,9 @@ int ksmbd_vfs_inherit_posix_acl(struct u
+ struct posix_acl_entry *pace;
+ int rc, i;
+
++ if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
++ return -EOPNOTSUPP;
++
+ acls = get_acl(parent_inode, ACL_TYPE_DEFAULT);
+ if (!acls)
+ return -ENOENT;