X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Facl.c;h=ca7524a74c5414be16c74b279f10de836d59b215;hb=6f34d6b85466bc8cddb8de1816734528af9da09b;hp=05b1fb0d15645dbd4a245638854925677c99bd1a;hpb=6fc61eea18e7fb48734ffef8aee4faa283f05e36;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/acl.c b/lustre/obdclass/acl.c index 05b1fb0..ca7524a 100644 --- a/lustre/obdclass/acl.c +++ b/lustre/obdclass/acl.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,7 +24,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -40,10 +38,6 @@ * Author: Fan Yong */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - #define DEBUG_SUBSYSTEM S_SEC #include @@ -99,9 +93,9 @@ static inline void lustre_posix_acl_cpu_to_le(posix_acl_xattr_entry *d, /* * Check permission based on POSIX ACL. */ -int lustre_posix_acl_permission(struct md_ucred *mu, struct lu_attr *la, - int want, posix_acl_xattr_entry *entry, - int count) +int lustre_posix_acl_permission(struct lu_ucred *mu, struct lu_attr *la, + int want, posix_acl_xattr_entry *entry, + int count) { posix_acl_xattr_entry *pa, *pe, *mask_obj; posix_acl_xattr_entry ae, me; @@ -115,12 +109,12 @@ int lustre_posix_acl_permission(struct md_ucred *mu, struct lu_attr *la, switch (ae.e_tag) { case ACL_USER_OBJ: /* (May have been checked already) */ - if (la->la_uid == mu->mu_fsuid) - goto check_perm; + if (la->la_uid == mu->uc_fsuid) + goto check_perm; break; case ACL_USER: - if (ae.e_id == mu->mu_fsuid) - goto mask; + if (ae.e_id == mu->uc_fsuid) + goto mask; break; case ACL_GROUP_OBJ: if (lustre_in_group_p(mu, la->la_gid)) { @@ -211,6 +205,49 @@ int lustre_posix_acl_chmod_masq(posix_acl_xattr_entry *entry, __u32 mode, EXPORT_SYMBOL(lustre_posix_acl_chmod_masq); /* + * Returns 0 if the acl can be exactly represented in the traditional + * file mode permission bits, or else 1. Returns -E... on error. + */ + int +lustre_posix_acl_equiv_mode(posix_acl_xattr_entry *entry, mode_t *mode_p, + int count) +{ + posix_acl_xattr_entry *pa, *pe; + mode_t mode = 0; + int not_equiv = 0; + + for (pa = &entry[0], pe = &entry[count - 1]; pa <= pe; pa++) { + __u16 perm = le16_to_cpu(pa->e_perm); + switch (le16_to_cpu(pa->e_tag)) { + case ACL_USER_OBJ: + mode |= (perm & S_IRWXO) << 6; + break; + case ACL_GROUP_OBJ: + mode |= (perm & S_IRWXO) << 3; + break; + case ACL_OTHER: + mode |= perm & S_IRWXO; + break; + case ACL_MASK: + mode = (mode & ~S_IRWXG) | + ((perm & S_IRWXO) << 3); + not_equiv = 1; + break; + case ACL_USER: + case ACL_GROUP: + not_equiv = 1; + break; + default: + return -EINVAL; + } + } + if (mode_p) + *mode_p = (*mode_p & ~S_IRWXUGO) | mode; + return not_equiv; +} +EXPORT_SYMBOL(lustre_posix_acl_equiv_mode); + +/* * Modify acl when creating a new object. */ int lustre_posix_acl_create_masq(posix_acl_xattr_entry *entry, __u32 *pmode, @@ -428,10 +465,10 @@ EXPORT_SYMBOL(lustre_posix_acl_xattr_filter); * @CFS_IC_UNMAPPED * only unmapped ids are converted to "nobody". */ -int lustre_posix_acl_xattr_id2client(struct md_ucred *mu, - struct lustre_idmap_table *t, - posix_acl_xattr_header *header, - int size, int flags) +int lustre_posix_acl_xattr_id2client(struct lu_ucred *mu, + struct lustre_idmap_table *t, + posix_acl_xattr_header *header, + int size, int flags) { int count, i; __u32 id; @@ -511,9 +548,9 @@ EXPORT_SYMBOL(lustre_posix_acl_xattr_free); * mapped ids are converted to server-side ones, * unmapped ones cause "EPERM" error. */ -int lustre_ext_acl_xattr_id2server(struct md_ucred *mu, - struct lustre_idmap_table *t, - ext_acl_xattr_header *header) +int lustre_ext_acl_xattr_id2server(struct lu_ucred *mu, + struct lustre_idmap_table *t, + ext_acl_xattr_header *header) { int i, count = le32_to_cpu(header->a_count); @@ -766,12 +803,12 @@ lustre_acl_xattr_merge2ext(posix_acl_xattr_header *posix_header, int size, if (posix_header->a_entries[i].e_perm != ee->e_perm) /* entry modified. */ - ee->e_perm = + ee->e_stat = new->a_entries[j++].e_stat = cpu_to_le32(ES_MOD); else /* entry unchanged. */ - ee->e_perm = + ee->e_stat = new->a_entries[j++].e_stat = cpu_to_le32(ES_UNC); } else { @@ -796,12 +833,12 @@ lustre_acl_xattr_merge2ext(posix_acl_xattr_header *posix_header, int size, if (posix_header->a_entries[i].e_perm != ee->e_perm) /* entry modified. */ - ee->e_perm = + ee->e_stat = new->a_entries[j++].e_stat = cpu_to_le32(ES_MOD); else /* entry unchanged. */ - ee->e_perm = + ee->e_stat = new->a_entries[j++].e_stat = cpu_to_le32(ES_UNC); } else {