at v3.15 460 lines 14 kB view raw
1/* 2 * kernfs.h - pseudo filesystem decoupled from vfs locking 3 * 4 * This file is released under the GPLv2. 5 */ 6 7#ifndef __LINUX_KERNFS_H 8#define __LINUX_KERNFS_H 9 10#include <linux/kernel.h> 11#include <linux/err.h> 12#include <linux/list.h> 13#include <linux/mutex.h> 14#include <linux/idr.h> 15#include <linux/lockdep.h> 16#include <linux/rbtree.h> 17#include <linux/atomic.h> 18#include <linux/wait.h> 19 20struct file; 21struct dentry; 22struct iattr; 23struct seq_file; 24struct vm_area_struct; 25struct super_block; 26struct file_system_type; 27 28struct kernfs_open_node; 29struct kernfs_iattrs; 30 31enum kernfs_node_type { 32 KERNFS_DIR = 0x0001, 33 KERNFS_FILE = 0x0002, 34 KERNFS_LINK = 0x0004, 35}; 36 37#define KERNFS_TYPE_MASK 0x000f 38#define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK 39 40enum kernfs_node_flag { 41 KERNFS_ACTIVATED = 0x0010, 42 KERNFS_NS = 0x0020, 43 KERNFS_HAS_SEQ_SHOW = 0x0040, 44 KERNFS_HAS_MMAP = 0x0080, 45 KERNFS_LOCKDEP = 0x0100, 46 KERNFS_STATIC_NAME = 0x0200, 47 KERNFS_SUICIDAL = 0x0400, 48 KERNFS_SUICIDED = 0x0800, 49}; 50 51/* @flags for kernfs_create_root() */ 52enum kernfs_root_flag { 53 /* 54 * kernfs_nodes are created in the deactivated state and invisible. 55 * They require explicit kernfs_activate() to become visible. This 56 * can be used to make related nodes become visible atomically 57 * after all nodes are created successfully. 58 */ 59 KERNFS_ROOT_CREATE_DEACTIVATED = 0x0001, 60 61 /* 62 * For regular flies, if the opener has CAP_DAC_OVERRIDE, open(2) 63 * succeeds regardless of the RW permissions. sysfs had an extra 64 * layer of enforcement where open(2) fails with -EACCES regardless 65 * of CAP_DAC_OVERRIDE if the permission doesn't have the 66 * respective read or write access at all (none of S_IRUGO or 67 * S_IWUGO) or the respective operation isn't implemented. The 68 * following flag enables that behavior. 69 */ 70 KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 0x0002, 71}; 72 73/* type-specific structures for kernfs_node union members */ 74struct kernfs_elem_dir { 75 unsigned long subdirs; 76 /* children rbtree starts here and goes through kn->rb */ 77 struct rb_root children; 78 79 /* 80 * The kernfs hierarchy this directory belongs to. This fits 81 * better directly in kernfs_node but is here to save space. 82 */ 83 struct kernfs_root *root; 84}; 85 86struct kernfs_elem_symlink { 87 struct kernfs_node *target_kn; 88}; 89 90struct kernfs_elem_attr { 91 const struct kernfs_ops *ops; 92 struct kernfs_open_node *open; 93 loff_t size; 94}; 95 96/* 97 * kernfs_node - the building block of kernfs hierarchy. Each and every 98 * kernfs node is represented by single kernfs_node. Most fields are 99 * private to kernfs and shouldn't be accessed directly by kernfs users. 100 * 101 * As long as s_count reference is held, the kernfs_node itself is 102 * accessible. Dereferencing elem or any other outer entity requires 103 * active reference. 104 */ 105struct kernfs_node { 106 atomic_t count; 107 atomic_t active; 108#ifdef CONFIG_DEBUG_LOCK_ALLOC 109 struct lockdep_map dep_map; 110#endif 111 /* 112 * Use kernfs_get_parent() and kernfs_name/path() instead of 113 * accessing the following two fields directly. If the node is 114 * never moved to a different parent, it is safe to access the 115 * parent directly. 116 */ 117 struct kernfs_node *parent; 118 const char *name; 119 120 struct rb_node rb; 121 122 const void *ns; /* namespace tag */ 123 unsigned int hash; /* ns + name hash */ 124 union { 125 struct kernfs_elem_dir dir; 126 struct kernfs_elem_symlink symlink; 127 struct kernfs_elem_attr attr; 128 }; 129 130 void *priv; 131 132 unsigned short flags; 133 umode_t mode; 134 unsigned int ino; 135 struct kernfs_iattrs *iattr; 136}; 137 138/* 139 * kernfs_syscall_ops may be specified on kernfs_create_root() to support 140 * syscalls. These optional callbacks are invoked on the matching syscalls 141 * and can perform any kernfs operations which don't necessarily have to be 142 * the exact operation requested. An active reference is held for each 143 * kernfs_node parameter. 144 */ 145struct kernfs_syscall_ops { 146 int (*remount_fs)(struct kernfs_root *root, int *flags, char *data); 147 int (*show_options)(struct seq_file *sf, struct kernfs_root *root); 148 149 int (*mkdir)(struct kernfs_node *parent, const char *name, 150 umode_t mode); 151 int (*rmdir)(struct kernfs_node *kn); 152 int (*rename)(struct kernfs_node *kn, struct kernfs_node *new_parent, 153 const char *new_name); 154}; 155 156struct kernfs_root { 157 /* published fields */ 158 struct kernfs_node *kn; 159 unsigned int flags; /* KERNFS_ROOT_* flags */ 160 161 /* private fields, do not use outside kernfs proper */ 162 struct ida ino_ida; 163 struct kernfs_syscall_ops *syscall_ops; 164 wait_queue_head_t deactivate_waitq; 165}; 166 167struct kernfs_open_file { 168 /* published fields */ 169 struct kernfs_node *kn; 170 struct file *file; 171 void *priv; 172 173 /* private fields, do not use outside kernfs proper */ 174 struct mutex mutex; 175 int event; 176 struct list_head list; 177 178 size_t atomic_write_len; 179 bool mmapped; 180 const struct vm_operations_struct *vm_ops; 181}; 182 183struct kernfs_ops { 184 /* 185 * Read is handled by either seq_file or raw_read(). 186 * 187 * If seq_show() is present, seq_file path is active. Other seq 188 * operations are optional and if not implemented, the behavior is 189 * equivalent to single_open(). @sf->private points to the 190 * associated kernfs_open_file. 191 * 192 * read() is bounced through kernel buffer and a read larger than 193 * PAGE_SIZE results in partial operation of PAGE_SIZE. 194 */ 195 int (*seq_show)(struct seq_file *sf, void *v); 196 197 void *(*seq_start)(struct seq_file *sf, loff_t *ppos); 198 void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos); 199 void (*seq_stop)(struct seq_file *sf, void *v); 200 201 ssize_t (*read)(struct kernfs_open_file *of, char *buf, size_t bytes, 202 loff_t off); 203 204 /* 205 * write() is bounced through kernel buffer. If atomic_write_len 206 * is not set, a write larger than PAGE_SIZE results in partial 207 * operations of PAGE_SIZE chunks. If atomic_write_len is set, 208 * writes upto the specified size are executed atomically but 209 * larger ones are rejected with -E2BIG. 210 */ 211 size_t atomic_write_len; 212 ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes, 213 loff_t off); 214 215 int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma); 216 217#ifdef CONFIG_DEBUG_LOCK_ALLOC 218 struct lock_class_key lockdep_key; 219#endif 220}; 221 222#ifdef CONFIG_KERNFS 223 224static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn) 225{ 226 return kn->flags & KERNFS_TYPE_MASK; 227} 228 229/** 230 * kernfs_enable_ns - enable namespace under a directory 231 * @kn: directory of interest, should be empty 232 * 233 * This is to be called right after @kn is created to enable namespace 234 * under it. All children of @kn must have non-NULL namespace tags and 235 * only the ones which match the super_block's tag will be visible. 236 */ 237static inline void kernfs_enable_ns(struct kernfs_node *kn) 238{ 239 WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR); 240 WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn->dir.children)); 241 kn->flags |= KERNFS_NS; 242} 243 244/** 245 * kernfs_ns_enabled - test whether namespace is enabled 246 * @kn: the node to test 247 * 248 * Test whether namespace filtering is enabled for the children of @ns. 249 */ 250static inline bool kernfs_ns_enabled(struct kernfs_node *kn) 251{ 252 return kn->flags & KERNFS_NS; 253} 254 255int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen); 256char * __must_check kernfs_path(struct kernfs_node *kn, char *buf, 257 size_t buflen); 258void pr_cont_kernfs_name(struct kernfs_node *kn); 259void pr_cont_kernfs_path(struct kernfs_node *kn); 260struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn); 261struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, 262 const char *name, const void *ns); 263void kernfs_get(struct kernfs_node *kn); 264void kernfs_put(struct kernfs_node *kn); 265 266struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry); 267struct kernfs_root *kernfs_root_from_sb(struct super_block *sb); 268 269struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops, 270 unsigned int flags, void *priv); 271void kernfs_destroy_root(struct kernfs_root *root); 272 273struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent, 274 const char *name, umode_t mode, 275 void *priv, const void *ns); 276struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent, 277 const char *name, 278 umode_t mode, loff_t size, 279 const struct kernfs_ops *ops, 280 void *priv, const void *ns, 281 bool name_is_static, 282 struct lock_class_key *key); 283struct kernfs_node *kernfs_create_link(struct kernfs_node *parent, 284 const char *name, 285 struct kernfs_node *target); 286void kernfs_activate(struct kernfs_node *kn); 287void kernfs_remove(struct kernfs_node *kn); 288void kernfs_break_active_protection(struct kernfs_node *kn); 289void kernfs_unbreak_active_protection(struct kernfs_node *kn); 290bool kernfs_remove_self(struct kernfs_node *kn); 291int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name, 292 const void *ns); 293int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, 294 const char *new_name, const void *new_ns); 295int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr); 296void kernfs_notify(struct kernfs_node *kn); 297 298const void *kernfs_super_ns(struct super_block *sb); 299struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, 300 struct kernfs_root *root, unsigned long magic, 301 bool *new_sb_created, const void *ns); 302void kernfs_kill_sb(struct super_block *sb); 303 304void kernfs_init(void); 305 306#else /* CONFIG_KERNFS */ 307 308static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn) 309{ return 0; } /* whatever */ 310 311static inline void kernfs_enable_ns(struct kernfs_node *kn) { } 312 313static inline bool kernfs_ns_enabled(struct kernfs_node *kn) 314{ return false; } 315 316static inline int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen) 317{ return -ENOSYS; } 318 319static inline char * __must_check kernfs_path(struct kernfs_node *kn, char *buf, 320 size_t buflen) 321{ return NULL; } 322 323static inline void pr_cont_kernfs_name(struct kernfs_node *kn) { } 324static inline void pr_cont_kernfs_path(struct kernfs_node *kn) { } 325 326static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) 327{ return NULL; } 328 329static inline struct kernfs_node * 330kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, 331 const void *ns) 332{ return NULL; } 333 334static inline void kernfs_get(struct kernfs_node *kn) { } 335static inline void kernfs_put(struct kernfs_node *kn) { } 336 337static inline struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry) 338{ return NULL; } 339 340static inline struct kernfs_root *kernfs_root_from_sb(struct super_block *sb) 341{ return NULL; } 342 343static inline struct kernfs_root * 344kernfs_create_root(struct kernfs_syscall_ops *scops, unsigned int flags, 345 void *priv) 346{ return ERR_PTR(-ENOSYS); } 347 348static inline void kernfs_destroy_root(struct kernfs_root *root) { } 349 350static inline struct kernfs_node * 351kernfs_create_dir_ns(struct kernfs_node *parent, const char *name, 352 umode_t mode, void *priv, const void *ns) 353{ return ERR_PTR(-ENOSYS); } 354 355static inline struct kernfs_node * 356__kernfs_create_file(struct kernfs_node *parent, const char *name, 357 umode_t mode, loff_t size, const struct kernfs_ops *ops, 358 void *priv, const void *ns, bool name_is_static, 359 struct lock_class_key *key) 360{ return ERR_PTR(-ENOSYS); } 361 362static inline struct kernfs_node * 363kernfs_create_link(struct kernfs_node *parent, const char *name, 364 struct kernfs_node *target) 365{ return ERR_PTR(-ENOSYS); } 366 367static inline void kernfs_activate(struct kernfs_node *kn) { } 368 369static inline void kernfs_remove(struct kernfs_node *kn) { } 370 371static inline bool kernfs_remove_self(struct kernfs_node *kn) 372{ return false; } 373 374static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn, 375 const char *name, const void *ns) 376{ return -ENOSYS; } 377 378static inline int kernfs_rename_ns(struct kernfs_node *kn, 379 struct kernfs_node *new_parent, 380 const char *new_name, const void *new_ns) 381{ return -ENOSYS; } 382 383static inline int kernfs_setattr(struct kernfs_node *kn, 384 const struct iattr *iattr) 385{ return -ENOSYS; } 386 387static inline void kernfs_notify(struct kernfs_node *kn) { } 388 389static inline const void *kernfs_super_ns(struct super_block *sb) 390{ return NULL; } 391 392static inline struct dentry * 393kernfs_mount_ns(struct file_system_type *fs_type, int flags, 394 struct kernfs_root *root, unsigned long magic, 395 bool *new_sb_created, const void *ns) 396{ return ERR_PTR(-ENOSYS); } 397 398static inline void kernfs_kill_sb(struct super_block *sb) { } 399 400static inline void kernfs_init(void) { } 401 402#endif /* CONFIG_KERNFS */ 403 404static inline struct kernfs_node * 405kernfs_find_and_get(struct kernfs_node *kn, const char *name) 406{ 407 return kernfs_find_and_get_ns(kn, name, NULL); 408} 409 410static inline struct kernfs_node * 411kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode, 412 void *priv) 413{ 414 return kernfs_create_dir_ns(parent, name, mode, priv, NULL); 415} 416 417static inline struct kernfs_node * 418kernfs_create_file_ns(struct kernfs_node *parent, const char *name, 419 umode_t mode, loff_t size, const struct kernfs_ops *ops, 420 void *priv, const void *ns) 421{ 422 struct lock_class_key *key = NULL; 423 424#ifdef CONFIG_DEBUG_LOCK_ALLOC 425 key = (struct lock_class_key *)&ops->lockdep_key; 426#endif 427 return __kernfs_create_file(parent, name, mode, size, ops, priv, ns, 428 false, key); 429} 430 431static inline struct kernfs_node * 432kernfs_create_file(struct kernfs_node *parent, const char *name, umode_t mode, 433 loff_t size, const struct kernfs_ops *ops, void *priv) 434{ 435 return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL); 436} 437 438static inline int kernfs_remove_by_name(struct kernfs_node *parent, 439 const char *name) 440{ 441 return kernfs_remove_by_name_ns(parent, name, NULL); 442} 443 444static inline int kernfs_rename(struct kernfs_node *kn, 445 struct kernfs_node *new_parent, 446 const char *new_name) 447{ 448 return kernfs_rename_ns(kn, new_parent, new_name, NULL); 449} 450 451static inline struct dentry * 452kernfs_mount(struct file_system_type *fs_type, int flags, 453 struct kernfs_root *root, unsigned long magic, 454 bool *new_sb_created) 455{ 456 return kernfs_mount_ns(fs_type, flags, root, 457 magic, new_sb_created, NULL); 458} 459 460#endif /* __LINUX_KERNFS_H */