549c729771
Extend some inode methods with an additional user namespace argument. A filesystem that is aware of idmapped mounts will receive the user namespace the mount has been marked with. This can be used for additional permission checking and also to enable filesystems to translate between uids and gids if they need to. We have implemented all relevant helpers in earlier patches. As requested we simply extend the exisiting inode method instead of introducing new ones. This is a little more code churn but it's mostly mechanical and doesnt't leave us with additional inode methods. Link: https://lore.kernel.org/r/20210121131959.646623-25-christian.brauner@ubuntu.com Cc: Christoph Hellwig <hch@lst.de> Cc: David Howells <dhowells@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: linux-fsdevel@vger.kernel.org Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
75 lines
1.6 KiB
C
75 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
File: fs/ext4/acl.h
|
|
|
|
(C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
|
|
*/
|
|
|
|
#include <linux/posix_acl_xattr.h>
|
|
|
|
#define EXT4_ACL_VERSION 0x0001
|
|
|
|
typedef struct {
|
|
__le16 e_tag;
|
|
__le16 e_perm;
|
|
__le32 e_id;
|
|
} ext4_acl_entry;
|
|
|
|
typedef struct {
|
|
__le16 e_tag;
|
|
__le16 e_perm;
|
|
} ext4_acl_entry_short;
|
|
|
|
typedef struct {
|
|
__le32 a_version;
|
|
} ext4_acl_header;
|
|
|
|
static inline size_t ext4_acl_size(int count)
|
|
{
|
|
if (count <= 4) {
|
|
return sizeof(ext4_acl_header) +
|
|
count * sizeof(ext4_acl_entry_short);
|
|
} else {
|
|
return sizeof(ext4_acl_header) +
|
|
4 * sizeof(ext4_acl_entry_short) +
|
|
(count - 4) * sizeof(ext4_acl_entry);
|
|
}
|
|
}
|
|
|
|
static inline int ext4_acl_count(size_t size)
|
|
{
|
|
ssize_t s;
|
|
size -= sizeof(ext4_acl_header);
|
|
s = size - 4 * sizeof(ext4_acl_entry_short);
|
|
if (s < 0) {
|
|
if (size % sizeof(ext4_acl_entry_short))
|
|
return -1;
|
|
return size / sizeof(ext4_acl_entry_short);
|
|
} else {
|
|
if (s % sizeof(ext4_acl_entry))
|
|
return -1;
|
|
return s / sizeof(ext4_acl_entry) + 4;
|
|
}
|
|
}
|
|
|
|
#ifdef CONFIG_EXT4_FS_POSIX_ACL
|
|
|
|
/* acl.c */
|
|
struct posix_acl *ext4_get_acl(struct inode *inode, int type);
|
|
int ext4_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
|
|
struct posix_acl *acl, int type);
|
|
extern int ext4_init_acl(handle_t *, struct inode *, struct inode *);
|
|
|
|
#else /* CONFIG_EXT4_FS_POSIX_ACL */
|
|
#include <linux/sched.h>
|
|
#define ext4_get_acl NULL
|
|
#define ext4_set_acl NULL
|
|
|
|
static inline int
|
|
ext4_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* CONFIG_EXT4_FS_POSIX_ACL */
|
|
|