Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Richacl #109

Closed
wants to merge 27 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
d5d1fb4
vfs: Indicate that the permission functions take all the MAY_* flags
Oct 18, 2011
0f69c40
vfs: Add hex format for MAY_* flag values
kvaneesh Oct 18, 2011
bf56180
vfs: Pass all mask flags down to iop->check_acl
Oct 18, 2011
518cbba
vfs: Add a comment to inode_permission()
Oct 18, 2011
89e1033
vfs: Add generic IS_ACL() test for acl support
Oct 18, 2011
45481f1
vfs: Add IS_RICHACL() test for richacl support
Oct 18, 2011
c684918
vfs: Optimize out IS_RICHACL() if CONFIG_FS_RICHACL is not defined
Oct 18, 2011
004723e
vfs: Add new file and directory create permission flags
Oct 18, 2011
1654a09
vfs: Add delete child and delete self permission flags
Oct 18, 2011
3437a82
vfs: Make the inode passed to inode_change_ok non-const
Oct 18, 2011
e963a4c
vfs: Add permission flags for setting file attributes
Oct 18, 2011
26dc449
vfs: Make acl_permission_check() work for richacls
Oct 18, 2011
e210ab8
richacl: In-memory representation and helper functions
Oct 18, 2011
36ee026
richacl: Permission mapping functions
Oct 18, 2011
dc240c0
richacl: Compute maximum file masks from an acl
Oct 18, 2011
6be646b
richacl: Update the file masks in chmod()
Oct 18, 2011
61bf134
richacl: Permission check algorithm
Oct 18, 2011
9d9bef3
richacl: Create-time inheritance
Oct 18, 2011
8013f16
richacl: Check if an acl is equivalent to a file mode
Oct 18, 2011
5882a81
richacl: Automatic Inheritance
Oct 18, 2011
862d861
richacl: xattr mapping functions
Oct 18, 2011
69d9df5
vfs: Cache richacl in struct inode
Oct 18, 2011
e86e410
vfs: Add richacl permission check
kvaneesh Oct 18, 2011
434e398
ext4: Use IS_POSIXACL() to check for POSIX ACL support
kvaneesh Oct 18, 2011
69b47fd
ext4: Implement rich acl for ext4
kvaneesh Oct 18, 2011
e17ad31
ext4: Add Ext4 compat richacl feature flag
kvaneesh Oct 18, 2011
13fc237
ext4: Add temporary richacl mount option for ext4
kvaneesh Oct 18, 2011
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
richacl: xattr mapping functions
Map between "system.richacl" xattrs and the in-kernel representation.

Acked-by: J. Bruce Fields <[email protected]>
Acked-by: David Howells <[email protected]>
Signed-off-by: Andreas Gruenbacher <[email protected]>
Signed-off-by: Aneesh Kumar K.V <[email protected]>
  • Loading branch information
Andreas Gruenbacher authored and kvaneesh committed Oct 23, 2011
commit 862d8614cae82affd7b4c8c1f280ffd40d3259a8
2 changes: 1 addition & 1 deletion fs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ obj-$(CONFIG_GENERIC_ACL) += generic_acl.o

obj-$(CONFIG_FHANDLE) += fhandle.o
obj-$(CONFIG_FS_RICHACL) += richacl.o
richacl-y := richacl_base.o richacl_inode.o
richacl-y := richacl_base.o richacl_inode.o richacl_xattr.o

obj-y += quota/

Expand Down
130 changes: 130 additions & 0 deletions fs/richacl_xattr.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* Copyright (C) 2006, 2010 Novell, Inc.
* Written by Andreas Gruenbacher <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/

#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/richacl_xattr.h>

MODULE_LICENSE("GPL");

