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  
22  struct 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  
34  struct 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   */
kernfs_root(struct kernfs_node * kn)63  static 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   */
74  struct 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  
kernfs_dentry_node(struct dentry * dentry)96  static 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  
kernfs_set_rev(struct kernfs_node * parent,struct dentry * dentry)103  static inline void kernfs_set_rev(struct kernfs_node *parent,
104  				  struct dentry *dentry)
105  {
106  	dentry->d_time = parent->dir.rev;
107  }
108  
kernfs_inc_rev(struct kernfs_node * parent)109  static inline void kernfs_inc_rev(struct kernfs_node *parent)
110  {
111  	parent->dir.rev++;
112  }
113  
kernfs_dir_changed(struct kernfs_node * parent,struct dentry * dentry)114  static 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  
122  extern const struct super_operations kernfs_sops;
123  extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache;
124  
125  /*
126   * inode.c
127   */
128  extern const struct xattr_handler *kernfs_xattr_handlers[];
129  void kernfs_evict_inode(struct inode *inode);
130  int kernfs_iop_permission(struct mnt_idmap *idmap,
131  			  struct inode *inode, int mask);
132  int kernfs_iop_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
133  		       struct iattr *iattr);
134  int kernfs_iop_getattr(struct mnt_idmap *idmap,
135  		       const struct path *path, struct kstat *stat,
136  		       u32 request_mask, unsigned int query_flags);
137  ssize_t kernfs_iop_listxattr(struct dentry *dentry, char *buf, size_t size);
138  int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
139  
140  /*
141   * dir.c
142   */
143  extern const struct dentry_operations kernfs_dops;
144  extern const struct file_operations kernfs_dir_fops;
145  extern const struct inode_operations kernfs_dir_iops;
146  
147  struct kernfs_node *kernfs_get_active(struct kernfs_node *kn);
148  void kernfs_put_active(struct kernfs_node *kn);
149  int kernfs_add_one(struct kernfs_node *kn);
150  struct 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   */
158  extern const struct file_operations kernfs_file_fops;
159  
160  bool kernfs_should_drain_open_files(struct kernfs_node *kn);
161  void kernfs_drain_open_files(struct kernfs_node *kn);
162  
163  /*
164   * symlink.c
165   */
166  extern const struct inode_operations kernfs_symlink_iops;
167  
168  /*
169   * kernfs locks
170   */
171  extern struct kernfs_global_locks *kernfs_locks;
172  #endif	/* __KERNFS_INTERNAL_H */
173