at v4.6 16 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_SUICIDAL = 0x0400, 47 KERNFS_SUICIDED = 0x0800, 48 KERNFS_EMPTY_DIR = 0x1000, 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 struct kernfs_node *notify_next; /* for kernfs_notify() */ 95}; 96 97/* 98 * kernfs_node - the building block of kernfs hierarchy. Each and every 99 * kernfs node is represented by single kernfs_node. Most fields are 100 * private to kernfs and shouldn't be accessed directly by kernfs users. 101 * 102 * As long as s_count reference is held, the kernfs_node itself is 103 * accessible. Dereferencing elem or any other outer entity requires 104 * active reference. 105 */ 106struct kernfs_node { 107 atomic_t count; 108 atomic_t active; 109#ifdef CONFIG_DEBUG_LOCK_ALLOC 110 struct lockdep_map dep_map; 111#endif 112 /* 113 * Use kernfs_get_parent() and kernfs_name/path() instead of 114 * accessing the following two fields directly. If the node is 115 * never moved to a different parent, it is safe to access the 116 * parent directly. 117 */ 118 struct kernfs_node *parent; 119 const char *name; 120 121 struct rb_node rb; 122 123 const void *ns; /* namespace tag */ 124 unsigned int hash; /* ns + name hash */ 125 union { 126 struct kernfs_elem_dir dir; 127 struct kernfs_elem_symlink symlink; 128 struct kernfs_elem_attr attr; 129 }; 130 131 void *priv; 132 133 unsigned short flags; 134 umode_t mode; 135 unsigned int ino; 136 struct kernfs_iattrs *iattr; 137}; 138 139/* 140 * kernfs_syscall_ops may be specified on kernfs_create_root() to support 141 * syscalls. These optional callbacks are invoked on the matching syscalls 142 * and can perform any kernfs operations which don't necessarily have to be 143 * the exact operation requested. An active reference is held for each 144 * kernfs_node parameter. 145 */ 146struct kernfs_syscall_ops { 147 int (*remount_fs)(struct kernfs_root *root, int *flags, char *data); 148 int (*show_options)(struct seq_file *sf, struct kernfs_root *root); 149 150 int (*mkdir)(struct kernfs_node *parent, const char *name, 151 umode_t mode); 152 int (*rmdir)(struct kernfs_node *kn); 153 int (*rename)(struct kernfs_node *kn, struct kernfs_node *new_parent, 154 const char *new_name); 155 int (*show_path)(struct seq_file *sf, struct kernfs_node *kn, 156 struct kernfs_root *root); 157}; 158 159struct kernfs_root { 160 /* published fields */ 161 struct kernfs_node *kn; 162 unsigned int flags; /* KERNFS_ROOT_* flags */ 163 164 /* private fields, do not use outside kernfs proper */ 165 struct ida ino_ida; 166 struct kernfs_syscall_ops *syscall_ops; 167 168 /* list of kernfs_super_info of this root, protected by kernfs_mutex */ 169 struct list_head supers; 170 171 wait_queue_head_t deactivate_waitq; 172}; 173 174struct kernfs_open_file { 175 /* published fields */ 176 struct kernfs_node *kn; 177 struct file *file; 178 void *priv; 179 180 /* private fields, do not use outside kernfs proper */ 181 struct mutex mutex; 182 int event; 183 struct list_head list; 184 char *prealloc_buf; 185 186 size_t atomic_write_len; 187 bool mmapped; 188 const struct vm_operations_struct *vm_ops; 189}; 190 191struct kernfs_ops { 192 /* 193 * Read is handled by either seq_file or raw_read(). 194 * 195 * If seq_show() is present, seq_file path is active. Other seq 196 * operations are optional and if not implemented, the behavior is 197 * equivalent to single_open(). @sf->private points to the 198 * associated kernfs_open_file. 199 * 200 * read() is bounced through kernel buffer and a read larger than 201 * PAGE_SIZE results in partial operation of PAGE_SIZE. 202 */ 203 int (*seq_show)(struct seq_file *sf, void *v); 204 205 void *(*seq_start)(struct seq_file *sf, loff_t *ppos); 206 void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos); 207 void (*seq_stop)(struct seq_file *sf, void *v); 208 209 ssize_t (*read)(struct kernfs_open_file *of, char *buf, size_t bytes, 210 loff_t off); 211 212 /* 213 * write() is bounced through kernel buffer. If atomic_write_len 214 * is not set, a write larger than PAGE_SIZE results in partial 215 * operations of PAGE_SIZE chunks. If atomic_write_len is set, 216 * writes upto the specified size are executed atomically but 217 * larger ones are rejected with -E2BIG. 218 */ 219 size_t atomic_write_len; 220 /* 221 * "prealloc" causes a buffer to be allocated at open for 222 * all read/write requests. As ->seq_show uses seq_read() 223 * which does its own allocation, it is incompatible with 224 * ->prealloc. Provide ->read and ->write with ->prealloc. 225 */ 226 bool prealloc; 227 ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes, 228 loff_t off); 229 230 int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma); 231 232#ifdef CONFIG_DEBUG_LOCK_ALLOC 233 struct lock_class_key lockdep_key; 234#endif 235}; 236 237#ifdef CONFIG_KERNFS 238 239static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn) 240{ 241 return kn->flags & KERNFS_TYPE_MASK; 242} 243 244/** 245 * kernfs_enable_ns - enable namespace under a directory 246 * @kn: directory of interest, should be empty 247 * 248 * This is to be called right after @kn is created to enable namespace 249 * under it. All children of @kn must have non-NULL namespace tags and 250 * only the ones which match the super_block's tag will be visible. 251 */ 252static inline void kernfs_enable_ns(struct kernfs_node *kn) 253{ 254 WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR); 255 WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn->dir.children)); 256 kn->flags |= KERNFS_NS; 257} 258 259/** 260 * kernfs_ns_enabled - test whether namespace is enabled 261 * @kn: the node to test 262 * 263 * Test whether namespace filtering is enabled for the children of @ns. 264 */ 265static inline bool kernfs_ns_enabled(struct kernfs_node *kn) 266{ 267 return kn->flags & KERNFS_NS; 268} 269 270int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen); 271size_t kernfs_path_len(struct kernfs_node *kn); 272int kernfs_path_from_node(struct kernfs_node *root_kn, struct kernfs_node *kn, 273 char *buf, size_t buflen); 274char *kernfs_path(struct kernfs_node *kn, char *buf, size_t buflen); 275void pr_cont_kernfs_name(struct kernfs_node *kn); 276void pr_cont_kernfs_path(struct kernfs_node *kn); 277struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn); 278struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent, 279 const char *name, const void *ns); 280struct kernfs_node *kernfs_walk_and_get_ns(struct kernfs_node *parent, 281 const char *path, const void *ns); 282void kernfs_get(struct kernfs_node *kn); 283void kernfs_put(struct kernfs_node *kn); 284 285struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry); 286struct kernfs_root *kernfs_root_from_sb(struct super_block *sb); 287struct inode *kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn); 288 289struct dentry *kernfs_node_dentry(struct kernfs_node *kn, 290 struct super_block *sb); 291struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops, 292 unsigned int flags, void *priv); 293void kernfs_destroy_root(struct kernfs_root *root); 294 295struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent, 296 const char *name, umode_t mode, 297 void *priv, const void *ns); 298struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent, 299 const char *name); 300struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent, 301 const char *name, 302 umode_t mode, loff_t size, 303 const struct kernfs_ops *ops, 304 void *priv, const void *ns, 305 struct lock_class_key *key); 306struct kernfs_node *kernfs_create_link(struct kernfs_node *parent, 307 const char *name, 308 struct kernfs_node *target); 309void kernfs_activate(struct kernfs_node *kn); 310void kernfs_remove(struct kernfs_node *kn); 311void kernfs_break_active_protection(struct kernfs_node *kn); 312void kernfs_unbreak_active_protection(struct kernfs_node *kn); 313bool kernfs_remove_self(struct kernfs_node *kn); 314int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name, 315 const void *ns); 316int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, 317 const char *new_name, const void *new_ns); 318int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr); 319void kernfs_notify(struct kernfs_node *kn); 320 321const void *kernfs_super_ns(struct super_block *sb); 322struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags, 323 struct kernfs_root *root, unsigned long magic, 324 bool *new_sb_created, const void *ns); 325void kernfs_kill_sb(struct super_block *sb); 326struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns); 327 328void kernfs_init(void); 329 330#else /* CONFIG_KERNFS */ 331 332static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn) 333{ return 0; } /* whatever */ 334 335static inline void kernfs_enable_ns(struct kernfs_node *kn) { } 336 337static inline bool kernfs_ns_enabled(struct kernfs_node *kn) 338{ return false; } 339 340static inline int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen) 341{ return -ENOSYS; } 342 343static inline size_t kernfs_path_len(struct kernfs_node *kn) 344{ return 0; } 345 346static inline char *kernfs_path(struct kernfs_node *kn, char *buf, 347 size_t buflen) 348{ return NULL; } 349 350static inline void pr_cont_kernfs_name(struct kernfs_node *kn) { } 351static inline void pr_cont_kernfs_path(struct kernfs_node *kn) { } 352 353static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) 354{ return NULL; } 355 356static inline struct kernfs_node * 357kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name, 358 const void *ns) 359{ return NULL; } 360static inline struct kernfs_node * 361kernfs_walk_and_get_ns(struct kernfs_node *parent, const char *path, 362 const void *ns) 363{ return NULL; } 364 365static inline void kernfs_get(struct kernfs_node *kn) { } 366static inline void kernfs_put(struct kernfs_node *kn) { } 367 368static inline struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry) 369{ return NULL; } 370 371static inline struct kernfs_root *kernfs_root_from_sb(struct super_block *sb) 372{ return NULL; } 373 374static inline struct inode * 375kernfs_get_inode(struct super_block *sb, struct kernfs_node *kn) 376{ return NULL; } 377 378static inline struct kernfs_root * 379kernfs_create_root(struct kernfs_syscall_ops *scops, unsigned int flags, 380 void *priv) 381{ return ERR_PTR(-ENOSYS); } 382 383static inline void kernfs_destroy_root(struct kernfs_root *root) { } 384 385static inline struct kernfs_node * 386kernfs_create_dir_ns(struct kernfs_node *parent, const char *name, 387 umode_t mode, void *priv, const void *ns) 388{ return ERR_PTR(-ENOSYS); } 389 390static inline struct kernfs_node * 391__kernfs_create_file(struct kernfs_node *parent, const char *name, 392 umode_t mode, loff_t size, const struct kernfs_ops *ops, 393 void *priv, const void *ns, struct lock_class_key *key) 394{ return ERR_PTR(-ENOSYS); } 395 396static inline struct kernfs_node * 397kernfs_create_link(struct kernfs_node *parent, const char *name, 398 struct kernfs_node *target) 399{ return ERR_PTR(-ENOSYS); } 400 401static inline void kernfs_activate(struct kernfs_node *kn) { } 402 403static inline void kernfs_remove(struct kernfs_node *kn) { } 404 405static inline bool kernfs_remove_self(struct kernfs_node *kn) 406{ return false; } 407 408static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn, 409 const char *name, const void *ns) 410{ return -ENOSYS; } 411 412static inline int kernfs_rename_ns(struct kernfs_node *kn, 413 struct kernfs_node *new_parent, 414 const char *new_name, const void *new_ns) 415{ return -ENOSYS; } 416 417static inline int kernfs_setattr(struct kernfs_node *kn, 418 const struct iattr *iattr) 419{ return -ENOSYS; } 420 421static inline void kernfs_notify(struct kernfs_node *kn) { } 422 423static inline const void *kernfs_super_ns(struct super_block *sb) 424{ return NULL; } 425 426static inline struct dentry * 427kernfs_mount_ns(struct file_system_type *fs_type, int flags, 428 struct kernfs_root *root, unsigned long magic, 429 bool *new_sb_created, const void *ns) 430{ return ERR_PTR(-ENOSYS); } 431 432static inline void kernfs_kill_sb(struct super_block *sb) { } 433 434static inline void kernfs_init(void) { } 435 436#endif /* CONFIG_KERNFS */ 437 438static inline struct kernfs_node * 439kernfs_find_and_get(struct kernfs_node *kn, const char *name) 440{ 441 return kernfs_find_and_get_ns(kn, name, NULL); 442} 443 444static inline struct kernfs_node * 445kernfs_walk_and_get(struct kernfs_node *kn, const char *path) 446{ 447 return kernfs_walk_and_get_ns(kn, path, NULL); 448} 449 450static inline struct kernfs_node * 451kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode, 452 void *priv) 453{ 454 return kernfs_create_dir_ns(parent, name, mode, priv, NULL); 455} 456 457static inline struct kernfs_node * 458kernfs_create_file_ns(struct kernfs_node *parent, const char *name, 459 umode_t mode, loff_t size, const struct kernfs_ops *ops, 460 void *priv, const void *ns) 461{ 462 struct lock_class_key *key = NULL; 463 464#ifdef CONFIG_DEBUG_LOCK_ALLOC 465 key = (struct lock_class_key *)&ops->lockdep_key; 466#endif 467 return __kernfs_create_file(parent, name, mode, size, ops, priv, ns, 468 key); 469} 470 471static inline struct kernfs_node * 472kernfs_create_file(struct kernfs_node *parent, const char *name, umode_t mode, 473 loff_t size, const struct kernfs_ops *ops, void *priv) 474{ 475 return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL); 476} 477 478static inline int kernfs_remove_by_name(struct kernfs_node *parent, 479 const char *name) 480{ 481 return kernfs_remove_by_name_ns(parent, name, NULL); 482} 483 484static inline int kernfs_rename(struct kernfs_node *kn, 485 struct kernfs_node *new_parent, 486 const char *new_name) 487{ 488 return kernfs_rename_ns(kn, new_parent, new_name, NULL); 489} 490 491static inline struct dentry * 492kernfs_mount(struct file_system_type *fs_type, int flags, 493 struct kernfs_root *root, unsigned long magic, 494 bool *new_sb_created) 495{ 496 return kernfs_mount_ns(fs_type, flags, root, 497 magic, new_sb_created, NULL); 498} 499 500#endif /* __LINUX_KERNFS_H */