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

configfs_internal.h (4819B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * configfs_internal.h - Internal stuff for configfs
      4 *
      5 * Based on sysfs:
      6 * 	sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
      7 *
      8 * configfs Copyright (C) 2005 Oracle.  All rights reserved.
      9 */
     10
     11#ifdef pr_fmt
     12#undef pr_fmt
     13#endif
     14
     15#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     16
     17#include <linux/slab.h>
     18#include <linux/list.h>
     19#include <linux/spinlock.h>
     20
     21struct configfs_fragment {
     22	atomic_t frag_count;
     23	struct rw_semaphore frag_sem;
     24	bool frag_dead;
     25};
     26
     27void put_fragment(struct configfs_fragment *);
     28struct configfs_fragment *get_fragment(struct configfs_fragment *);
     29
     30struct configfs_dirent {
     31	atomic_t		s_count;
     32	int			s_dependent_count;
     33	struct list_head	s_sibling;
     34	struct list_head	s_children;
     35	int			s_links;
     36	void			* s_element;
     37	int			s_type;
     38	umode_t			s_mode;
     39	struct dentry		* s_dentry;
     40	struct iattr		* s_iattr;
     41#ifdef CONFIG_LOCKDEP
     42	int			s_depth;
     43#endif
     44	struct configfs_fragment *s_frag;
     45};
     46
     47#define CONFIGFS_ROOT		0x0001
     48#define CONFIGFS_DIR		0x0002
     49#define CONFIGFS_ITEM_ATTR	0x0004
     50#define CONFIGFS_ITEM_BIN_ATTR	0x0008
     51#define CONFIGFS_ITEM_LINK	0x0020
     52#define CONFIGFS_USET_DIR	0x0040
     53#define CONFIGFS_USET_DEFAULT	0x0080
     54#define CONFIGFS_USET_DROPPING	0x0100
     55#define CONFIGFS_USET_IN_MKDIR	0x0200
     56#define CONFIGFS_USET_CREATING	0x0400
     57#define CONFIGFS_NOT_PINNED	(CONFIGFS_ITEM_ATTR | CONFIGFS_ITEM_BIN_ATTR)
     58
     59extern struct mutex configfs_symlink_mutex;
     60extern spinlock_t configfs_dirent_lock;
     61
     62extern struct kmem_cache *configfs_dir_cachep;
     63
     64extern int configfs_is_root(struct config_item *item);
     65
     66extern struct inode * configfs_new_inode(umode_t mode, struct configfs_dirent *, struct super_block *);
     67extern struct inode *configfs_create(struct dentry *, umode_t mode);
     68
     69extern int configfs_create_file(struct config_item *, const struct configfs_attribute *);
     70extern int configfs_create_bin_file(struct config_item *,
     71				    const struct configfs_bin_attribute *);
     72extern int configfs_make_dirent(struct configfs_dirent *, struct dentry *,
     73				void *, umode_t, int, struct configfs_fragment *);
     74extern int configfs_dirent_is_ready(struct configfs_dirent *);
     75
     76extern void configfs_hash_and_remove(struct dentry * dir, const char * name);
     77
     78extern const unsigned char * configfs_get_name(struct configfs_dirent *sd);
     79extern void configfs_drop_dentry(struct configfs_dirent *sd, struct dentry *parent);
     80extern int configfs_setattr(struct user_namespace *mnt_userns,
     81			    struct dentry *dentry, struct iattr *iattr);
     82
     83extern struct dentry *configfs_pin_fs(void);
     84extern void configfs_release_fs(void);
     85
     86extern const struct file_operations configfs_dir_operations;
     87extern const struct file_operations configfs_file_operations;
     88extern const struct file_operations configfs_bin_file_operations;
     89extern const struct inode_operations configfs_dir_inode_operations;
     90extern const struct inode_operations configfs_root_inode_operations;
     91extern const struct inode_operations configfs_symlink_inode_operations;
     92extern const struct dentry_operations configfs_dentry_ops;
     93
     94extern int configfs_symlink(struct user_namespace *mnt_userns,
     95			    struct inode *dir, struct dentry *dentry,
     96			    const char *symname);
     97extern int configfs_unlink(struct inode *dir, struct dentry *dentry);
     98
     99int configfs_create_link(struct configfs_dirent *target, struct dentry *parent,
    100		struct dentry *dentry, char *body);
    101
    102static inline struct config_item * to_item(struct dentry * dentry)
    103{
    104	struct configfs_dirent * sd = dentry->d_fsdata;
    105	return ((struct config_item *) sd->s_element);
    106}
    107
    108static inline struct configfs_attribute * to_attr(struct dentry * dentry)
    109{
    110	struct configfs_dirent * sd = dentry->d_fsdata;
    111	return ((struct configfs_attribute *) sd->s_element);
    112}
    113
    114static inline struct configfs_bin_attribute *to_bin_attr(struct dentry *dentry)
    115{
    116	struct configfs_attribute *attr = to_attr(dentry);
    117
    118	return container_of(attr, struct configfs_bin_attribute, cb_attr);
    119}
    120
    121static inline struct config_item *configfs_get_config_item(struct dentry *dentry)
    122{
    123	struct config_item * item = NULL;
    124
    125	spin_lock(&dentry->d_lock);
    126	if (!d_unhashed(dentry)) {
    127		struct configfs_dirent * sd = dentry->d_fsdata;
    128		item = config_item_get(sd->s_element);
    129	}
    130	spin_unlock(&dentry->d_lock);
    131
    132	return item;
    133}
    134
    135static inline void release_configfs_dirent(struct configfs_dirent * sd)
    136{
    137	if (!(sd->s_type & CONFIGFS_ROOT)) {
    138		kfree(sd->s_iattr);
    139		put_fragment(sd->s_frag);
    140		kmem_cache_free(configfs_dir_cachep, sd);
    141	}
    142}
    143
    144static inline struct configfs_dirent * configfs_get(struct configfs_dirent * sd)
    145{
    146	if (sd) {
    147		WARN_ON(!atomic_read(&sd->s_count));
    148		atomic_inc(&sd->s_count);
    149	}
    150	return sd;
    151}
    152
    153static inline void configfs_put(struct configfs_dirent * sd)
    154{
    155	WARN_ON(!atomic_read(&sd->s_count));
    156	if (atomic_dec_and_test(&sd->s_count))
    157		release_configfs_dirent(sd);
    158}
    159