cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kernfs-internal.h (4460B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * fs/kernfs/kernfs-internal.h - kernfs internal header file
      4 *
      5 * Copyright (c) 2001-3 Patrick Mochel
      6 * Copyright (c) 2007 SUSE Linux Products GmbH
      7 * Copyright (c) 2007, 2013 Tejun Heo <teheo@suse.de>
      8 */
      9
     10#ifndef __KERNFS_INTERNAL_H
     11#define __KERNFS_INTERNAL_H
     12
     13#include <linux/lockdep.h>
     14#include <linux/fs.h>
     15#include <linux/mutex.h>
     16#include <linux/rwsem.h>
     17#include <linux/xattr.h>
     18
     19#include <linux/kernfs.h>
     20#include <linux/fs_context.h>
     21
     22struct kernfs_iattrs {
     23	kuid_t			ia_uid;
     24	kgid_t			ia_gid;
     25	struct timespec64	ia_atime;
     26	struct timespec64	ia_mtime;
     27	struct timespec64	ia_ctime;
     28
     29	struct simple_xattrs	xattrs;
     30	atomic_t		nr_user_xattrs;
     31	atomic_t		user_xattr_size;
     32};
     33
     34struct kernfs_root {
     35	/* published fields */
     36	struct kernfs_node	*kn;
     37	unsigned int		flags;	/* KERNFS_ROOT_* flags */
     38
     39	/* private fields, do not use outside kernfs proper */
     40	struct idr		ino_idr;
     41	u32			last_id_lowbits;
     42	u32			id_highbits;
     43	struct kernfs_syscall_ops *syscall_ops;
     44
     45	/* list of kernfs_super_info of this root, protected by kernfs_rwsem */
     46	struct list_head	supers;
     47
     48	wait_queue_head_t	deactivate_waitq;
     49	struct rw_semaphore	kernfs_rwsem;
     50};
     51
     52/* +1 to avoid triggering overflow warning when negating it */
     53#define KN_DEACTIVATED_BIAS		(INT_MIN + 1)
     54
     55/* KERNFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
     56
     57/**
     58 * kernfs_root - find out the kernfs_root a kernfs_node belongs to
     59 * @kn: kernfs_node of interest
     60 *
     61 * Return the kernfs_root @kn belongs to.
     62 */
     63static inline struct kernfs_root *kernfs_root(struct kernfs_node *kn)
     64{
     65	/* if parent exists, it's always a dir; otherwise, @sd is a dir */
     66	if (kn->parent)
     67		kn = kn->parent;
     68	return kn->dir.root;
     69}
     70
     71/*
     72 * mount.c
     73 */
     74struct kernfs_super_info {
     75	struct super_block	*sb;
     76
     77	/*
     78	 * The root associated with this super_block.  Each super_block is
     79	 * identified by the root and ns it's associated with.
     80	 */
     81	struct kernfs_root	*root;
     82
     83	/*
     84	 * Each sb is associated with one namespace tag, currently the
     85	 * network namespace of the task which mounted this kernfs
     86	 * instance.  If multiple tags become necessary, make the following
     87	 * an array and compare kernfs_node tag against every entry.
     88	 */
     89	const void		*ns;
     90
     91	/* anchored at kernfs_root->supers, protected by kernfs_rwsem */
     92	struct list_head	node;
     93};
     94#define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info))
     95
     96static inline struct kernfs_node *kernfs_dentry_node(struct dentry *dentry)
     97{
     98	if (d_really_is_negative(dentry))
     99		return NULL;
    100	return d_inode(dentry)->i_private;
    101}
    102
    103static inline void kernfs_set_rev(struct kernfs_node *parent,
    104				  struct dentry *dentry)
    105{
    106	dentry->d_time = parent->dir.rev;
    107}
    108
    109static inline void kernfs_inc_rev(struct kernfs_node *parent)
    110{
    111	parent->dir.rev++;
    112}
    113
    114static inline bool kernfs_dir_changed(struct kernfs_node *parent,
    115				      struct dentry *dentry)
    116{
    117	if (parent->dir.rev != dentry->d_time)
    118		return true;
    119	return false;
    120}
    121
    122extern const struct super_operations kernfs_sops;
    123extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache;
    124
    125/*
    126 * inode.c
    127 */
    128extern const struct xattr_handler *kernfs_xattr_handlers[];
    129void kernfs_evict_inode(struct inode *inode);
    130int kernfs_iop_permission(struct user_namespace *mnt_userns,
    131			  struct inode *inode, int mask);
    132int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
    133		       struct iattr *iattr);
    134int kernfs_iop_getattr(struct user_namespace *mnt_userns,
    135		       const struct path *path, struct kstat *stat,
    136		       u32 request_mask, unsigned int query_flags);
    137ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
    138int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
    139
    140/*
    141 * dir.c
    142 */
    143extern const struct dentry_operations kernfs_dops;
    144extern const struct file_operations kernfs_dir_fops;
    145extern const struct inode_operations kernfs_dir_iops;
    146
    147struct kernfs_node *kernfs_get_active(struct kernfs_node *kn);
    148void kernfs_put_active(struct kernfs_node *kn);
    149int kernfs_add_one(struct kernfs_node *kn);
    150struct kernfs_node *kernfs_new_node(struct kernfs_node *parent,
    151				    const char *name, umode_t mode,
    152				    kuid_t uid, kgid_t gid,
    153				    unsigned flags);
    154
    155/*
    156 * file.c
    157 */
    158extern const struct file_operations kernfs_file_fops;
    159
    160void kernfs_drain_open_files(struct kernfs_node *kn);
    161
    162/*
    163 * symlink.c
    164 */
    165extern const struct inode_operations kernfs_symlink_iops;
    166
    167#endif	/* __KERNFS_INTERNAL_H */