/**
* richacl_from_xattr - convert a richacl xattr into the in-memory representation
*/
struct richacl *
richacl_from_xattr(const void *value, size_t size)
{
const struct richacl_xattr *xattr_acl = value;
const struct richace_xattr *xattr_ace = (void *)(xattr_acl + 1);
struct richacl *acl;
struct richace *ace;
int count;

if (size < sizeof(struct richacl_xattr) ||
xattr_acl->a_version != ACL4_XATTR_VERSION ||
(xattr_acl->a_flags & ~ACL4_VALID_FLAGS))
return ERR_PTR(-EINVAL);

count = le16_to_cpu(xattr_acl->a_count);
if (count > ACL4_XATTR_MAX_COUNT)
return ERR_PTR(-EINVAL);

acl = richacl_alloc(count);
if (!acl)
return ERR_PTR(-ENOMEM);

acl->a_flags = xattr_acl->a_flags;
acl->a_owner_mask = le32_to_cpu(xattr_acl->a_owner_mask);
if (acl->a_owner_mask & ~ACE4_VALID_MASK)
goto fail_einval;
acl->a_group_mask = le32_to_cpu(xattr_acl->a_group_mask);
if (acl->a_group_mask & ~ACE4_VALID_MASK)
goto fail_einval;
acl->a_other_mask = le32_to_cpu(xattr_acl->a_other_mask);
if (acl->a_other_mask & ~ACE4_VALID_MASK)
goto fail_einval;

if (((void *)xattr_ace + count * sizeof(*xattr_ace)) > (value + size))
goto fail_einval;

richacl_for_each_entry(ace, acl) {

ace->e_type = le16_to_cpu(xattr_ace->e_type);
ace->e_flags = le16_to_cpu(xattr_ace->e_flags);
ace->e_mask = le32_to_cpu(xattr_ace->e_mask);
ace->e_id = le32_to_cpu(xattr_ace->e_id);

if (ace->e_flags & ~ACE4_VALID_FLAGS)
goto fail_einval;
if (ace->e_type > ACE4_ACCESS_DENIED_ACE_TYPE ||
(ace->e_mask & ~ACE4_VALID_MASK))
goto fail_einval;

xattr_ace++;
}

return acl;

fail_einval:
richacl_put(acl);
return ERR_PTR(-EINVAL);
}
EXPORT_SYMBOL_GPL(richacl_from_xattr);

/**
* richacl_xattr_size - compute the size of the xattr representation of @acl
*/
size_t
richacl_xattr_size(const struct richacl *acl)
{
size_t size = sizeof(struct richacl_xattr);

size += sizeof(struct richace_xattr) * acl->a_count;
return size;
}
EXPORT_SYMBOL_GPL(richacl_xattr_size);

/**
* richacl_to_xattr - convert @acl into its xattr representation
* @acl: the richacl to convert
* @buffer: buffer of size richacl_xattr_size(@acl) for the result
*/
void
richacl_to_xattr(const struct richacl *acl, void *buffer)
{
struct richacl_xattr *xattr_acl = buffer;
struct richace_xattr *xattr_ace;
const struct richace *ace;

xattr_acl->a_version = ACL4_XATTR_VERSION;
xattr_acl->a_flags = acl->a_flags;
xattr_acl->a_count = cpu_to_le16(acl->a_count);

xattr_acl->a_owner_mask = cpu_to_le32(acl->a_owner_mask);
xattr_acl->a_group_mask = cpu_to_le32(acl->a_group_mask);
xattr_acl->a_other_mask = cpu_to_le32(acl->a_other_mask);

xattr_ace = (void *)(xattr_acl + 1);
richacl_for_each_entry(ace, acl) {
xattr_ace->e_type = cpu_to_le16(ace->e_type);
xattr_ace->e_flags = cpu_to_le16(ace->e_flags &
ACE4_VALID_FLAGS);
xattr_ace->e_mask = cpu_to_le32(ace->e_mask);
xattr_ace->e_id = cpu_to_le32(ace->e_id);
xattr_ace++;
}
}
EXPORT_SYMBOL_GPL(richacl_to_xattr);
46 changes: 46 additions & 0 deletions include/linux/richacl_xattr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2006, 2010 Novell, Inc.
* Written by Andreas Gruenbacher <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/

#ifndef __RICHACL_XATTR_H
#define __RICHACL_XATTR_H

#include <linux/richacl.h>

#define RICHACL_XATTR "system.richacl"

struct richace_xattr {
__le16 e_type;
__le16 e_flags;
__le32 e_mask;
__le32 e_id;
};

struct richacl_xattr {
unsigned char a_version;
unsigned char a_flags;
__le16 a_count;
__le32 a_owner_mask;
__le32 a_group_mask;
__le32 a_other_mask;
};

#define ACL4_XATTR_VERSION 0
#define ACL4_XATTR_MAX_COUNT 1024

extern struct richacl *richacl_from_xattr(const void *, size_t);
extern size_t richacl_xattr_size(const struct richacl *acl);
extern void richacl_to_xattr(const struct richacl *, void *);

#endif /* __RICHACL_XATTR_H */