From: Dmitry Eremin <dmitry.eremin@xxxxxxxxx> Linux kernel v3.14 adds set_acl method to inode operations. This patch adds support to Lustre for proper acl management. Signed-off-by: Dmitry Eremin <dmitry.eremin@xxxxxxxxx> Signed-off-by: John L. Hammond <john.hammond@xxxxxxxxx> Signed-off-by: James Simmons <uja.ornl@xxxxxxxxx> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-9183 Reviewed-on: https://review.whamcloud.com/25965 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-10541 Reviewed-on: https://review.whamcloud.com/31588 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-10926 Reviewed-on: https://review.whamcloud.com/32045 Reviewed-by: Bob Glossman <bob.glossman@xxxxxxxxx> Reviewed-by: James Simmons <uja.ornl@xxxxxxxxx> Reviewed-by: Andreas Dilger <andreas.dilger@xxxxxxxxx> Reviewed-by: Dmitry Eremin <dmitry.eremin@xxxxxxxxx> Reviewed-by: Oleg Drokin <oleg.drokin@xxxxxxxxx> Signed-off-by: James Simmons <jsimmons@xxxxxxxxxxxxx> --- Changelog: v1) Initial ported patch v2) Updated patch with fixes that address issues pointed out by Can Carpenter v3) Rebased to contain new code in acl.c drivers/staging/lustre/lustre/llite/acl.c | 57 ++++++++++++++++++++++ .../staging/lustre/lustre/llite/llite_internal.h | 2 + 2 files changed, 59 insertions(+) diff --git a/drivers/staging/lustre/lustre/llite/acl.c b/drivers/staging/lustre/lustre/llite/acl.c index d7c3bf9..de1499b 100644 --- a/drivers/staging/lustre/lustre/llite/acl.c +++ b/drivers/staging/lustre/lustre/llite/acl.c @@ -49,3 +49,60 @@ struct posix_acl *ll_get_acl(struct inode *inode, int type) return acl; } + +int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type) +{ + struct ll_sb_info *sbi = ll_i2sbi(inode); + struct ptlrpc_request *req = NULL; + const char *name = NULL; + size_t value_size = 0; + char *value = NULL; + int rc = 0; + + switch (type) { + case ACL_TYPE_ACCESS: + name = XATTR_NAME_POSIX_ACL_ACCESS; + if (acl) + rc = posix_acl_update_mode(inode, &inode->i_mode, &acl); + break; + + case ACL_TYPE_DEFAULT: + name = XATTR_NAME_POSIX_ACL_DEFAULT; + if (!S_ISDIR(inode->i_mode)) + rc = acl ? -EACCES : 0; + break; + + default: + rc = -EINVAL; + break; + } + if (rc) + return rc; + + if (acl) { + value_size = posix_acl_xattr_size(acl->a_count); + value = kmalloc(value_size, GFP_NOFS); + if (!value) { + rc = -ENOMEM; + goto out; + } + + rc = posix_acl_to_xattr(&init_user_ns, acl, value, value_size); + if (rc < 0) + goto out_value; + } + + rc = md_setxattr(sbi->ll_md_exp, ll_inode2fid(inode), + value ? OBD_MD_FLXATTR : OBD_MD_FLXATTRRM, + name, value, value_size, 0, 0, 0, &req); + + ptlrpc_req_finished(req); +out_value: + kfree(value); +out: + if (rc) + forget_cached_acl(inode, type); + else + set_cached_acl(inode, type, acl); + return rc; +} diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index bdb1564..c08a6e1 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h @@ -756,8 +756,10 @@ int ll_getattr(const struct path *path, struct kstat *stat, u32 request_mask, unsigned int flags); #ifdef CONFIG_FS_POSIX_ACL struct posix_acl *ll_get_acl(struct inode *inode, int type); +int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type); #else #define ll_get_acl NULL +#define ll_set_acl NULL #endif /* CONFIG_FS_POSIX_ACL */ int ll_migrate(struct inode *parent, struct file *file, int mdtidx, -- 1.8.3.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel