| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /*
- * kernfs.h - pseudo filesystem decoupled from vfs locking
- *
- * This file is released under the GPLv2.
- */
- #ifndef __LINUX_KERNFS_H
- #define __LINUX_KERNFS_H
- #include <linux/kernel.h>
- #include <linux/err.h>
- #include <linux/list.h>
- #include <linux/mutex.h>
- #include <linux/lockdep.h>
- struct file;
- struct iattr;
- struct seq_file;
- struct vm_area_struct;
- struct sysfs_dirent;
- struct sysfs_open_file {
- /* published fields */
- struct sysfs_dirent *sd;
- struct file *file;
- /* private fields, do not use outside kernfs proper */
- struct mutex mutex;
- int event;
- struct list_head list;
- bool mmapped;
- const struct vm_operations_struct *vm_ops;
- };
- struct kernfs_ops {
- /*
- * Read is handled by either seq_file or raw_read().
- *
- * If seq_show() is present, seq_file path is active. Other seq
- * operations are optional and if not implemented, the behavior is
- * equivalent to single_open(). @sf->private points to the
- * associated sysfs_open_file.
- *
- * read() is bounced through kernel buffer and a read larger than
- * PAGE_SIZE results in partial operation of PAGE_SIZE.
- */
- int (*seq_show)(struct seq_file *sf, void *v);
- void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
- void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
- void (*seq_stop)(struct seq_file *sf, void *v);
- ssize_t (*read)(struct sysfs_open_file *of, char *buf, size_t bytes,
- loff_t off);
- /*
- * write() is bounced through kernel buffer and a write larger than
- * PAGE_SIZE results in partial operation of PAGE_SIZE.
- */
- ssize_t (*write)(struct sysfs_open_file *of, char *buf, size_t bytes,
- loff_t off);
- int (*mmap)(struct sysfs_open_file *of, struct vm_area_struct *vma);
- #ifdef CONFIG_DEBUG_LOCK_ALLOC
- struct lock_class_key lockdep_key;
- #endif
- };
- #ifdef CONFIG_SYSFS
- struct sysfs_dirent *kernfs_create_dir_ns(struct sysfs_dirent *parent,
- const char *name, void *priv,
- const void *ns);
- struct sysfs_dirent *kernfs_create_file_ns_key(struct sysfs_dirent *parent,
- const char *name,
- umode_t mode, loff_t size,
- const struct kernfs_ops *ops,
- void *priv, const void *ns,
- struct lock_class_key *key);
- struct sysfs_dirent *kernfs_create_link(struct sysfs_dirent *parent,
- const char *name,
- struct sysfs_dirent *target);
- void kernfs_remove(struct sysfs_dirent *sd);
- int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name,
- const void *ns);
- int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent,
- const char *new_name, const void *new_ns);
- void kernfs_enable_ns(struct sysfs_dirent *sd);
- int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr);
- void kernfs_notify(struct sysfs_dirent *sd);
- #else /* CONFIG_SYSFS */
- static inline struct sysfs_dirent *
- kernfs_create_dir_ns(struct sysfs_dirent *parent, const char *name, void *priv,
- const void *ns)
- { return ERR_PTR(-ENOSYS); }
- static inline struct sysfs_dirent *
- kernfs_create_file_ns_key(struct sysfs_dirent *parent, const char *name,
- umode_t mode, loff_t size,
- const struct kernfs_ops *ops, void *priv,
- const void *ns, struct lock_class_key *key)
- { return ERR_PTR(-ENOSYS); }
- static inline struct sysfs_dirent *
- kernfs_create_link(struct sysfs_dirent *parent, const char *name,
- struct sysfs_dirent *target)
- { return ERR_PTR(-ENOSYS); }
- static inline void kernfs_remove(struct sysfs_dirent *sd) { }
- static inline int kernfs_remove_by_name_ns(struct sysfs_dirent *parent,
- const char *name, const void *ns)
- { return -ENOSYS; }
- static inline int kernfs_rename_ns(struct sysfs_dirent *sd,
- struct sysfs_dirent *new_parent,
- const char *new_name, const void *new_ns)
- { return -ENOSYS; }
- static inline void kernfs_enable_ns(struct sysfs_dirent *sd) { }
- static inline int kernfs_setattr(struct sysfs_dirent *sd,
- const struct iattr *iattr)
- { return -ENOSYS; }
- static inline void kernfs_notify(struct sysfs_dirent *sd) { }
- #endif /* CONFIG_SYSFS */
- static inline struct sysfs_dirent *
- kernfs_create_dir(struct sysfs_dirent *parent, const char *name, void *priv)
- {
- return kernfs_create_dir_ns(parent, name, priv, NULL);
- }
- static inline struct sysfs_dirent *
- kernfs_create_file_ns(struct sysfs_dirent *parent, const char *name,
- umode_t mode, loff_t size, const struct kernfs_ops *ops,
- void *priv, const void *ns)
- {
- struct lock_class_key *key = NULL;
- #ifdef CONFIG_DEBUG_LOCK_ALLOC
- key = (struct lock_class_key *)&ops->lockdep_key;
- #endif
- return kernfs_create_file_ns_key(parent, name, mode, size, ops, priv,
- ns, key);
- }
- static inline struct sysfs_dirent *
- kernfs_create_file(struct sysfs_dirent *parent, const char *name, umode_t mode,
- loff_t size, const struct kernfs_ops *ops, void *priv)
- {
- return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL);
- }
- static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,
- const char *name)
- {
- return kernfs_remove_by_name_ns(parent, name, NULL);
- }
- #endif /* __LINUX_KERNFS_H */
|