From fe990205ac8ce0edee4f94b632d0d7411805648c Mon Sep 17 00:00:00 2001 From: Christof Schmitt Date: Tue, 9 Jul 2019 13:08:35 -0700 Subject: vfs_gpfs: Move mapping from generic NFSv ACL to GPFS ACL to separate function This is not functional change. It cleans up the code a bit and makes expanding this codepath in a later patch easier. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14032 Signed-off-by: Christof Schmitt Reviewed-by: Ralph Boehme (cherry picked from commit fbf3a090a9ec94262b2924461cc1d6336af9919c) --- source3/modules/vfs_gpfs.c | 69 +++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index 63aeeddf797..fc7d73508d8 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -673,6 +673,43 @@ static NTSTATUS gpfsacl_get_nt_acl(vfs_handle_struct *handle, return map_nt_error_from_unix(errno); } +static bool vfs_gpfs_nfs4_ace_to_gpfs_ace(SMB_ACE4PROP_T *nfs4_ace, + struct gpfs_ace_v4 *gace) +{ + gace->aceType = nfs4_ace->aceType; + gace->aceFlags = nfs4_ace->aceFlags; + gace->aceMask = nfs4_ace->aceMask; + + if (nfs4_ace->flags & SMB_ACE4_ID_SPECIAL) { + switch(nfs4_ace->who.special_id) { + case SMB_ACE4_WHO_EVERYONE: + gace->aceIFlags = ACE4_IFLAG_SPECIAL_ID; + gace->aceWho = ACE4_SPECIAL_EVERYONE; + break; + case SMB_ACE4_WHO_OWNER: + gace->aceIFlags = ACE4_IFLAG_SPECIAL_ID; + gace->aceWho = ACE4_SPECIAL_OWNER; + break; + case SMB_ACE4_WHO_GROUP: + gace->aceIFlags = ACE4_IFLAG_SPECIAL_ID; + gace->aceWho = ACE4_SPECIAL_GROUP; + break; + default: + DBG_WARNING("Unsupported special_id %d\n", + nfs4_ace->who.special_id); + return false; + } + + return true; + } + + gace->aceIFlags = 0; + gace->aceWho = (nfs4_ace->aceFlags & SMB_ACE4_IDENTIFIER_GROUP) ? + nfs4_ace->who.gid : nfs4_ace->who.uid; + + return true; +} + static struct gpfs_acl *vfs_gpfs_smbacl2gpfsacl(TALLOC_CTX *mem_ctx, files_struct *fsp, struct SMB4ACL_T *smbacl, @@ -705,35 +742,11 @@ static struct gpfs_acl *vfs_gpfs_smbacl2gpfsacl(TALLOC_CTX *mem_ctx, for (smbace=smb_first_ace4(smbacl); smbace!=NULL; smbace = smb_next_ace4(smbace)) { struct gpfs_ace_v4 *gace = gpfs_ace_ptr(gacl, gacl->acl_nace); SMB_ACE4PROP_T *aceprop = smb_get_ace4(smbace); + bool add_ace; - gace->aceType = aceprop->aceType; - gace->aceFlags = aceprop->aceFlags; - gace->aceMask = aceprop->aceMask; - gace->aceIFlags = (aceprop->flags&SMB_ACE4_ID_SPECIAL) ? ACE4_IFLAG_SPECIAL_ID : 0; - - if (aceprop->flags&SMB_ACE4_ID_SPECIAL) - { - switch(aceprop->who.special_id) - { - case SMB_ACE4_WHO_EVERYONE: - gace->aceWho = ACE4_SPECIAL_EVERYONE; - break; - case SMB_ACE4_WHO_OWNER: - gace->aceWho = ACE4_SPECIAL_OWNER; - break; - case SMB_ACE4_WHO_GROUP: - gace->aceWho = ACE4_SPECIAL_GROUP; - break; - default: - DEBUG(8, ("unsupported special_id %d\n", aceprop->who.special_id)); - continue; /* don't add it !!! */ - } - } else { - /* just only for the type safety... */ - if (aceprop->aceFlags&SMB_ACE4_IDENTIFIER_GROUP) - gace->aceWho = aceprop->who.gid; - else - gace->aceWho = aceprop->who.uid; + add_ace = vfs_gpfs_nfs4_ace_to_gpfs_ace(aceprop, gace); + if (!add_ace) { + continue; } gacl->acl_nace++; -- cgit v1.2.1