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>
131 lines
3.5 KiB
C
131 lines
3.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* fs/kernfs/kernfs-internal.h - kernfs internal header file
|
|
*
|
|
* Copyright (c) 2001-3 Patrick Mochel
|
|
* Copyright (c) 2007 SUSE Linux Products GmbH
|
|
* Copyright (c) 2007, 2013 Tejun Heo <teheo@suse.de>
|
|
*/
|
|
|
|
#ifndef __KERNFS_INTERNAL_H
|
|
#define __KERNFS_INTERNAL_H
|
|
|
|
#include <linux/lockdep.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/xattr.h>
|
|
|
|
#include <linux/kernfs.h>
|
|
#include <linux/fs_context.h>
|
|
|
|
struct kernfs_iattrs {
|
|
kuid_t ia_uid;
|
|
kgid_t ia_gid;
|
|
struct timespec64 ia_atime;
|
|
struct timespec64 ia_mtime;
|
|
struct timespec64 ia_ctime;
|
|
|
|
struct simple_xattrs xattrs;
|
|
atomic_t nr_user_xattrs;
|
|
atomic_t user_xattr_size;
|
|
};
|
|
|
|
/* +1 to avoid triggering overflow warning when negating it */
|
|
#define KN_DEACTIVATED_BIAS (INT_MIN + 1)
|
|
|
|
/* KERNFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
|
|
|
|
/**
|
|
* kernfs_root - find out the kernfs_root a kernfs_node belongs to
|
|
* @kn: kernfs_node of interest
|
|
*
|
|
* Return the kernfs_root @kn belongs to.
|
|
*/
|
|
static inline struct kernfs_root *kernfs_root(struct kernfs_node *kn)
|
|
{
|
|
/* if parent exists, it's always a dir; otherwise, @sd is a dir */
|
|
if (kn->parent)
|
|
kn = kn->parent;
|
|
return kn->dir.root;
|
|
}
|
|
|
|
/*
|
|
* mount.c
|
|
*/
|
|
struct kernfs_super_info {
|
|
struct super_block *sb;
|
|
|
|
/*
|
|
* The root associated with this super_block. Each super_block is
|
|
* identified by the root and ns it's associated with.
|
|
*/
|
|
struct kernfs_root *root;
|
|
|
|
/*
|
|
* Each sb is associated with one namespace tag, currently the
|
|
* network namespace of the task which mounted this kernfs
|
|
* instance. If multiple tags become necessary, make the following
|
|
* an array and compare kernfs_node tag against every entry.
|
|
*/
|
|
const void *ns;
|
|
|
|
/* anchored at kernfs_root->supers, protected by kernfs_mutex */
|
|
struct list_head node;
|
|
};
|
|
#define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info))
|
|
|
|
static inline struct kernfs_node *kernfs_dentry_node(struct dentry *dentry)
|
|
{
|
|
if (d_really_is_negative(dentry))
|
|
return NULL;
|
|
return d_inode(dentry)->i_private;
|
|
}
|
|
|
|
extern const struct super_operations kernfs_sops;
|
|
extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache;
|
|
|
|
/*
|
|
* inode.c
|
|
*/
|
|
extern const struct xattr_handler *kernfs_xattr_handlers[];
|
|
void kernfs_evict_inode(struct inode *inode);
|
|
int kernfs_iop_permission(struct user_namespace *mnt_userns,
|
|
struct inode *inode, int mask);
|
|
int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
|
struct iattr *iattr);
|
|
int kernfs_iop_getattr(struct user_namespace *mnt_userns,
|
|
const struct path *path, struct kstat *stat,
|
|
u32 request_mask, unsigned int query_flags);
|
|
ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
|
|
int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
|
|
|
|
/*
|
|
* dir.c
|
|
*/
|
|
extern struct mutex kernfs_mutex;
|
|
extern const struct dentry_operations kernfs_dops;
|
|
extern const struct file_operations kernfs_dir_fops;
|
|
extern const struct inode_operations kernfs_dir_iops;
|
|
|
|
struct kernfs_node *kernfs_get_active(struct kernfs_node *kn);
|
|
void kernfs_put_active(struct kernfs_node *kn);
|
|
int kernfs_add_one(struct kernfs_node *kn);
|
|
struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
|
|
const char *name, umode_t mode,
|
|
kuid_t uid, kgid_t gid,
|
|
unsigned flags);
|
|
|
|
/*
|
|
* file.c
|
|
*/
|
|
extern const struct file_operations kernfs_file_fops;
|
|
|
|
void kernfs_drain_open_files(struct kernfs_node *kn);
|
|
|
|
/*
|
|
* symlink.c
|
|
*/
|
|
extern const struct inode_operations kernfs_symlink_iops;
|
|
|
|
#endif /* __KERNFS_INTERNAL_H */
|