aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4acl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfs4acl.c')
-rw-r--r--fs/nfsd/nfs4acl.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
index 5d94555cdc83..785418b0b799 100644
--- a/fs/nfsd/nfs4acl.c
+++ b/fs/nfsd/nfs4acl.c
@@ -61,9 +61,11 @@
61 61
62/* flags used to simulate posix default ACLs */ 62/* flags used to simulate posix default ACLs */
63#define NFS4_INHERITANCE_FLAGS (NFS4_ACE_FILE_INHERIT_ACE \ 63#define NFS4_INHERITANCE_FLAGS (NFS4_ACE_FILE_INHERIT_ACE \
64 | NFS4_ACE_DIRECTORY_INHERIT_ACE | NFS4_ACE_INHERIT_ONLY_ACE) 64 | NFS4_ACE_DIRECTORY_INHERIT_ACE)
65 65
66#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS | NFS4_ACE_IDENTIFIER_GROUP) 66#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS \
67 | NFS4_ACE_INHERIT_ONLY_ACE \
68 | NFS4_ACE_IDENTIFIER_GROUP)
67 69
68#define MASK_EQUAL(mask1, mask2) \ 70#define MASK_EQUAL(mask1, mask2) \
69 ( ((mask1) & NFS4_ACE_MASK_ALL) == ((mask2) & NFS4_ACE_MASK_ALL) ) 71 ( ((mask1) & NFS4_ACE_MASK_ALL) == ((mask2) & NFS4_ACE_MASK_ALL) )
@@ -707,11 +709,16 @@ nfs4_acl_split(struct nfs4_acl *acl, struct nfs4_acl *dacl)
707 if (ace->flag & ~NFS4_SUPPORTED_FLAGS) 709 if (ace->flag & ~NFS4_SUPPORTED_FLAGS)
708 return -EINVAL; 710 return -EINVAL;
709 711
710 switch (ace->flag & NFS4_INHERITANCE_FLAGS) { 712 if ((ace->flag & NFS4_INHERITANCE_FLAGS) == 0) {
711 case 0:
712 /* Leave this ace in the effective acl: */ 713 /* Leave this ace in the effective acl: */
713 continue; 714 continue;
714 case NFS4_INHERITANCE_FLAGS: 715 }
716 /*
717 * Note that when only one of FILE_INHERIT or DIRECTORY_INHERIT
718 * is set, we're effectively turning on the other. That's OK,
719 * according to rfc 3530.
720 */
721 if (ace->flag & NFS4_ACE_INHERIT_ONLY_ACE) {
715 /* Add this ace to the default acl and remove it 722 /* Add this ace to the default acl and remove it
716 * from the effective acl: */ 723 * from the effective acl: */
717 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag, 724 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
@@ -721,17 +728,13 @@ nfs4_acl_split(struct nfs4_acl *acl, struct nfs4_acl *dacl)
721 list_del(h); 728 list_del(h);
722 kfree(ace); 729 kfree(ace);
723 acl->naces--; 730 acl->naces--;
724 break; 731 } else {
725 case NFS4_INHERITANCE_FLAGS & ~NFS4_ACE_INHERIT_ONLY_ACE:
726 /* Add this ace to the default, but leave it in 732 /* Add this ace to the default, but leave it in
727 * the effective acl as well: */ 733 * the effective acl as well: */
728 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag, 734 error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
729 ace->access_mask, ace->whotype, ace->who); 735 ace->access_mask, ace->whotype, ace->who);
730 if (error) 736 if (error)
731 return error; 737 return error;
732 break;
733 default:
734 return -EINVAL;
735 } 738 }
736 } 739 }
737 return 0; 740 return 0;