sysfs, kernfs: prepare mount path for kernfs
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / kernfs / kernfs-internal.h
index 5a2c3a1..0d94988 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/lockdep.h>
 #include <linux/fs.h>
 #include <linux/rbtree.h>
+#include <linux/mutex.h>
 
 #include <linux/kernfs.h>
 
@@ -24,6 +25,12 @@ struct sysfs_elem_dir {
        unsigned long           subdirs;
        /* children rbtree starts here and goes through sd->s_rb */
        struct rb_root          children;
+
+       /*
+        * The kernfs hierarchy this directory belongs to.  This fits
+        * better directly in sysfs_dirent but is here to save space.
+        */
+       struct kernfs_root      *root;
 };
 
 struct sysfs_elem_symlink {
@@ -103,6 +110,20 @@ static inline unsigned int sysfs_type(struct sysfs_dirent *sd)
        return sd->s_flags & SYSFS_TYPE_MASK;
 }
 
+/**
+ * kernfs_root - find out the kernfs_root a sysfs_dirent belongs to
+ * @sd: sysfs_dirent of interest
+ *
+ * Return the kernfs_root @sd belongs to.
+ */
+static inline struct kernfs_root *kernfs_root(struct sysfs_dirent *sd)
+{
+       /* if parent exists, it's always a dir; otherwise, @sd is a dir */
+       if (sd->s_parent)
+               sd = sd->s_parent;
+       return sd->s_dir.root;
+}
+
 /*
  * Context structure to be used while adding/removing nodes.
  */
@@ -112,4 +133,46 @@ struct sysfs_addrm_cxt {
 
 #include "../sysfs/sysfs.h"
 
+/*
+ * inode.c
+ */
+struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
+void sysfs_evict_inode(struct inode *inode);
+int sysfs_permission(struct inode *inode, int mask);
+int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
+int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
+                 struct kstat *stat);
+int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
+                  size_t size, int flags);
+void sysfs_inode_init(void);
+
+/*
+ * dir.c
+ */
+extern struct mutex sysfs_mutex;
+extern const struct dentry_operations sysfs_dentry_ops;
+extern const struct file_operations sysfs_dir_operations;
+extern const struct inode_operations sysfs_dir_inode_operations;
+
+struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd);
+void sysfs_put_active(struct sysfs_dirent *sd);
+void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt);
+int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd,
+                 struct sysfs_dirent *parent_sd);
+void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt);
+struct sysfs_dirent *sysfs_new_dirent(struct kernfs_root *root,
+                                     const char *name, umode_t mode, int type);
+
+/*
+ * file.c
+ */
+extern const struct file_operations kernfs_file_operations;
+
+void sysfs_unmap_bin_file(struct sysfs_dirent *sd);
+
+/*
+ * symlink.c
+ */
+extern const struct inode_operations sysfs_symlink_inode_operations;
+
 #endif /* __KERNFS_INTERNAL_H */