]> git.karo-electronics.de Git - karo-tx-linux.git/blob - include/linux/kernfs.h
sysfs, kernfs: introduce kernfs_notify()
[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 void kernfs_notify(struct sysfs_dirent *sd);
88
89 #else   /* CONFIG_SYSFS */
90
91 static inline struct sysfs_dirent *
92 kernfs_create_dir_ns(struct sysfs_dirent *parent, const char *name, void *priv,
93                      const void *ns)
94 { return ERR_PTR(-ENOSYS); }
95
96 static inline struct sysfs_dirent *
97 kernfs_create_file_ns(struct sysfs_dirent *parent, const char *name,
98                       umode_t mode, loff_t size, const struct kernfs_ops *ops,
99                       void *priv, const void *ns)
100 { return ERR_PTR(-ENOSYS); }
101
102 static inline struct sysfs_dirent *
103 kernfs_create_link(struct sysfs_dirent *parent, const char *name,
104                    struct sysfs_dirent *target)
105 { return ERR_PTR(-ENOSYS); }
106
107 static inline void kernfs_remove(struct sysfs_dirent *sd) { }
108
109 static inline int kernfs_remove_by_name_ns(struct sysfs_dirent *parent,
110                                            const char *name, const void *ns)
111 { return -ENOSYS; }
112
113 static inline int kernfs_rename_ns(struct sysfs_dirent *sd,
114                                    struct sysfs_dirent *new_parent,
115                                    const char *new_name, const void *new_ns)
116 { return -ENOSYS; }
117
118 static inline void kernfs_enable_ns(struct sysfs_dirent *sd) { }
119
120 static inline int kernfs_setattr(struct sysfs_dirent *sd,
121                                  const struct iattr *iattr)
122 { return -ENOSYS; }
123
124 static inline void kernfs_notify(struct sysfs_dirent *sd) { }
125
126 #endif  /* CONFIG_SYSFS */
127
128 static inline struct sysfs_dirent *
129 kernfs_create_dir(struct sysfs_dirent *parent, const char *name, void *priv)
130 {
131         return kernfs_create_dir_ns(parent, name, priv, NULL);
132 }
133
134 static inline struct sysfs_dirent *
135 kernfs_create_file(struct sysfs_dirent *parent, const char *name, umode_t mode,
136                    loff_t size, const struct kernfs_ops *ops, void *priv)
137 {
138         return kernfs_create_file_ns(parent, name, mode, size, ops, priv, NULL);
139 }
140
141 static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,
142                                         const char *name)
143 {
144         return kernfs_remove_by_name_ns(parent, name, NULL);
145 }
146
147 #endif  /* __LINUX_KERNFS_H */