@@ -65,6 +65,17 @@ const struct super_operations kernfs_sops = {
.show_path = kernfs_sop_show_path,
};
+/*
+ * A special version of export_encode_fh(). This will avoid to get inode and
+ * then do the fhandle encoding. This function must match with export_encode_fh
+ * and the kernfs node should be a directory.
+ */
+void kernfs_encode_node_id(struct kernfs_node *kn, struct kernfs_node_id *id)
+{
+ id->ino = kn->ino;
+ id->gen = kn->generation;
+}
+
static struct inode *kernfs_fh_get_inode(struct super_block *sb,
u64 ino, u32 generation)
{
@@ -308,6 +308,8 @@ struct cgroup {
/* used to store eBPF programs */
struct cgroup_bpf bpf;
+ struct kernfs_node_id node_id;
+
/* ids of the ancestors at each level including self */
int ancestor_ids[];
};
@@ -589,6 +589,10 @@ static inline void cgroup_kthread_ready(void)
current->no_cgroup_migration = 0;
}
+static inline struct kernfs_node_id *cgroup_get_node_id(struct cgroup *cgrp)
+{
+ return &cgrp->node_id;
+}
#else /* !CONFIG_CGROUPS */
struct cgroup_subsys_state;
@@ -611,6 +615,10 @@ static inline int cgroup_init_early(void) { return 0; }
static inline int cgroup_init(void) { return 0; }
static inline void cgroup_init_kthreadd(void) {}
static inline void cgroup_kthread_ready(void) {}
+static inline struct kernfs_node_id *cgroup_get_node_id(struct cgroup *cgrp)
+{
+ return NULL;
+}
static inline bool task_under_cgroup_hierarchy(struct task_struct *task,
struct cgroup *ancestor)
@@ -247,6 +247,12 @@ struct kernfs_ops {
#endif
};
+/* match with 'struct fid' */
+struct kernfs_node_id {
+ u32 ino;
+ u32 gen;
+};
+
#ifdef CONFIG_KERNFS
static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
@@ -339,6 +345,8 @@ struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns);
void kernfs_init(void);
+void kernfs_encode_node_id(struct kernfs_node *kn, struct kernfs_node_id *id);
+
#else /* CONFIG_KERNFS */
static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
@@ -1692,6 +1692,7 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask, int ref_flags)
goto exit_root_id;
}
root_cgrp->kn = root->kf_root->kn;
+ kernfs_encode_node_id(root_cgrp->kn, &root_cgrp->node_id);
ret = css_populate_dir(&root_cgrp->self);
if (ret)
@@ -4209,6 +4210,8 @@ int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, umode_t mode)
/* let's create and online css's */
kernfs_activate(kn);
+ kernfs_encode_node_id(kn, &cgrp->node_id);
+
ret = 0;
goto out_unlock;