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 {
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.
*/
struct kstat *stat);
int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value,
size_t size, int flags);
-int sysfs_inode_init(void);
+void sysfs_inode_init(void);
/*
* dir.c
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(const char *name, umode_t mode, int type);
+struct sysfs_dirent *sysfs_new_dirent(struct kernfs_root *root,
+ const char *name, umode_t mode, int type);
/*
* file.c