|
|
- 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;
|