]> git.karo-electronics.de Git - karo-tx-linux.git/blob - include/linux/kernfs.h
ba993ebcd81ef019dda7a83bc2e7e1efb458cc53
[karo-tx-linux.git] / include / linux / kernfs.h
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
15 struct file;
16 struct iattr;
17 struct seq_file;
18 struct vm_area_struct;
19
20 struct sysfs_dirent;
21
22 struct sysfs_open_file {
23         /* published fields */
24         struct sysfs_dirent     *sd;
25         struct file             *file;
26
27         /* private fields, do not use outside kernfs proper */
28         struct mutex            mutex;
29         int                     event;
30         struct list_head        list;
31
32         bool                    mmapped;
33         const struct vm_operations_struct *vm_ops;
34 };
35
36 struct kernfs_ops {
37         /*
38          * Read is handled by either seq_file or raw_read().
39          *
40          * If seq_show() is present, seq_file path is active.  Other seq
41          * operations are optional and if not implemented, the behavior is
42          * equivalent to single_open().  @sf->private points to the
43          * associated sysfs_open_file.
44          *
45          * read() is bounced through kernel buffer and a read larger than
46          * PAGE_SIZE results in partial operation of PAGE_SIZE.
47          */
48         int (*seq_show)(struct seq_file *sf, void *v);
49
50         void *(*seq_start)(struct seq_file *sf, loff_t *ppos);
51         void *(*seq_next)(struct seq_file *sf, void *v, loff_t *ppos);
52         void (*seq_stop)(struct seq_file *sf, void *v);
53
54         ssize_t (*read)(struct sysfs_open_file *of, char *buf, size_t bytes,
55                         loff_t off);
56
57         /*
58          * write() is bounced through kernel buffer and a write larger than
59          * PAGE_SIZE results in partial operation of PAGE_SIZE.
60          */
61         ssize_t (*write)(struct sysfs_open_file *of, char *buf, size_t bytes,
62                          loff_t off);
63
64         int (*mmap)(struct sysfs_open_file *of, struct vm_area_struct *vma);
65 };
66
67 #ifdef CONFIG_SYSFS
68
69 struct sysfs_dirent *kernfs_create_dir_ns(struct sysfs_dirent *parent,
70                                           const char *name, void *priv,
71                                           const void *ns);
72 struct sysfs_dirent *kernfs_create_file_ns(struct sysfs_dirent *parent,
73                                            const char *name,
74                                            umode_t mode, loff_t size,
75                                            const struct kernfs_ops *ops,
76                                            void *priv, const void *ns);
77 struct sysfs_dirent *kernfs_create_link(struct sysfs_dirent *parent,
78                                         const char *name,
79                                         struct sysfs_dirent *target);
80 void kernfs_remove(struct sysfs_dirent *sd);
81 int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name,
82                              const void *ns);
83 int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent,
84                      const char *new_name, const void *new_ns);
85 void kernfs_enable_ns(struct sysfs_dirent *sd);
86 int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr);
87
88 #else   /* CONFIG_SYSFS */
89
90 static inline struct sysfs_dirent *
91 kernfs_create_dir_ns(struct sysfs_dirent *parent, const char *name, void *priv,
92                      const void *ns)
93 { return ERR_PTR(-ENOSYS); }
94
95 static inline struct sysfs_dirent *
96 kernfs_create_file_ns(struct sysfs_dirent *parent, const char *name,
97                       umode_t mode, loff_t size, const struct kernfs_ops *ops,
98                       void *priv, const void *ns)
99 { return ERR_PTR(-ENOSYS); }
100
101 static inline struct sysfs_dirent *
102 kernfs_create_link(struct sysfs_dirent *parent, const char *name,
103                    struct sysfs_dirent *target)
104 { return ERR_PTR(-ENOSYS); }
105
106 static inline void kernfs_remove(struct sysfs_dirent *sd) { }
107
108 static inline int kernfs_remove_by_name_ns(struct sysfs_dirent *parent,
109                                            const char *name, const void *ns)
110 { return -ENOSYS; }
111
112 static inline int kernfs_rename_ns(struct sysfs_dirent *sd,
113                                    struct sysfs_dirent *new_parent,
114                                    const char *new_name, const void *new_ns)
115 { return -ENOSYS; }
116
117 static inline void kernfs_enable_ns(struct sysfs_dirent *sd) { }
118
119 static inline int kernfs_setattr(struct sysfs_dirent *sd,
120                                  const struct iattr *iattr)
121 { return -ENOSYS; }
122
123 #endif  /* CONFIG_SYSFS */
124
125 static inline struct sysfs_dirent *
126 kernfs_create_dir(struct sysfs_dirent *parent, const char *name, void *priv)
127 {
128         return kernfs_create_dir_ns(parent, name, priv, NULL);
129 }
130
131 static inline struct sysfs_dirent *
132 kernfs_create_file(struct sysfs_dirent *parent, const char *name, umode_t mode,
133                    loff_t size, const struct kernfs_ops *ops, void *priv)
134 {
135         return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL);
136 }
137
138 static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,
139                                         const char *name)
140 {
141         return kernfs_remove_by_name_ns(parent, name, NULL);
142 }
143
144 #endif  /* __LINUX_KERNFS_H */