sysfs, kernfs: introduce kernfs_ops
[platform/adaptation/renesas_rcar/renesas_kernel.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.  The behavior
41          * is equivalent to single_open().  @sf->private points to the
42          * associated sysfs_open_file.
43          *
44          * read() is bounced through kernel buffer and a read larger than
45          * PAGE_SIZE results in partial operation of PAGE_SIZE.
46          */
47         int (*seq_show)(struct seq_file *sf, void *v);
48
49         ssize_t (*read)(struct sysfs_open_file *of, char *buf, size_t bytes,
50                         loff_t off);
51
52         /*
53          * write() is bounced through kernel buffer and a write larger than
54          * PAGE_SIZE results in partial operation of PAGE_SIZE.
55          */
56         ssize_t (*write)(struct sysfs_open_file *of, char *buf, size_t bytes,
57                          loff_t off);
58
59         int (*mmap)(struct sysfs_open_file *of, struct vm_area_struct *vma);
60 };
61
62 #ifdef CONFIG_SYSFS
63
64 struct sysfs_dirent *kernfs_create_dir_ns(struct sysfs_dirent *parent,
65                                           const char *name, void *priv,
66                                           const void *ns);
67 struct sysfs_dirent *kernfs_create_link(struct sysfs_dirent *parent,
68                                         const char *name,
69                                         struct sysfs_dirent *target);
70 void kernfs_remove(struct sysfs_dirent *sd);
71 int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name,
72                              const void *ns);
73 int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent,
74                      const char *new_name, const void *new_ns);
75 void kernfs_enable_ns(struct sysfs_dirent *sd);
76 int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr);
77
78 #else   /* CONFIG_SYSFS */
79
80 static inline struct sysfs_dirent *
81 kernfs_create_dir_ns(struct sysfs_dirent *parent, const char *name, void *priv,
82                      const void *ns)
83 { return ERR_PTR(-ENOSYS); }
84
85 static inline struct sysfs_dirent *
86 kernfs_create_link(struct sysfs_dirent *parent, const char *name,
87                    struct sysfs_dirent *target)
88 { return ERR_PTR(-ENOSYS); }
89
90 static inline void kernfs_remove(struct sysfs_dirent *sd) { }
91
92 static inline int kernfs_remove_by_name_ns(struct sysfs_dirent *parent,
93                                            const char *name, const void *ns)
94 { return -ENOSYS; }
95
96 static inline int kernfs_rename_ns(struct sysfs_dirent *sd,
97                                    struct sysfs_dirent *new_parent,
98                                    const char *new_name, const void *new_ns)
99 { return -ENOSYS; }
100
101 static inline void kernfs_enable_ns(struct sysfs_dirent *sd) { }
102
103 static inline int kernfs_setattr(struct sysfs_dirent *sd,
104                                  const struct iattr *iattr)
105 { return -ENOSYS; }
106
107 #endif  /* CONFIG_SYSFS */
108
109 static inline struct sysfs_dirent *
110 kernfs_create_dir(struct sysfs_dirent *parent, const char *name, void *priv)
111 {
112         return kernfs_create_dir_ns(parent, name, priv, NULL);
113 }
114
115 static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,
116                                         const char *name)
117 {
118         return kernfs_remove_by_name_ns(parent, name, NULL);
119 }
120
121 #endif  /* __LINUX_KERNFS_H */