linux/include/linux/kernfs.h
<<
>>
Prefs
   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};
  49
  50/* @flags for kernfs_create_root() */
  51enum kernfs_root_flag {
  52        /*
  53         * kernfs_nodes are created in the deactivated state and invisible.
  54         * They require explicit kernfs_activate() to become visible.  This
  55         * can be used to make related nodes become visible atomically
  56         * after all nodes are created successfully.
  57         */
  58        KERNFS_ROOT_CREATE_DEACTIVATED          = 0x0001,
  59
  60        /*
  61         * For regular flies, if the opener has CAP_DAC_OVERRIDE, open(2)
  62         * succeeds regardless of the RW permissions.  sysfs had an extra
  63         * layer of enforcement where open(2) fails with -EACCES regardless
  64         * of CAP_DAC_OVERRIDE if the permission doesn't have the
  65         * respective read or write access at all (none of S_IRUGO or
  66         * S_IWUGO) or the respective operation isn't implemented.  The
  67         * following flag enables that behavior.
  68         */
  69        KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK       = 0x0002,
  70};
  71
  72/* type-specific structures for kernfs_node union members */
  73struct kernfs_elem_dir {
  74        unsigned long           subdirs;
  75        /* children rbtree starts here and goes through kn->rb */
  76        struct rb_root          children;
  77
  78        /*
  79         * The kernfs hierarchy this directory belongs to.  This fits
  80         * better directly in kernfs_node but is here to save space.
  81         */
  82        struct kernfs_root      *root;
  83};
  84
  85struct kernfs_elem_symlink {
  86        struct kernfs_node      *target_kn;
  87};
  88
  89struct kernfs_elem_attr {
  90        const struct kernfs_ops *ops;
  91        struct kernfs_open_node *open;
  92        loff_t                  size;
  93        struct kernfs_node      *notify_next;   /* for kernfs_notify() */
  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
 165        /* list of kernfs_super_info of this root, protected by kernfs_mutex */
 166        struct list_head        supers;
 167
 168        wait_queue_head_t       deactivate_waitq;
 169};
 170
 171struct kernfs_open_file {
 172        /* published fields */
 173        struct kernfs_node      *kn;
 174        struct file             *file;
 175        void                    *priv;
 176
 177        /* private fields, do not use outside kernfs proper */
 178        struct mutex            mutex;
 179        int                     event;
 180        struct list_head        list;
 181        char                    *prealloc_buf;
 182
 183        size_t                  atomic_write_len;
 184        bool                    mmapped;
 185        const struct vm_operations_struct *vm_ops;
 186};
 187
 188struct kernfs_ops {
 189        /*
 190         * Read is handled by either seq_file or raw_read().
 191         *
 192         * If seq_show() is present, seq_file path is active.  Other seq
 193         * operations are optional and if not implemented, the behavior is
 194         * equivalent to single_open().  @sf->private points to the
 195         * associated kernfs_open_file.
 196         *
 197         * read() is bounced through kernel buffer and a read larger than
 198         * PAGE_SIZE results in partial operation of PAGE_SIZE.
 199         */
 200        int (*seq_show)(struct seq_file *sf, void *v);
 201
 202        void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
 203        void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
 204        void (*seq_stop)(struct seq_file *sf, void *v);
 205
 206        ssize_t (*read)(struct kernfs_open_file *of, char *buf, size_t bytes,
 207                        loff_t off);
 208
 209        /*
 210         * write() is bounced through kernel buffer.  If atomic_write_len
 211         * is not set, a write larger than PAGE_SIZE results in partial
 212         * operations of PAGE_SIZE chunks.  If atomic_write_len is set,
 213         * writes upto the specified size are executed atomically but
 214         * larger ones are rejected with -E2BIG.
 215         */
 216        size_t atomic_write_len;
 217        /*
 218         * "prealloc" causes a buffer to be allocated at open for
 219         * all read/write requests.  As ->seq_show uses seq_read()
 220         * which does its own allocation, it is incompatible with
 221         * ->prealloc.  Provide ->read and ->write with ->prealloc.
 222         */
 223        bool prealloc;
 224        ssize_t (*write)(struct kernfs_open_file *of, char *buf, size_t bytes,
 225                         loff_t off);
 226
 227        int (*mmap)(struct kernfs_open_file *of, struct vm_area_struct *vma);
 228
 229#ifdef CONFIG_DEBUG_LOCK_ALLOC
 230        struct lock_class_key   lockdep_key;
 231#endif
 232};
 233
 234#ifdef CONFIG_KERNFS
 235
 236static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
 237{
 238        return kn->flags & KERNFS_TYPE_MASK;
 239}
 240
 241/**
 242 * kernfs_enable_ns - enable namespace under a directory
 243 * @kn: directory of interest, should be empty
 244 *
 245 * This is to be called right after @kn is created to enable namespace
 246 * under it.  All children of @kn must have non-NULL namespace tags and
 247 * only the ones which match the super_block's tag will be visible.
 248 */
 249static inline void kernfs_enable_ns(struct kernfs_node *kn)
 250{
 251        WARN_ON_ONCE(kernfs_type(kn) != KERNFS_DIR);
 252        WARN_ON_ONCE(!RB_EMPTY_ROOT(&kn->dir.children));
 253        kn->flags |= KERNFS_NS;
 254}
 255
 256/**
 257 * kernfs_ns_enabled - test whether namespace is enabled
 258 * @kn: the node to test
 259 *
 260 * Test whether namespace filtering is enabled for the children of @ns.
 261 */
 262static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
 263{
 264        return kn->flags & KERNFS_NS;
 265}
 266
 267int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen);
 268char * __must_check kernfs_path(struct kernfs_node *kn, char *buf,
 269                                size_t buflen);
 270void pr_cont_kernfs_name(struct kernfs_node *kn);
 271void pr_cont_kernfs_path(struct kernfs_node *kn);
 272struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn);
 273struct kernfs_node *kernfs_find_and_get_ns(struct kernfs_node *parent,
 274                                           const char *name, const void *ns);
 275void kernfs_get(struct kernfs_node *kn);
 276void kernfs_put(struct kernfs_node *kn);
 277
 278struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry);
 279struct kernfs_root *kernfs_root_from_sb(struct super_block *sb);
 280
 281struct kernfs_root *kernfs_create_root(struct kernfs_syscall_ops *scops,
 282                                       unsigned int flags, void *priv);
 283void kernfs_destroy_root(struct kernfs_root *root);
 284
 285struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
 286                                         const char *name, umode_t mode,
 287                                         void *priv, const void *ns);
 288struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
 289                                         const char *name,
 290                                         umode_t mode, loff_t size,
 291                                         const struct kernfs_ops *ops,
 292                                         void *priv, const void *ns,
 293                                         struct lock_class_key *key);
 294struct kernfs_node *kernfs_create_link(struct kernfs_node *parent,
 295                                       const char *name,
 296                                       struct kernfs_node *target);
 297void kernfs_activate(struct kernfs_node *kn);
 298void kernfs_remove(struct kernfs_node *kn);
 299void kernfs_break_active_protection(struct kernfs_node *kn);
 300void kernfs_unbreak_active_protection(struct kernfs_node *kn);
 301bool kernfs_remove_self(struct kernfs_node *kn);
 302int kernfs_remove_by_name_ns(struct kernfs_node *parent, const char *name,
 303                             const void *ns);
 304int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
 305                     const char *new_name, const void *new_ns);
 306int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr);
 307void kernfs_notify(struct kernfs_node *kn);
 308
 309const void *kernfs_super_ns(struct super_block *sb);
 310struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags,
 311                               struct kernfs_root *root, unsigned long magic,
 312                               bool *new_sb_created, const void *ns);
 313void kernfs_kill_sb(struct super_block *sb);
 314struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns);
 315
 316void kernfs_init(void);
 317
 318#else   /* CONFIG_KERNFS */
 319
 320static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
 321{ return 0; }   /* whatever */
 322
 323static inline void kernfs_enable_ns(struct kernfs_node *kn) { }
 324
 325static inline bool kernfs_ns_enabled(struct kernfs_node *kn)
 326{ return false; }
 327
 328static inline int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen)
 329{ return -ENOSYS; }
 330
 331static inline char * __must_check kernfs_path(struct kernfs_node *kn, char *buf,
 332                                              size_t buflen)
 333{ return NULL; }
 334
 335static inline void pr_cont_kernfs_name(struct kernfs_node *kn) { }
 336static inline void pr_cont_kernfs_path(struct kernfs_node *kn) { }
 337
 338static inline struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
 339{ return NULL; }
 340
 341static inline struct kernfs_node *
 342kernfs_find_and_get_ns(struct kernfs_node *parent, const char *name,
 343                       const void *ns)
 344{ return NULL; }
 345
 346static inline void kernfs_get(struct kernfs_node *kn) { }
 347static inline void kernfs_put(struct kernfs_node *kn) { }
 348
 349static inline struct kernfs_node *kernfs_node_from_dentry(struct dentry *dentry)
 350{ return NULL; }
 351
 352static inline struct kernfs_root *kernfs_root_from_sb(struct super_block *sb)
 353{ return NULL; }
 354
 355static inline struct kernfs_root *
 356kernfs_create_root(struct kernfs_syscall_ops *scops, unsigned int flags,
 357                   void *priv)
 358{ return ERR_PTR(-ENOSYS); }
 359
 360static inline void kernfs_destroy_root(struct kernfs_root *root) { }
 361
 362static inline struct kernfs_node *
 363kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
 364                     umode_t mode, void *priv, const void *ns)
 365{ return ERR_PTR(-ENOSYS); }
 366
 367static inline struct kernfs_node *
 368__kernfs_create_file(struct kernfs_node *parent, const char *name,
 369                     umode_t mode, loff_t size, const struct kernfs_ops *ops,
 370                     void *priv, const void *ns, struct lock_class_key *key)
 371{ return ERR_PTR(-ENOSYS); }
 372
 373static inline struct kernfs_node *
 374kernfs_create_link(struct kernfs_node *parent, const char *name,
 375                   struct kernfs_node *target)
 376{ return ERR_PTR(-ENOSYS); }
 377
 378static inline void kernfs_activate(struct kernfs_node *kn) { }
 379
 380static inline void kernfs_remove(struct kernfs_node *kn) { }
 381
 382static inline bool kernfs_remove_self(struct kernfs_node *kn)
 383{ return false; }
 384
 385static inline int kernfs_remove_by_name_ns(struct kernfs_node *kn,
 386                                           const char *name, const void *ns)
 387{ return -ENOSYS; }
 388
 389static inline int kernfs_rename_ns(struct kernfs_node *kn,
 390                                   struct kernfs_node *new_parent,
 391                                   const char *new_name, const void *new_ns)
 392{ return -ENOSYS; }
 393
 394static inline int kernfs_setattr(struct kernfs_node *kn,
 395                                 const struct iattr *iattr)
 396{ return -ENOSYS; }
 397
 398static inline void kernfs_notify(struct kernfs_node *kn) { }
 399
 400static inline const void *kernfs_super_ns(struct super_block *sb)
 401{ return NULL; }
 402
 403static inline struct dentry *
 404kernfs_mount_ns(struct file_system_type *fs_type, int flags,
 405                struct kernfs_root *root, unsigned long magic,
 406                bool *new_sb_created, const void *ns)
 407{ return ERR_PTR(-ENOSYS); }
 408
 409static inline void kernfs_kill_sb(struct super_block *sb) { }
 410
 411static inline void kernfs_init(void) { }
 412
 413#endif  /* CONFIG_KERNFS */
 414
 415static inline struct kernfs_node *
 416kernfs_find_and_get(struct kernfs_node *kn, const char *name)
 417{
 418        return kernfs_find_and_get_ns(kn, name, NULL);
 419}
 420
 421static inline struct kernfs_node *
 422kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode,
 423                  void *priv)
 424{
 425        return kernfs_create_dir_ns(parent, name, mode, priv, NULL);
 426}
 427
 428static inline struct kernfs_node *
 429kernfs_create_file_ns(struct kernfs_node *parent, const char *name,
 430                      umode_t mode, loff_t size, const struct kernfs_ops *ops,
 431                      void *priv, const void *ns)
 432{
 433        struct lock_class_key *key = NULL;
 434
 435#ifdef CONFIG_DEBUG_LOCK_ALLOC
 436        key = (struct lock_class_key *)&ops->lockdep_key;
 437#endif
 438        return __kernfs_create_file(parent, name, mode, size, ops, priv, ns,
 439                                    key);
 440}
 441
 442static inline struct kernfs_node *
 443kernfs_create_file(struct kernfs_node *parent, const char *name, umode_t mode,
 444                   loff_t size, const struct kernfs_ops *ops, void *priv)
 445{
 446        return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL);
 447}
 448
 449static inline int kernfs_remove_by_name(struct kernfs_node *parent,
 450                                        const char *name)
 451{
 452        return kernfs_remove_by_name_ns(parent, name, NULL);
 453}
 454
 455static inline int kernfs_rename(struct kernfs_node *kn,
 456                                struct kernfs_node *new_parent,
 457                                const char *new_name)
 458{
 459        return kernfs_rename_ns(kn, new_parent, new_name, NULL);
 460}
 461
 462static inline struct dentry *
 463kernfs_mount(struct file_system_type *fs_type, int flags,
 464                struct kernfs_root *root, unsigned long magic,
 465                bool *new_sb_created)
 466{
 467        return kernfs_mount_ns(fs_type, flags, root,
 468                                magic, new_sb_created, NULL);
 469}
 470
 471#endif  /* __LINUX_KERNFS_H */
 472