On 05.10.2021 20:54, Cyrill Gorcunov wrote: > From: Angelo Ruocco <angeloruocc...@gmail.com> > > This commit enables a cftype to have a symlink (of any name) that > points to the file associated with the cftype. > > Signed-off-by: Angelo Ruocco <angeloruocc...@gmail.com> > Signed-off-by: Paolo Valente <paolo.vale...@linaro.org> > Signed-off-by: Jens Axboe <ax...@kernel.dk> > > https://jira.sw.ru/browse/PSBM-101019 > (cherry-picked from 54b7b868e826b294687c439b68ec55fe20cafe5b) > Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com> > Signed-off-by: Cyrill Gorcunov <gorcu...@virtuozzo.com> > --- > include/linux/cgroup-defs.h | 3 +++ > kernel/cgroup/cgroup.c | 33 +++++++++++++++++++++++++++++---- > 2 files changed, 32 insertions(+), 4 deletions(-) > > diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h > index 583ce2bce98c..0b2222b884ce 100644 > --- a/include/linux/cgroup-defs.h > +++ b/include/linux/cgroup-defs.h > @@ -125,6 +125,8 @@ enum { > */ > CFTYPE_VE_WRITABLE = (1 << 15), > > + CFTYPE_SYMLINKED = (1 << 6), /* pointed to by symlink too */
We already have: CFTYPE_PRESSURE = (1 << 6), /* only if pressure feature is enabled */ > + > /* internal flags, do not use outside cgroup core proper */ > __CFTYPE_ONLY_ON_DFL = (1 << 16), /* only on default hierarchy */ > __CFTYPE_NOT_ON_DFL = (1 << 17), /* not on default hierarchy */ > @@ -552,6 +554,7 @@ struct cftype { > * end of cftype array. > */ > char name[MAX_CFTYPE_NAME]; > + char link_name[MAX_CFTYPE_NAME]; > unsigned long private; > > /* > diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c > index 08b7cff7a1c3..74d0b503e696 100644 > --- a/kernel/cgroup/cgroup.c > +++ b/kernel/cgroup/cgroup.c > @@ -1471,8 +1471,8 @@ struct cgroup *task_cgroup_from_root(struct task_struct > *task, > > static struct kernfs_syscall_ops cgroup_kf_syscall_ops; > > -static char *cgroup_file_name(struct cgroup *cgrp, const struct cftype *cft, > - char *buf) > +static char *cgroup_fill_name(struct cgroup *cgrp, const struct cftype *cft, > + char *buf, bool write_link_name) > { > struct cgroup_subsys *ss = cft->ss; > > @@ -1482,13 +1482,26 @@ static char *cgroup_file_name(struct cgroup *cgrp, > const struct cftype *cft, > > snprintf(buf, CGROUP_FILE_NAME_MAX, "%s%s.%s", > dbg, cgroup_on_dfl(cgrp) ? ss->name : ss->legacy_name, > - cft->name); > + write_link_name ? cft->link_name : cft->name); > } else { > - strscpy(buf, cft->name, CGROUP_FILE_NAME_MAX); > + strscpy(buf, write_link_name ? cft->link_name : cft->name, > + CGROUP_FILE_NAME_MAX); > } > return buf; > } > > +static char *cgroup_file_name(struct cgroup *cgrp, const struct cftype *cft, > + char *buf) > +{ > + return cgroup_fill_name(cgrp, cft, buf, false); > +} > + > +static char *cgroup_link_name(struct cgroup *cgrp, const struct cftype *cft, > + char *buf) > +{ > + return cgroup_fill_name(cgrp, cft, buf, true); > +} > + > /** > * cgroup_file_mode - deduce file mode of a control file > * @cft: the control file in question > @@ -1647,6 +1660,9 @@ static void cgroup_rm_file(struct cgroup *cgrp, const > struct cftype *cft) > } > > kernfs_remove_by_name(cgrp->kn, cgroup_file_name(cgrp, cft, name)); > + if (cft->flags & CFTYPE_SYMLINKED) > + kernfs_remove_by_name(cgrp->kn, > + cgroup_link_name(cgrp, cft, name)); > } > > /** > @@ -4012,6 +4028,7 @@ static int cgroup_add_file(struct cgroup_subsys_state > *css, struct cgroup *cgrp, > { > char name[CGROUP_FILE_NAME_MAX]; > struct kernfs_node *kn; > + struct kernfs_node *kn_link; > struct lock_class_key *key = NULL; > int ret; > > @@ -4042,6 +4059,14 @@ static int cgroup_add_file(struct cgroup_subsys_state > *css, struct cgroup *cgrp, > spin_unlock_irq(&cgroup_file_kn_lock); > } > > + if (cft->flags & CFTYPE_SYMLINKED) { > + kn_link = kernfs_create_link(cgrp->kn, > + cgroup_link_name(cgrp, cft, name), > + kn); > + if (IS_ERR(kn_link)) > + return PTR_ERR(kn_link); > + } > + > return 0; > } > > _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel