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

autofs_i.h (7644B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *  Copyright 1997-1998 Transmeta Corporation - All Rights Reserved
      4 *  Copyright 2005-2006 Ian Kent <raven@themaw.net>
      5 */
      6
      7/* Internal header file for autofs */
      8
      9#include <linux/auto_fs.h>
     10#include <linux/auto_dev-ioctl.h>
     11
     12#include <linux/kernel.h>
     13#include <linux/slab.h>
     14#include <linux/time.h>
     15#include <linux/string.h>
     16#include <linux/wait.h>
     17#include <linux/sched.h>
     18#include <linux/sched/signal.h>
     19#include <linux/mount.h>
     20#include <linux/namei.h>
     21#include <linux/uaccess.h>
     22#include <linux/mutex.h>
     23#include <linux/spinlock.h>
     24#include <linux/list.h>
     25#include <linux/completion.h>
     26#include <linux/file.h>
     27#include <linux/magic.h>
     28
     29/* This is the range of ioctl() numbers we claim as ours */
     30#define AUTOFS_IOC_FIRST     AUTOFS_IOC_READY
     31#define AUTOFS_IOC_COUNT     32
     32
     33#define AUTOFS_DEV_IOCTL_IOC_FIRST	(AUTOFS_DEV_IOCTL_VERSION)
     34#define AUTOFS_DEV_IOCTL_IOC_COUNT \
     35	(AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD - AUTOFS_DEV_IOCTL_VERSION_CMD)
     36
     37#ifdef pr_fmt
     38#undef pr_fmt
     39#endif
     40#define pr_fmt(fmt) KBUILD_MODNAME ":pid:%d:%s: " fmt, current->pid, __func__
     41
     42extern struct file_system_type autofs_fs_type;
     43
     44/*
     45 * Unified info structure.  This is pointed to by both the dentry and
     46 * inode structures.  Each file in the filesystem has an instance of this
     47 * structure.  It holds a reference to the dentry, so dentries are never
     48 * flushed while the file exists.  All name lookups are dealt with at the
     49 * dentry level, although the filesystem can interfere in the validation
     50 * process.  Readdir is implemented by traversing the dentry lists.
     51 */
     52struct autofs_info {
     53	struct dentry	*dentry;
     54	struct inode	*inode;
     55
     56	int		flags;
     57
     58	struct completion expire_complete;
     59
     60	struct list_head active;
     61
     62	struct list_head expiring;
     63
     64	struct autofs_sb_info *sbi;
     65	unsigned long last_used;
     66	int count;
     67
     68	kuid_t uid;
     69	kgid_t gid;
     70	struct rcu_head rcu;
     71};
     72
     73#define AUTOFS_INF_EXPIRING	(1<<0) /* dentry in the process of expiring */
     74#define AUTOFS_INF_WANT_EXPIRE	(1<<1) /* the dentry is being considered
     75					* for expiry, so RCU_walk is
     76					* not permitted.  If it progresses to
     77					* actual expiry attempt, the flag is
     78					* not cleared when EXPIRING is set -
     79					* in that case it gets cleared only
     80					* when it comes to clearing EXPIRING.
     81					*/
     82#define AUTOFS_INF_PENDING	(1<<2) /* dentry pending mount */
     83
     84struct autofs_wait_queue {
     85	wait_queue_head_t queue;
     86	struct autofs_wait_queue *next;
     87	autofs_wqt_t wait_queue_token;
     88	/* We use the following to see what we are waiting for */
     89	struct qstr name;
     90	u32 offset;
     91	u32 dev;
     92	u64 ino;
     93	kuid_t uid;
     94	kgid_t gid;
     95	pid_t pid;
     96	pid_t tgid;
     97	/* This is for status reporting upon return */
     98	int status;
     99	unsigned int wait_ctr;
    100};
    101
    102#define AUTOFS_SBI_MAGIC 0x6d4a556d
    103
    104#define AUTOFS_SBI_CATATONIC	0x0001
    105#define AUTOFS_SBI_STRICTEXPIRE 0x0002
    106#define AUTOFS_SBI_IGNORE	0x0004
    107
    108struct autofs_sb_info {
    109	u32 magic;
    110	int pipefd;
    111	struct file *pipe;
    112	struct pid *oz_pgrp;
    113	int version;
    114	int sub_version;
    115	int min_proto;
    116	int max_proto;
    117	unsigned int flags;
    118	unsigned long exp_timeout;
    119	unsigned int type;
    120	struct super_block *sb;
    121	struct mutex wq_mutex;
    122	struct mutex pipe_mutex;
    123	spinlock_t fs_lock;
    124	struct autofs_wait_queue *queues; /* Wait queue pointer */
    125	spinlock_t lookup_lock;
    126	struct list_head active_list;
    127	struct list_head expiring_list;
    128	struct rcu_head rcu;
    129};
    130
    131static inline struct autofs_sb_info *autofs_sbi(struct super_block *sb)
    132{
    133	return (struct autofs_sb_info *)(sb->s_fs_info);
    134}
    135
    136static inline struct autofs_info *autofs_dentry_ino(struct dentry *dentry)
    137{
    138	return (struct autofs_info *)(dentry->d_fsdata);
    139}
    140
    141/* autofs_oz_mode(): do we see the man behind the curtain?  (The
    142 * processes which do manipulations for us in user space sees the raw
    143 * filesystem without "magic".)
    144 */
    145static inline int autofs_oz_mode(struct autofs_sb_info *sbi)
    146{
    147	return ((sbi->flags & AUTOFS_SBI_CATATONIC) ||
    148		 task_pgrp(current) == sbi->oz_pgrp);
    149}
    150
    151struct inode *autofs_get_inode(struct super_block *, umode_t);
    152void autofs_free_ino(struct autofs_info *);
    153
    154/* Expiration */
    155int is_autofs_dentry(struct dentry *);
    156int autofs_expire_wait(const struct path *path, int rcu_walk);
    157int autofs_expire_run(struct super_block *, struct vfsmount *,
    158		      struct autofs_sb_info *,
    159		      struct autofs_packet_expire __user *);
    160int autofs_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
    161			   struct autofs_sb_info *sbi, unsigned int how);
    162int autofs_expire_multi(struct super_block *, struct vfsmount *,
    163			struct autofs_sb_info *, int __user *);
    164
    165/* Device node initialization */
    166
    167int autofs_dev_ioctl_init(void);
    168void autofs_dev_ioctl_exit(void);
    169
    170/* Operations structures */
    171
    172extern const struct inode_operations autofs_symlink_inode_operations;
    173extern const struct inode_operations autofs_dir_inode_operations;
    174extern const struct file_operations autofs_dir_operations;
    175extern const struct file_operations autofs_root_operations;
    176extern const struct dentry_operations autofs_dentry_operations;
    177
    178/* VFS automount flags management functions */
    179static inline void __managed_dentry_set_managed(struct dentry *dentry)
    180{
    181	dentry->d_flags |= (DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
    182}
    183
    184static inline void managed_dentry_set_managed(struct dentry *dentry)
    185{
    186	spin_lock(&dentry->d_lock);
    187	__managed_dentry_set_managed(dentry);
    188	spin_unlock(&dentry->d_lock);
    189}
    190
    191static inline void __managed_dentry_clear_managed(struct dentry *dentry)
    192{
    193	dentry->d_flags &= ~(DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
    194}
    195
    196static inline void managed_dentry_clear_managed(struct dentry *dentry)
    197{
    198	spin_lock(&dentry->d_lock);
    199	__managed_dentry_clear_managed(dentry);
    200	spin_unlock(&dentry->d_lock);
    201}
    202
    203/* Initializing function */
    204
    205int autofs_fill_super(struct super_block *, void *, int);
    206struct autofs_info *autofs_new_ino(struct autofs_sb_info *);
    207void autofs_clean_ino(struct autofs_info *);
    208
    209static inline int autofs_prepare_pipe(struct file *pipe)
    210{
    211	if (!(pipe->f_mode & FMODE_CAN_WRITE))
    212		return -EINVAL;
    213	if (!S_ISFIFO(file_inode(pipe)->i_mode))
    214		return -EINVAL;
    215	/* We want a packet pipe */
    216	pipe->f_flags |= O_DIRECT;
    217	/* We don't expect -EAGAIN */
    218	pipe->f_flags &= ~O_NONBLOCK;
    219	return 0;
    220}
    221
    222/* Queue management functions */
    223
    224int autofs_wait(struct autofs_sb_info *,
    225		 const struct path *, enum autofs_notify);
    226int autofs_wait_release(struct autofs_sb_info *, autofs_wqt_t, int);
    227void autofs_catatonic_mode(struct autofs_sb_info *);
    228
    229static inline u32 autofs_get_dev(struct autofs_sb_info *sbi)
    230{
    231	return new_encode_dev(sbi->sb->s_dev);
    232}
    233
    234static inline u64 autofs_get_ino(struct autofs_sb_info *sbi)
    235{
    236	return d_inode(sbi->sb->s_root)->i_ino;
    237}
    238
    239static inline void __autofs_add_expiring(struct dentry *dentry)
    240{
    241	struct autofs_sb_info *sbi = autofs_sbi(dentry->d_sb);
    242	struct autofs_info *ino = autofs_dentry_ino(dentry);
    243
    244	if (ino) {
    245		if (list_empty(&ino->expiring))
    246			list_add(&ino->expiring, &sbi->expiring_list);
    247	}
    248}
    249
    250static inline void autofs_add_expiring(struct dentry *dentry)
    251{
    252	struct autofs_sb_info *sbi = autofs_sbi(dentry->d_sb);
    253	struct autofs_info *ino = autofs_dentry_ino(dentry);
    254
    255	if (ino) {
    256		spin_lock(&sbi->lookup_lock);
    257		if (list_empty(&ino->expiring))
    258			list_add(&ino->expiring, &sbi->expiring_list);
    259		spin_unlock(&sbi->lookup_lock);
    260	}
    261}
    262
    263static inline void autofs_del_expiring(struct dentry *dentry)
    264{
    265	struct autofs_sb_info *sbi = autofs_sbi(dentry->d_sb);
    266	struct autofs_info *ino = autofs_dentry_ino(dentry);
    267
    268	if (ino) {
    269		spin_lock(&sbi->lookup_lock);
    270		if (!list_empty(&ino->expiring))
    271			list_del_init(&ino->expiring);
    272		spin_unlock(&sbi->lookup_lock);
    273	}
    274}
    275
    276void autofs_kill_sb(struct super_block *);